Recientemente, INTECO ha sacado una oferta de 20 plazas para perfiles técnicos ("hackers"). Para cubrir las plazas el pasado día 10 se publicaron 4 "retos" en temas tan dispares como Computer Forensics, Incident Handling, Reversing y Descubrimiento de vulnerabilidades.
Las pruebas se basan en unos ficheros que contienen desde capturas de memoria, capturas de tráfico de red, un "crackme" o un programa en el que hay que buscar vulnerabilidades. INTECO planteaba una serie de preguntas en relación a estos ficheros y lo que podia ocurrirles a los sistemas afectados.
Estos ficheros lo podemos encontrar en https://mega.co.nz/#!dwNSUbYa!crHig0UYRVSVCytehho3tyMuPBsRi_8Zt-M8AsXStDM
Yo me presenté a esas plazas e hice las pruebas de los 4 apartados. A continuación publico mis respuestas. Esta sería la primera de dos entradas con este asunto y en el de hoy pondré mis respuestas en los retos de INCIDENT HANDLING y REVERSING.
INCIDENT HANDLING
¿Cómo se ha comprometido el sistema?[15%]
El usuario con la IP 192.168.78.132 ha recibido un correo SPAM sobre los atentados de Boston que incluía un enlace. A partir del segundo 17 de la captura (frame 282), hace clic sobre el enlace, que le dirije a http://188.2.164.112/boston.html
Dicha página web incluye 5 iframes, 4 de ellos con enlaces a videos reales de los atentados de Boston y un iframe que le redirige a http://heathawkheaters.com/hair.html (IP216.172.186.132)
Este último iframe solo muestra un mensaje de error, pero incluye un applet java que descarga un fichero malicioso vz1.jar
Este fichero se trata de un exploit que se aprovecha de la vulnerabilidad de Java con CVE-2012-1723 (http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2012-1723)
También se descarga otros ficheros maliciosos como:
Newbos3.exe (frame 2714) desde kolasoeg.ru, se trata, según virustotal de zbot-KR(Sophos) o Tepfer.imbp(Kaspersky)
Indique los hashes SHA256 y tipo de ficheros maliciosos encontrados en las conexiones.[15%]
• vz1.jar -- FRAMES 1807 a 1821 - Este fichero se trata de un exploit que se aprovecha de la vulnerabilidad de Java con CVE-2012-1723 (http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2012-1723)
SHA256: 0bf5cdfd7387cf818d53e463f19d98c8bd14439e85b137bb6503d1faa85555db
https://www.virustotal.com/es/file/0bf5cdfd7387cf818d53e463f19d98c8bd14439e85b137bb6503d1faa85555db/analysis/1370856836/
• Newbos3.exe (frame 2714) – Descargado desde kolasoeg.ru - Se trata de un troyano ejecutable windows, según virustotal es Zbot-KR(Sophos) o Tepfer.imbp(Kaspersky)
SHA256: 6bab0821aec44f13e41af7ef73fa528c2ef8b4c36be1886a7a57e7e173be536b
https://www.virustotal.com/es/file/6bab0821aec44f13e41af7ef73fa528c2ef8b4c36be1886a7a57e7e173be536b/analysis/1370856559/
• Setup.exe (frame 1923) descargado desde dustpanrecordings.com ( 208.109.138.8) tras una consulta http://dustpanrecordings.com/i.htm?1wDg6bS8MzvoprjDTFHphg7wwLPVZ
Sin embargo, no he sido capaz de obtener el ejecutable. Se trataría de este enlace a bvirstotal:
https://www.virustotal.com/es/file/6894347ff4238ee06c8f9b8e2ca2dc01b3aea7f973b40db5366c4400964cbc43/analysis/1366258011/ que no considera que sea malicioso:
SHA256: 6894347ff4238ee06c8f9b8e2ca2dc01b3aea7f973b40db5366c4400964cbc43
Indique los dominios y las direcciones IP relacionadas con el incidente hasta que se comprometió el sistema.[15%]
188.2.164.112 – Dominio serbio del enlace que llegaba en el SPAM (sin nombre de dominio)
216.172.186.32 - http://heathawkheaters.com/ Alojado en EEUU. Lugar desde el que se descarga el exploit Java.
109.87.207.34 – kolasoeg.ru – Lugar desde donde se descarga el fichero newbos3.exe
208.67.220.220 – dustpanrecordings.com – Lugar desde donde se descarga el ejecutable setup.exe
5.105.75.42 – Desde esta IP se descarga posiblemente un payload para el exploit de Java.
Describa el flujo de conexiones relevantes en el incidente, con todos los detalles de las mismas.[20%]
La victima hace clic en el enlace del correo electrónico SPAM que le lleva a 188.2.164.112 (frame 282):
http://188.2.164.112/boston.html
Dicha página web incluye 5 iframes, 4 de ellos con enlaces a videos reales de los atentados de Boston y un iframe que le redirige a http://heathawkheaters.com/hair.html (IP 216.172.186.132).
Este último iframe solo muestra un mensaje de error, pero incluye un applet java que descarga un fichero malicioso vz1.jar desde esa misma IP (FRAME 1807-1821).
El applet java se ejecuta y descarga el fichero 13.htm (FRAME 1824-1891) , SHA256: 64341e4ed560fcecd393deb4a15c0f75b99daf002a4c735194316c22327473ac , que no es detectado como un fichero malicioso, pero tampoco es una página web.
A partir de ese momento la maquina queda comprometida y comienzan a descargarse un troyano llamado newbos3.exe desde 109.87.207.34 – kolasoeg.ru (FRAME 2714)
Al ejecutarse este troyano, la victima se conecta con 46.119.212.23 y 5.105.75.42, se conecta con 78.111.219.45 para descargarse login.html
A partir del frame 2777 (segundo 74, 10 segundos después de ejecutar el troyano) abre 65 conexiones HTTP contra las IPs 141.102.121.96, 186.2.166.59, 190.93.251.24, 91.202.142.208, 186.2.185.13, 178.32.71.33, 64.235.40.176
Algunas de ellas responden y otras no. A todas se hace un get PXFAHN
Tiene aspecto de que la victima ha pasado a ser un nodo mas de una red zombie y el troyano esta conectando con el servidor C&C
A continuación (FRAMES 3138-3310) la victima consulta los registros MX y A de una serie de servidores de correo a los que va a comenzar a mandar SPAM.
A partir del FRAME siguiente, 3311, comienza a mandar SPAM como el siguiente:
Subject: New Sub Penny Alert Coming Soon
Date: Thu, 18 Apr 2013 10:25:36 +0100 MIME-Version: 1.0
Content-Type: text/plain; .format=flowed; .charset="iso-8859-2"; .reply-type=original
Content-Transfer-Encoding: 7bit X-Priority: 3 X-MSMail-Priority:
Normal X-Mailer: Microsoft Outlook Express 6.00.2800.1506
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1506
Body:
Welcome announcement for P_W_E I watchers. Buy thousands of P_W_E I stock offered at the morning, since it's still bargained. Then see the pps spike to 55 cents - or maybe hit a 1! Prepare to make a fortune on P_W_E I starting Thursday, Apr 18.
En total intenta mandar más de 300 correos en el tiempo que dura la captura (hay 320 sesiones).
Una vez comprometido el sistema, según las evidencias que tenemos, ¿para qué se ha estado utilizando? Indique por favor todos los detalles: destinos de las conexiones con finalidad maliciosa; cuáles han tenido éxito y cuáles no, en este caso indicando el porqué; aportando el mayor detalle posible del destino de los ataques.[35%]
La victima es usada como un servidor de correo SPAM.
A partir de la ejecución del VZ1.JAR la maquina queda comprometida y comienzan a descargarse un troyano newbos3.exe desde 109.87.207.34 – kolasoeg.ru (FRAME 2714)
Al ejecutarse este troyano, la victima se conecta con 46.119.212.23 y 5.105.75.42, se conecta con 78.111.219.45 para descargarse login.html
A partir del frame 2777 (segundo 74, 10 segundos después de ejecutar el troyano) abre 65 conexiones HTTP contra las siguientes 9 IPs 141.102.121.96, 186.2.166.59, 190.93.251.24, 90.156.201.11, 50.62.238.103, 91.202.142.208, 186.2.185.13, 178.32.71.33, 64.235.40.176. Los 5 primeras Ips están activas y responden, las 4 últimas no.
A todas se hace un get PXFAHN a lo que responden con un Bad Request, pero la conexión continúa sin otras descargas.
Tiene aspecto de que la victima ha pasado a ser un nodo mas de una red zombie y el troyano esta conectando con los servidores C&C.
A continuación (FRAME 2996-3137) se descarga el fichero file.html desde 5.105.75.42 y tiene aspecto de que este fichero contiene cifrados, las direcciones de correo y los servidores MX desde los que mandar el SPAM.
En cuanto acaba la descarga de ese file.html, la victima consulta los registros MX y A de una serie de servidores de correo (FRAMES 3138-3310) a los que va a comenzar a mandar SPAM.
A partir del FRAME siguiente, 3311, comienza a mandar SPAM como el siguiente:
Subject: New Sub Penny Alert Coming Soon
Body:
Welcome announcement for P_W_E I watchers. Buy thousands of P_W_E I stock offered at the morning, since it's still bargained. Then see the pps spike to 55 cents - or maybe hit a 1! Prepare to make a fortune on P_W_E I starting Thursday, Apr 18.
En total intenta mandar más de 300 correos en el tiempo que dura la cptura (hay 320 sesiones).
Algunas de las direcciones de correo y su respuesta son:
mail1.corpmailsvcs.com ?
bpurins@optonline.net - 550 5.1.1 unknown or illegal alias: bpurins@optonline.net
jayeandy@yahoo.com OK ok dirdel
marsha_n_cali@yahoo.com OK deferred 451 Message temporarily deferred - [140]
acafiero.office@cox.net 250 2.0.0 RLbC1l01Q2mYAnX01LbECt mail accepted for delivery
annaauu@yahoo.com OK deferred 451 Message temporarily deferred - [160]
allisonkpace@gmail.com OK
jmlee325@gmail.com OK
greg.mcallister@adtech.com 550 No such user (greg.mcallister@adtech.com)
janisamzallag@rogers.com OK 250 ok dirdel
dionne.matthews@bankofamerica.com 550 5.0.0 User unknown
comoline@hotmail.com OK??Queued 250
guiggs14@hotmail.com 550 Requested action not taken: mailbox unavailable
sagirkennel@yahoo.com OK 250 ok dirdel
rgoodman5@cinci.rr.com OK 250 OK 12/F5-02208-440BF615
hfsommer@earthlink.net 550 hfsommer@earthlink.net...User unknown
murphmcd@sbcglobal.net OK 250 ok dirdel
sgntblain@cs.com 550 5.1.1 : Recipient address rejected: cs.com
llcoeone@iowatelcom.net ok
bpurinto@student.umass.edu 550 5.1.1 : Recipient address rejected: User unknown in relay recipient table
sjjones@voyager.net 554 5.7.1 Service unavailable; Client host [195.53.165.128] blocked using local.ip.rbl; http://www.spamhaus.org/query/bl?ip=195.53.165.128
judy@artechecarr.com ok
larsflatoe@hotmail.com Queued mail for delivery 250 <000f01ce3c0f$a4c80130$6d3498e6@hanz0785663ba1o4lr5> Queued mail for delivery
dennis.west@pfizer.com 550 5.7.0 Local Policy Violation
dionne@mattinglycorp.com 250 [InternalId=16039451] Queued mail for delivery
painting4me@msn.com 550 Requested action not taken: mailbox unavailable
shonda.mark@vonage.com OK
ewroberts38@earthlink.net 550 ewroberts38@earthlink.net...User unknown
yafeng_xiao@hotmail.com Queued mail for delivery 250
johnfkm03@aol.com 250 2.0.0 Ok: queued as 36E3F380000B2
jmlee3@msn.com Queued mail for delivery 250
nic26@sbcglobal.net OK 250 ok dirdel
dguttman@uvm.edu 550 5.0.0 ... User unknown
jvhjh@worldnet.att.net 551 not our customer
aleksicveronica@aol.com 250 2.0.0 Ok: queued as AFB0938000084
lori.lizik@fiserv.com OK
lorilizrogers@gmail.com OK
4bewers@verizon.net 550 5.1.1 unknown or illegal alias: 4bewers@verizon.net
loriljackson@hotmail.com Queued mail for delivery 250
johnfk@microsoft.com Queued mail for delivery 50 2.6.0
REVERSING
¿En qué se basa la generación del número de serie?[20%]
Se basa en la llamada a la API del sistema GetVolumeInformation:
CALL <JMP.&kernel32.GetVolumeInformationA>
Veamos, en la función que comienza en la instrucción 004010A3, hace una llamada a GetTickCount que no sirve para nada, y posteriormente hace una llamada a GetVolumeInformation pasándole como arg1 la unidad: C:\, como arg2, cero, como arg3 el tamaño del volumen y como arg4 un buffer que será donde escriba la información del volumen. Este Buffer esta en la posición 004030B8.
004010A3 /$ 33C0 XOR EAX,EAX ; reversing.004010A3(guessed void)
004010A5 |. E8 6E010000 CALL <JMP.&kernel32.GetTickCount> ; [KERNEL32.GetTickCount
004010AA |. 6A 00 PUSH 0 ; /SysNameSize = 0
004010AC |. 6A 00 PUSH 0 ; |SysName = NULL
004010AE |. 6A 00 PUSH 0 ; |pFlags = NULL
004010B0 |. 6A 00 PUSH 0 ; |pMaxNameLength = NULL
004010B2 |. 68 B8304000 PUSH OFFSET 004030B8 ; |pSerialNumber = reversing.4030B8 -> 0
004010B7 |. 68 B7304000 PUSH OFFSET 004030B7 ; |VolumeSize = 4206775.
004010BC |. 68 26314000 PUSH OFFSET 00403126 ; |VolumeName = reversing.403126 -> 00
004010C1 |. 68 B3304000 PUSH OFFSET 004030B3 ; |Root = "C:\"
004010C6 |. E8 53010000 CALL <JMP.&kernel32.GetVolumeInformationA> ; \KERNEL32.GetVolumeInformationA
El valor devuelto por GetVolumeInformation es posteriormente copiado en la posición de memoria 00403136 en ASCII:
004010F2 |. FF35 B8304000 PUSH DWORD PTR DS:[4030B8] ; /<%.08X> = 0
004010F8 |. 68 BC304000 PUSH OFFSET 004030BC ; |Format = "%.08X"
004010FD |. 68 36314000 PUSH OFFSET 00403136 ; |Buf = ""
00401102 |. E8 2B020000 CALL <JMP.&user32.wsprintfA> ; \USER32.wsprintfA
00401107 |. 83C4 0C ADD ESP,0C
0040110A \. C3 RETN
Posteriormente, desde el Entry Point, es llamada la función que comienza en la instrucción 0040110B que es básicamente un strcmp(serialmetido,volumeinformation),
0040110B /$ 33C0 XOR EAX,EAX
0040110D |. 6A 08 PUSH 8 ; /Count2 = 8
Aqui compara las posiciones de memoria donde esta almacenado el serial introducido, 004030C2 y el volumen information, 00403136:
0040110F |. 68 36314000 PUSH OFFSET 00403136 ; |String2 = ""
00401114 |. 6A 08 PUSH 8 ; |Count1 = 8
00401116 |. 68 C2304000 PUSH OFFSET 004030C2 ; |String1 = ""
0040111B |. 6A 01 PUSH 1 ; |Flags = NORM_IGNORECASE
0040111D |. 6A 00 PUSH 0 ; |Locale = LOCALE_NEUTRAL
0040111F |. E8 E8000000 CALL <JMP.&kernel32.CompareStringA> ; \KERNEL32.CompareStringA
00401124 |. 83F8 02 CMP EAX,2
Si son iguales, salta a la función de la instrucción 0040115ª y si no, decodifica el mensaje de error “Error!! Invalid serial number”:
00401127 |. 74 31 JE SHORT 0040115A
00401129 |. FF35 8B304000 PUSH DWORD PTR DS:[40308B] ; /Arg3 = 20
0040112F |. 68 00304000 PUSH OFFSET 00403000 ; |Arg2 = reversing.403000
00401134 |. 68 6A304000 PUSH OFFSET 0040306A ; |Arg1 = reversing.40306A
00401139 |. E8 4C000000 CALL 0040118A ; \reversing.0040118A
0040113E |. 68 00304000 PUSH OFFSET 00403000 ; /Arg1 = reversing.403000
00401143 |. E8 E4000000 CALL 0040122C ; \reversing.0040122C
00401148 |. FF35 8B304000 PUSH DWORD PTR DS:[40308B] ; /Arg2 = 20
0040114E |. 68 00304000 PUSH OFFSET 00403000 ; |Arg1 = reversing.403000
00401153 |. E8 94000000 CALL 004011EC ; \reversing.004011EC
00401158 |. 58 POP EAX
00401159 |. C3 RETN
Explica el cifrado de cadenas.[30%]
Existen 4 cadenas que aparecen en este ejecutable:
• “Type the serial number:”
• “Error!! Invalid serial number.”
• “The serial number is OK”
• Press ENTER to Finish
Todas ellas se encuentran, codificadas en el ejecutable del programa. En concreto están en las posiciones 004030C2, 0040306A , 0040304F y 0040308F respectivamente.
Sin embargo cuando se llama a la función que llama a la API WriteFile ( que es la que escribe por pantalla), siempre se le pasa como argumento la posición 00403000 (Esta función comienza en la instrucción 0040122C):
0040116F |. 68 00304000 PUSH OFFSET 00403000 ; /Arg1 = reversing.403000
00401174 |. E8 B3000000 CALL 0040122C ; \reversing.0040122C
Esto es así porque siempre antes de esta llamada se hace otra a una función que convierte las cadenas y las pone en 00403000:
0040115A |. FF35 66304000 PUSH DWORD PTR DS:[403066] ; /Arg3 = 16
00401160 |. 68 00304000 PUSH OFFSET 00403000 ; |Arg2 = reversing.403000
00401165 |. 68 4F304000 PUSH OFFSET 0040304F ; |Arg1 = reversing.40304F
0040116A |. E8 1B000000 CALL 0040118A ; \reversing.0040118A
0040116F |. 68 00304000 PUSH OFFSET 00403000 ; /Arg1 = reversing.403000
00401174 |. E8 B3000000 CALL 0040122C ; \reversing.0040122C
Esta function es la siguiente, se añaden explicaciones entre líneas:
Inicio típico de una función, limpiando la casa:
0040118A /$ 55 PUSH EBP ; reversing.0040118A(guessed Arg1,Arg2,Arg3)
0040118B |. 8BEC MOV EBP,ESP
0040118D |. 53 PUSH EBX
0040118E |. 51 PUSH ECX
0040118F |. 56 PUSH ESI
00401190 |. 57 PUSH EDI
00401191 |. 33C0 XOR EAX,EAX
00401193 |. BB 5C2B8D54 MOV EBX,548D2B5C
00401198 |. B9 32400000 MOV ECX,4032
Almacenamos en ESI la posición de memoria de la cadena codificada y en EDI la posicion de memoria del buffer que se imprimira por pantalla:
0040119D |. 8B75 08 MOV ESI,DWORD PTR SS:[ARG.1]
004011A0 |. 8B7D 0C MOV EDI,DWORD PTR SS:[ARG.2]
Toda sección es innecesario. Son 16434 bucles modificando EBX que luego al finalizar tendrá siempre el valor 548D2B5C:
004011A3 |> 81F3 00006699 /XOR EBX,99660000
004011A9 |. 81F3 0000232D |XOR EBX,2D230000
004011AF |. 81F3 0000AA11 |XOR EBX,11AA0000
004011B5 |. 81F3 0000DD98 |XOR EBX,98DD0000
004011BB |. 81F3 0000FF33 |XOR EBX,33FF0000
004011C1 |. 49 |DEC ECX
004011C2 |. 0BC9 |OR ECX,ECX
004011C4 |.^ 75 DD \JNE SHORT 004011A3
Aqui en ECX se le indica el numero de iteraciones que se harán del siguiente bucle (depende de la longitud de la cadena)
004011C6 |. 8B4D 10 MOV ECX,DWORD PTR SS:[ARG.3]
Cogemos los dos primeros bytes de la cadena codificada
004011C9 |. 66:8B06 /MOV AX,WORD PTR DS:[ESI]
Los rotamos, poniendolos en su posición real, tal y como saldrían por pantalla
004011CC |. 66:C1C8 08 |ROR AX,8
Hacemos un XOR con el valor 548D2B5C:
004011D0 |. 66:33C3 |XOR AX,BX
004011D3 |. 46 |INC ESI
004011D4 |. 46 |INC ESI
Los volvemos a rotar para volver a escribirlos en memoria:
004011D5 |. 66:C1C8 08 |ROR AX,8
Los pasamos a la posicion de memori 00403000:
004011D9 |. 66:8907 |MOV WORD PTR DS:[EDI],AX
004011DC |. 47 |INC EDI
004011DD |. 47 |INC EDI
004011DE |. 49 |DEC ECX
004011DF |. 49 |DEC ECX
Comprobamos si debemos salir del bucle (ECX es cero):
004011E0 |. 0BC9 |OR ECX,ECX
004011E2 |.^ 75 E5 \JNE SHORT 004011C9
004011E4 |. 5F POP EDI
004011E5 |. 5E POP ESI
004011E6 |. 59 POP ECX
004011E7 |. 5B POP EBX
004011E8 |. C9 LEAVE
004011E9 \. C2 0C00 RETN 0C
Básicamente y a modo de resumen, se trata de un XOR con 548D2B5C, aunque ante se hace un rotado cambiando el orden de los bytes.
Muestra el código de un generador de serials. (Da igual el lenguaje)[50%]
El numero de serie del volumen o VolumeID es una sucesión de ocho letras y números en el formato "xxxx-yyyy"
Se puede conocer mediante el comando “vol” del sistema.
El formato del serial es xxxxyyyy (sin incluir el guion intermedio).
Dado que el serial de este ejecutable se basa en el volumenID de la unidad C donde se ejecuta, sólo existe un serial válido en cada máquina.
Esta sería una función para obtenerlo en visual basic:
1. Function HDSerialNumber() As String
2. Dim fsObj As Object
3. Dim drv As Object
4. Set fsObj = CreateObject("Scripting.FileSystemObject")
5. Set drv = fsObj.Drives("C")
6. HDSerialNumber = Left(Hex(drv.SerialNumber), 4) _
7. & Right(Hex(drv.SerialNumber), 4)
8. Debug.Print HDSerialNumber
9.
10. End Function
Habria muchas otras maneras de evitar tener que usar un serial modificando bytes sueltos en el ejecutable. Por ejemplo modificando la instruccion 401127 y poniendo un JMP en vez de un JE (EB31 en vez de 7431)