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.GetVolumeInformationAEl 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 RETNPosteriormente, 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 = 8Aqui 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)
No hay comentarios:
Publicar un comentario