Dưới đây là một số challenge mình giải quyết được trong SPbCTF's Student CTF 2021 Quals.
Tất cả source code mình sẽ để ở đây nhé SOURCE
Ở challenge này thì chúng ta được cung cấp Dockerfile
và docker-compose
.
Ở docker-compose thì thấy được server chạy apache, trong Dockerfile thì có đoạn
Khá giống với CVE của apache 2.4.49 gần đây. Dùng burp để bắt lại request và thấy header server
trả về đúng là Apache/2.4.49
Vậy nên bây giờ thử payload của CVE-2021-41773 thôi.
Kết quả Path Traversal và đọc được file /etc/passwd => bây giờ chỉ cần đọc flag thôi.
spbctf{th3_lat3st_d03s_n0t_m3an_s3cur3}
Bài nay được cung cấp code php như sau và các luồng hoạt động cơ bản của code mình comment ở code bên dưới luôn nhé.
data
và upload 1 file xml lên.html
để upload fileSau khi dung burp bắt lại là thêm parameter data
thì được request như trên hình.
abc
bằng content của file xml để nó có thể in ra You have logged in as user ...
Request cho ai cần:
Content file mình truyền vào.
Kết quả trả về.
user
Payload xxe injection
Kết quả là nhận được content của file /etc/passwd nhưng chúng ta không biết flag ở đâu và để có thể đọc được.
unlink
, lúc chương trình unlink
sẽ mất 1 khoảng thời gian, và chúng ta sẽ lợi dụng nó race condition, upload 1 file php lên và file đó sẽ vẫn còn tồn lại và từ đó có thể chạy được file php.upload/id/my_file.php
để đọc chạy file php.race.py
. Mọi người nhớ thay session và id nhé.check.php
http://62.84.114.238/upload/cf8828cf95abdb5e046d30e4f6006588/check_info.php
thì thấy được trang phpinfo()
.disable_function
trong trang phpinfo thì thấy được các function có thể RCE đã bị disable
Tới đây thì đọc lại description của bài On the last step, you’ll need a recently published 0day.
=> mình đã nhớ đến 1 0day gần đầy có thể bypass disable function và từ đó có thể RCE.
Link Bypass disable function.
File shell.php
(mình để trong github, ở trên cùng của bài viết nhé) mình chỉ thay chỗ pwn('/./readflag > /tmp/taidh');
(đây là cách mình đọc flag luôn). Để show thì các bạn thay bằng pwn('ls > /tmp/taidh');
nhé.
check.php
thành shell.php
.Read flag bằng cách ở trong file xml sửa thành file:///tmp/taidh
.
Flag -> spbctf{XX3_2_rCe_w3Ll_D0n3}
Đầu tiên đăng kí 1 account và login vào. Ở /pro
thì hiện so sánh giữa account pro và account free.
Cụ thể ở đây account của chúng ta đang là free, nhưng không thể BUY PRO NOW
. Ghi nhớ những chức năng có thể sử dụng khi lên account pro nhé. Xíu nữa sẽ cần đến nó.
Service có một số endpoint:
/profile
-> tạo webhook/change_password
-> change password/report
-> send url và bot sẽ request tới.Ở /change_password
chỉ là change password nên không có gì exploit, mình chỉ quan tâm đến /profile
và /report
.
/report
thì thấy được send 1 url bất kì và bot sẽ request vào và hiện thông báo Your idea/report successfully sended to admins. Thank you!
=> có thể bài này là xss./profile
-> khi tạo 1 webhook thì trong đó sẽ có delete, change template và select. Ở đây mình chỉ quan tâm đến change template và select. Hiện tại thì chỉ có thể chọn được 1 trong 5 template. Chú ý thì cả 5 template sử dụng {{}} vì vậy có thể ssti ở đây nếu như chúng ta có thể thay đổi được content của template.Đến đây thì nhớ về lúc đầu ở /pro
khi account pro thì có thể tạo template và số webhook được tạo không giới hạn.
IDEA: xss
(lấy cookie của admin để lên pro) -> SSTI
(tạo template mới) -> RCE và lấy flag.
url
mình có thể controlurl
được truyền vô src của thẻ img
=> có thể escape để xss"
nên chúng ta cần escape "
để có thể thêm onerror=alert(1)
. Đời không như là mơ thì chương trình đã sử dụng htmlencode => không thể escape dấu "`"?url=a" onerror="alert(1)
=> kết quả url
nhưng ở thẻ img
không có "
=> không cần escape dấu "
=> không bị ảnh hưởng bởi htmlencode ?url=a onerror=alert(1)
=> kết quả
Vậy bây giờ chỉ cần lấy cookie của bot trả về là sẽ lên account pro, nhưng đến đoạn gửi url cho bot thì lại bị một số vẫn đề:
/report
->redirect
.index.php
mình host:php -S 0.0.0.0:1234
trên serverhttp://ip:1234/index.php
cho Url ở /report
Nhưng sau khi lên pro thì mình cũng không thể click vào Create Template
. Stuck ở đây khá lâu và đi check các file JS thì thấy được có 1 api được giấu ở file https://rozhook.xyz/static/js/main.js
Truy cập api trên và tạo template mới có thể rce (SSTI):
Get cookie để lên tài khoản pro
Add template to SSTI (get flag)
Flag -> spbctf{m@yb3_i_sh0uld_m@k3_an0ther_s3rvic3}
Ở bài này mình chỉ brute ở location
vì khi hoàn tất các bước và send lên thì nhận được thông báo There are no free servers in this location
=> thử brute hoặc thay bằng location khác.
Flag -> spbctf{b3_c4r3fu1_w17h_grpc_3num5}