xmi1e-vir.log

[Dreamhack] wargame 'command-injection-1' write-up 본문

WARGAME/WEB

[Dreamhack] wargame 'command-injection-1' write-up

eunee22 2025. 9. 7. 22:28
🌱 Biginner
문제링크
특정 Host에 ping 패킷을 보내는 서비스입니다.
Command Injection을 통해 플래그를 획득하세요.
플래그는 flag.py에 있습니다.

 

📌문제 파악

주어진 웹사이트는 시간안에 입력한 host에게 ping을 3번 보내는 기능을 가지고 있다.

Command Injection 취약점 이란?

  • 취약한 애플리케이션을 실행 중인 서버에서 임의의 운영체제 명령을 실행할 수 있는 취약점을 의미
  • ping 명령을 활용한 Command Injection에서는
    • 정상적인 작동을 위해 IP를 입력
    • 이후 다중 명령을 사용할 수 있또록 해주는 특수문자인 ; 또는 &&를 입력하고 원하는 명령을 입력하여 실행되게 할 수 있음

다중 명령 가능 특수문자 모음

📌풀이 방법

ping을 보내는 코드는 아래와 같이 되어있다.
원래는 호스트 이름에 공백이나 특수 문자가 들어가는 것을 방지하려고 큰 따옴표를 사용하지만 이게 오히려 공격에 활용할 수 있는 지점이 된다.

@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'))

 

정상적으로 127.0.0.1와 같은 IP를 입력하면
 ping -c 3 "127.0.0.1" 과 같은 명령이 실행된다.

 

그러나, IP를 입력하면서 임의로 "를 닫아준뒤 내가 실행하고자 하는 명령을 실행하면 쉘은 ping 정상 동작 후 명령을 새로 해석한다.

 

이 문제의 경우 127.0.0.1"; cat flag.py #를 input으로 입력하면
 ping -c 3 "127.0.0.1"; cat flag.py # 명령이 실행되는 것이다.

  • 세부적인 실행 흐름은 아래와 같다.
  1. "127.0.0.1" → ping 정상 동작
  2. "; 이후부터는 따옴표가 닫혀서 쉘이 명령어를 새로 해석
  3. cat flag.py 실행
  4. #를 통해 이후의 내용인 "등을 주석처리 → 기존 코드를 무시하므로 에러 없이 종료

입력 후 다음과 같은 플래그를 얻을 수 있다.

* 참고문헌

[Command Injection 취약점]

https://maker5587.tistory.com/61
https://ctf101.org/web-exploitation/command-injection/what-is-command-injection/
https://blog.plura.io/ko/threats/command-injection-overview/