Skip to content

Instantly share code, notes, and snippets.

@pich4ya
Created October 22, 2017 17:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pich4ya/fca849dbf3198c734640be78f106445b to your computer and use it in GitHub Desktop.
Save pich4ya/fca849dbf3198c734640be78f106445b to your computer and use it in GitHub Desktop.
Thailand CTF 2017 Write-up : Everything is Broken (300)
โจทย์ให้ไฟล์ 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