Thailand Cyber Top Talent 2022: Writeup
ปีนี้โจทย์ค่อนข้างท้าทายดี ถึงทีมจะไม่เข้ารอบแต่ทีมก็ได้ความรู้ประสบการณ์กลับมาเยอะครับ และเนื่องจากสมาชิกในทีมคาใจกันหลายข้อ เลยนำโจทย์มาลองทำต่อหลังแข่งเสร็จครับ 555
post นี้เลยมาแบ่งปัน writeup ครับผม :D (ทุกข้อในนี้ทำได้หลังแข่งนะครับ)
Programming 01 (Pinpad)
โจทย์คือให้ crack hash นี้: 12d6a23f0c832e89607381fb6f703f475e5bd22a0
พร้อมให้รูปภาพ pinpad มารูปนึง
จากรูปคงให้ Brute force โดยใช้เลขบน pad แน่ ๆ แต่เป็น hash ประเภทไหนล่ะ? ความยาวมันแปลก ๆ ลองเอาเข้า hash identifier ก็ไม่เจอ
เลยย้อนกลับมาที่รูปภาพซึ่งคิดว่าอาจจะมีคำใบ้อยู่ ลอง exiftool หน่อย
ชัดเลย~ คำใบ้อยู่ที่ Author: Seven-Digits กับ Comment: RipeMD+SHA1 ซึ่งบอกจำนวน 7 หลักกับวิธีเข้า hash มา ตอนแรกก็งงอยู่สักพักว่ามันบวกกันยังไง ปรากฏว่าเอา digest ของ RipeMD กับ SHA1 บวกกันตรง ๆ (แบบ Arithmetic) ได้เลย สังเกตจากความยาว hash ที่ได้จะตรงกับ target พอดี!
ที่เหลือก็แค่ brute force ด้วยตัวเลข 0–9 กับ . ตรงนี้เทคนิคของใครของมันเลย
ดันทำได้หลังแข่งเลยไม่รู้ถูกมั้ย แต่น่าจะใช่แหละ
tctt2022{1.61803}
Crypto 01
ให้ QR Code มาอันนึง
ลอง Scan ดูจะได้ string มาชุดนึง
1337:101001001010110010000100100100001010001011101110100110101000100010000010101000101010110010010110101100101101101010001100110111101000001010000010101101001110011010110000111011101000010010110000100000101101100011010110100100101100010010000010101100101001000011001100100000101000001010001010110011001110111010000100110010001000011011011010110011101000001010110000110110101001101010010000101100101110111010100010100100001010111010100010101101001001111
1337 ยังไม่รู้คืออะไร ลองเล่น binary ข้างหลังดูก่อน แปลงเลขฐาน 2 ดูละกัน
จากนั้นแปลงตัวเลขให้เป็น bytes (ใน python ใช้ to_bytes ได้เลย) จะได้ string สวย ๆ มาอันนึง น่าจะ base64
RVBHQwMDAQVKYmFoAAZsXwBXAlkIbAYHfAAEfwBdCmgAXmMHYwQHWQZO
แต่พอลองถอดก็จะพบว่ามันไม่ออก! แต่อย่าลืมว่าข้อนี้เป็นโจทย์ crypto แสดงว่ามันอาจจะ encrypt อะไรไว้ พอคิดแบบนี้ก็เดาต่อได้ว่า 1337 ด้านหน้าอาจเป็น key ไงล่ะ
Key สั้น ๆ แบบนี้ ลองใช้ XOR ธรรมดา (key = “1337”) ก็ออกเลยครับ
tctt2022{QR_15_h1d1n9_50M37H1n9_1mP0R74n7}
Forensics 01
ให้ไฟล์ที่มีชื่อคนต่าง ๆ มาชุดนึง ตามภาพ
ลองค้นชื่อคนใน google จะเจอไฟล์ usernames.txt ใน github สร้างไว้ 2 ปีที่แล้ว ซึ่งลำดับจะตรงกับโจทย์เป๊ะ ตรงนี้สรุปได้ว่า ชื่อ/ลำดับของชื่อไม่มีผลต่อการซ่อนข้อความ
ลองหาต่อว่ามี bytes แปลก ๆ ซ่อนในไฟล์มั้ย ก็เจอแค่ tab / return / dash และ a — z
มาถึงตรงนี้ก็จะเหลือแค่ไม่กี่วิธีที่ทำได้แล้ว ตอนแรกก็ลองนับจำนวนคำแต่ละบรรทัดแล้วแปลงเลขฐานแต่ก็ไม่สำเร็จ พอปรึกษาพี่คนนึงเลยได้ไอเดียว่า tab กับ return อาจจะแทนด้วย 0 กับ 1 ได้
ใช้ text editor ตัดตัวที่ไม่ใช่ \t กับ \r ออก จากนั้น replace ด้วย 0 กับ 1 ตามลำดับจะได้ binary มา พอลองแปลงเป็น string จะได้ base32 ถอดอีกรอบได้ flag
tctt2022{UNIN73nd3D_3FF3c75_oF_5oM3_45Cii}