miércoles, 21 de junio de 2017

Phishing - punycode, typosquatting y esas cosas...


El Phishing… un arte que nunca muere (? Porque ya son demasiados los años en que ésta práctica se utiliza para el robo de credenciales a los usuarios, porque parece que poco le hace a su efectividad las capacitaciones que se brindan al respecto y porque a pesar del tiempo ni siquiera se ha sofisticado demasiado la técnica de ataque. Siempre es lo mismo, una cabecera de origen de un correo falsificada, un mensaje bonito y un link a un sitio que se apropiará de tus datos si allí los ingresas.

Parece tan tonto, tan obvio de darse cuenta lo que va a pasar… pero no! Lamentablemente miles de usuarios caen a diario en estas trampas y sus credenciales y/o datos confidenciales son robados. ¿Por qué estoy escribiendo una nota de Phishing? Tal como mencioné, la técnica no se ha sofisticado demasiado en el tiempo, el común denominador siempre es explotar el factor humano y eso no cambiará; sin embargo, hay algunos conceptos y herramientas de las que me gustaría escribir.

El Phishing comenzó como lo que mencionamos en el primer párrafo, un correo de origen falsificado con un mensaje que pretende engañar al usuario para que entre a determinada página y escriba sus credenciales. Cuando se capacitaba a la gente para prevenirla de caer en esta trampa, a menudo se hacía énfasis en dos cosas: “Revisar si el sitio al que dirige el link del correo falso es HTTPS o no”, “Mirar bien el link, suele ser similar a la URL del sitio que se está falsificando, mas no es exactamente igual”.

¿Por qué estos consejos? Es cierto que la mayoría de los ataques de Phishing se montan sobre sitios web HTTP mientras que los sitios originales (home banking, redes sociales, etc.) siempre los vemos sobre HTTPS. Pero decirle a un usuario que con ver que el sitio al que ingresa es HTTPS ya es suficiente para confiar, es un grave error. Un atacante puede obtener un certificado SSL/TLS para su sitio falso, y convertirlo en HTTPS fácilmente, de hecho, ni siquiera es necesario que invierta dinero, existen páginas como “Let’s Encrypt” que emiten certificados totalmente válidos y gratuitos por varios meses.

Respecto del segundo consejo habitualmente mencionado, revisar bien la URL, es porque para el sitio falso se suele adquirir un dominio muy similar al del sitio real. La técnica se la suele llamar typosquatting y se trata básicamente de engañar al ojo humano, para que lea por ejemplo “linkedin.com” cuando en realidad dice “likendin.com”. Una alternativa similar, es utilizar el mismo nombre de dominio pero con un TLD diferente, por ejemplo linkedin.tk en lugar de linkedin.com pero el poder hacerlo depende de que dicho dominio esté disponible. Debido a esto, existen numerosas herramientas para hacer un chequeo rápido de los TLD disponibles para un determinado nombre de dominio.

Una herramienta nueva, que me ha gustado mucho es CATPHISH, pueden descargarla de aquí: https://github.com/ring0lab/catphish/.




Como se puede ver en la imagen, nos arroja un listado de dominios muy similares, en este caso al dominio de Twitter, que están disponibles para ser registrados por cualquier persona. Imposible de negar que a "twiiter.com" hasta podríamos entrar por error de tipeo, es bastante riesgoso que dicho dominio "ande libre por ahí".

Hace realmente muchos años, al menos unos 10… cuando empecé a estudiar estos temas, leí la teoría sobre ataques homógrafos, la cual se basa en registrar un dominio que utiliza caracteres que a la vista son extremadamente similares o prácticamente idénticos a los que se quieren falsificar. Así es como cierta persona registró ɢoogle.com en lugar de google.com (sutil cambio en la letra “g” ¿no?).  Hasta hace algún tiempo atrás, no se escuchaba que esta técnica fuera aprovechada, pero parece que eso está cambiando…

Hace poquito Xudong Zheng registró el dominio xn--80ak6aa92e.com que si hacemos click, notaremos que el navegador lo muestra como apple.com. Es una hermosa demostración del potencial de este tipo de ataque si se lo utiliza con fines delictivos. La realidad, es que no es más que jugar con los caracteres y aprovecharse del sistema “punycode”, utilizado por los servidores DNS para poder gestionar dominios que son registrados en otros caracteres que no son romanos.
La herramienta que mostré anteriormente, se ganó mi cariño por encima de las demás, ya que tiene un parámetro que analiza las posibles URLs que podrían registrarse utilizando caracteres que a la vista del usuario se verán muy similar al dominio original.



Por ejemplo en la imagen podemos ver que el dominio xn--ppl-rgzsf.com está disponible para ser registrado y a simple vista luce muy parecido al dominio real de Apple.
Tal como comencé escribiendo, los ataques homógrafos llevan muchos años documentados, sin embargo ahora, desde mi punto de vista, estoy observando más casos que lo aprovechan así como también nuevas herramientas que facilitan el llegar a registrar este tipo de dominios.

Bueno, esta nota no tenía otro objetivo más que comentar algunas cosas del tema y compartirles la herramienta catphish que fue de mis preferidas esta semana :)
¡Nos leemos pronto!.

