CSAW CTF
here is my writeup for some good chall one CSAW CTF
========================Gatekeeping===========================

vì chall đã off nên mình miêu tả bằng trí tưởng tượng lol.
first, take a look at source code provide, its simple
server has 3 route, index, decrypt và admin/key
decrypt dùng để decrypt file enc đã được thanh toán, cấu hình thanh toán thì không thể khiểm soát được nên dù có upfile lên cũng không thể decrypt.
/admin/key dùng để đọc file key.

mục tiêu của bài là đọc key sau đó decrypt flag.txt.enc
nhưng không thể access vào route /admin vì nginx config.
để ý thấy ở file config, có một trường được bật là underscores_in_headers
bình thường nếu trường này không bật thì nginx sẽ chuẩn hóa header bằng cách thay thế tất cả _ bằng - . ở chall này option này được bật tức là có vấn đề, mình nghĩ ngay tới HTTP smuggling. đọc lại code sh, có 1 đoạn comment như sau
cuộc hội thoại trên nói về sự handle khác nhau giữa nginx proxy và wsgi server, có liên quan gì đó tới path_info thế nên mình sẽ vào source wsgi đọc

thấy điểm bất thường ở path_info , sau khi được gán bởi req.path, tiếp tục được split bởi script_name , trace ngược lại script_name thì thấy nó được lấy từ header lol, nên đây là lý do nginx allow underscores_in_headers . đến đây đã rõ để access vào /admin/key chỉ cần access với cú pháp như sau
/bla/admin/key sẽ pass nginx proxy, sau khi được wsgi xử lý thì trở thành /admin/key

còn key_id sau khi upload 1 file enc lên thì server sẽ tự động set key_id , đọc lấy key và decrypt file flag.
=============================scp-terminal==========================

với bài này thì không có source nên phải fuzz, ngày đầu mình fuzz no hope quá nên tính give up, khoảng 5h cn thì teammate hú send mình payload đọc /etc/passwd. lúc này thì mình bắt tay lại vào việc, cứ nghĩ nó dễ ai ngờ phức tạp vl ;)

take a look on landing page. trang này chỉ request khi url có scp- string.
nên payload đọc file sẽ như sau file:///etc/passwd#scp-
sau khi đọc được file thì mình tiến hành đọc source code. vì không biết vị trí file hiện tại nên mình sẽ sử dụng symlink cho lẹ.
file:///proc/self/cwd/server.py#scp-


vì chỉ đọc được 1 phần file, nên chỉ có thể vừa làm vừa đoán, ở đây có route
scp-31337 kết hợp với des thì có thể đây là route chứa flag, từ sourte ta thấy route này render từ file scp-31337.html nên mình sẽ đi đọc file này.
file:///proc/self/cwd/templates/scp-31337.html

oh no, flag đã được hide, đúng là đời khum như là mơ. mở hint của chall thì thấy

its mean view-source? lets try


clm server chỉ screenshot 1 phần nên khum thể đọc flag :( painfull
tiếp tục quay trở lại đọc source. mình nhận thấy có 1 số file chưa đụng tới nhưng có import vào, đầu tiên là scp_contain

file này simple mở header chromeless và request tới, đồng thời có một tiến trình chạy song song với chromeless là scp_secure.py, tiếp tục read nó thôi.

ở file này sẽ có thêm 1 service curl, service này làm nhiệm vụ tìm kiếm url hình ảnh trong url được provide và lưu nó vào site_19 dir. làm đến đây thì mình có idea như sau. host 1 file htmp chứa tag img, src trỏ về file:///server/tempaltes/scp-31337.html và sau đó access vào thư mực site_19 sẽ đọc được flag without css.

nhưng khi mình thực hiện request thì nó vẫn báo là không tìm thấy SCP. tiếp tục mò source fe. ở file app.js

tức res trả về phải có scp nếu khum thì sẽ không hiện url của site_19 dir.
quay lại với file scp_secure.py đọc kỹ hơn thì thấy

tức phải chứa scp-image-block ở thẻ div nữa thì nó mới nhận url, sửa lại file html và request lại

đã có scp, view-source để kiểm trả url trả về

request vào url này để có flag.
Last updated
Was this helpful?