Thailand CTF 2019 – What is a URL Again (Write-up)

ในข้อนี้โจทย์มีชื่อว่า What is a URL Again สามารถดาวน์โหลดโจทย์ได้ที่ลิงค์นี้ >>> What is a URL Again.zip

ทำการแตกไฟล์ออกมา จะได้ไฟล์ memdump.mem ออกมา อันนี้ไม่ต้อง file ก็น่าจะรู้นะว่าไฟล์อะไร แฮ่! 🤣

ลอง binwalk ดูซะหน่อยว่ามีไรบ้าง … 🧐
เพียบ… 😵

ในที่นี้เราจะใช้ volatility ในการวิเคราะห์ข้อมูล เนื่องจากเป็น Volatile Data (สงสัยถามกู๋โลดนะครับ 🤣)
ขั้นแรกลองรัน Imageinfo ดูก่อนเพื่อดูข้อมูลคร่าวๆของไฟล์ memdump ไฟล์นี้
$ volatility -f memdump.mem Imageinfo
ซึ่งต่อไปเราต้องระบุ Windows Profile ด้วย โดยในที่นี้จะใช้ Win7SP1x64

ต่อไปจะทำการลิสต์ process ทั้งหมดขึ้นมา โดยเราสามารถใช้ได้หลายคำสั่ง เช่น pslist, psscan, pstree, psxview ในที่นี้ใช้ psxview เนื่องจากดูเป็นระเบียบมากกว่าตัวอื่น ไม่รกดี 😅
$ volatility -f memdump.mem --profile=Win7SP1x64 psxview

จากทุก Process ที่มี มีตัวที่น่าสนใจที่สุดคือ notepad.exe PID: 2892

ไหนลองเช็คซิ ว่าเปิดไฟล์อะไรอยู่หรือเปล่า 🧐
SECRET!! !!!! น่าสนใจๆ 🤔

งั้น Dump เฉพาะในส่วนของ notepad ออกมาละกัน ก่อนอื่นต้องรู้หมายเลข PID ของ Notepad ก่อน ซื่งจะอยู่ในขั้นตอนก่อนหน้าที่ได้ทำการลิสต์ process ซึ่งก็คือ 2892
$ volatility -f memdump.mem --profile=Win7SP1x64 memdump -p 2892 --dump-dir .

ไฟล์ลองค้นด้วยชื่อไฟล์ที่เราเจอจากขั้นตอนก่อนหน้าซิ (SECRET!!.txt) 🧐
เอ๊ะ SeCrEtHeRe แพทเทิร์นคุ้นๆแฮะ 🤔 ซึ่งมีทั้งหมด 3 ชุดด้วยกัน

จะเห็นได้ว่ามันคือ Url escape (encode) นั่นเอง แต่จะสังเกตได้ว่า ค่าแรกสุด % จะหายไป ซึ่งก็แค่เติมลงไปให้เรียบร้อย แล้วไปทำการ unescape/decode ให้เรียบร้อย

หลังจากการทำ Url unescape เราก็จะได้ค่าเลขฐานสองมา ซึ่งจะเห็นได้ว่า 2 ชุดแรกค่าเหมือนกัน งั้นเราก็จะโฟกัสแค่ค่าแรกพอ อันหลังไม่ใช่แน่นอน (ขออนุญาตรวบรัด 🤣)

ให้เราไปทำการแปลงให้เป็น string ซึ่งจะได้ผลลัพท์ทีเป็น Base64 ออกมา c2hvcnR1cmwuYXQvaXRHVTI=

ให้ทำการ Decode Base64 จะได้เป็นลิงค์อันนึงออกมา
$ echo c2hvcnR1cmwuYXQvaXRHVTI= | base64 -d

ลองเอาไปเช็คก่อนซิว่าลิงค์จริงๆคืออะไร แอบฝังอะไรมาให้หรือเปล่า 😆

เอ๊ะ ไฟล์ Flag.zip 🤔
ให้ทำการโหลดมาโลด ว่าแต่คิดว่าจะเปิดดู Flag ได้เลยมั้ย?
แน่นอนว่า.. ไม่มีทาง!! 🤣

ลองแตกไฟล์ดูซิ
แน่นอนว่าติดรหัสผ่าน 😂

รหัสแตกไฟล์อยู่ไหนนนนนน 😭
งั้นลอง grep notepad dump file ดูเลยแล้วกัน เริ่มง่ายๆที่
pass, password, P@ssw0rd … ไม่เจอ 😢

งั้นลองใช้ Grep with regex ซิ
$ strings 2892.dmp| grep -i -P "^P@.?.?.?.?.?d"
เย่! P@S5w0rDH3rE มันต้องเป็นรหัสแตกไฟล์แน่ๆ !!!

