Dreamhack/Dreamhack Wargame (Challenge)

[58] IT 비전공자 [dreamhack]command-injection-chatgpt문제 풀기

imaginefuture-1 2024. 11. 6. 09:23

오랜만에 웹문제~~!!

신나게 풀어보자구

오호 ping playground!
구글로 보내볼까?

 

 

따라란 잘 돌아왔군요! 구글이랑 인사 잘하고왔습니다

 

 

 

이제 소스코드를 보러가볼게요 

 

#!/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분만에 푼적은 처음이네..이게..지피티..?