본문 바로가기

드림핵

[드림핵 워게임] command injection-1

위의 문제를 다음과 같은 과정으로 풀어보았다.

 

 

1. 코드 및 페이지 파악하기

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

코드를 확인해보면 인덱스 페이지와 ping 페이지 두 개의 페이지가 있는 것을 확인할 수 있다. 두 페이지 중 ping 페이지가 더 중요해보인다. 특히 POST 메소드로 요청을 받았을 때 host 값을 받고 해당 host로 ping을 보내는 명령어를 셸에서 실행한다. 이 부분에서 공격자는 command injection 공격을 시도할 수 있다.

 

 

 

2. 핑 보내보기

ping 페이지로 접속하면 입력란에 placeholder로 8.8.8.8이 떠있는 것을 볼 수 있다. 우선 placeholder 값과 똑같이 8.8.8.8을 입력하여 결과를 확인해보았다.

 

 

ping이 보내져 그 수신 결과를 볼 수 있다. 앞서 살펴본 코드에 따르면, 입력한 값 8.8.8.8이 ping -c 3 8.8.8.8이라는 명령어로 처리되어 셸에서 실행된 것이다.

 

 

 

3. 방해요소 제거하기

문제에서 플래그는 flag.py에 있다고 했으니 command injection 공격을 통해 flag.py 파일을 읽어내는 명령을 시도해봤다. 입력값 8.8.8.8 뒤에 명령어 한 줄을 마치는 기호 ;을 붙이고, 이어서 flag.py파일을 읽어내는 명령어 cat flag.py를 입력했다. 그런데 ping! 버튼을 클릭했더니 "요청한 형식과 일치시키세요."라는 경고문이 뜬다.

 

 

경고문이 뜨지 않게 해서 입력값을 전송하기 위해 개발자 도구(F12)에 들어가서 어떤 방해요소가 있는지 확인해보았다. 개발자 도구의 Elements 메뉴로 들어가서 html 코드를 확인해보니 입력값에 대해 pattern이 지정되어 있는 것을 발견할 수 있었다. 해당 내용을 삭제하니 경고문이 뜨지 않고 입력값이 성공적으로 전송되었다.

 

 

 

입력값은 잘 전송되었으나 결과를 보면 오류가 난 것을 확인할 수 있다. 내용으로 보아 따옴표가 문제되는 것으로 예상했다.

 

 

 

4. 익스플로잇 코드 작성하기

따옴표 문제를 해결하기 위해 입력값에 따옴표를 추가하여 익스플로잇 코드를 작성했다.

 

플래그를 확인할 수 있다.

'드림핵' 카테고리의 다른 글

[드림핵 워게임] Carve Party  (1) 2022.10.08
[드림핵 워게임] pathtraversal  (1) 2022.10.08
[드림핵 워게임] Mango  (0) 2022.10.01
[드림핵 워게임] simple-sqli  (1) 2022.09.24
[드림핵 워게임] csrf-2  (1) 2022.09.24