Author: Sheila A. Berta
Tw: @UnaPibaGeek.
Web: www.semecayounexploit.com.

domingo, 11 de junio de 2017

Reversing IV: Inyección PE a mano (old school)



En la entrada anterior de esta serie de notas de reversing, vimos cómo expandir una sección del ejecutable con el objetivo de hacernos un hueco para inyectar código propio allí. Hasta este punto, llegamos a hacer dicho espacio a mano, y ampliamos la última sección del binario de Putty de 32bits. Ahora llegó el momento de aprovechar ese espacio que hemos creado e inyectar el código que deseemos.

Para la práctica inyectaremos un MessageBox que se mostrará el iniciar el binario. En este caso el ejecutable afectado, como ya dijimos, es el cliente de Putty de 32 bits.

Si consultamos la documentación de la API MessageBox, podemos ver los parámetros que tenemos que pasarle para lograr ejecutar correctamente un mensaje.


Como podemos observar, el texto del mensaje (lpText) y el titulo (lpCaption) están entre los parámetros que debemos proporcionar. También tenemos el handler (hWnd) de la ventana que lo dejaremos en Null y el tipo de MessageBox, para el cual tenemos una gran variedad de opciones, pero también lo dejaremos en Null para que muestre un cuadro simple con un botón de “Aceptar”.

El primer paso es abrir con un editor hexadecimal el binario al cual le hemos expandido la sección, e insertar en alguna parte de ese hueco que hicimos, el texto y el título del mensaje que vamos a mostrar. Tal como pueden observar en la nota anterior, el espacio que generamos en el binario de Putty comienza en el offset AAE00h, así que es allí donde me posicionaré para escribir el mensaje.



En el offset AAE00h tenemos el título y en el AAE10h el texto del mensaje.

A partir del offset AAE30h inyectaremos las instrucciones necesarias para la ejecución del MensajeBox, pero para ello vamos a utilizar un debugger como OllyDBG o Immunity DBG.
Antes de abrir el binario con el debugger, vamos a cargarlo en Stud_PE para convertir los offset a RVA, de manera que al momento de abrirlo con el debugger ya sepamos a donde dirigirnos.



Tal como vemos en la imagen, cargamos el binario en Stud_PE, presionamos en RVA<=>RAW y calculamos la RVA tanto del título, como del mensaje y la posición donde vamos a escribir luego las instrucciones de código.
  • Título: 00AAE00 -> 004B0000
  • Texto: 00AAE10 -> 004B0010
  • Código: 00AAE30 -> 004B0030
Dentro de Stud_PE también podemos ver la dirección del Entry Point, vamos a anotarnos ese dato ya que lo necesitaremos más adelante. En el caso de este binario, el EP se encuentra en la dirección: 0045C728.

Ahora sí, abrimos el ejecutable con Immunity DBG o el debugger que más nos guste y una vez allí, lo primero que haremos será buscar la dirección de memoria donde se encuentra la llamada a la API de MessageBox. En esta práctica, y para empezar, lo haremos de la siguiente manera:

Click secundario en cualquier parte de la ventana de código y seleccionamos Search For -> All Intermodular Calls.


En la ventana que se abre, debemos buscar la API de MessageBox.


Hacemos doble click allí, y en la ventana de código podremos observar la dirección de la llamada.


Aunque, es necesario invertirla, de manera que la dirección para este caso finalmente es: 0047C474.
Ahora sí, teniendo todos los datos necesarios, nos dirigimos al hueco que hemos creado, donde inyectaremos todas las instrucciones. Como ya hemos calculado, la dirección es 004B0030. Así que hacemos click secundario en cualquier parte del código, y presionamos en Go to -> Expression.


En el cuadro de dialogo que se abre escribimos la dirección y presionamos OK.

Una vez allí, empezamos a escribir las instrucciones necesarias. Para ello, hacemos doble click sobre la primera posición que vamos a alterar y escribimos PUSH 00 para el parámetro uType.


Presionamos “Assemble” y continuamos con el parámetro lpCaption, para el cual haremos un PUSH a la dirección de memoria que ya hemos calculado antes, donde se encuentra el título para el mensaje.


Lo mismo para el siguiente parámetro, el cual es el texto del mensaje.


Como último parámetro, hacemos un PUSH 00 para el parámetro hWnd.

