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 – 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}

จอบอ. 😁

Thailand CTF 2018 – My password collection (Write-up)

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

ขั้นแรกให้ทำการแตกไฟล์ออกมาก่อน โดยใช้คำสั่ง unzip disk.zip จะได้ไฟล์ disk.dd ออกมา

ลองเช็คประเภทของไฟล์ดูก่อน โดยใช้คำสั่ง file disk.dd
จะเห็นได้ว่า Partition เป็น MSDOS ซึ่งจากประสบการณ์ ใช้ 7Zip แตกไฟล์ในคอมพิวเตอร์โดยตรงเลยง่ายกว่า 555+

เมื่อแตกไฟล์ใน Windows ด้วย 7Zip ก็จะได้ไฟล์ประมาณนี้

ไฟล์ข้างในแต่ละ Folder ก็จะได้ประมาณนี้

ทำการไล่เช็คประเภทของไฟล์ใน Document (เนื่องจากไม่มี .extension ทำให้ไม่ทราบได้ว่าเป็นไฟล์ประเภทอะไร)
โดยใช้คำสั่ง for f in Documents/*; do file $f; done

จะเห็นได้ว่าน่าสนใจทุกไฟล์เลย 55+ แต่เราจะทำการเช็ค 2 ไฟล์กันก่อน คือไฟล์ g ที่เป็นไฟล์ pdf และไฟล์ w ที่เป็น textfile
เมื่อดูข้อมูลใน textfile จะพบข้อความ VyAtMzAwClAgMApSIDI= ซึ่งแน่นอนว่ามันคือ base64 หลังจาก decode ก็จะได้ผลลัพธ์ตามรูปด้านบน

กลับไปดูอีกไฟล์ที่เป็น pdf ซึ่งจริงๆมันเป็นคำใบ้ในการเอา key ในขั้นต่อไป (จำรูปภาพ และ filters ด้านล่างไว้ให้ดีๆ 😁)

ไปดูที่อีกโฟลเดอร์บ้าง ในโฟลเดอร์ Pictures นั่นเอง เห็นอะไรแปลกๆมั้ยครับ 🙃

ใช่เลยครับ รูปแรกนี่แหละ เมื่อลองเปิดรูปดู จะเห็นว่าเหมือนมีข้อความโดนหมุนเป็นเกลียวอยู่!

จำไฟล์ pdf ที่เปิดก่อนหน้าได้ไหมครับ นั่นแหละ! มันคือคำใบ้!! อ้อ textfile อักอัน
ก่อนอื่นให้เปิดรูปด้วย Gimp ก่อนครับ จากนั้นไปที่ Filters → Distorts → Whirl and Pinch เพื่อจะทำการหมุนภาพกลับ
ซึ่งไม่ต้องไปงมให้เมื่อยว่าแต่ละค่าต้องหมุนไปที่เท่าไหร่ เพราะมันบอกไว้แล้วใน textfile ที่เป็น base64
จะได้ 4XAktWZ3tH7AHsO9

กลับไปดูใน Documents อีกรอบ จะเห็นว่าเหลืออีก 2 ไฟล์คือ f: openssl และไฟล์ p: Keepass
โดยไฟล์ f เป็น Encryption file แล้วจะแกะยังไง ในเมื่อไม่มี passphase 😂

งั้นกลับไปดูอีกไฟล์กันก่อน อันนี้ยอมรับว่าไม่รู้จัก เท่าที่ไปถามอากู๋มา ได้ความว่าเป็น Password Management ซึ่งส่วนตัวรู้จักแค่ Dashlane, 1Password และ Lastpass 555+
ทำการโหลด Keepass แล้วเปิดไฟล์ p โลดดดด ซึ่งจะเจอหน้าถามหา Master Password = =”
ลองเอา key ที่ถอดมาได้จากรูปภาพใส่ดู แล้วก็โป๊ะเชะ!

ด้วยความที่ไม่เคยใช้ ก็เลยลองเอาเมาส์ไปชี้เล่นๆดู เอ๊ะตรงนี้คืออัลไล (,__,  )a เก็บไว้ก่อน

ลองดับเบิลคลิกเข้าไปดูใน Text file ซะหน่อย จะเห็นว่าตรงช่อง Notes: มันว่างๆเหมือนไม่มีอะไร แต่ทำไมมันยาวววววว 😶
เมื่อเลื่อนไปดูล่างสุด เหมือนจะเจอ key อีกแล้ว แต่มันไม่ใช่ flag !!!
UzE0f6Sb2ZvUtvsD

ตอนนี้ใน Documents ก็เหลือไฟล์เดียวแล้ว คือไฟล์ f: openssl
จากที่บอกข้างต้นว่ามันเป็น Encryption data ต้องใช้ key ในการ Decryption ซึ่งแน่นอนเหลือ key เดียวแล้วที่ยังไม่ได้ใช้ และเพิ่งแกะออกมาได้

ซึ่งในการ Decryption ต้องรู้ก่อนว่าใช้ Algorithm อะไร และแน่นอนว่ามันคือ AES-256-CBC ที่โจทย์ได้ทำการใบ้ไว้ใน Keepass
เมื่อทำการ Decrypt แล้วก็จะได้ Flag ออกมา 😎

THCTF{Uu5AzrJD3mMKDG0z}

จอบอ. 😁