웹 해킹에 관한 문제이므로 http:// host : port로 접속한다.
우선, 이 웹 서비스에서 F12(관리자 모드)를 통해 정보를 확인해 보자.
<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">
</head>
<body class="container">
<form method="POST">
<div class="row">
<div class="col-md-6 form-group">
<h1>Baby Linux</h1><br/>
<div class="input_box">
<p class="input_txt">echo $(<input type="text" name="user_input" class="input_in_txt" required>)</p>
</div>
</div>
</div>
<button type="submit" class="btn btn-default">Submit</button>
</form><br/><br/>
<h2>Result</h2>
<pre></pre>
<script src="/static/js/jquery.min.js"></script>
<script src="/static/js/bootstrap.min.js"></script>
</body>
하지만, 위의 index.html 코드로 딱히, 힌트가 될만한 정보를 찾지 못하였다.
다시, 문제로 돌아가보자.
이 웹 서비스는 리눅스 명령어를 실행하는 사이트이다. 여기서, 우리가 찾아야 할 파일은 flag.txt이다.
이 파일의 위치를 찾기 전에 ls -l 명령어를 통해 작업 공간을 확인해 보자.
아래는 Result이다.
total 24 -rwxr-xr-x 1 root root 884 Apr 21 2023 app.py
drwxr-xr-x 3 root root 4096 Apr 21 2023 dream
-rw-r--r-- 1 root root 34 Apr 21 2023 hint.txt
-rw-r--r-- 1 root root 5 Apr 21 2023 requirements.txt
drwxr-xr-x 5 root root 4096 Apr 21 2023 static
drwxr-xr-x 2 root root 4096 Apr 21 2023 templates
여기서 hint.txt라는 힌트가 될만한 파일을 발견하였다. cat 명령어를 통해 이 파일에 대한 내용을 출력해 보자.
아래는 Result이다.
Where is Flag? ./dream/hack/hello
우리가 찾고자 하는 flag.txt의 파일 위치에 대한 힌트를 얻었다. 즉 현재 파일을 기준으로 상대 경로로 표기되어 있고,
./ dream / hack / hello에 flag.txt 파일이 있다는 사실을 알 수 있다.
마찬가지로, cat 명령어를 통해 flag.txt 파일의 내용을 확인해 보자.
아래는 Result이다.
No!
우리가 기대하는 DH { 해시 }와 같은 출력 형식이 아닌 No!라는 결과가 나왔다.
여기서, 무엇이 문제인지를 확인하기 위해 처음에 문제 첨부했던 소스 코드를 확인해 보자.
아래는 app.py 파일의 파이선 소스코드이다.
#!/usr/bin/env python3
import subprocess
from flask import Flask, request, render_template
APP = Flask(__name__)
@APP.route('/', methods=['GET', 'POST'])
def index():
if request.method == 'POST':
user_input = request.form.get('user_input')
cmd = f'echo $({user_input})'
if 'flag' in cmd:
return render_template('index.html', result='No!')
try:
output = subprocess.check_output(['/bin/sh', '-c', cmd], timeout=5)
return render_template('index.html', result=output.decode('utf-8'))
except subprocess.TimeoutExpired:
return render_template('index.html', result='Timeout')
except subprocess.CalledProcessError:
return render_template('index.html', result='Error')
return render_template('index.html')
if __name__ == '__main__':
APP.run(host='0.0.0.0', port=8000)
앞서 얻은 No!라는 결괏값에 대한 소스 코드 정보만 살펴보자.
if 'flag' in cmd:
return render_template('index.html', result='No!')
위의 코드가 의미하는 것은 cmd(명령 프롬포트)에 flag 가 있으면 No! 를 출력한다는 것이다.
즉, 우리는 cat 명령어를 사용할 때, cat./ dream / hack / hello / flag. txt에서 flag 가 포함이 되어 있어서, 우리가 원하는 결과를 얻지 못했음을 알 수 있다.
flag를 입력하지 않고도 flag.txt에 대한 파일 내용을 얻기 위해 와일드카드를 이용해 보자.
아래는 최종 Result이다.
DH{671ce26c70829e716fae26c7c71a33823feb479f2562891f64605bf68f60ae54}
'해킹 > Dreamhack WarGame' 카테고리의 다른 글
[Dreamhack] blue-whale 문제 풀이 (1) | 2023.11.30 |
---|---|
[Dreamhack] phpreg 문제 풀이 (1) | 2023.11.28 |
[Dreamhack] ex-reg-ex 문제 풀이 (1) | 2023.11.28 |
[Dreamhack] Exercise: SSH 문제 풀이 (0) | 2023.11.20 |
[Dreamhack] 64se64 문제 풀이 (0) | 2023.11.17 |