ไหนลองแตกไฟล์ซิ ใช่รหัส P@S5w0rDH3rE มั้ยนะ 🤔
ก็ยังไม่ใช่ … 😢

ไปคุ้ยใน raw เลยละกัน ลอง Search ด้วยคำที่ได้มาเมื่อกี้ดู
เอ๊ะ Magic Bytes คุ้นๆแฮะ 🤔

แน่นอนว่ามันคือ Magic Bytes ของไฟล์ JPEG ทีนี้จะรู้ได้ไงว่าตั้งแต่ตรงไหนถึงตรงไหน?
ก็เลื่อนดูไปเรื่อยๆไงล่ะ 😂
เห็นอะไรมั้ยครับ?

จะเห็นว่าเมื่อเลื่อนไปเรื่อยๆ จะมีข้อมูลอีกชุดที่ดูแล้วไม่น่าใช่ข้อมูลของรูปแน่ๆ FixedButton อะไรไม่รู้ 😵
ดังนั้นเราจึงเอาเฉพาะแค่ตรง offset ประมาณ 0C992400 ถึงประมาณ 0C992EC0

ไหนมาเช็ค Magic Bytes ดูอีกรอบซิว่าถูกต้องหรือเปล่า 🧐

ไฟล์รูปภาพที่ได้มา จะเห็นว่ามีข้อความอยู่ด้านใน และแน่นอนว่ามันคือรหัสผ่านสำหรับการแตกไฟล์
38nVw%Z_#jdtZ>M?

ทำการแตกไฟล์ด้วยรหัสผ่านที่ได้มาจากรูปในขั้นตอนก่อนหน้า

ได้ Flag มาแล้วจ้าาาา
THCTF{@!Th1S_ls_A-f1Ag!@}

จอบอ. 😁

Thailand CTF 2019 – In the Picture (Write-up)

ในข้อนี้โจทย์มีชื่อว่า In the picture สามารถดาวน์โหลดโจทย์ได้ที่ลิงค์นี้ >>> In the picture.zip

Ps. ขออภัยด้วย Flag ไม่ได้เรียงกันนะครับ 😅

ทำการแตกไฟล์ In the picture.zip
เมื่อทำการแตกไฟล์ออกมา จะได้รูปภาพมา 1 รูป …

ลองเข้าไปส่องข้างในดูหน่อยซิ 🧐
เมื่อใช้คำสั่ง binwalk ส่องดูข้างใน จะพบว่ารูปภาพโดนยัดไฟล์ rar เข้ามา

ให้ทำการดึงไฟล์ rar ออกมาโดยใช้คำสั่ง binwalk -e Question.jpeg เราก็จะได้ไฟล์ rar ที่ต้องการออกมา

ไหนลอง extract ดูซิ …
ติด password จ้าาา ☹️

ลองไปส่งไฟล์รูปอีกทีซิ รอบนี้ใช้คำสั่ง strings Question.jpeg เพื่อดูว่ามีการแอบยัดข้อความอะไรมาหรือเปล่า
แล้วก็โป๊ะเชะ!! DPa$$w0rd:SheepInTheBigCity 😍

นำรหัสผ่านที่ได้เมื่อกี้ไปแตกไฟล์โลด 😁
จะได้ไฟล์ออกมาอีก 3 ไฟล์ (ยังไม่จบอีก 😢)

ลองเช็คไฟล์ทั้ง 3 ไฟล์ซิ ว่าเนื้อแท้มันคือไฟล์อะไร
จะเห็นว่าไฟล์แรกเป็นไฟล์รูป (.jpg) ไฟล์ที่สองเป็นไฟล์เสียง (.wav) ส่วนไฟล์สุดท้ายเป็น data ไว้เดี๋ยวมาเช็คกันอีกที … 😅

ก่อนอื่นทำการเปลี่ยนนามสกุลให้ 2 ไฟล์แรกก่อน hint1.zip เป็น hint1.jpg และ hint2.zip เป็น hint2.wav
ลองส่องไฟล์ hint3.zip จะพบว่าส่วน header มีคำว่า NG !!!
และแน่นอนครับ มันคือไฟล์รูปภาพ 😄

ให้เราไปแก้ค่า Hex โดยการเพิ่ม 89 50 ไป offset แรกสุด

เปลี่ยนนามสกุลไฟล์ให้เป็น .png ซะ

รูปภาพที่ได้ … 🧐

ทีนี้กลับมาดู hint2 ลองแมวมาดูหน่อยซิ 🧐

Nothing …

งั้นโยนเข้า Audacity หน่อยเป็นไง 😅
เอ๊ะ… Morse Code แน่ๆ 🤔

และแน่นอนมันคือ Morse Code เมื่อทำการ Translate ออกมาจะได้คำว่า PLAYSOME

