WEB


Webpwnize

<?php 
  $ffi=FFI::cdef("int system(const char *command);");
  $ffi->system('ls -al');
?>

phpinfo로 ffi enable, file_uploads = on 체크하고, 여기까지 설계 다 해놓고 이걸 못푸네... 업로드하고 reverse shell 만 땄으면 되는뎅...

Flask-dev

(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가 너무나도 마렵다.

Untitled

메인페이지의 home 버튼을 누르게 되면 이렇게 flask_debug_pin.html로 리다이렉션되면서 debug 창이열린다.

Untitled

오류에 마우스를 올리면 콘솔 버튼이 있는데 이 버튼을 누르면 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 를 만들었다.