Miscellaneous

lunes, 12 de septiembre de 2016

Técnicas antidepuración - PEB.NtGlobalFlag

Para continuar la serie sobre técnicas antidepuración, en esta entrada hablare acerca de la técnica que usa otro campo de la estructura PEB, más específicamente el campo NtGlobalFlag (offset 0x68).

Este campo, al igual que PEB.BeingDebugged (offset 0x02), cambia su valor cuando el programa es cargado desde un depurador, es decir, cuando el programa no esta siendo depurado, normalmente su valor es 0x0, mientras que cuando es cargado desde un depurador, su valor cambia a 0x70, valor que se explica por el establecimiento de las siguientes banderas con sus respectivos valores:

FLG_HEAP_ENABLE_TAIL_CHECK -> 0x10
FLG_HEAP_ENABLE_FREE_CHECK -> 0x20
FLG_HEAP_VALIDATE_PARAMETERS-> 0x40

Si observas, la suma de los valores con los que se establecen estas banderas es 0x70, que es el valor que adquiere PEB.NtGlobalFlag cuando el programa esta siendo depurado. Entonces, para saber si un programa esta dentro de un depurador usando PEB.NtGlobalFlag, antes se debe hacer una comprobación de su valor con 0x70, si es igual, entonces esta siendo depurado, en caso contrario, no lo esta, en esencia es el mismo funcionamiento que emplea la técnica IsDebuggerPresent(), la única diferencia es que ahora windows no nos proporciona una función para acceder directamente a PEB.NtGlobalFlag, por lo que debemos hacer uso de un código parecido al siguiente:



O también alguno de estos, que desde mi punto de vista, son la mejor opción si eres una persona que se interesa en el mundo del reversing y lenguaje ensamblador:


Pero bueno, sea cual sea la forma en que implementes esta técnica, debo advertirte, evitarla es igualmente fácil que evitar la técnica IsDebuggerPresent(), si observas, basta con manualmente cambiar el valor de la flag NtGlobalFlag y setearlo a 0x0, así, si el programa se carga desde un depurador, funcionara de igual manera que como si estuviera fuera de este.

pero manten la calma, apenas estamos en la segunda técnica antidepuración, esto ira aumentando de complejidad e iremos conociendo nuevas técnicas en futuras entradas. 

Por ahora, estudiar, comprender e intentar hacer bypass de estos códigos puede ser un buen ejercicio para reforzar lo leido... Sin más que decir, manos a la obra y happy hacking! :).

viernes, 9 de septiembre de 2016

De burpsuite a túnel SSH y salgo con Tor.

Como lo dice el título, en esta ocasión aprenderemos el procedimiento para poder lograr entablar una relación entre tres servicios diferentes, burpsuite, Túnel SSH y Tor, es decir, lo que lograremos siguiendo este procedimiento tendra una pinta parecida a esto:

Web Browser
Solicitud 
https://facebookcorewwwi.onion/ 
BurpSuite  
  SSH tunnel  
 TOR 
 INTERNET 

¿Qué logramos con esto? Resumidamente las ventajas son las siguientes:

  • Anonimato: Ya que la IP con la que salimos a internet es la IP de un nodo de TOR y no la IP publica real que nos asigna nuestro ISP, pero epa, tranquilos, el anonimato es de aquí para adelante, el servidor remoto que usamos para realizar nuestro túnel SSH sí que sabe cual es nuestra IP real, así que ojo con creer que son 100% anónimos.

     

  • Capacidad de modificar solicitudes de dominios .onion: Sabemos que BurpSuite permite capturar, analizar y modificar peticiones GET y POST, Tor nos da acceso a dominios .onion, en complemento ya se imaginan jeje (ahhh por el alert`XSS` & el CSRF).

     

  • Cifrado y protección contra sniffers: De esto se encargara nuestro tunel SSH ya que al implementarlo nuestro trafico se encapsula y cifra, lo que nos da una protección extra contra ataques del tipo MitM que son muy comunes para el robo de credenciales e información sensible en redes que no son de nuestra confianza (Fr33Wif1 Fuck Yeah!).

     

Pero bueno, no perdamos más tiempo y manos a la obra.

 

Antes que nada debo aclarar que todos los pasos de este tutorial se realizaron sobre una máquina con BunsenLabs instalado como sistema operativo, más específicamente BunsenLabs 8.5 (Hydrogen), así que si el sistema operativo de tu máquina no es BunsenLabs, sera tarea tuya el adecuar estos procedimientos para que funcionen correctamente en tu sistema, sin más que aclarar, procedamos con el tutorial.


Primeramente instalemos todo lo que necesitamos:

  • BurpSuite
  • Tor
  • Y Un cliente SSH.
