https://dreamhack.io/wargame/challenges/44
[1] ๋ฌธ์ ๋ถ์
# ๋ฌธ์ ์น ํ์ด์ง ๋ถ์
์ฒซ ํ๋ฉด์ด๋ค.
์๋จ์ 'Home' ์์ 'Ping'์ ๋๋ฅด๋ฉด ์ด๋ํ๋ ํ์ด์ง์ด๋ค.
๋ค๋ชจ ์นธ์ IP ์ฃผ์๋ฅผ ์ ๋ ฅํ ์ ์๊ฒ ๋์ด์๋ ๊ฒ ๊ฐ์๊ณ , "Ping!" ๋ฒํผ์ ๋๋ฌ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์๋ ๊ฒ ๊ฐ์๋ค.
โ๏ธ /ping.html
<!doctype html>
<html>
<head>
<link rel="stylesheet" href="/static/css/bootstrap.min.css">
<link rel="stylesheet" href="/static/css/bootstrap-theme.min.css">
<link rel="stylesheet" href="/static/css/non-responsive.css">
<title>ping | Dreamhack Ping Tester</title>
</head>
<body>
<!-- Fixed navbar -->
<nav class="navbar navbar-default navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<a class="navbar-brand" href="/">Home</a>
</div>
<div id="navbar">
<ul class="nav navbar-nav">
<li><a href="/ping">Ping</a></li>
</ul>
</div><!--/.nav-collapse -->
</div>
</nav>
<div class="container">
<h1>Let's ping your host</h1><br/>
<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>
</div> <!-- /container -->
<!-- Bootstrap core JavaScript -->
<script src="/static/js/jquery.min.js"></script>
<script src="/static/js/bootstrap.min.js"></script>
</body>
</html>
์ด ํ์ด์ง์ ์์ค ์ฝ๋์ด๋ค.
ํผ ๋ถ๋ถ์ ์์ฃผ๋ก ๋ถ์ํด๋ดค์ ๋,
1. ์๋ฒ๋ก ์ ์ก๋ ๋ "host"๋ผ๋ ์ด๋ฆ์ ์ฌ์ฉํ์ฌ ์ ์กํ๋ค.
2. ์ํ๋ฒณ ๋์๋ฌธ์, ์ซ์, ๊ทธ๋ฆฌ๊ณ ์ (.)์ด 5๋ถํฐ 20๊ฐ๊น์ง ํ์ฉ๋๋ค.
3. required ์์ฑ์ ์ด ํ๋๊ฐ ๋น์ด์์ผ๋ฉด ์ ์ถ์ด ๋ถ๊ฐ๋ฅํ๋๋ก ๋ง๋ ๋ค.
์ด ์ ๋ ๋ด์ฉ์ ์ ์ ์์๋ค.
"8.8.8.8"์ ์ ์ด์ ํ ํ ์คํธ๋ฅผ ํด๋ณธ ๊ฒฐ๊ณผ ํ๋ฉด์ด๋ค.
์ค์ ping ๋ช ๋ น๊ณผ ๋์ผํ ๊ธฐ๋ฅ์ ์ํํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ ๊ฒ์ ์ ์ ์๋ค.
์ด ํ์ด์ง์ ์์ค ์ฝ๋๋ฅผ ๋ณด์๋๋ฐ ๋ณ ๊ฑด ์์๋ค.
.
.
.
์ด์ ๋ค์ด๋ก๋ํ ๋ฌธ์ ํ์ผ์ ๋ถ์ํด๋ณด๋๋ก ํ๊ฒ ๋ค.
# ๋ค์ด๋ก๋ํ ๋ฌธ์ ํ์ผ ๋ถ์
โ๏ธ app.py
#!/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์์ ์ฃผ๋ชฉํ ๋งํ ๋ถ๋ถ์,
์ด ๋ถ๋ถ์ธ๋ฐ, ์ด ์ฝ๋๋ฅผ ํตํด {host} ๋ถ๋ถ์ ๋ด๊ฐ ์ ๋ ฅํ ๊ฐ์ด ๋ค์ด๊ฐ๋ค๋ ๊ฒ์ ์ ์ ์์๋ค.
โญ โญ [2] ๊ณต๊ฒฉ โญ โญ
command injection ๊ณต๊ฒฉ์ ์ฃผ๋ก "๋ฉํ ๋ฌธ์"๋ฅผ ์ด์ฉํ์ฌ ๋ฐ์์ด ๋๋ค.
๊ทธ๋ฌ๋ /ping.html์ pattern="[A-Za-z0-9.]{5,20}"๋ถ๋ถ์ ๋ณด๋ฉด,
์ํ๋ฒณ ๋๋ฌธ์, ์๋ฌธ์, 0-9๊น์ง์ ์ซ์ ์ด์ธ์ ๋ฌธ์๋ ํํฐ๋ง์ด ๋จ์ ์ ์ ์๋ค.
์ฆ, ๋ฉํ ๋ฌธ์๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด๋ค.
๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ์ด์ด์ ํํฐ๋ง ๊ธฐ๋ฅ์ ๋ง๋๋ ๋ค๋ชจ ๋ฐ์ค ๋ถ๋ถ์ ์ง์ด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํด๋ณด์๋ค.
{host} ๋ถ๋ถ์ ๋ด๊ฐ ์ ๋ ฅํ ํ ์คํธ๊ฐ ๋ค์ด๊ฐ๋ ๊ฒ์ ์ฐธ๊ณ ํ์ฌ 8.8.8.8";ls" ๋ฅผ ์ ๋ ฅํ๊ณ ์ ์ถํ ๊ฒฐ๊ณผ์ด๋ค.
์ด๋ ๊ฒ ๋๋ฉด, cmd = f'ping -c 3 "8.8.8.8";ls"' ์ ์ ๋ ฅํ ๊ฒ์ด ๋๋ค.
ํ์ฌ ๋๋ ํ ๋ฆฌ์ flag.py๊ฐ ์กด์ฌํ๋ ๊ฒ๊ณผ, ํํฐ๋ง์ ํด์ฃผ๋ ์ฝ๋๋ฅผ ์ง์ฐ๋ฉด ๊ณต๊ฒฉ์ด ๋๋ค๋ ์ ์ ์ด์ฉํด cat ๋ช ๋ น์ด๋ก flag.py ํ์ผ์ ์ฝ์ด์ฌ ๊ฒ์ด๋ค.
(ํ์ ์๋ฌด๊ฑฐ๋ ์ ๋ ฅํด๋ ์๊ด์๋ค.)
cat ๋ช ๋ น์ด๋ก flag.py์ ๋ด์ฉ์ธ ํ๋๊ทธ ๊ฐ์ ์ถ๋ ฅํ ์ ์์๋ค.
๋ฌธ์ ํ์ด ์๋ฃ!
[3] ์ฐธ๊ณ
'SWLUG > ์น ํดํน' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Dreamhack/๋๋ฆผํต] Web (2) | 2024.04.29 |
---|---|
[webhacking.kr] Challange 44 (1) | 2023.11.20 |
[Dreamhack/๋๋ฆผํต] Command Injection Advanced (1) | 2023.11.19 |
[Dreamhack/๋๋ฆผํต] baby-linux (0) | 2023.11.16 |
[Dreamhack/๋๋ฆผํต] csrf-2 (1) | 2023.11.11 |