[WEB] command-injection-1 문제풀이

Command Injection 취약점이란 시스템 명령어를 쿼리문에 주입하여 취약한 변수를 통해 서버 운영체제에 접근하는 공격으로 shell)exec, eval, system 함수 등을 사용하여 발생되는 취약점이다.

 

문제를 확인해보자.

 

HOST에 ping 패킷을 보내는 서비스에서 command Injectino을 통해 FLAG를 획득하라고 한다.

페이지에 접속해보자.

 

 

Ping 페이지로 접근해보자.

 

 

8.8.8.8 ip로 ping을 한 번 보내보자.

 

 

시스템에서 ping 명령을 수행한 내역을 웹 페이지에 출력해준다.

음... 사실 어떻게 접근해야할지 잘 모르겠다. 소스코드를 바로 확인해보자.

 

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

 

오우 코드가 상당히 간결하다.

우리가 ping 페이지에서 host ip를 입력하고 버튼을 클릭하면 시스템에서 수행되는 명령어가 보인다.

 

cmd = f'ping -c 3 "{host}"'

 

host ip로 8.8.8.8 을 입력했을 때는 시스템에서 어떤 명령이 수행될까

 

/bin/sh -c ping -c 3 "8.8.8.8"

 

사용자 입력이 시스템 명령에 반영되는 부분은 "{host}" 부분이기 때문에

앞에서 ping 명령을 수행하고 또 다른 명령어를 실행하게끔 해야한다.

 

우리는 여기에서 리눅스 다중명령어를 사용하는 방법을 쓸 수 있다.

1) ; (세미콜론) : 하나의 라인에 주어진 명령어를 성공, 실패와 관련 없이 모두 실행한다.

 - 예시) ping 8.8.8.8; ls; ps

2) && (엠퍼센트) : 앞에서부터 순차적으로 실행하되, 명령 실행에 실패할 경우 뒤 명령은 실행하지 않는다.

 - 예시) ping 8.8.8.8 && ls && ps

3) || (더블버티컬바) : 앞에서부터 순차적으로 실행하되, 명령 실행에 성공할 경우 뒤 명령은 실행하지 않는다.

 - 예시) ping 8.8.8.8 || ls || ps

4) | (파이프라인) : 앞의 명령어 처리결과를 뒤 명령어로 전달하여 뒤 명령어를 실행한다.

 - 예시) ping 8.8.8.8 | ls 

 -> ping 명령어 결과로 ls 명령어를 수행하는데 이렇게 되면 실제로 모두 수행되지만 화면에는 ls 결과만 출력된다.

 

시스템 명령의 형태를 확인하여 1)번부터 시도 해보자. 예상되는 명령어는 다음과 같다.

 

/bin/sh -c ping "8.8.8.8"; ls "./"

 

이걸 웹 페이지에서 입력해보자.

 

 

요청한 형식과 일치시키라는데 클라이언트 단에서 입력 값 검증이 있나보다.

귀찮지만 웹 페이지에서는 8.8.8.8만 입력해주도록 하고 나머지는 프록시 툴을 이용하여 조작해주도록 하자.

 

 

시스템 명령이 수행된 현재 디렉토리에 flag.py 파일이 보인다. 

위에서 명령어를 삽입한 방식으로 cat 명령어를 통해 flag.py 파일을 읽어주도록 하자.

 

 

오우 FLAG가 나왔다.

문제풀이에서는 다중명령어 리스트 중 1) ; (세미콜론)을 이용했지만

4) | (파이프라인)을 이용한 flag 획득도 가능했다.

 

문제풀이 끗

'워게임 > dreamhack' 카테고리의 다른 글

[dreamhack] csrf-1 문제풀이  (0) 2021.06.02
[dreamhack] image-storage 문제풀이  (0) 2021.06.02
[dreamhack] simple_sqli 문제풀이  (0) 2021.05.28
[dreamhack] xss-1 문제풀이  (0) 2021.05.19
[dreamhack] pathtraversal 문제풀이  (0) 2021.05.19
복사했습니다!