829 words
4 minutes
Bloody Xmas 2024 CTF

นี่ก็จะเป็น ctf ครั้ง 2 ที่ผมได้เล่นของทาง secplayground ต้องบอกเลยว่า สามารถใช้อัพความรู้และ skill ได้เยอะเลยทีเดียว อย่างรอบที่แล้วผมก็ทำได้ไม่เยอะเท่าไหร่ แต่ก็สามารถอ่าน write up ของคนอื่นในโจทย์ที่เราทำไม่ได้หรือทำได้ก็อ่านเหมือนกันเผื่อจะได้แนวคิดมาปรับใช้บ้าง และก็เป็นผลจริงๆในข้อที่ผมไม่รู้เรื่องเกี่ยวกับการอ่าน log ของ windows เลยก็พอทีจะถูๆไถ่ๆ ไปได้ ในรอบนี้

แล้วก็ในรอบนี้ผมก็พยายามเขียนรายละเอียดของแต่ละข้อให้ได้เยอะที่สุดละ แต่จะมีบางข้อที่ไม่ได้แคปจอไว้ เลยจำไม่ได้ว่า ว่าทำอะไรไปบ้าง ก็หวังว่าทุกคนจะได้แนวคิดในการเจาะหรือวิเคราะห์จากผมไปบ้างนะครับ และก็ขอแนวคิดจากทุกคนบ้างนะ

image.png

Web Application Security#

Bespoke Library#

image.png

ข้อนี้จะต้องค้นหาหนังสือผ่านโปรแกรมบน windows เท่านั้น ซึ่งดูแล้วก็น่าจะเขียนด้วย java

image.png

ถ้าลองใช้งานดูก็จะมีแค่ให้ค้นหาหนังสือเฉยๆ ก็น่าจะเป็นเรื่องที่เกี่ยวกับ sql injection แต่เราไม่สามารถใส่ อักษรพิเศษ ได้ เลย injection ไม่ได้ ถ้าลองใช้ burp suite มาดักข้อมูลดูก็ไม่เห็นมีอะไรวิ่งผ่าน proxy เลย

image.png

สุดท้ายก็ต้อง reverse ตัวโปรแกรมเพื่อดูโค้ดว่ามันทำงานอย่างไร และเปิดดูข้อมูลข้างในก็จะเห็นว่ามีไฟล์อยู่ประมาณนี้

image.png

เมื่อไล่อ่านโค้ดดูว่ามันทำงานยังไง ในไฟล์ ClientAppWithGUI.class ก็สรุปได้ว่าเชื่อมต่อกันด้วย TCP Protocol (ถึงแม้ว่าผมจะเขียน java ไม่เป็นแต่หลายๆภาษาก็คล้ายๆกันทั้งหมด สิ่งที่ผมจะไม่รู้เลยก็คือ Class แต่ละอันคืออะไรใช้ทำอะไร ไม่เป็นไรใช้ Google กับ AI ช่วยได้)

image.png

แล้วถ้ามาดูใน function openSearchPage ก็จะเห็นว่าส่งข้อมูลไปถามที่ server ยังไง

image.png

ทีนี้มาดูในไฟล์ Server.class ดูว่ามีอะไรที่น่าสนใจไหม ก็จะเห็นว่ามี Table secret อยู่แล้วมี insert flag เข้าไปเก็บไว้ด้วย เพราะงั้นเราก็จะต้อง injection ให้ได้เท่านั้นเอง

image.png

image.png

ผมก็จะใช้วิธีเดียวกันกับรอบ CTF ก่อนหน้า secplaygroundhackloween2024 นั้นก็คือการรันโค้ด java ที่เรา decomplie มาได้ แล้วก็ทำการ injection สะเท่านี้ก็ได้ flag แล้ว

image.png

misc{d0vxbacs89}

Bespoke Library 2#

image.png

