---
# System prepended metadata

title: BKSec-CTF Writeup 2024

---

# **bksec Public Insecure News**

![image](https://hackmd.io/_uploads/Hy6OeDZjkl.png)

Ban đầu ta xem qua có các chức năng gì không, lướt qua một lúc thì không thấy có chức năng, những link dẫn đến các bài viết và video ở ip khác.
view source: thấy một vài đường dẫn /static như css hay js nhưng chưa thấy khả năng exploit
xem trong burp suite:

![image](https://hackmd.io/_uploads/r1i4ZvWskx.png)

Thấy endpoint /logo, check mã nguồn xem nào
 
![image](https://hackmd.io/_uploads/SJarWDbs1e.png)

Chưa hiểu lắm nên quăng vô gpt thui :>

![image](https://hackmd.io/_uploads/SkiLWwZikl.png)

 
Quay lại burp ta thấy /logo có 1 param là file, ném qua repeater, thử xem có nghịch được gì không, nhìn thấy file nên ta nghĩ qua có thể mấy lỗi liên quan đến file như path traversal, LFI,.. test:

![image](https://hackmd.io/_uploads/SywDbv-sJe.png)

 
Thấy nó vẫn trả về logo.png, thử thêm vài payload

![image](https://hackmd.io/_uploads/ry1u-DWjkl.png)

 
ta thấy có vẻ các dấu ../ bị filter mất dẫn đến đường dẫn bị ghép thành logo/etc/passwd, tức là file=logo.png đường dẫn của nó là logo/logo.png
chưa hiểu tại sao nên ta quay lại trang mã nguồn xem có gì không, nhưng thôi ta cứ vứt hết cho AI đọc hộ, lần này thử grok xem :>

![image](https://hackmd.io/_uploads/HyTubvbjye.png)
![image](https://hackmd.io/_uploads/r1rY-PWsyx.png)
 
Yess, hóa ra hàm replace đã xóa “../” nhưng như grok nói, ta có thể thử ….//, giống việc validate xss là replace(“<script>”, “”) ta có thể dùng <sc<script>ript> (tự nhiên nghĩ đến =)) ) 
 
![image](https://hackmd.io/_uploads/rJocZP-i1g.png)
  
Bùm, confirm path traversal, nhưng giờ làm gì tiếp, tất nhiên là thử /root/
         
![image](https://hackmd.io/_uploads/SJ_s-PWi1l.png)

 
Nhưng dễ thế thì đã tốt T.T
Đang chưa biết làm gì, tôi sang kali scan vài cái xem sao :>
scan param ẩn bằng arjun ⇒ không thấy

![image](https://hackmd.io/_uploads/S1O6bDbs1x.png)

 
scan directory bằng dirsearch
         
![image](https://hackmd.io/_uploads/By40ZDboyx.png)

 
⇒ /logo (500)
/console (200)
/logo thì ta vừa xem rùi
/console

![image](https://hackmd.io/_uploads/H100WwZjkx.png)
![image](https://hackmd.io/_uploads/S1PkGw-iJg.png)

 
Lên internet xem sao
 
![image](https://hackmd.io/_uploads/HJ3JfvZjye.png)
![image](https://hackmd.io/_uploads/HkNefPbs1l.png)

Một vài thứ cần để tự generate pin
Đầu tiên cần username, lại chatgpt ta có:
![image](https://hackmd.io/_uploads/rywZGv-jkg.png)

Username: urmother
Modname là flask.app, tiếp theo là Flask
Tiếp là MAC của computer chuyển sang decimal
	 
![image](https://hackmd.io/_uploads/SyA-GwWi1g.png)
![image](https://hackmd.io/_uploads/H14MzPbs1e.png)

 
device id là eth0
![image](https://hackmd.io/_uploads/S1sGfwWsJx.png)

Đầu tiên tôi nghĩ cái dãy này cố định, nhưng sau vài lần khi vào instance mới thì nó lại khác :v
![image](https://hackmd.io/_uploads/BJuXGwWo1x.png)

Vậy MAC sang decimal là 113231594547997
Cuối cùng là machine-id
![image](https://hackmd.io/_uploads/BkeNMwbokx.png)
Đầu tiên ta thử /etc/machine-id
![image](https://hackmd.io/_uploads/HJAVMwbj1l.png)

Không có gì hết, vậy thử /proc/sys/kernel/random/boot_id
![image](https://hackmd.io/_uploads/ByZrzw-ikg.png)
![image](https://hackmd.io/_uploads/B1hBMDZi1x.png)

  
Đây là đoạn mã để gen ra pin, thử thui, copy đoạn code về, sửa lại thông tin ta vừa lấy được  
![image](https://hackmd.io/_uploads/Hk2IfDZoyg.png)

“Vui quá có flag rùi, thử pin nào”
![image](https://hackmd.io/_uploads/H1BPMD-okl.png)

:vvv, và sau khi thử lại rất nhiều lần, xem youtube exploit, đọc hint, nghe chat gpt thử /proc/self/maps, /proc/self/cgroup các kỉu vẫn không biết cách exploit T.T
 
--- 

# **Ezzzz**
Giải xong r là k mở được instance, sếp Trung vừa mở xong, e viết đây :v: 
![image](https://hackmd.io/_uploads/By15GPZiJx.png)
 
Thấy sơ sơ có chức năng add event gồm nội dung và ngày, thêm sort by title or date, test thêm vài cái bình thường ban đầu, thử html injection, xss
![image](https://hackmd.io/_uploads/SkCqzwbiye.png)

Không khả quan lắm, nhìn vào burp nào
/add
![image](https://hackmd.io/_uploads/rJOjzDWiyl.png)

/?status=success
![image](https://hackmd.io/_uploads/BkToGwbskx.png)

Tui có thử thay đổi giá trị của status nhưng vẫn trả về 200 như thường
Giờ ta thử 2 chức năng sort
![image](https://hackmd.io/_uploads/SkU2GDWiJe.png)

Endpoint /sort có param là key với 2 giá trị title và date, title thì theo thứ tự bảng chữ cái, date thì theo ngày tháng
Thử dấu ‘ xem có dính sqli không
![image](https://hackmd.io/_uploads/B1C3fv-oyx.png)

Lúc này tưởng đã confirm dính sqli rồi, mặc dù đúng là sqli thật nhưng chưa confirm được lắm, vì sau đấy thử không điền gì hoặc điền không đúng 2 giá trị title hoặc date đều sẽ hiện ra 500 internal server error
Sau một hồi chatgpt gợi ý ra những cái không có ích, thử payloadallthethings xem sao
 
![image](https://hackmd.io/_uploads/BJuTMPZsJl.png)
![image](https://hackmd.io/_uploads/B1e0Gv-oke.png)

Thành công, confirm sqli, và là blind sqli, giờ cần tìm logic để có thể exploit
Sau một hồi thử rất nhiều kiểu, thắc mặc tại sao lại vậy, hành vi như nào
 
![image](https://hackmd.io/_uploads/H1LAMP-okg.png)
![image](https://hackmd.io/_uploads/HyKRGD-ikg.png)
![image](https://hackmd.io/_uploads/H1sAGvWs1g.png)
![image](https://hackmd.io/_uploads/SJA0Gwbiyx.png)

 
 
Và vân vân =))
Lúc đó do mới chỉ add một 1 even nên tui chưa thấy được sự khác biệt, mặc dù vẫn chưa hiểu tại sao phải để đúng là date và title, đáng phải đi vào title và vẫn response 200, sort by title chứ T.T, thui kệ, tiếp nào
Sau khi nhận ra là chưa thêm vào, tôi thử thêm event, nội dung là các kí tự chữ bảng chữ cái để dễ phân biệt
![image](https://hackmd.io/_uploads/Hku1XPZoJl.png)

 
Và để ngày của a sau ngày của b, để nếu sử dụng sort thì sẽ phân biệt khi query được gọi nó rơi vào cái nào
 
![image](https://hackmd.io/_uploads/B1UxXPbjyl.png)
![image](https://hackmd.io/_uploads/BJpg7Dbjyl.png)


Vậy là coi như có logic để nhận ra sự khác biệt
         

![image](https://hackmd.io/_uploads/Sk9b7wZoJe.png)
nhưng khi thử để bắt đầu lấy thông tin db, thì lại lỗi
![image](https://hackmd.io/_uploads/S1_MmDZj1x.png)
 
Con gpt nó rep như z, còn smirk mình, quá láo :v
Nhưng có vẻ sai, vì sau khi đi tra thì vẫn được, và tui có thử CASE WHEN SUBSTR(‘ab’,1,1) = 1 và CASE WHEN SELECT 1 = 1 thì nó vẫn trả ra, chỉ khi thử database() là báo lỗi, vậy cần phải tìm xem server đang dùng sql server nào
![image](https://hackmd.io/_uploads/SJ3mmDZo1g.png)

 
Thế là tui tin là postgreSQL, thử current_database() các thứ trong postgreSQL vẫn không được, quá nản =)), đã thử mysql, microsoft sql server,.. và về đến nhà đợi phase2 thử sqlite3 T.T
 
![image](https://hackmd.io/_uploads/HkbVQwZokg.png)
![image](https://hackmd.io/_uploads/rJ9EXvbskg.png)

 
Và ta có payload 
(CASE WHEN (SUBSTR((SELECT name FROM sqlite_master WHERE type='table' LIMIT 1),1,1)='a') THEN date ELSE title END)
![image](https://hackmd.io/_uploads/SyYI7P-jJg.png)

Sau khi thử từ a trở đi
![image](https://hackmd.io/_uploads/HkmDXw-ikg.png)

Đến ‘s’, sort đã thành sort by date, tức điều kiện when khi này đúng, vậy từ đầu tiên của table_name thứ nhất là s, cứ thế mới kí tự, nhưng làm thủ công trông có vẻ mỏi, ta có thể dùng intruder, nhưng tui nghĩ nếu dùng intruder thì so sánh như nào, vì length hay size đều giống nhau, vào pytthon thuii
![image](https://hackmd.io/_uploads/H1yumDZs1l.png)

Paste vào vscode ta được
 ![image](https://hackmd.io/_uploads/HJNdQPbsJg.png)

Giờ vũ trang lại nó xíu là exploit được ngay :>
![image](https://hackmd.io/_uploads/H1jdmPZoJe.png)

Test để kiểm tra vẫn bình thường, tiếp tục nào
Ban đầu tôi định dùng sql-anding, so sánh bit để tìm ra từng kí tự cho nhanh, nhưng có vấn đề là sqlite không có ASCII(), tôi thử search thì có UNICODE(), nhưng nó hoạt động không đúng lắm, nên tôi ta lại thử tất cả các kí tự vậy :>
![image](https://hackmd.io/_uploads/B19t7PZjye.png)

  sau một hồi prompt engineering thì khi chạy ta sẽ có flag, em đang định chạy thì instance bị đóng nên thui :v
BKSEC{B00l34n_4nd_3rr0r_B4s3d_SQLi_4r3_P0w3rfu1_TechniquesKQcdaIJNPD52aIKn}
 
---
    
# **low-effort-sns-2**
build
![image](https://hackmd.io/_uploads/rJWjmPZjkx.png)
![image](https://hackmd.io/_uploads/ryvjQwZiyl.png)

Có vẻ như toàn là api, không có gui
Vì tôi k code golang nên chắc sẽ phải chatgpt nhiều, xem nàooo, writeup real time :v
Có vài chỗ để ý
![image](https://hackmd.io/_uploads/BJpjXDWoyl.png)
![image](https://hackmd.io/_uploads/H1WnQD-s1x.png)

 
Cũng có vài gợi ý :>
![image](https://hackmd.io/_uploads/H1Y2QP-okx.png)

Xem tiếp các file khác
Sau khi xem qua một lượt thấy, mặc dù không hiểu code lắm nhưng ngờ ngợ xíu các chức năng
Signup, login, secret gì đó, profile, có hàm hash và check password
![image](https://hackmd.io/_uploads/HyxaQv-ikx.png)

Rồi trong authentication liên quan đến khoá bất đối xứng rsa, maybe rsa256
![image](https://hackmd.io/_uploads/BJ76QvZoyl.png)

Và các chức năng khác :v
Thử đăng ký trước đã
![image](https://hackmd.io/_uploads/H1FTXvWi1g.png)

![image](https://hackmd.io/_uploads/H10yVv-okx.png)

Thử curl xem
![image](https://hackmd.io/_uploads/BJ6lNPWikl.png)

Có vẻ đã đăng ký thành công, giờ thử đăng nhập
![image](https://hackmd.io/_uploads/S14ZVvZskg.png)
![image](https://hackmd.io/_uploads/Bkub4v-jJx.png)

 
Vậy là đã thành công :>
Token trả về là jwt để xác thực người dùng
![image](https://hackmd.io/_uploads/B1mf4Pbs1e.png)
![image](https://hackmd.io/_uploads/SyOzEvZikg.png)

 
Đúng là trong secret của admin sẽ có flag
Ta sẽ bám theo hướng này
![image](https://hackmd.io/_uploads/S1JQVDZs1l.png)

Thử đổi role thành admin
![image](https://hackmd.io/_uploads/HJ9mEDZo1e.png)

  ta cần biết public và private key
Tìm hiểu xem cách tạo jwt token
![image](https://hackmd.io/_uploads/S11S4Pbikx.png)

Muốn thay đổi role trong payload, ta cũng phải thay đổi cả chữ ký, vậy giờ cần tự tạo ra chữ ký
Thử hỏi chatgpt coi sao
![image](https://hackmd.io/_uploads/HyQB4wbsJx.png)

Sau khi tra chatgpt, grok, internet các thứ thì tui vẫn chưa tìm ra cách để tự ký T.T
Sau khi chả biết làm gì nữa : ) thì mình xem lại mấy file, vào file handlers.go thì thấy endpoint này

![image](https://hackmd.io/_uploads/S1ABVPZoJg.png)

![image](https://hackmd.io/_uploads/rJEI4v-iyl.png)

Có vẻ ta có keys gì đó, search tiếp thui
 

![image](https://hackmd.io/_uploads/Hy5LVvWs1x.png)
![image](https://hackmd.io/_uploads/SJ08Nw-o1l.png)
![image](https://hackmd.io/_uploads/r1XvNDZsJx.png)

 
Ta đã có public và private key từ đoạn code grok cung cấp :>
![image](https://hackmd.io/_uploads/SkivEv-iye.png)

Giờ thử gen jwt trên jwt.io lại
Cho lại jwt của mình hiện tại vào
![image](https://hackmd.io/_uploads/BJN_NvbiJl.png)

 
Thay role thành admin, expired thêm số vì nó đã bị expired và thêm public và private key vào
![image](https://hackmd.io/_uploads/ryg9VDboJl.png)

Giờ ta đã có jwt với role admin
![image](https://hackmd.io/_uploads/rkI9NvZikg.png)



Exploiteddd.

---
         
# **Forensics: introduction2mem4**
Sau khi giải nén file author cấp ta được 2 file, một file là challenge.zip, một file là checksum.txt
![image](https://hackmd.io/_uploads/HypsEvbskl.png)

Sau một hồi thử unzip file challenge.zip thì tui chưa biết cách nào, nhưng chợt nhớ ra biết đâu cái pass giải nén file zip đầu cũng là của cái này, thế là thử, bùm :>
![image](https://hackmd.io/_uploads/rJMnEvZiJx.png)

Ta đã có file memdump.mem
![image](https://hackmd.io/_uploads/S1v2Nv-oJx.png)

File vẫn còn nguyên vẹn
![image](https://hackmd.io/_uploads/Hka2VDZokg.png)

Sau khi thử BKSEC{d0_n0t_p4sS_s3cr3TZ_0n_th3_cmDljn3} sai
Có vẻ còn flag BKSEC{l00k_ljk3_w3_h4v3_a_n3w_ nhưng chưa hết
Giờ nc đến ip author cấp nc 10.8.0.1 10001
Đến đây sau khi vào sẽ có câu hỏi 
![image](https://hackmd.io/_uploads/B1xaEPboJe.png)
![image](https://hackmd.io/_uploads/SJNp4v-oJl.png)

 
Vậy windows version là 10
![image](https://hackmd.io/_uploads/S1KTVwZoJx.png)

Và câu hỏi tiếp theo là when memory is dumped
Ban đầu khi chưa có volatility, em dùng
![image](https://hackmd.io/_uploads/SyAT4D-syx.png)

Nhờ chat gpt convert nhưng sai
 
![image](https://hackmd.io/_uploads/SycAEP-oJl.png)

Nhưng như ảnh trên ta có 
![image](https://hackmd.io/_uploads/H16ANDZjJl.png)

Chuyển về giờ việt nam UTC+7 ta cộng 7 tiếng
	2025-02-20 22:05:26
Vậy có thể đáp án câu tiếp theo là 2025-02-20 22:05:26
Bingbong, hết giờ :v T.T
