워게임/HackTheBox

[HackTheBox] petpet rcbee - 웹해킹 / Command Injection / Pillow

SecurityMan 2022. 12. 12. 11:00

 

Pillow 취약점을 이용한 Command Injection 문제

 

HackTheBox 에서 제공하는 문제는 난이도가 EASY 더라도

 

조금 어려운것 같다...

 

반응형

 

 

문제페이지에 접속하면 이런 화면이 나온다.

 

귀엽게 생긴 벌들이 날아다니고

 

아래쪽에는 뭔가 파일을 업로드 할 수 있는 버튼이 있다.

 

 

바탕화면에서 크롬 아이콘을 캡쳐해서 한번 업로드 해봤더니

 

갑자기 손이 하나 튀어나와서 업로드한 크롬 사진을 마구마구 쓰다듬어 준다.

 

찾아보니 pet 이라는 단어가 애완동물 외에도 동사로 쓰일경우 쓰다듬다 라는 뜻이 있다고 한다.

 

문제 제목 그대로 업로드한 사진을 쓰다듬어 주는 기능이 이 페이지 기능의 전부이다.

 

 

문제에서 같이 주어진 Dockerfile 을 열어보면

 

pip install로 Pillow 라이브러리를 다운받고 있는걸 볼 수 있다.

 

어떻게 보면 당연한 건데 이 Pillow 라는게 

 

파이썬에서 이미지 처리를 할 때 자주 사용하는 라이브러리이기 때문이다.

 

 

소스코드에서 이미지 처리와 관련된 util.py 파일을 열어보면

 

실제로 from PIL import Image 형태로 Pillow 를 가져와 사용하는것을 볼 수 있다.

 

웹페이지에 이미지를 업로드해서 이미지 처리하는 기능밖에 없으니,

 

당연히 관련된 Pillow 의 취약점으로 푸는 문제일거라고 생각했다.

 

그래서 구글에 pillow vuln, pillow expolit 등등으로 검색해본 결과

 

 

어느 외국 블로그에서 관련된 내용을 찾을 수 있었다.

(https://blog.wlaqstcs.com/2022/05/30/CVE-2018-16509/)

 

사실 문제 풀 당시 참고했던 사이트는 다른 사이트인데,

 

왜인지모르게 그 사이트는 더이상 접속이 되지 않는다..

 

근데 여기도 결국 똑같은 내용을 써 놨다.

 

%!PS-Adobe-3.0 EPSF-3.0
%%BoundingBox: -0 -0 100 100

userdict /setpagedevice undef
save
legal
{ null restore } stopped { pop } if
{ legal } stopped { pop } if
restore
mark /OutputFile (%pipe%CMD_HERE) currentdevice putdeviceprops

 

위에도 나와있는것 처럼 이건 Ghostscript 코드인데

 

맨 아랫줄에 있는 CMD_HERE 부분을 수정해서 명령어를 집어넣으면 된다.

 

 

그전에 먼저 파일이 업로드되는 경로가 어딘지 알아야한다.

 

제공되는 config.py 파일의 내용을 보면,

 

사용자가 업로드하는 파일은 /app/application/static/petpets 경로에 저장되는것을 볼 수 있다.

 

 

이제 메모장 같은 텍스트편집기를 하나 열어서

 

위에서 봤던 Ghostscript 를 그대로 복사 한 뒤, 

 

CMD_HERE 부분을 touch > /app/application/static/petpets/test.jpg 라고 변경해준다.

 

그리고 그 내용을 rce.jpg 라는 이름으로 저장해준다.

 

 

rce.jpg 파일을 업로드해보면

 

정상적으로 업로드가 되고, 하얀색 백지를 쓰다듬는 화면이 나오게 된다.

 

 

지정한 경로인 /static/petpets/test.jpg 를 URL을 통해 접근해보면

 

이렇게 하얀 화면이 보이게 된다.

 

운영체제 명령어인 touch 의 결과로 서버내에 test.jpg 파일이 생성된 것이다.

 

 

생성이 안됐다면 이렇게 Not Found 에러가 뜬다.

 

 

이제 플래그를 읽어주기만 하면 된다.

 

flag 파일의 위치는 주어진 소스파일로 추정해볼 수 있다.

 

application 폴더와 같은 위치에 flag 파일이 존재하니,

 

flag 파일의 절대경로는 /app/flag 가 된다.

 

 

rce.jpg 파일에서 touch 부분을 cat /app/flag 라고 바꿔준 뒤 저장한다.

 

 

다시한번 URL로 /static/petpets/test.jpg 경로를 찾아가

 

f12를 눌러 개발자도구의 소스보기를 선택하면

 

플래그를 찾을 수 있다.

반응형