ข้อนี้ก็ต้อง sql injection เหมือนกันแค่เขาบอกว่ามันจะปลอดภัยกว่าเดิม แน่นอนครับใน function queryBooks และ queryReviews มีการ bind params ก็ปลอดภัยเลย แต่ใน function queryCheck ยังต่อ string เหมือนเดิมก็ยังคง injection ได้อยู่ดี

image.png

แต่รอบนี้ไม่ว่าจะทำให้ query อะไรไปก็จะได้ reponse Done หมดยกเว้น query มัน error จะไม่ response อะไรกลับมา พอรู้แล้วก็ inject โล้ดดด เท่านี้ก็ได้ flag ละ

image.png

misc{Fq2OJ9Cvo2}

Log Christmas#

image.png

ข้อนี้ให้หาสิ่งที่ซ่อนอยู่ ข้อนี้ผมไม่ได้ flag เนื่องจากทำพลาดแล้ว restart vm จนครบ 3 ครั้งเลยทำอะไรต่อไม่ได้ งั้นเรามาจำลองโจทย์ข้อนี้กัน ข้อนี้จะเปิด อยู่ 2 port มี 80 และ 22 ซึ่งก็ทำให้เราสามารถ ssh เข้าไปได้

แต่ก่อนที่จะไปจำลองมาดูกันก่อนว่า ผมหาช่องโหว่เจอได้ยังไง ตอนแรกเข้าเว็บมาก็เจอหน้าเว็บธรรมดาอันนึ่ง ทีนี้ก็ลองหาสิ่งที่ซ่อนอยู่โดยเดา folder หรือ ไฟล์ ที่มีโดยใช้ wfuzz ก็จะเจอ folder public หลังจากที่เข้าไปดูก็จะเห็นว่ามีไฟล์ชื่อ file.php อยู่

image.png

image.png

ไม่ได้มีอะไรพิเศษเลยหน้าเว็บเปล่าๆ แสดงข้อความเฉยๆ

image.png

งั้นเรามาลองเดา prameter กันต่อ ไม่รู้ว่าอะไรดลบันดาลให้พิมพ์แค่ไม่กี่คำก็เจอเลย ^ ^ เจอช่องโหว่ file inclusion แต่ลอง php wrappers ต่างๆแล้วก็ทำไม่ได้ปิดไว้หมด แต่เขาจะเปิด port 22 ทำไว้ถ้าไม่ให้เรา ssh จริงไหม เพราะผมก็เลยลองหาดูว่ามีช่องโหว่ไหนไหมที่ใช้ file inclusion กับ ssh ก็ไปเจอ LFI to RCE via SSH Log File Poisoning

image.png

ก็คือเราสามารถไปดู log ssh ได้แล้วทำการ ssh ด้วย explot โค้ด php โดยที่ log จะเก็บไว้ที่ /var/log/auth.log

image.png

ถ้าเรา ssh โดยใช้ชื่อ user ทั่วๆไป แล้วไปดูที่ log อีกครั้ง ก็จะเห็น user ที่ ssh เข้าไปใน log

image.png

image.png

งั้นเรามาแทรก โค้ด php เข้าไปดู อ้าวววว ทำไมกัน คิดว่า terminal หรือ ssh version ใหม่ๆมันไม่ยอมแล้วมั้ง

image.png

งั้นลองใช้ kali version 2017 ดูสิ

image.png

ว้าว phpinfo ออกมาตามที่เราระบุไว้เลย

image.png

และแล้วผมก็ลองพลาดไปหลายรอบจนทำอะไรไม่ได้ จบแล้ว restart vm ไม่ได้

image.png

งั้นเรามาจำลองโจทย์ข้อนี้กัน เรารู้ว่าเขาใช้ php version 7.2.34 และใช้ apache แล้วโจทย์ ctf นี้ยังไงก็รันผ่าน container งั้นเราก็ใช้ docker มาจำลองกัน

docker-compose.yml

