---
# System prepended metadata

title: Chơi CTF giải trí tí thôi (giải CTF n00bzunit3d 2024)

---

# (Giải CTF n00bzunit3d 2024)
## Write up phần web
Nói thiệt mình là 1 thằng rất nghiện mấy cái trò CTF này. Chắc là do cái tính hay tò mò, cứ thấy cái gì bí ẩn là phải mò ra bằng được. Mấy ae biết cảm giác đó không? Giống như kiểu bạn đang chơi trò ghép hình, mà mảnh ghép cuối cùng cứ lẩn trốn đâu đó, khiến mình cứ phải tìm mãi, đến khi tìm ra rồi thì phê không thể tả! Nhưng câu chuyện quan trọng là mình chơi cái này là để học hỏi nhiều thêm và giải trí sau nhưng giờ lao động vất vả :)))) 
OK mình vào bài đi, viết nhanh cái writeup này t còn đi ăn kem với ny :))))) ('mấy đứa ko có ny chắc cay hehehe')
## Bài 1. Passwordless
![image](https://hackmd.io/_uploads/BkNF5BX9A.png)

**Vào đọc source:**
![image](https://hackmd.io/_uploads/H1SNsHQqA.png)

Nhìn vào source, mình nhìn ngày vào cái dòng return flag. ok!!! Nhìn có vẻ có dễ có flag nhưng phải qua vài bước. Để lấy được flag kia, mình phải bypass qua phần /<uid> kia, tuy nhiên do mình không biết cái thư viên uid kia là gì nên mình sẽ copy về chỉnh sửa lại 1 tí và chạy: 
![image](https://hackmd.io/_uploads/Sk8PpHX5A.png)
Quá ngắn gọn cho một cuộc tình, chỉ cần biết uid và GET đến nó thế là flag thuộc về tay em:
![image](https://hackmd.io/_uploads/rJeQRHmcC.png)
    
## Bài 2. Focus on yourSELF
![image](https://hackmd.io/_uploads/Syj1irmqR.png)

**Vào đọc source**
![image](https://hackmd.io/_uploads/BJn60HQ90.png)

Vừa vào đọc source, nhìn thấy cái flag. Mình nghĩ sao cái bài này dễ thế!!! Nhưng không, cái ông là bài này lừa đảo vãi :))))

**Giờ mình nào link xem thử có gì?**
![image](https://hackmd.io/_uploads/ryjwJ8XqA.png)

Vừa vào, theo kinh nghiệm phần tích thì mình nghi ngờ bài nào là [lỗ hổng file_Upload](https://viblo.asia/p/file-upload-vulnerabilities-cac-lo-hong-upload-tep-tin-phan-1-3kY4gnr0VAe). Nhưng sau khi test ra một hồ thì lại chả ra cái gì, nản vãi!!!!
    
Nhưng mà mình vừa phát hiện ra cái gì đó!! Hmmmm
![image](https://hackmd.io/_uploads/BJfNgLQqA.png)
wow!!! nhìn vào cái này bạn đoán được gì, nghi ngờ của mình là XSS, path traversal... Mình liên test với '/etc/passwd'.
    
![image](https://hackmd.io/_uploads/H1isgLm9A.png)
Và tất cả đều ra như thế này cho đến khi..... Hmmm, File quá lớn à, nãy giờ có cái ảnh nào để xem đâu mà lớn vs chả bé!!! Mạnh dạn chui vào inspect source, thì thấy có một đoạn ký tự nhìn có vẻ đã bị mã hóa.
![image](https://hackmd.io/_uploads/Bk-LbImqR.png)

OK, thế thì đi giải mã thử. Và hehehe :))))), thế thì biết rồi nhá. Và sau một hồi lay hoay và nhờ ông anh tiền bối chỉ thì ông cho mình cái [link](https://book.jorianwoltjer.com/linux/analyzing-processes) này.
![image](https://hackmd.io/_uploads/Sytnb879R.png)

/proc/self là một thư mục đặc biệt trong hệ thống file của Linux. Nó không phải là một thư mục thực tế lưu trữ trên ổ cứng, mà là một phần của hệ thống file ảo '/proc'. Mỗi quá trình trên hệ thống Linux có một thư mục riêng trong /proc, được đặt tên theo Process ID (PID) của nó, ví dụ như /proc/1234 cho PID 1234.
Nếu không biết PID của quá trình hiện tại thì có thể truy cập thông tin của nó qua /proc/self mà không cần biết hoặc tra cứu PID cụ thể.
*Ví dụ: Bạn có thể đọc file /proc/self/environ để lấy các biến môi trường của quá trình hiện tại.*

Và sau một hồi thử thì mình thấy:
![image](https://hackmd.io/_uploads/BkxjQLQq0.png)

## Bài 3. File Sharing Portal
![image](https://hackmd.io/_uploads/B1ze6WX5A.png)

Để giải được bài này ae cần biết qua một số kiến thức như [Symlink, zipslip](https://hackmd.io/@Nightcore/H1TtxG9YT#b-RCE) và [lỗ hổng SSTi](https://book.hacktricks.xyz/pentesting-web/ssti-server-side-template-injection)

**Vào bài:**
![image](https://hackmd.io/_uploads/rJDapbmqR.png)
Đây là giao diện bài, lúc mình mới nhìn qua mà chưa đọc source mình liền nghĩ ngày đến lỗ hổng File upload. Nhưng khi sau một vài lần test upload file của mình lên thì server chỉ nhận được loại file '.tar'. Đây là 1 loại file nén.


**Vào đọc source:**
![image](https://hackmd.io/_uploads/rJuvMf750.png)


Thì khi mình đọc được source thì mình chú ý nhất 2 điểm là: hàm extractall() và render_template_string(). Nhờ 2 hàm này mình liền nghĩ đến 2 lỗ hỗng đó là symlink hay zip slip và lổ hổng SSTi. Nhưng có điểm phải chú nữa là tên file rar của chúng ta khi được up lên sẽ được đặt lại thành 1 tên mới(Cái dòng tạo tên bằng sha256 random có má :))))

### 1. Lấy Flag với cách Symlink:

#### Symlink
Để mình nói sơ qua về symlink vào:
![image](https://hackmd.io/_uploads/BkiZ7GQ9R.png)
Đấy như cái hình trên á, là cách mình tạo ra 1 symlink, dòng lệnh đầu tiền là mình tạo ra symlink với tên là link và nó được trỏ vào '/etc/passwd'.

![image](https://hackmd.io/_uploads/HkHh7MmcR.png)
Để xem nó là loại file gì thì sử dụng lệnh file(lệnh này mình hay sử dụng trong các bài misc,foren các kiểu để biết là nó loại file gì):
![image](https://hackmd.io/_uploads/HycgGfm5R.png)
Chúng ta cũng có thể xem lại nó bằng 'ls -ln' thì thấy link mũi tên kia sẽ trỏ vào '/etc/passwd'. OK vậy nếu chúng ta kích hoạt 'link' thì nó sẽ như thế nào.
![image](https://hackmd.io/_uploads/SJ27ZzQcC.png)
Như ở trên chúng ta sẽ thấy kết quả sẽ là nội dung trong 'etc/passwd'. 
Như thế chúng ta có thể hiểu là gì? Symlink chỉ là một "điểm chỉ đường", nó không chứa dữ liệu thực tế của tệp đích. Và 'link' -> '/etc/passwd' thì 'link' sẽ được chuyển hướng đến 'etc/passwd'.

#### Tìm Flag
Bây giờ mình vì file tải lên bắt buộc là đuôi file '.tar' nên mình sẽ nén thì file tar. Mình sẽ nhét cái link mới này vào. Để khi nếu file được giải nén trên server thì khi chúng ta bật chế độ xem thì chúng ta sẽ được nội dung 'etc/passwd' của hệ thống.
![image](https://hackmd.io/_uploads/SkKgnGX90.png)
Bây giờ mình sẽ thử đẩy lên, xem thử có được không
![image](https://hackmd.io/_uploads/BJJbpM7cA.png)
Ok! Thế là đã up lên được và đã giải nén. xem thử thử có cái gì trong link kia không ? và WOW
![image](https://hackmd.io/_uploads/S1p46zQq0.png)
Có vẻ như cách khai thác này sẽ giúp cho chúng ta tìm ra cờ. Bây giờ mình sẽ phát triển theo cách này xem thử có lấy được cái gì không.
Chúng ta quay lại source bên trên, thì sau khi được upload thì tất cả file trong folder tar sẽ được lưu trong trong một folder có tên ngâu nhiễn. 
Mạnh dạn chúng ta sẽ tạo ra một cái Symlink được trỏ từ thư mục gốc để nó trỏ ra dần để xem các file khác trên hệ thống.(thì sẽ có như thư mục gốc như var, www, uploads,.... và app). Mình liên tạo ra thử và test:
![image](https://hackmd.io/_uploads/r12LXm75C.png)
Cứ tưởng lấy được flag rồi nhưng không!!! Thì mình xem tham khảo thì thấy trong nén tar có parameter là --absolute-names: Tùy chọn này yêu cầu tar lưu giữ đường dẫn tuyệt đối cho các tệp được thêm vào archive. Điều này có nghĩa là khi bạn giải nén tệp tar sau này, các tệp sẽ được phục hồi vào vị trí của chúng trên hệ thống tệp, không chỉ trong thư mục hiện tại. Thể là đi nén thử rồi test tiếp :)))
![image](https://hackmd.io/_uploads/B1CHPXXcR.png)
Sau khi upload lên như này nghĩa là được 
![image](https://hackmd.io/_uploads/HyFC4XXcC.png)
Mình sẽ đổi /view/<name> thành 'meo'
![image](https://hackmd.io/_uploads/B1Q_um790.png)

### 2. Lấy Flag với cách lỗ hổng SSTi:
Ở cách này chúng ta sẽ tìm cách khai thác vô chỗ này:
![image](https://hackmd.io/_uploads/HyuvFHm5R.png)
Bây giờ mình sẽ tạo một file có tên là payload SSTi và sao đó nén tar vào folder.tar. Bởi vì sau khi upload được lên folder, hệ thống sẽ được giải nén và lợi dụng việc xem tên file và hàm 'render_template_string' kia chúng ta sẽ đặt tên file trong folder bị nén sẽ là các payload SSTi.  
![image](https://hackmd.io/_uploads/r13jtQ7qA.png)
Và đây, mít sần com bờ le te :)))):
![image](https://hackmd.io/_uploads/SJK1qXQc0.png)
Cứ như thế ta sẽ thày chô 'id' thành 'ls' hay 'ls ../', để cuối cùng tìm ra tên file flag và 'cat' đọc ra cái cờ và ném lên trả bài
    
    
    
Đây là bài viết đầu tiên mình viết nên còn nhiều sai sót, nếu sai sót hay cần góp ý thì các bạn cứ mạng dạn nhá comment nhé.
    
Discord *baoprozxc999#1611*
GitHub :))))

[link source code bài này](https://github.com/TranKuBao/File-Sharing-Portal-)
[link thông tin giải này]()