Para facilitar esto desarrolle un script que efectúa de manera automática las instalaciones, para usarlo basta con ejecutar en una terminal y como usuario root, los siguientes comandos:

Muy bien, una vez tenemos todo instalado procedemos a ejecutar burpsuite, creamos un proyecto temporal, usamos los valores por default de burp y damos clic en Start Burp:


Una vez corriendo burp, automáticamente se pone a la escucha un proxy en el puerto 8080:


Para poder usar dicho proxy debemos configurar firefox siguiendo los pasos que se describen a continuación:


  • Una vez dentro, accedemos a la pestaña Network y hacemos clic en  Settings, esto abrira una nueva ventana que configuraremos con los valores que podemos observar en la siguiente imagen:

  • Una vez damos clic en Ok, burp ya debe ser capaz de capturar las solicitudes que efectuamos desde nuestro navegador:


  • Para evitar conflictos con protocoles seguros y certificados, descargaremos e instalaremos el certificado que nos ofrece burpsuite, para ello nos dirigimos a http://burp/cert, guardamos el certificado en alguna carpeta y después accedemos nuevamente a about:preferences#advanced y realizamos lo siguiente:



Listo, ya tenemos configurado correctamente nuestro navegador, simplificando, lo que tenemos hecho hasta ahora, tiene un aspecto parecido a esto:

Web Browser
Solicitud 
https://facebook.com
BurpSuite 

Lo que resta es poder capturar solicitudes a dominios .onion, cifrar nuestro trafico con el tunel SSH y obtener una ip anonima de algún nodo de Tor, suena muy complicado, pero tranquilo, es mucho más fácil de lo que parece.

Para empezar, lo del tunnel SSH es tan simple como tipear el siguiente comando en una terminal:

 ssh -N -D <portListen> <user>@<IpRemoteServerSSH>

Donde:
  • <portListen>: Es el puerto en el que va a estar escuchando nuestro túnel.
  • <user>: Es algún nombre de usuario con el que podemos realizar login en nuestro servidor SSH.
  • Y <IpRemoteServerSSH>: Es la ip de nuestro servidor remoto.
En mi caso, este comando queda de la siguiente manera:



Una vez proporcionada mi contraseña, mi tunel SSH es funcional, y esta a la escucha en el puerto 1337, lo podemos verificar usando netstat -ptnl:


Hasta aquí el túnel solo esta a la escucha, para usarlo, y relacionarlo con Tor, debemos ejecutar el siguiente comando:

echo "Socks5Proxy 127.0.0.1:1337" >> /etc/tor/torrc

Lógicamente "1337" debe ser cambiado por el puerto en el que esta escuchando tu túnel SSH.

Una vez hecho esto, iniciamos el servicio Tor:

service tor start
 
Comprobamos que tor este a la escucha en el puerto 9050:
Y finalmente, modificamos burpsuite para que use este proxy:


Listo, ahora nuestro esquema esta completo, somos "anónimos":

Podemos acceder y capturar solicitudes a dominios .onion:
Y nuestro trafico viaja cifrado por nuestro tunel SSH:

Eso es todo, aquí acaba esta entrada, espero te haya sido de utilidad, y des un uso responsable a lo que haz aprendido aquí, sin más que agregar, happy hacking! y hasta la próxima... :).




martes, 6 de septiembre de 2016

Técnicas antidepuración - IsDebuggerPresent()

La técnica más simple para comprobar si un programa se encuentra dentro de un depurador, es decir, esta siendo depurado, es aquella que realiza una comprobación al estado de la bandera BeingDebugged, dicha bandera se encuentra en el PEB (Process Environment Block) y tiene el offset 0x02.


En sistemas windows se nos proporciona vía kernel32.dll la función IsDebuggerPresent() para checar el estado de esta bandera, el código que se muestra debajo es un ejemplo de como usar kernel32!IsDebuggerPresent() para verificar si el programa se encuentra dentro de un depurador:


Se puede notar que la función nos va a retornar un valor Booleano, es decir,  si es 1 (TRUE) significa que el programa fue cargado desde un depurador, si es 0 (FALSE) significa que el programa esta corriendo fuera de un depurador.

Otros códigos equivalentes a lo anterior pueden ser los siguientes:


La simpleza de esta medida antidepuración la convierte hoy en día en una de las medidas menos efectivas para tratar de evitar a un depurador ya que basta con modificar manualmente la flag PEB.BeingDebugged con el valor 0x00 para evitarla.

Pero bueno ya en otras entradas abordare técnicas más sofisticadas para detectar depuradores, por ahora trata de entender bien el funcionamiento de los códigos proporcionados anteriormente y happy hacking!.