services:
php:
build:
context: .
dockerfile: Dockerfile
ports:
- 80:80
- 22:22
volumes:
- ./src:/var/www/vhosts/0x01code.me/httpdocs/blog/

Dockerfile

# ใช้ PHP Apache image
FROM php:7.2.34-apache
# ตั้งค่า environment เพื่อป้องกันคำถามในระหว่างติดตั้ง
ENV DEBIAN_FRONTEND=noninteractive
# ติดตั้ง SSH server, rsyslog และ utility ที่จำเป็น
RUN apt-get update && \
apt-get install -y openssh-server rsyslog && \
mkdir /var/run/sshd && \
apt-get clean
# สร้างโฟลเดอร์ log และตั้งค่า rsyslog ให้บันทึก log SSH
RUN mkdir -p /var/log/ssh && \
echo "LogLevel VERBOSE" >> /etc/ssh/sshd_config && \
echo "SyslogFacility AUTH" >> /etc/ssh/sshd_config
# เปิดใช้งาน root login และกำหนดรหัสผ่าน
RUN echo 'root:password' | chpasswd && \
sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
RUN usermod -aG adm www-data
# เปิด port ที่จำเป็น
EXPOSE 22 80
# กำหนด command เริ่มต้น (เริ่มต้นทั้ง rsyslog, SSH และ Apache)
CMD service rsyslog start && service ssh start && apache2-foreground

index.php

<?php include($_GET['file']); ?>

รันมันขึ้นมาแล้วเช็คดูว่าอ่าน log ssh ได้ไหม ตอนนี้ของผมรันขึ้นมาได้ปกติแล้ว

image.png

ทีนี้ลอง insert payload เข้าไปดูก็จะเห็นว่าสามารถใช้คำสั่ง os ได้ที่เหลือก็แค่ไปหา flag (จะทำ reverse shell ก็ได้นะ)

Terminal window
ssh "<?php system('ls -al'); ?>"@IP_ADDRESS

image.png

image.png

The Naughty List#

image.png

นี้จะเป็นข้อที่ให้อัพรูปได้ แต่ไม่ได้มีอะไรใช่ไหม

image.png

ถ้าเกิดว่าเราไปหาว่ามีไฟล์อื่นอีกไหมในระบบ ก็จะเจอไฟล์ view.php

image.png

พอเปิดเข้ามีก็เจอข้อความที่บอกว่า ต้องการ key

image.png

งั้นก็ต้องมาหา parameter กับ key กันก่อน ก็จะเจอ parameter secret แล้ว key ที่ถูกต้องละ

image.png

อยู่ตรงนี้ไง J2F0bmFzJyBzaSB5ZUsgIW9uIGhP แต่มันเข้ารหัสอยู่ก็เอาไปถอดรหัสด้วย base64 สะแล้วก็ reverse คำเพราะงั้น key ก็คือ santa

image.png

image.png

แต่ยังไม่จบต้องหา parameter อีกตัวซึ่งนั้นก็คือ file แล้วก็ใส่ path รูปที่เราพึงอัพไป

image.png

response มาแบบนี้ก็หวานเจี๊ยบ เลยสิ เอาฝั่ง payload ในรูปโลดดดด

image.png

แล้วก็ exploit เท่านี้ก็ได้ flag แล้ว

image.png

web{vEORluJH4H}

Reverse Engineering#

Secplaysomware#1#

image.png

สำหรับข้อนี้เขาจะให้หา hashsum ของไฟล์ ปกติแล้วก็คงจะถาม algorithm sha256 แหละ เพราะก็ใช้เว็บ https://emn178.github.io/online-tools/sha256_checksum.html ในการเช็ค เท่านี้ก็จะได้ flag ไปตอบแล้ว แต่ต้องตอบเป็นพิมพ์ใหญ่นะ

image.png

re{B8AF9CBD706C13F5E7F20573FF5F2894966C905835BD7C026B8C96F20E304C0B}

