
SANS Holiday Hack Challenge 2020 ข้อ 11
Incognito Lab
ใครสนใจอยากลองเล่นไปเล่นได้ที่ https://www.holidayhackchallenge.com/2020/ ซึ่งทาง SANS ได้เปิด Holiday Hack ประจำปีมานานแล้ว ถือได้ว่าเป็น CTF ให้ความรู้ได้ดีเลยทีเดียว โจทย์ในปีเก่า ๆ ก็ยังสามารถที่จะเข้าไปเล่นได้อยู่ตลอดเวลาครับ
ในบทความนี้ขอพูดถึงโจทย์ข้อสุดท้าย ซึ่งเป็นโจทย์ที่มีความน่าสนใจมาก ทั้งนี้เพราะโจทย์นี้เกี่ยวข้องกับ Blockchain
โจทย์ข้อนี้แบ่งเป็น 2 ข้อย่อย 11a และ 11b
โจทย์ 11a) Naughty/Nice List with Blockchain Investigation Part 1
Even though the chunk of the blockchain that you have ends with block 129996, can you predict the nonce for block 130000? Talk to Tangle Coalbox in the Speaker UNpreparedness Room for tips href="https://download.holidayhackchallenge.com/2020/OfficialNaughtyNiceBlockchainEducationPack.zip" rel="noopener nofollow"> tools. (Enter just the 16-character hex value of the nonce)
เฉลย
ในโจทย์นี้จะมีข้อมูลให้ 2 ส่วน คือ เครื่องมือที่จำเป็นต้องใช้ tools และ ข้อมูลใน blockchain blockchain.dat
แก้ code ให้ loop แล้ว print value ใน blockchain.dat โดยใช้
print(c2.blocks\[index\])

Sans
จะพบว่าในแต่ละ Block จะมีค่า Nonce ซึ่งเป็นค่า Random และ Index ของ Chain นี้จบที่ 129996 (แต่ index ใน array คือ 1547)
โดยโจทย์ถามว่า Nonce ของ Index ที่ 130000 คือค่าอะไร ซึ่งโดยปกติการ Predict ค่า random นั้นจะทำได้ยาก ในแต่กรณีนี้มี Hint ว่า ปัจจุบันใช้ MT19937 PRNG ซึ่งเราจะสามารถ Predict ค่า Nonce ได้หากเราทราบค่า Random จำนวน 624 ค่าก่อนหน้า
เราทำการ Extract ค่า Nonce ใน Block ก่อนหน้า โดยใช้ Code ด้านล่าง ซึ่ง เราทำการ Extract array index ที่ 923–1546 ซึ่งสาเหตุที่เราทำการ Extract ถึง Array index 1546 เพื่อจะได้ทราบว่าที่ Array index 1547 นั้น script ของเราสามารถทำนายได้ถูกต้องหรือไม่

Sans 1
เนื่องจาก Script ที่ใช้ในการ Predict value (MT19937Predictor) รับ Parameter เป็นตัวเลข จึงต้องมีการแปลงค่า Hex value จากที่เรา Extract ได้จาก Blockchain.dat เป็น int ก่อนแล้วค่อย feed เข้า MT19937Predictor

Sans 1
เมื่อเราทำถูกต้องเรียบร้อย จะได้ค่า Nonce ของ Block ที่ 130000 คือ 0x57066318f32f729d

Sans 1
โจทย์ 11b) Naughty/Nice List with Blockchain Investigation Part 2
The SHA256 of Jack’s altered block is: 58a3b9335a6ceb0234c12d35a0564c4e f0e90152d0eb2ce2082383b38028a90f. If you’re clever, you can recreate the original version of that block by changing the values of only 4 bytes. Once you’ve recreated the original block, what is the SHA256 of that block?
เฉลย
ทำการ Dump Object ที่อยู่ภายใน Blockchain.dat โดยใช้ method dump_doc() โดยทำการ Dump object ใน index ที่ 1 ของแต่ละ Block ออกมาทั้งหมด

Sans 2
จากผลลัพธ์จะพบว่ามีแต่ละ Block จะมี PDF file ออกมายกเว้น Block index ที่ 129549 (Array index คือ 1010) ซึ่ง Object ที่ได้ออกมาจาก Block นี้คือ file ชื่อ 129549.bin
ตรงนี้ทำให้รู้สึกว่า Block นี้มีบางอย่างแปลก ๆ จึงทำการดูรายละเอียดอื่น ๆ ใน block นี้เพิ่มเติม จากการทำการ Print ข้อมูลใน Block นี้ก็พบสิ่งที่แปลก