Ahora nos queda el llamado a la función, para ello utilizaremos la siguiente instrucción:  CALL DWORD PTR DS:[0047C474] donde entre llaves, tenemos la dirección de memoria que obtuvimos en pasos previos.


Con esto, ya tendríamos nuestro MessageBox armado con todos los parámetros necesarios. Ahora bien ¿En qué momento se va a ejecutar esto? Nuestro próximo paso es alterar el Entry Point, de manera que nuestra inyección de código sea lo primero que se ejecute.

Entonces, vamos a escribir una instrucción más donde estamos ahora, que será el salto al Entry Point original y se ejecutará inmediatamente después de que nuestro MessageBox se muestre en pantalla.




Finalmente, toda nuestra inyección de código queda de la siguiente manera:


Como vemos, la inyección comienza en la dirección 004B0033 así que ese será el nuevo Entry Point del ejecutable. Guardamos la modificación seleccionado todas estas nuevas instrucciones de código y haciendo click secundario -> Copy to Executable -> Selection. En la ventana que se abre hacemos click secundario -> Backup -> Save data to File y guardamos el archivo nuevo.

Para modificar el Entry Point, abrimos este nuevo archivo con el PE Editor de Lord PE y cambiamos el valor original del EP por 000B0033 que es donde comienzan las instrucciones que hemos inyectado.


Click en “Save” y finalizamos.
A partir de ahora, al ejecutar este binario, lo primero que veremos será nuestro MessageBox.


Al presionar Aceptar visualizaremos el cliente de Putty correctamente.



Bien, esta nota ha sido realmente muy "old school" y es la forma en que yo hacia inyecciones PE hace años. Es una forma muy sencilla que necesita mejoras que veremos más adelante, en próximas notas. Sin embargo, me parece que es útil para introducir conceptos de lo que es inyectar código en PE e ir amigandose con un debugger :).

Nos leemos pronto!

Author: Sheila A. Berta.
Tw: @UnaPibaGeek.
Web: www.semecayounexploit.com.

martes, 6 de junio de 2017

[ARDUINO-TIP] Leer y procesar con python una comunicación Serie


Cualquier persona que me conozca sabe muy bien que odio arduino y eso no ha cambiado xD. Mis desarrollos de hardware siempre se basan en microcontroladores PIC programados en assembler o eventualmente en C. Para mi, Arduino es el Python de la electrónica, y los que me conocen saben también que no comparto la filosofía de dicho lenguaje. En fin, aclarado eso, resultó que tengo que armar una demo para la cual no tengo el tiempo de hacer algo como a mi me gustaría, fue entonces que opté por usar un Arduino.

Como parte de la demo necesito poder recibir y procesar con un script en Python, ciertos datos enviados por el Arduino a través de una comunicación serie. Me pareció que podía serle útil a alguien más así que lo comparto.

En primer lugar tenemos el circuito, que para hacer una simple prueba de concepto utilicé 2 botones como entradas digitales y 2 LEDs de diferente color como salida (decoración). Al presionar un botón se enciende el LED rojo, si presionamos el otro botón se enciende el LED verde.




No voy a detallar como los conecté ya que no es más que 2 botones y 2 LEDs, tutoriales de cómo conectar eso hay millones. Para alimentar el protoboard utilicé la salida de 5v del arduino y el GND del mismo. Por otro lado tenemos dos pines digitales (4 y 12) declarados como entrada para los botones, y otros dos pines digitales (2 y 13) definidos como salida para los LEDs.

El objetivo es, que al presionar un botón no solo se encienda su correspondiente LED, sino también, que envíe un dato a través de una comunicación Serie, que nos diga si fue el "botón rojo" o el "botón verde" el que fue presionado. 

Para ello, el código para el Arduino puede ser el siguiente:




Podemos probar rápidamente que esto funciona utilizando el "Monitor Serie" del Arduino IDE. Al presionar los diferentes botones deberíamos ver que recibimos la correspondiente string en pantalla.



Sin embargo, esto no nos permite realizar ningún tipo de procesamiento del dato recibido para actuar en consecuencia, es por ello que programaremos un script en Python que nos permita jugar un poco más :)



Como vemos el script es extremadamente sencillo, podríamos hacer simples variaciones de acuerdo a lo que necesitemos. Por ejemplo la línea 14: "srecv = s.readline()" lee una línea completa que se ha recibido, esto es una string hasta donde se encuentra el caracter de salto '\n'. Si quisiéramos podríamos utilizar simplemente read() para ir leyendo byte a byte, o sino read(10) por ejemplo, para leer hasta los primeros 10 bytes recibidos.



Recuerda que puedes utilizar http://www.onlineocr.net/ para obtener el código de las imágenes publicadas. Sin más, espero que les sea útil, nos leemos en otra nota!

Author: Sheila A. Berta
Tw: @UnaPibaGeek.
Web: www.semecayounexploit.com