Secplaysomware#2#

image.png

ข้อนี้ถามว่าเขียนด้วยภาษาอะไร ถ้าไปเช็คใน Detect It Easy แล้ว ก็จะเห็นว่าถูก Pack ด้วย UPX

image.png

หากไปลองเช็คดูว่า UPX คืออะไร เนื่องจากผมไม่เคยใช้มาก่อน หลังจากเก็บข้อมูลมาสักพักก็สรุปได้ว่า มันคือ pack ที่เอาไว้แปลงโค้ด python เป็น exe นั้นเอง เท่านี้ก็ลองไปตอบดู

re{PYTHON}

Secplaysomware#3#

image.png

ในข้อนี้ถามว่านามสกุลที่ ransomware ใช้ encrypt คืออะไร ถ้าเรามีไฟล์อยู่หน้า Desktop แล้วไฟล์มันถูก encrypt ก็จะเห็นว่า นามสกุลคือ qwerty

image.png

re{qwerty}

Secplaysomware#4#

image.png

ข้อนี้ถามว่าชื่อไฟล์อะไรที่สร้างขึ้นหลังจากที่รัน ransomware นี้ ตอนเล่นผมข้องค่อนคิดเยอะเกินไป ไปเช็คละเอียดเลยว่าหลังจาก process นี้ทำงานแล้วมีไฟล์อะไรถูกเขียนไปบ้าง เสียเวลาเลย 555 แต่จริงๆ ก็แค่ดูที่หน้า Desktop ก็จะเห็นว่ามีไฟล์ UNLOCK_README.txt ถูกสร้างขึ้นไฟล์นี้แหละคือ flag

image.png

re{UNLOCK_README.txt}

Secplaysomware#5#

image.png

ข้อนี้ถามว่า IV ที่ใช้ encrypt ไฟล์คืออะไร ก็ชัดเลยมันคือ aes ซึ่งเราก็รู้อยู่แล้วว่ามันคือโค้ด python เพราะงั้นเราก็ทำการแตกไฟล์จาก exe เป็น pyc ก่อน โดยใช้ pyextractor หลังจากได้ pyc แล้วก็นำไป decomplie แต่จากที่ลองมาหลายๆตัวจะไม่รองรับ python 3.12 กัน แต่ไปเจอ pylingual ซึ่งรอบรับก็ทำให้เห็นโค้ดทั้งหมด ถ้าอ่านโค้ดดูก็จะเห็นว่า IV คือ

image.png

re{secplaygroundgod}

Log Analysis#

Hideden Secret#

image.png

ข้อนี้เขาบอกว่ามีการโหลดไฟล์จากภายนอกเข้ามาเปิด ก็ต้องบอกว่าผมก็ยังดู log ของ windows แบบนี้ไม่เป็นไม่รู้ว่า event แต่ละอย่างคืออะไร แต่การที่ผมได้ไปอ่าน write up ของคนอื่นในรอบที่แล้วก็ทำให้รู้ว่าเป็นไปได้ว่าอาจจะโหลดไฟล์ผ่าน cmd หรือ powershell ก็ได้เลยลอง filter ดู และแล้วก็เจอสิ่งที่น่าสนใจคือ url github ตัวนี้

image.png

พอเข้าไปดูก็เจอ flag แต่มัน encrypt ไว้อยู่ มีทั้ง key และ iv ให้ก็น่าจะเป็น aes

image.png

เมื่อ decrypt ออกมาก็เจอ flag ที่แท้ทรู

image.png

forensic{WaitingUnderTheMistletoe}

The First Clue#

image.png

ข้อนี้ก็จะให้มาเป็น access log ก็น่าจะเป็นรูปแบบของ nginx หรือไม่ก็ apache ไม่แน่ใจ

image.png