Sans 2
สิ่งที่แปลกคือ Document Count: 2 ซึ่งแสดงว่าใน Block นี้มี document อื่นอีก และ ค่า Score ที่เป็นค่า 0xffffffff ซึ่งเกินกว่า score
ทั่วไป ถ้าเทียบกับข้อมูลใน Block อื่น นอกจากนี้คือ Sign หรือ flag ที่ใช้ในการระบุว่าเป็น Nice (1) หรือ Naughty (0)
ทำการ Dump Object เพิ่มจากข้อมูลใน Block นี้ และทำการ extract ข้อมูลของ Block 129549 ออกมาโดยตั้งชื่อว่า 1010.dat

Sans 2
ทำการ verify ว่าใช่ Block นี้หรือไม่ที่เป็น Block ที่ถูกเปลี่ยนแปลงโดย Jack ตามข้อมูลที่โจทย์ให้มา ซึ่งผลลัพธ์คือ Block 129549 นี่แหละที่เป็นปัญหา

Sans 2
จากการเปิดดูค่า hex เทียบกับข้อมูลใน Block เราพอจะคาดเดาได้ว่าตำแหน่งไหนคือตำแหน่งที่ใช้ระบุ Flag Naughty/Nice ซึ่งในโจทย์นี้เราต้องเปลี่ยนจากเลข 31 เป็น 30 (นี่คือ 1 ใน 4 bytes ที่เราต้องเปลี่ยนตามคำถามของโจทย์ข้อนี้)

Sans 2
ถัดมาในไฟล์ 129549.pdf เมื่อเราเปิดไฟล์เราจะพบว่าไฟล์นี้มีการเขียนชม Jack Frost มากมาย

Sans 2
ในโครงสร้างของไฟล์ PDF จะมีลักษณะคล้าย ๆ index คือมี pointer ชี้ว่าจะไปหน้าไหนต่อไป ซึ่งในโจทย์ข้อนี้หลังจากลองไล่ค่า Hex ใน file PDF แล้วพบว่าถ้าลองเปลี่ยน Index จาก 2 เป็น 3 จะพบว่าไฟล์ PDF นี้แสดงผลเป็นเนื้อหาที่ Complain Jack

Sans 2
ซึ่งในโจทย์นี้เราต้องเปลี่ยนจากเลข 32 เป็น 33 (นี่คืออีก 1 ใน 4 bytes ที่เราต้องเปลี่ยนตามคำถามของโจทย์ข้อนี้)

