PicoCTF 2025
Web Exploitation
Cookie Monster Secret Recipe
Cookie Monster has hidden his top-secret cookie recipe somewhere on his website. As an aspiring cookie detective, your mission is to uncover this delectable secret. Can you outsmart Cookie Monster and find the hidden recipe?You can access the Cookie Monster here and good luck

Bài web này free flag nên không có gì cần bàn.
head-dump
Welcome to the challenge! In this challenge, you will explore a web application and find an endpoint that exposes a file containing a hidden flag.The application is a simple blog website where you can read articles about various topics, including an article about API Documentation. Your goal is to explore the application and find the endpoint that generates files holding the server’s memory, where a secret flag is hidden.The website is running picoCTF News.
Lướt web 1 lúc tôi thấy có dòng sau:

Thì 2 link đầu đều redirect đến chính nó nên thôi không phải bàn.
Link cuối cùng thì chuyển hướng đến đây:

Ta sẽ có 1 list các API để ta có thể sử dụng, đáng chú ý phần cuối cùng: GET /heapdump
Expand -> try it out sau đó là Execute thì bạn sẽ gửi request này đến server:
Sau đó ở phần response body ta sẽ nhận được 1 file như sau:

Mỗi lần gửi request ta sẽ nhận được 1 file snapshot khác nhau. Trong file đó có chứa flag:

Bài này cũng không có gì đặc biệt lắm nên tôi sẽ không giải thích nhiều.
n0s4n1ty 1
A developer has added profile picture upload functionality to a website. However, the implementation is flawed, and it presents an opportunity for you. Your mission, should you choose to accept it, is to navigate to the provided web page and locate the file upload area. Your ultimate goal is to find the hidden flag located in the
/rootdirectory.You can access the web application here!
Ở bài này bạn sẽ có quyền Upload 1 file lên server.
Sau khi upload nó sẽ hiện path -> có thể là vuln path traversal:


Sử dụng vuln để đọc file:


Sau đó ta chỉ cần đọc file flag trong /root nhưng nó không nhanh vậy. User bình thường không thể đọc được, chỉ có user root mới có quyền access. Tôi thử sudo -l và điều bất ngờ là không cần nhập pass:

Và tôi có thể sử dụng tất cả các lệnh dưới quyền sudo mà không cần nhập password:

SSTI1
I made a cool website where you can announce whatever you want! Try it out!I heard templating is a cool and modular way to build web apps! Check out my website here!


Như đề bài cũng chỉ rõ rằng trong website này xuất hiện vuln SSTI ( Server Side Template Injection)

Nếu tôi test với {{7*'7'}} thì tôi nhận được output sau:

⇒ Server side sử dụng Jinja2
Sau đó tôi tham khảo blog sau và làm tiếp đến bước này
payload:

subprocess.Popen tại index 356 ⇒ payload bây giờ sẽ trở thành:
Bây giờ sử dụng nó để liệt kê xem file flag nằm ở đâu


Khi làm bài này, tôi tham khảo bài blog sau: https://viblo.asia/p/server-side-template-injection-vulnerabilities-ssti-cac-lo-hong-ssti-phan-3-Ny0VGjAYLPA
3v@l
Trong bài sau nếu tôi nhập 1 chữ cái bất kì, tôi sẽ nhận được lỗi sau:

Hoặc số có dấu . (float number). Nếu tôi nhập 1.1 + 1.2 thì sẽ nhận ngay lỗi:

Nếu nhập số hoặc biểu thức thì tôi sẽ được kết quả của nó:

Hệt như cách eval ở Python:

Vậy để có thể gọi được các command tôi cần import các thư viện như os hay subprocess.
Nếu tôi truyền command sau:

Bây giờ ta cần bypass filter. Filter ở bài này tôi nghĩ nó bắt theo cụm từ nguy hiểm
Tôi đã thử rất nhiều payload để xem kết quả là gì. Ở đây tôi sẽ liệt kê các kết quả mà tôi nhận được

Kế thừa payload trước tôi phát triển nó thành:

Xác định mục tiêu của mình là đọc file flag.txt.
Tiếp theo, tôi sử dụng payload sau:

Payload cuối cùng:

Đọc thử file app.py xem nó viết gì mà hardcore thế :))
SSTI2
I made a cool website where you can announce whatever you want! I read about input sanitization, so now I remove any kind of characters that could be a problem :)I heard templating is a cool and modular way to build web apps! Check out my website here!
Giao diện khá giống với SSTI1 nhưng khả năng bài này có tí filter rồi :)). Thử xem payload bài đầu tiên còn áp dụng được không. Do là payload đó có 1 chút bypass filter rồi.
Ở server này vẫn tiếp tục sử dụng Jinja2 để xử lí logic khi tôi test với 7 * '7'

Nếu truyền vào các kí tự trong blacklist bạn sẽ nhận được thông báo:

Do vậy tôi sẽ thử guessing blacklist xem những kí tự nào đã bị filter
Làm tương tự:
Và sau đó bạn sẽ nhận ra rằng bạn mất đi kí tự [, ], _, .
Nếu bạn gửi 7.2 hoặc 7_2 + 2 thì kết quả 74, tức dấu . _ đã bị loại bỏ khỏi chuỗi.
Còn khi truyền 2 kí tự liên tiếp 1 mình thì nó sẽ hiện như trên: Stop ... me.
⇒ Chốt lại, tôi sẽ không thể insert trực tiếp các chuỗi vào (nó sẽ được loại bỏ)
... (khoai quá làm sau)
WebSockFish
Can you win in a convincing manner against this chess bot? He won't go easy on you!You can find the challenge here.
Hint: Try understanding the code and how the websocket client is interacting with the server
F12 và bạn sẽ thấy ngay source của nó, và đây là cách nó kết nối đến stockfish

Websocket sẽ gửi các message dến server và nó sẽ hiển thị trong event data:

Đây là logic chính của nó:
Vậy để thắng được ván cờ ta cần giá trị lợi thế của mình ở mức tuyệt đối nên tôi sẽ sửa giá trị eval và gửi đi 1 chuỗi eval 10000 hoặc eval -10000
Sau 1 nước đi "ngu" của tôi thì tôi sẽ nhận được message sau từ stockfish:

Và giá trị eval nó gửi đi là 127 ⇒ Tôi có bảng sau (nhưng ngược lại)

Và tôi phải chỉnh 3 lần với 3 giá trị khác nhau thì lúc đó tôi mới nhận được chiến thắng và lấy flag :))



Binary Exploit
PIE_TIME_1
Can you try to get the flag? Beware we have PIE!Connect to the program with netcat:
The program's source code can be downloaded here. The binary can be downloaded here.
Payload:
Hash_only_1
Here is a binary that has enough privilege to read the content of the flag file but will only let you know its hash. If only it could just give you the actual content!Connect using
ssh ctf-player@shape-facility.picoctf.net -p 59937with the password,1db87a14and run the binary named "flaghasher".You can get a copy of the binary if you wish:scp -P 59937 ctf-player@shape-facility.picoctf.net:~/flaghasher .
Bài này sẽ thực hiện hash file /root/flag.txt và sau đó in ra màn hình chuỗi hash đó.

Ở đây md5sum không sử dụng absolute path nên ta có thể ghi đè nó với 1 chương trình mà tôi có quyền custom:

Path của chương trình này nằm ở: /home/ctf-player.
Để thực hiện việc ghi đè, đầu tiên tôi sẽ ghi đè vào biến môi trường $PATH. Vì biến $PATH là biến xác định các chương trình hệ thống của Linux.
Giá trị mặc định của biến $PATH: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
Để có thể ghi đè được md5sum ta cần ghi vào đầu biến $PATH này. Thứ tự ưu tiên của nó sẽ là 1.
Sau đó exec flaghasher và đợi nó exec chương trình của mình là xong

PIE_TIME_2
Can you try to get the flag? I'm not revealing anything anymore!!Connect to the program with netcat:
The program's source code can be downloaded here. The binary can be downloaded here.
Payload:
Hash_only_2
Here is a binary that has enough privilege to read the content of the flag file but will only let you know its hash. If only it could just give you the actual content!Connect using
ssh ctf-player@rescued-float.picoctf.net -p 61511with the password,fa005713and run the binary named "flaghasher".
Binary ở bài này hệt như bài đầu tiên (check hash). Nhưng nó đã dùng đến restricted bash khiến ta không thể làm những thứ rbash không cho phép.
Bạn có thể escape lên 1 shell khác bằng cách sử dụng perl hoặc awk:

Bây giờ tôi đã thoát khỏi rbash ban đầu và có thể tự do di chuyển giữa các thư mục mà tôi có quyền đến và tạo file thêm giá trị tùy ý:

Thêm quyền exec cho tệp md5sum này.
Sau đó tôi thêm path của tôi vào trước path của md5sum gốc:

Run flaghasder rồi lụm thôi:

Echo Valley
The echo valley is a simple function that echoes back whatever you say to it.But how do you make it respond with something more interesting, like a flag? Download the source: valley.c Download the binary: valley Connect to the service at
nc shape-facility.picoctf.net 52856
Handoff
Download the binary here Download the source here Connect to the program with netcat:
$ nc shape-facility.picoctf.net 62055
Vuln at: row 32 in handoff.c
Hoặc có thể xem vuln bằng cách compile source:

Đầu tiên tôi sẽ tính xem stack là bao nhiêu đẫ.


Stack sẽ trông như sau:
Màu xanh lá ⇒ choice
Màu cam ⇒ entries
Màu vàng ⇒ feedback
Màu xanh dương ⇒ total entries
Bên dưới màu vàng: rbp
Bên dưới màu xanh dương: return address

Ngoài ra ta có 1 gadget call rax để kích hoạt shellcode từ stack:

Payload dưới đây tôi đã chia ra làm 3 stage rõ ràng để khai thác bài này, bạn có thể debug từng stage 1

Bài này có nhiều yếu tố hơi lừa player bởi vậy tôi thấy bài này ko hay vì nó quá nhiều thông tin nhiễu như libc sử dụng csu này, rồi yếu tố overflow ở stage 1 :)).
Last updated
Was this helpful?