เท่าที่อ่านดูทั้งหมดจะมีอยู่ 2 คนที่ใช้งานระบบนี้ ผมก็ไม่รู้นะว่าระบบนี้คือระบบอะไรแต่จะมีอยู่ 2 ip ใน log 172.17.0.1 และ 192.168.116.1 แล้วถ้าไปดูที่ไฟล์ error ก็จะมี อยู่ error เดียว เป็นไปได้ว่าอาจจะพยายาม hack เข้ามาก็ได้

image.png

ถ้าเอาเวลาที่ error ไปดูที่จุดอื่นๆ ก็ดูเหมือนว่าจะเป็นการเพิ่ม user ใน ระบบ

image.png

งั้นก็น่าจะเป็น FULL Date ตัวนี้แหละ พอดีไม่ได้แคปเจอไว้ ถ้าจำไม่ผิดก็ตอบแบบนี้แหละ

forensic{30/Nov/2024:14:08:18 +0000}

Digital Forensic#

Santa_Message#

image.png

ในข้อนี้เขาให้หาข้อความลับจากคลิปเสียง แล้วไฟล์ที่ให้มามี User Profile ของ Google Chrome อยู่ด้วยงั้นเราก็เราไปทับ Profile เดิมของเราหรือสร้างใหม่ก็ได้

image.png

ในที่นี้ผมสร้างใหม่ ก็จะได้ Folder Profile 1 ขึ้นมาแล้วก็ลบข้อมูลเดิมทิ้ง แล้วเอาข้อมูลใน Folder Default มาใส่

image.png

image.png

แล้วก็มาดูใน Chrome Profile ที่เราสร้างขึ้นมาใหม่ ใน History ก็จะเป็นข้อมูลที่เราเอามาใส่

image.png

เมื่อไล่ดูไปเรื่อยๆก็จะเจอ repo github นี้ เราใกล้ความเป็นจริงแล้ว ใจดีบอกเครื่องมือที่ใช้ถอดรหัสให้ด้วย

image.png

หลังจากใช้เครื่องมือตามที่โจทย์ให้มาก็จะเจอ flag แล้ว

image.png

image.png

forensic{santa_2024}

The Snowman’s Secret Message#1#

image.png

โจทย์ถามว่า มันคือชนิดไฟล์อะไร ก็ดู properties ก็เจอละว่าเป็น lnk ลองไปตอบดูก็ถูกต้อง

image.png

forensic{LNK}

The Snowman’s Secret Message#2#

image.png

ข้อนี้ถามว่า domain อะไรที่ดึงมาจากไฟล์ lnk แล้วดูที่ shortcut เท่านี้ก็เจอ domain แล้ว

image.png

forensic{dpaste.com}

The Snowman’s Secret Message#3#

image.png

ข้อนี้เขาถามว่าไฟล์อะไรที่ถูกโหลดใน stage ที่ 2 ถ้าดูจากข้อก่อนหน้าก็จะมี url อยู่ลองเปิดดูสิ https://dpaste.com/DF7SUQU2G.txt จะเห็นว่ามันคือโค้ด powershell งั้นลองมาถอดรหัสแต่ละอันดูโดยที่ เอาไปรันใน powershell

image.png

พอถอดออกมาแล้วก็จะเห็นข้อความทั้งหมด จะเห็นว่า โค้ดนี้จะไปโหลดไฟล์มา 2 ไฟล์ มี script.py และ Xmas.png ก็เอาไปตอบได้เลย

image.png

forensic{script.py;Xmas.png}

The Snowman’s Secret Message#4#

image.png

