오랜만에 웹문제~~!!
신나게 풀어보자구
이제 소스코드를 보러가볼게요
#!/usr/bin/env python3
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)
오호
지피티야, 이 소스코드에서 command injection을 통해 플래그를 획득하고 싶은데 어떻게 하면 좋을까?
ㄹ이 코드에는 `ping` 명령어에 입력된 `host` 변수를 그대로 사용하고 있기 때문에 **명령어 주입(command injection)** 취약점이 발생할 수 있습니다. `host` 입력 필드에 추가 명령을 입력하여 `ping` 명령어 뒤에 임의의 명령을 실행하도록 만들 수 있습니다.
### 취약점 분석
```python
cmd = f'ping -c 3 {host}'
output = subprocess.check_output(['/bin/sh', '-c', cmd], timeout=5)
```
- `cmd` 변수에 `host` 값이 포함되어 있습니다. 만약 `host`에 악의적인 명령을 추가한다면, `ping` 명령과 함께 임의의 명령이 실행될 수 있습니다.
- 예를 들어, `host`에 `; cat flag.txt` 같은 입력을 추가하여 `ping` 명령 외에 `cat` 명령을 실행하도록 유도할 수 있습니다.
### 공격 예시
`host` 입력 필드에 다음과 같이 입력하면 `FLAG` 값을 읽을 수 있을 가능성이 있습니다:
```bash
127.0.0.1; cat flag.txt
```
- `127.0.0.1`은 기본적인 `ping` 대상이며, `; cat flag.txt`를 통해 `flag.txt` 파일 내용을 출력하게 됩니다.
또는, 플래그 파일이 특정 경로에 있다고 한다면 해당 경로를 사용하여 명령을 구성할 수도 있습니다:
```bash
127.0.0.1; cat /path/to/flag.txt
```
### 방어 방법
해당 취약점을 막기 위해서는 사용자 입력을 **검증**하거나, `subprocess.check_output()` 호출 시 입력된 호스트 이름만을 전달하도록 **명령어 주입을 방지**해야 합니다.
flag는 flag.py에 있다했으니
127.0.0.1; cat flag.py로 핑을 보내봤다.
문제를 1분만에 푼적은 처음이네..이게..지피티..?
'Dreamhack > Dreamhack Wargame (Challenge)' 카테고리의 다른 글
[60] IT 비전공자 [dreamhack]hook문제 풀기 (10) | 2024.11.08 |
---|---|
[59] IT 비전공자 [dreamhack]sql injection bypass WAF문제 풀기 (10) | 2024.11.07 |
[57] IT 비전공자 [dreamhack]oneshot문제 풀기 (2) | 2024.11.05 |
[56] IT 비전공자 [dreamhack]error based sql injection문제 풀기 (5) | 2024.11.04 |
[55] IT 비전공자 [dreamhack]rev-basic-8문제 풀기 (4) | 2024.11.03 |