Web Hacking/Dreamhack 풀이

command-injection-1

박연준 2023. 6. 25. 17:32

command-injection-1

문제 정보

  • 특정 Host에 ping 패킷을 보내는 서비스입니다.
  • Command Injection을 통해 플래그를 획득하세요. 플래그는에 있습니다.

풀이

처음 접속 화면이다.

Ping 탭으로 들어가보면 Host 밑에 입력 폼이 있다.

input 속성의 placeholder가 8.8.8.8 이므로 그대로 입력해서 Ping!버튼을 눌러봤다.

다음과 같이 Ping 결과가 잘 출력되는 것을 확인해보았다.

다시 돌아와 8.8.8.8; ls를 입력해서 Ping! 버튼을 눌렀더니 형식을 일치시키라고 나온다.

문제 코드를 한 번 살펴보겠다.

문제 코드에는 해당 형식을 지정해주는 코드는 없는 것 같다.

import subprocess

from flask import Flask, request, render_template, redirect

from flag import FLAG

APP = Flask(__name__)

@APP.route('/')
def index():
    return render_template('index.html')

@APP.route('/ping', methods=['GET', 'POST'])
def ping():
    if request.method == 'POST':
        host = request.form.get('host')
        cmd = f'ping -c 3 "{host}"'
        try:
            output = subprocess.check_output(['/bin/sh', '-c', cmd], timeout=5)
            return render_template('ping_result.html', data=output.decode('utf-8'))
        except subprocess.TimeoutExpired:
            return render_template('ping_result.html', data='Timeout !')
        except subprocess.CalledProcessError:
            return render_template('ping_result.html', data=f'an error occurred while executing the command. -> {cmd}')

    return render_template('ping.html')

if __name__ == '__main__':
    APP.run(host='0.0.0.0', port=8000)

다시 f12를 눌러 입력 폼을 검사해보았더니 다음과 같이 pattern 속성이 들어가있었다.

저게 뭔지 인터넷에 검색해보니 정규표현식이라고 한다.

저 정규표현식을 살펴보면 A-Z는 대문자 A부터 Z까지이고 a-z는 소문자 a부터 z까지이고 0-9는 숫자 0에서 9까지 나타내며 마지막 . 은 실제 .을 나타내고 .을 5개 이상 20개 이하로 반복되는 문자열을 찾는 정규표현식이다.

 

그럼 이제 BurpSuite를 켜서 Ping!버튼을 누르면 가는 패킷을 잡아온다.

다시 그럼 ;같은 특수문자를 걸러내기 때문에 “문자로 8.8.8.8”;”ls 이렇게 한 번 작성해보았다.

falg.py가 잘 있는 것을 확인했다.

cat 명령어로 확인해보면 flag값이 나올 것이다.

하지만 cat 명령어로 확인하는데 에러가 나온다.

인터넷에서 검색해보다가 띄어쓰기도 필터링이 된다는 사실을 알았다.

따라서 띄어쓰기도 “” 큰 따옴표로 한 번 더 감싸서 주면 다음처럼 flag 값이 나온다.

 

'Web Hacking > Dreamhack 풀이' 카테고리의 다른 글

image-storage  (0) 2023.06.25
command-injection-chatgpt  (0) 2023.06.25
simple_sqli  (0) 2023.06.25
simple_sqli_chatgpt  (0) 2023.06.25
CSRF-2  (0) 2023.06.25