รอบนี้เขาถามว่าใช้ LOLBAS ตัวไหน เอ้า LOLBAS คืออะไรหว่า ไม่รู้จักต้องใช้เวลาสักพัก จนมาเจอเว็บนี้ lolbas-project งั้นก็น่าจะหมายถึงวิธีที่ใช้รึป่าวนะ ถ้าจำได้จากข้อก่อนหน้าจะมีข้อความ bitsadmin อยู่ด้วย ถ้าอ่านโค้ดดูก็น่าจะเป็นการโหลดไฟล์มาไว้ที่เครื่อง พอลองเอา bitsadmin ไปค้นหาใน lolbas-project ก็เจอเหมือนกันแหะ งั้น flag ก็น่าจะเป็น Bitsadmin.exe แล้วก็ถูกด้วยตามที่คิดไว้

image.png

forensic{Bitsadmin.exe}

The Snowman’s Secret Message#5#

image.png

เขาให้หาข้อความลับ ลองหาละ แล้วเอาทุกอย่างที่น่าจะเป็นไปได้มาตอบ แต่ก็ไม่ถูกสักอัน ทั้งข้อความที่อยู่ในไฟล์ DF7SUQU2G.txt และ script.py คิดว่าเป็น 25122024 แต่ก็ไม่ใช่

image.png

และสุดท้ายก็ไม่มีใครตอบได้เลย lol

image.png

Malware Infection#1#

image.png

ข้อนี้ให้หา url ไวรัสที่ไปโหลดมา โจทย์ให้ไฟล์ text กับ binary มาลองอ่านไฟล์ text ดู

image.png

ก็บอกชื่อโปรแกรมที่ใช้สร้างอยู่แล้วนิ ลองไปโหลดมาเปิดดู

image.png

ดูเหมือนว่าจะเป็นไฟล์ image นะ งั้นก็น่าจะเอา Chrome Profile มาใช้ได้อยู่แล้วดูที่ Download History ว่าโหลดไฟล์อะไรไปบ้าง

image.png

เจอไฟล์ที่น่าสงสัยนะ MinceraftCrack.exe

image.png

มาดูที่ History ต่อว่า URL ที่โหลดมาคืออะไร ก็จะเห็นว่า url คือ https://github.com/taipun/Minecraft/blob/main/MinecraftCrack.exe

image.png

ทีนี้ก็ลองมาเช็คดูว่าเป็นไวรัสรึป่าว เช็คดูว่าเขียนด้วยอะไรก็จะเห็นว่าเป็น .NET และ ป้องกันด้วย Confuser ซึ่ง Unpack ง่าย

image.png

debug โค้ดที่ gchandle.Free(); แล้ว save module มาเปิดใน dnspy อีกรอบ

image.png

เท่านี้ก็เห็นโค้ดทั้งหมดแล้ว ก็ยืนยันได้ว่านี่คือไวรัส

image.png

เพราะงั้น flag ก็คือ https://github.com/taipun/Minecraft/blob/main/MinecraftCrack.exe (พอดีไม่ได้ แคปเจอไว้ ถ้าจำไม่ผิดก็น่าจะอันนี้แหละ)

forensic{https://github.com/taipun/Minecraft/blob/main/MinecraftCrack.exe}

Malware Infection#2#

image.png

ข้อนี้ให้ตอบ ip กับ port ที่ไวรัสตัวนี้ใช้ในการติดต่อกับ C2 ดูใน Class Setting function InitializeSettings เราจะเห็นว่าจะมีการกำหนด IP และ Port อยู่เราสามารถ debug ตรงนี้ได้ เท่าก็ได้ flag เรียบร้อย

image.png

forensic{20.188.121.243:9999}

Malware Infection#3#

image.png

ข้อนี้ให้หา key ที่ใช้ encrypt ไฟล์ ผมหาไม่เจอ T ^ T อาจจะยังไม่เข้าใจโค้ดส่วนที่คุยกับ C2 เพราะงั้นข้อนี้ไม่รู้วิธีจ๊ะ 555 รออ่าน write up คนอื่น

Bloody Xmas 2024 CTF
https://blog.0x01code.me/posts/bloody-xmas-2024-ctf/
Author
0x01code
Published at
2024-12-29
License
CC BY-NC-SA 4.0