<문제>
특정 Host에 ping 패킷을 보내는 서비스입니다.
Command Injection을 통해 플래그를 획득하세요. 플래그는 flag.py에 있습니다.
@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')
ping 링크에서 cmd를 실행시키는데 여기서 flag.py 파일을 읽어오도록 command injection을 해야 할 것 같다.
ping 페이지에서 여러 가지를 입력해보았는데 필터링이 걸려있는 것 같다.
1.1.1.1 이런 식으로 주소 형식으로 쓰지 않으면 필터링 되었고
1.1.1.1; cat flag.py
1.1.1.1 || cat flag.py 이런식으로 여러 시도를 했지만 전부 안되었다.
필터링에 안 걸리면서 cat을 실행할 수 있는 인젝션 방법이 없나 한참 고민을 했는데 어떤 식으로 필터링이 동작하는지 알 수가 없으니 어떻게 풀라는건가 싶었다. 그런데 필터링 매커니즘이 분명 동작 코드에서는 보이지 않기 때문에 그냥 html 프론트엔드에서 자체적으로 필터링 하는 것 같다는 생각이 들었다.
그래서 f12를 누르고 입력창 부분의 코드를 보니
이런 식으로 [A-Za-z0-9.]{5,20}같이 뭔가 문자열 필터링 같이 생긴 pattern 속성이 보였다.
그래서 이걸 지우고 1.1.1.1; cat flag.py 를 했더니
안된다....
결과를 보니 ping -c 3 "1.1.1.1; cat flag.py" 이런식으로 ""로 입력값이 묶여있어서 안됐던 것이다.
1.1.1.1" ; cat flag.py" 이렇게 했더니
flag가 잘 나온다!
'웹해킹' 카테고리의 다른 글
드림핵 image-storage 롸업 (0) | 2023.11.05 |
---|---|
ServerSide: File Vulnerability (0) | 2023.11.04 |
ServerSide: Command Injection (0) | 2023.11.04 |
드림핵 Mango 롸업 (0) | 2023.11.04 |
드림핵 simple_sqli 롸업 (0) | 2023.11.04 |