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!.

miércoles, 10 de agosto de 2016

VT_GetReport - análisis recursivo a una url en busca de malware

Sencillo script que hace uso de la API de virus total para hacer un análisis recursivo a una url.
Ejemplo:
:) Happy Hacking! ...

miércoles, 3 de agosto de 2016

UnicodeIpObfuscator - Ofuscando una dirección IP con caracteres Unicode

Sencilla tool desarrollada por mí e inspirada en el trabajo de @OsandaMalith (https://goo.gl/BrtoAB) que ofusca una dirección ip de diferentes maneras usando caracteres unicode:

Ejemplo:


Cómo podemos observar la ip 189.247.150.242 (www.google.com) puede ser representada de diferentes maneras entre ellas:

[+] http://0Ⅹℬⓓ.⁰ⅹf7.₀Ⅹ⁹⁶.⁰xf2
[+] http://⁰ⅩⓑD.⁰ⅹℱ⁷.₀Ⓧ9⁶.⁰ˣⓕ²
[+] http://₀Xbd.₀Ⓧf⁷.₀ⓧ₉₆.₀ⅹⒻ²
[+] http://⁰XbⅮ.⓪xⓕ⁷.⁰ⓧ₉⑥.₀ⅩⒻ②
[+] http://⁰XℬⅮ.₀ˣℱ7.0ˣ96.0ⅹf②
[+] http://₀ˣbⅮ.⁰Xf7.⁰ⓧ9₆.₀Ⅹf²
[+] http://₀ˣⒷd.⓪ⓍF⁷.0x₉₆.⓪ˣℱ②
[+] http://₀ˣBⒹ.⁰ⓧf⑦.⁰Ⓧ⑨⑥.⓪ⅹℱ2
[+] http://⁰ⅩbⅮ.0xℱ7.₀ˣ⁹₆.⁰xⓕ₂
[+] http://⁰xbD.₀ⓍⒻ⁷.⁰x9⑥.⁰XF②
[+] http://⁰ˣℬd.₀XF⑦.⓪ⅹ⑨₆.₀ⅹⒻ2
[+] http://⁰xⒷⅮ.₀Ⓧf⑦.⁰Ⓧ₉⑥.⓪Xℱ2
[+] http://⁰ⓧⓑⓓ.⁰ⅹF7.₀x⁹⑥.⁰Ⓧℱ²
[+] http://₀ˣℬⅅ.₀xℱ⑦.⁰Ⓧ9⑥.⁰ⅹⓕ²
[+] http://₀xⒷD.₀ˣF7.₀Ⓧ9⁶.0ⅩF²
[+] http://₀ⅹℬd.⁰Ⅹℱ₇.₀Ⓧ9₆.0ˣⓕ2
[+] http://0xBⒹ.0XⒻ7.₀X⑨⁶.⁰ⓧF2
[+] http://0ⓧⒷⅮ.₀ˣⓕ⑦.₀x9⑥.⁰ⅹf2
[+] http://₀ⅩBⅅ.⁰ⓧⓕ⑦.0Ⓧ⁹6.⁰xℱ②
[+] http://0ˣbⅾ.₀ˣℱ⁷.0ˣ₉⁶.0ⅹℱ2
[+] http://⓪xbⅮ.₀xⒻ⁷.⓪ˣ96.₀ˣⒻ²
[+] http://⓪XBⅮ.⁰ⓧf⁷.⓪Ⅹ₉₆.⁰ˣf②
[+] http://⁰ⅹⒷⓓ.⁰ⅹℱ7.⁰X⑨6.⓪ⓧf2
[+] http://⓪xBⅆ.₀Ⓧℱ⁷.0ⓧ₉⁶.0Ⅹℱ₂
[+] http://⓪xbⅆ.0ˣⓕ7.₀x⑨⑥.⓪Ⅹℱ②
[+] http://⓪ⓧⒷⒹ.₀ⓧf⑦.₀X⑨₆.⓪Ⓧℱ₂
[+] http://⁰xℬⅮ.₀ˣⓕ⑦.⁰Ⓧ⑨6.0ⅹℱ2
[+] http://⁰ⅩⒷD.₀ˣⓕ7.0Ⅹ⑨₆.⁰ⅹⒻ²
[+] http://⁰ⓧⓑⅾ.⓪Ⓧℱ7.0Ⓧ96.₀xℱ²
[+] http://₀XⓑⒹ.₀XF⑦.⁰Ⓧ9₆.0ⓧℱ②
[+] http://0ⅩBⅅ.⁰ⅹF⁷.⁰X96.⁰XⒻ②
[+] http://₀xⓑⅅ.⁰ⓍF₇.0x9₆.⁰Ⅹf2
[+] http://₀Ⓧⓑⅾ.⁰ⓧℱ⁷.⓪x⁹⑥.₀ⓧⒻ²
[+] http://⁰Ⓧℬⅅ.₀ⓍF⁷.₀ⅹ₉⑥.₀Xf₂

Puedes disfrutar y hacer uso de esta utilidad cuando quieras siguiendo este enlace (http://bit.ly/2aSe4dC).

domingo, 3 de julio de 2016

Aprendiendo el aeiou de radare2

En esta entrada les voy a compartir el aeiou de radare2, es decir, hablare acerca de algunos comandos que ahorraran la curva de aprendizaje a aquellas personas que se están animando a entrar al mundo del reversing y cuya opción para desensamblar, depurar, analizar y manipular archivos binarios fue nada más y nada menos que radare2, herramienta de código abierto que tiene la capacidad de ejecutarse desde una terminal y ofrecer unos resultados más que satisfactorios, pero bueno, basta de tanto blah, blah, blah y pasemos a lo que corresponde.

Antes que nada debemos tener instalado radare2, cuya ultima versión esta disponible en su repositorio GitHub. Y bueno, como soy una persona que cree que la mejor forma de aprender es de manera practica, usare este ejecutable (ccf58978584aacfed3ea9917e153e36b) para ejemplificar todos los comandos que mencionare enseguida.

Comando de ayuda y evaluación matemática ( ? )

 

Este comando es uno de los más simples y mi favorito, ya que radare2 tiene un comando asignado para cada letra del alfabeto, es decir, de la a-z, memorizar y recordar cada uno, es algo muy difícil, pero tranquil@s porque basta con incluir al final de un comando el símbolo ?, para obtener una descripción de lo que hace dicho comando específicamente, pero bueno, dijimos que pondremos en practica lo que se menciona en esta entrada, así que carguemos el ejecutable en radare2 usando el comando r2.



Como podemos ver el comando por si solo nos arroja una descripción de todos los comandos básicos de r2, pero si probamos ahora con a? se mostrara solo la ayuda para el comando a específicamente:


Además de ser un comando para obtener ayuda, también sirve como comando de evaluación matemática, y lo vemos claramente en la siguiente imagen:

Nótese el espacio que hay después del signo ?, si se omite, el comando se interpretara como comando de ayuda.

Comandos para obtener información del fichero



Radare2 cuenta con algunos comandos que permiten conocer información de un archivo binario, entre estos comandos se encuentran:

iI -> Comando que nos lista gran cantidad de información acerca del archivo binario, entre esa información se encuentran, el tipo de binario, arquitectura, lenguaje, estado de las contra-medidas vs exploiting, etc.


Si solo necesitamos conocer un valor especifico, podemos usar el operador ~ seguido de iI para buscar coincidencias como lo hace el comando grep en linux, es decir, si solo queremos saber el tipo de binario que es nuestro fichero usamos iI~bintype, o si queremos saber si tiene activado el bit nx usamos iI~nx:


ii -> Este comando nos muestra información de todos los objetos que son importados por el archivo binario:

Nuestro ejecutable realiza 3 importaciones y printf es una de ellas.

il -> Nos lista las librerías que utiliza nuestro archivo binario:

ie -> Este comando nos muestra el punto de entrada del archivo binario, es decir, la dirección de la primera instrucción que se ejecuta:

iM -> Parecido al comando anterior pero esta vez lo que se obtiene es la dirección de main:


is -> Lista todos los símbolos del binario:

iz -> Con este comando obtenemos una lista de las strings que contiene el archivo binario:

 

Comandos de búsqueda 


Radare2 también cuenta con una serie de comandos de búsqueda, entre los más útiles se encuentran:

/ string -> Este comando nos lista todas las direcciones en las que se encuentra una coincidencia con la string que se pasa como parámetro:

/a instrucción -> Es un comando que permite conocer todas las direcciones en las que se encuentra una coincidencia con la instrucción en ensamblador que se pasa como parámetro, es decir, si queremos listar todas las instrucciones jmp eax que contiene el fichero binario tendríamos que usar /a jmp eax:



/A tipo_de_instrucción-> tiene un comportamiento muy similar al comando anterior, solo que esta vez se obtiene la lista de direcciones que coinciden con el tipo de instrucción que se paso como parámetro, en otras palabras, si nosotros queremos obtener los saltos (jmp) que se encuentran en el desensamblado del fichero binario, tenemos que usar /A jmp, aunque no lo parezca, este es un comando muy diferente al anterior, ya que /a jmp eax solo lista las direcciones donde se encuentra un jmp eax exactamente, mientras que /A jmp lista cualquier tipo de salto que se encuentre en el archivo binario, es decir, jmp eax, jmp ebx, jmp ecx, jmp edx, etc.

/R [filter] -> Este comando es muy útil para un exploiter (Creador de exploits), ya que muestra un listado de gadgets ROP, es decir, conjunto de instrucciones que finalizan con la instrucción RET, JMP, o CALL y que al ser enlazadas pueden facilitar la creación de un exploit funcional:

iS | grep perm=..w -> Con esta instrucción se obtiene un listado de todas las secciones del archivo binario en las que se permite la escritura:


iS | grep perm=...x -> Similar a la instrucción anterior, pero esta vez se listan las secciones del binario que son ejecutables:


 

Comandos para análisis,desensamblado,búsqueda de referencias, manejo de funciones, argumentos y variables locales


aaa -> Este comando analiza todo y auto-nombra las funciones, es el primer comando que debemos ejecutar antes que todos los que se mencionan enseguida.

afl -> Nos lista todas las funciones que fueron analizadas por el comando aaa:


s [nombre_función|dirección_función] -> Para poder abordar o posicionarnos en alguna de las funciones que lista afl podemos usar este comando, es decir, si queremos abordar la función sym.main tenemos dos posibilidades y son las siguientes:


algo parecido debe usarse si la función que queremos abordar es sym.aeiou:


podemos ver que lo único que cambio fue el nombre y la dirección de la función.

pdf -> Este comando desensambla la función que abordamos usando el comando s, es decir si ejecutamos s sym.main y después ejecutamos el comando pdf lo que obtendremos sera el código  desensamblado de dicha función:


pdf@[nombre_función|dirección_función] -> Si queremos ahorrarnos el uso del comando s, o no tenemos la intención de abordar una función diferente a la que actualmente estamos abordando podemos usar este comando, he aquí un ejemplo:


Ahora bien, si lo que se desea es solamente obtener una N cantidad de lineas del código desensamblado, podemos optar por usar pd [N]@[función_name]:


axt [nombre_función] -> Este comando nos muestra las referencias que existen hacia una función, es decir, instrucciones en código ensamblador desde las cuales es llamada una función, por ejemplo, si queremos saber las direcciones desde las que se efectúa una llamada a printf podemos usar axt sym.imp.printf:


En la imagen podemos observar que en nuestro fichero binario se efectúan 3 llamadas a la función printf (en las direcciones 0x400582, 0x400560 y 0x400544) para comprobar que esto es correcto, podemos hacer uso del comando pd que ya mencionamos anteriormente:



Y en efecto, en esas 3 direcciones se efectúa una llamada a la función printf.


afa -> Si queremos conocer los argumentos de una función tenemos que usar este comando, por ejemplo, si queremos conocer los argumentos de la función sym.aeiou debemos hacer lo que se muestra a continuación:


afv -> Este comando ofrece también un listado, solo que esta vez lo que se lista son las variables locales de la función:


afn new_name_function->  Con esta instrucción podemos cambiar el nombre de una función:


afan old_name new_name-> Si lo que se desea es renombrar algún argumento de la función podemos usar este comando:



afvn old_name new_name-> Sirve para renombrar las variables locales de una función:


gráficos y comentarios
 

Como no podía faltar, radare2 también nos ofrece un ambiente más ameno y cómodo llamado visual mode, que si bien no es nada cercano a una GUI, si que puede ser algo mucho más sencillo de usar que la CLI una vez te acostumbras. 

para acceder a este modo solo basta con tipear el comando V, de igual manera que en la CLI el comando ? nos muestra la ayuda para este modo:



Y bueno ahí esta, no entrare en detalle con cada uno de los comandos pero si mencionare uno de los comandos que más util nos puede ser y ese es:

VV@[function_name] -> Este comando nos muestra un gráfico (ascii art) de una función, por ejemplo, si queremos ver el grafico de la función sym.aeiou usamos VV@sym.aeiou y obtendremos algo como esto:

Al momento de estar visualizando el gráfico disponemos de algunos atajos de teclado que podemos obtener al oprimir ?, algunos de estos atajos son:
  • asdw -mueve el grafo completo
  • hjkl - mueve un nodo (también podemos usar las teclas de dirección)
  • tab/TAB - selecciona next/previous node
  • t/f -Sigue camino verdadero/falso
  • . -centra el gráfico
  • q -salir
Y bueno ya para terminar este extenso recorrido aprendamos algo sobre los comentarios en radare2:

CC -> Nos lista todos los comentarios que contiene nuestro fichero objeto.


¿y si lo queremos es agregar un comentario? simple, solo basta con usar el comando s para posicionarnos en la dirección donde queremos agregar el comentario y después usar CC [Comentario] y listo:


Como vemos en la imagen lo que se hizo primero fue abordar la dirección 0x004004ef para después agregar el comentario "llamada a función aeiou" en dicha dirección usando CC, otra manera de obtener el mismo resultado es usar el comando CCu [Comentario]@[addr]:



Y bueno, eso es todo... claro que no son todos los comandos ni mucho menos todas las posibilidades que ofrece este excelente framework llamado Radare2, pero espero que sirva de algo a aquellos que recién se inician a experimentar con el, sin más que decir, happy hacking :).