ส่วน hint1 นั้น ..

ลองแมวดูซิ เห็นอะไรแว๊บๆ 🧐 🤔

ถ้าดูดีๆมีเครื่องหมาย { ก็น่าจะเป็น ROT13 แน่ๆ งั้น decode โลด
จะได้คำว่า TH{lets ออกมา

เมื่อเอาคำใบ้ทั้ง 3 คำมารวมกันก็จะได้ Flag ออกมา
TH{letsPLAYSOME_CtF!$} เอาไปแก้ format ให้ถูกต้องเป็นอันเรียบร้อย

จอบอ. 😁

Thailand CTF 2019 – Android (Write-up)

ในข้อนี้โจทย์มีชื่อว่า Android สามารถดาวน์โหลดโจทย์ได้ที่ลิงค์นี้ >>> Android.zip

ขั้นแรกให้ทำการแตกไฟล์ออกมาก่อน โดยใช้คำสั่ง unzip Android.zip จะได้โฟลเดอร์ Android_ ออกมา
โดยข้างในโฟลเดอร์ก็จะพบอยู่ 3 ไฟล์ ได้แก่ android.zip (password protected), .git และ README.md

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

ให้เราทำการรันคำสั่ง git log เพื่อดูประวัติการ Commit เพราะโดยปกติแล้ว แต่ละครั้งเมื่อเราทำการ Commit จะมีการใส่ Comment ไว้ด้วย เพื่อที่จะได้ทราบว่าเราได้ทำอะไรไปบ้าง

จุดที่น่าสนใจมีอยู่ 2 commit คือ
update (สนใจก่อนการ delete key) : 33d78b5cbb94854ff228172e7dd0159564157655
delete website : 20929d7d0ff6d4fc99fdc25d6196f80f49d0582b

Checkout #1

ทำการรันคำสั่ง git checkout 33d78b5cbb94854ff228172e7dd0159564157655 เพื่อทำการย้อนกลับไปก่อนมีการ delete key

เมื่อทำการเรียกดูรายชื่อไฟล์ จะพบว่ามีไฟล์ aws_s3.key โผล่ขึ้นมา

เมื่อทำการดูไฟล์ข้างใน จะพบค่าค่านึง อันนี้ขอรวบลัดเลยละกัน ไม่ต้องไปรันใน aws console หรือเขียน api ให้ยุ่งยาก เพราะจริงๆมันคือค่า hex นี่เอง

เมื่อทำการ decode ก็จะได้ค่าดังนี้ Th@iL@nDCTF2Ol9

เมื่อนำรหัสที่ได้มาแตกไฟล์ android.zip ปรากฏว่ารหัสผิด 😢

Checkout #2

คราวนี้เรามาดูอีก Commit ที่เกี่ยวกับ Website อะไรสักอย่าง เช่นเดิมครับ ให้รันคำสั่ง git checkout 20929d7d0ff6d4fc99fdc25d6196f80f49d0582b เพื่อย้อนกลับไปก่อนการลบ website

จะเห็นว่ามีโฟลเดอร์ web โผล่ขึ้นมา

เมื่อเข้าไปดูในโฟลเดอร์ web จะพบไฟล์ index.html ให้เราทำการเปิดไฟล์ครับ เพื่ออ่าน source code ด้านใน

เห็นอะไรมั้ยครับ 😏

คล้ายๆอันแรกเลย จากค่า aws_access_key_id และ aws_secret_access_key ให้เราทำการ decode ออกมาครับ อันนี้แล้วแต่ความสะดวกเลย ส่วนตัวผมใช้ perl script ครับ

เมื่อ decode ออกมาก็จะได้ค่าดังนี้ Th@iLanDCTF2Ol9_P@ssCode

นำมาเป็นรหัสแตกไฟล์ android.zip ครับ ถูกต้องสักที เย้ 😄

รวบรัดอีกแล้ว 😆 ไม่ต้องคิดอะไรมากครับ โจทย์นี้คือจะให้เราทำการ Crack Android Pattern ครับ

รันคำสั่งเพื่อค้นการไฟล์ gesture.key โลดครับ จะใช้คำสั่งใน linux (find,grep) หรือถ้าใช้ Windows ก็ search ผ่าน Explorer ได้เลยครับ

ข้อดีของโจทย์นี้คือ จะมี Script สำหรับ Crack Pattern มาให้แล้ว ตามผลลัพท์ที่ 2 ครับ

รันสคริปต์ aplc.py เพื่อทำการ Crack Pattern โลดครับ 😄

$ data/data/com.android.crackkey/androidpatternlock/aplc.py data/system/gesture.key

เท่านี้เราก็จะได้ Flag ออกมา 😎
THCTF{6304852}

จอบอ. 😁