[Dreamhack] command-injection-1

2025. 3. 16. 10:30·Webhacking/Dreamhack
 

command-injection-1

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

dreamhack.io


code

#!/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)

code 해석

@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')
  1. host 라는 이름의 폼 데이터를 가져온다.
  2. 가져온 host 값을 사용하여 ping 명령어를 실행한다.
  3. subprocess.check_output 함수를 사용하여 /bin/sh 에서 cmd 명령을 실행한다.
  4. 결과 출력을 변수 output에 저장한다
  • 명령어 실행 중 예외가 발생하지 않을 때 -> 결과 출력을 UTF-8로 디코딩, ping_result.html 템플릿과 함께 렌더링하여 전환한다.
  • 명령어 실행 시간이 5초 초과시 -> subprocess.TimeoutExpired 예외가 발생, Timeout ! 메시지와 함께 ping_result.html 템플릿을 렌더링하여 반환한다.
  • 명령어 실행 중 오류 -> subprocess.CalledProcessError 예외 발생 -> 해당 오류 메시지와 함께 ping_result.html 템플릿을 렌더링하여 반환한다.
subprocess.check_output 함수 (Information)
서부 프로세스를 실행하고 출력 문자열을 파이썬 로직에서 변수에 담아 사용하고 싶은 경우 사용하는 함수이다.
비정상으로 종료되면 CalledProcessError 예외를 발생시킨다.

취약점 분석

cmd 변수

  • 사용자로부터 입력받은 host값을 포함한다.
사용자의 입력을 그대로 명령어로 실행하여 사용자가 악의적인 공격 코드 주입 가능하다.
=> Command Injection
  • ex. host에 의도대로 "8.8.8.8" 이 들어간다면 -> ping -c 3 "8.8.8.8" 이 올바르게 실행되며, " 문자를 임의로 삽입하여 문자열에서 빠져나온다면 원하는 명령어 이어서 실행 가능하다.
  • host = ' 8.8.8.8"; ls# ' 일 경우 -> cmd = 'ping -c 3 "8.8.8.8" ls #" ' 의 문자열을 보유한다.
  • 이를 /bin/sh 로 실행시킨 결과 -> 의도된 핑 뿐만 아니라 ls 라는 명령어의 결과를 추가적으로 학인 가능하다.

익스플로잇

메인 홈 화면이다.


 

ping 페이지이다.

명령어 구분자 ; 를 이용하여 익스플로잇을 시도했을 때 형식에 대한 조건이 있음을 확인 가능하다.

개발자도구(F12)를 통해 input 태그의 pattern 속성이 설정되어 있다.

위와 같이 F12 도구를 통해 필터링을 확인한다.

※ pattern 속성이란?
폼 제출시 <input> 요소의 값을 검사할 때 사용될 정규 표현식 (regular expression)을 명시한다.
허용된 정규 표현식은 영어, 숫자, ".", 글자수 5 ~ 20자 이다.
서버 단에서 일어나는 검증이 아닌, 클라이언트 단에서 검증이 일어나기 때문에 필터링 우회 가능하다.
개발자 도구를 상요해 pattern 속성을 제거하여 허용된 정규표현식에 대한 조건으로 우회 가능하다.

pattern 속성이 제거된 코드와, 개발자 도구에서의 모습을 확인했다.

플래그 획득

문제 설명에 의하면 플래그는 flag.py 에 존재한다고 한다.

ls 명령어를 통해 현재 디렉터리에 존재하는 파일 리스트를 확인해보자.

flag.py 를 확인했으며, cat 명령어를 사용해 flag.py를 읽으면 플래그 획득 가능하다.

정상적으로 플래그를 획득하였다.

저작자표시 비영리 동일조건 (새창열림)

'Webhacking > Dreamhack' 카테고리의 다른 글

[Dreamhack] file-download-1  (0) 2025.03.16
[Dreamhack] image-storage  (0) 2025.03.16
[Dreamhack] Mango  (0) 2025.03.15
[Dreamhack] simple_sqli  (0) 2025.03.15
[Dreamhack] csrf-2  (0) 2025.03.15
'Webhacking/Dreamhack' 카테고리의 다른 글
  • [Dreamhack] file-download-1
  • [Dreamhack] image-storage
  • [Dreamhack] Mango
  • [Dreamhack] simple_sqli
배움이 머무는 곳
배움이 머무는 곳
  • 배움이 머무는 곳
    wlgus
    배움이 머무는 곳
  • 전체
    오늘
    어제
    • 분류 전체보기 (68) N
      • 이것저것.zip (7)
      • CVE (6)
      • CTF (2)
      • Wargame (23) N
      • Webhacking (19)
        • WebGoat (2)
        • Dreamhack (15)
      • Web (5)
      • Pwnable (5)
        • Dreamhack (5)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
  • hELLO· Designed By정상우.v4.10.5
배움이 머무는 곳
[Dreamhack] command-injection-1
상단으로

티스토리툴바