Sans 2
ถัดไปเป็นเรื่องที่เป็นปัญหาหลักของโจทย์นี้นั่นคือเทคนิคการปลอมแปลงค่าใน Blockchain คุณสมบัติของ Blockchain นั้นคือจะไม่มีใครสามารถเปลี่ยนแปลงค่าใน Block ได้ แต่ในโจทย์นี้ Jack สามารถทำได้ โดยวิธีการที่ Jack ใช้นั้นคือการทำ Hash Colission ซึ่งในโจทย์นี้ใช้ MD5 ในการทำ Hash ซึ่งถือว่าไม่ปลอดภัยในปัจจุบันแล้ว
โดยเทคนิคที่ใช้ในโจทย์นี้คือ UNICOLL (อ่านเพิ่มเติมได้ที่ https://speakerdeck.com/ange/colltris?slide=109) สรุปสั้น ๆ คือ ให้ increase value (+1) ของ Byte ลำดับที่ 10 ใน Prefix Block และ decrease value (-1) ของ Byte ลำดับที่ 10 ใน Block ถัดมา ถ้าทำได้ถูกต้อง MD5 value จะไม่เปลี่ยนแปลง นั่นคือเกิด colission นั่นเอง
ในโจทย์นี้ Jack ได้ทำการแก้ไขค่าใน Block โดยใช้ UNICOLL ดังนั้นสิ่งที่เราจะทำก็คือการ Reverse process ของการทำ UNICOLL เพื่อให้ Block นั้นกลับไปเป็นค่าเดิม
โดยถ้าเริ่มต้นที่ตำแหน่งของ Naughty/Nice flag เดิมเป็นค่า 0x31 เราต้องแก้เป็นค่า 0x30 คือค่าถูก decrease ลงมา (-1) ซึ่งถ้าเทียบกับการทำ UNICOLL นั้น Block นี้จะหมายถึง Prefix block ดังนั้น Block ถัดไป ที่ Byte ลำดับที่ 10 จะต้องทำการ increase value (+1) (เพราะเรากำลังจะ reverse UNICOLL process) แต่ตอนนี้ปัญหาของเราคือเราไม่รู้ว่าจำนวน Block size คือเท่าไร
วิธีการประเมิน Block size ที่จุดนี้คือนับเอาว่า ที่ Prefix block นี้เริ่มต้นที่จุดไหน นั่นคือนับไปก่อนหน้านั้น 9 bytes จากนั้นก็ assume ว่าข้อมูลก่อนหน้านั้นทั้งหมดคือ 1 Block ซึ่งในที่นี้ก็จะพบว่า 1 Block มีขนาด 64 bytes

Sans 2
พอเราทราบว่า 1 Block ขนาดเท่าไร แล้วก็ต้องหาว่า Block ที่ 3 เริ่มต้นที่ไหน แล้วหา Byte ที่ 10 ของ Block ที่ 3 เพื่อทำการแก้ไขค่า ซึ่งในที่นี้พบว่าเป็นค่า D6 เราก็ทำการแก้เป็นค่า D7 (นี่คือ 1 ใน 4 bytes ที่เราต้องเปลี่ยนตามคำถามของโจทย์ข้อนี้)

Sans 2
หลังจากทำเสร็จแล้วเราสามารถทดสอบได้โดยลองทำ MD5 กับค่าก่อนแก้และหลังแก้ จะพบว่า MD5 เป็นค่าเดิม
ถัดไปเราจะหา Byte สุดท้ายที่ต้องเปลี่ยน ซึ่งก็จะใช้วิธีการคล้าย ๆ กับด้านบนโดยเราต้องหา Byte ที่ต้องเปลี่ยนให้เจอ ซึ่งข้อมูลใน Block ที่ 5 นั้นคือจุดที่เราต้องเปลี่ยนค่าของ ไฟล์ PDF พอดี ดังนั้น Block ที่ 6 ที่ Byte ลำดับที่ 10 ต้องทำการ decrease ค่าลง นั่นคือแก้จาก 1C เป็น 1B และนี่ก็คือ Byte สุดท้ายที่เราต้องเปลี่ยนตามคำถามของโจทย์ข้อนี้

Sans 2
พอแก้ทุกอย่างเรียบร้อยแล้วก็ทำการตรวจสอบว่าการแก้ถูกต้องหรือไม่ ซึ่งหากถูกต้อง MD5 ต้องได้ค่าเดิมแต่ SHA256 ต้องเปลี่ยน

Sans
ซึ่งในโจทย์นี้เราต้องนำค่า SHA256 ของ Block ใหม่ไปกรอกแล้วก็จะผ่าน ซึ่งค่านั้นคือ fff054f33c2134e0230efb29dad515064ac97aa8c68d33c58c01213a0d408afb
โดยสรุปแล้วโจทย์ข้อนี้ก็ค่อนข้างสนุก มีหลายหัวข้อให้เรียนรู้ทั้ง MT19937 PRNG, Blockchain, PDF file structure และการทำ Hash collision
Up Next

ARTICLES
Mar
03
2021
Secure Code Warrior
วันก่อนเจอ Tweet ที่คุณ Troy Hunt เจ้าของ haveibeenpwned ได้ share มาเกี่ยวกับ paper อันนึงที่น่าสนใจมาก
READ MORE

ARTICLES
Mar
03
2021
หลักแห่งการออกแบบระบบอย่างมั่นคงปลอดภัย (Secure Design Principles)
ธนาคารรายใหญ่มีกฎระเบียบข้อบังคับในการคัดเลือกผู้ให้บริการหลายข้อ ทั้งในแง่ขีดความสามารถและความมั่นคงทางการเงินของบริษัท แต่เมื่อมีการจัดซื้อจัดจ้างผลิตภัณฑ์หรือบริการไปแล้ว
READ MORE

ARTICLES
Mar
02
2021
ทำความรู้จักกับ Application Sandboxing บน Mobile Platform
เมื่อพูดถึงกลไกการรักษาความปลอดภัยของ Smartphone ในปัจจุบัน ไม่ว่าจะ iOS, Android หรือ Windows Phone ล้วนมีกลไกการรักษาความปลอดภัยพื้นฐานมาอยู่แล้วซึ่งช่วยให้ผู้ใช้งานทั่วไปสามารถใช้งาน Smartphone ได้อย่างมั่นคงปลอดภัยในระดับหนึ่ง
READ MORE