HookMe, herramienta para interceptar comunicaciones con API hooking

lunes, 4 de noviembre de 2013

Hookme es un programa para sistemas Windows que permite interceptar los procesos del sistema cuando llaman a las APIs necesarias para las conexiones de red. La herramienta, todavía en versión beta, fue desarrollada por Manuel Fernández (del actual equipo de Elven Paths) y Francisco Oca (que participó en el desarrollo de las primeras versiones de FOCA). La herramienta fue presentada en las ediciones de BlackHat Europe & USA 2013.

Cuando se analiza malware, habitualmente se estudia el tráfico de red para comprender cómo se comunica con el exterior, qué información descarga, o qué órdenes recibe o envía. Normalmente este tipo de malware utiliza http o https para comunicarse, y las herramientas para conseguir "ver" ese tráfico son de sobra conocidas (actuando como man in the middle). Sin embargo, cierto tipo de malware más sofisticado puede llegar a utilizar un protocolo propio encapsulado bajo SSL y con verificación de certificado del servidor (si no se comunica con un servidor con un certificado específico que almacena en su código, se niega a continuar). Analizar de forma más cómoda el tráfico generado por este tipo de malware fue lo que motivó la creación de la herramienta, aunque se puede utilizar para otras finalidades, por ejemplo:
  • Análisis y modificación de protocolos.
  • Firewall de aplicación (gracias a los filtros on the fly que se pueden aplicar).
  • Herramienta de post-explotación para la creación de puertas traseras (inyección de malware sobre el protocolo de red de una determinada aplicación).
API Hooking

A grandes rasgos, la técnica de "hooking" consiste en interceptar la comunicación entre distintos procesos, ya sean llamadas a funciones, eventos o mensajes. En el caso de HookMe, el hook se realiza entre las llamadas que un determinado proceso hace a las API de envío y recepción de datos. 

A la hora de realizar un hook a una determinada llamada, existen varias técnicas. Las más conocidas son el "AIT Hooking" y el "InLine Hooking". La segunda es la técnica utilizada por HookMe. Consiste en modificar el código de la función que se desea hookear y realizar un salto a otra porción de código antes de ejecutar el código original. Esta modificación suele ser un salto incondiciona (JMP) que apunta a otra dirección de memoria en la que se implementan las acciones que realiza el hook

En las siguientes figuras se muestran el antes y el después de realizar un hook a un proceso sobre la API send en la librería WS2_32.dll.



Código de la función "send" antes y después de añadir el hook
Como se observa, la dirección de memoria donde empieza la función send comienza en 0x71A34C27 y contiene un MOV EDI,EDI. Esta instrucción es remplazada por un salto incondicional (JMP) a la dirección 0x0576000. En esa dirección se encontrarán las instrucciones (el código) de control del hook. El programa, para solucionar potenciales problemas de cambios en las direcciones de las funciones, hace uso de la conocida librería Nektra Deviare2.

Las API de envío en Windows

El propósito de ‘HookMe’ es interceptar las llamadas a las API de envió y recepción de datos a través de red. Las que cumplen con este propósito en Windows son:
Las seis primeras APIs se encargan del envío y recepción de datos de red en diferentes formas. Las dos últimas (EncryptMessage y DecryptMessage)  tienen otra finalidad. Proporcionan a las aplicaciones una forma sencilla de llevar a cabo el cifrado y descifrado de datos, y soportan una gran cantidad de algoritmos criptográficos. El hook a estas dos API se realiza para poder acceder a los datos directamente sin importar que sean posteriormente enviados a través de un canal seguro como puede ser SSL. Hookme, al interceptar estas llamadas, posibilita al usuario el visualizar y modificar la entrada y salida de esas funciones, incluso los datos en claro de conexiones SSL que hacen uso de la CryptoAPI de Windows. Esto es posible porque estos datos son interceptados junto antes de ser cifrados o justo después de ser descifrados.

En el ejemplo de la imagen, se observa cómo la interfaz muestra en texto plano una petición que va a ser enviada a través de HTTPS. El contenido que se muestra es el que va a ser cifrado.



La interfaz

Para llevar a cabo los distintos hooks, la aplicación implementa una interfaz gráfica que permite atachearse (interceptarlo y poder modificar su comportamiento) a un proceso. Antes, es recomendable seleccionar las API que se desean interceptar. Esto es posible configurarlo desde el panel situado en "Configuration, Hooks".




Una vez hookeada una llamada, desde la interfaz de usuario es posible interceptar las llamadas o dejarlas pasar mediante el botón Intercepting is ON / Intercepting is OFF. En caso de que se intercepte una de ellas, el programa mostrará en la aplicación el contenido de la llamada tanto en formato hexadecimal como en texto (ANSI).


Desde esta ventana es posible modificar su contenido antes de que sea enviado a la API, o antes de que la API le devuelva los datos a la aplicación (en los casos en los que la API devuelva valores de retorno). En la captura anterior se puede observar cómo se está interceptando  la comunicación de la aplicación HeidiSQL (Un cliente con interfaz gráfica para Windows de MySQL). En ella podemos ver el paquete de autenticación del cliente sobre el servidor. En el offset 0x24 se observa el usuario ‘root’, y en el 0x29 el hash de la contraseña introducida.

Otra de las características de HookME es la posibilidad de aplicar reglas de remplazo on the fly sin necesidad que el usuario interactúe, por lo que sería un proceso totalmente transparente y automático. Para ello es posible ir a la pestaña Match and replace y hacer clic con el botón derecho para pulsar en Add. Se abrirá una nueva ventana en la que se puede especificar la regla que se desea aplicar. 


Una vez aplicada la regla de remplazo podremos ver como al realizar la consulta SQL Select ‘hello :)’ se recibe en respuesta la cadena “11 Paths”. Con estos cambios se podrían implementar cortafuegos de aplicación que mejoraran su seguridad filtrando ciertos parámetros que podrían resultar peligrosos.



Una característica importante es el soporte de plugins desarrollados en Python. Estos plugins pueden crearse con diferentes finalidades, como almacenar la comunicación en disco, modificar tráfico, modificar certificados, firewalls a nivel de aplicación, etc. En la siguiente captura de pantalla se muestra la interfaz desde la que se cargan los plugins, así como una pequeña interfaz de Python integrada dentro de la aplicación.

Se han creado algunas plantillas de ejemplo las disponibles en: https://code.google.com/p/hookme/source/browse/trunk/hookme/hook/Scripts/.

Entre ellas se encuentra el plugin MySQL_Backdoor.txt, que fuerza a HookMe a attachearse al proceso mysqld.exe y espera a la escucha por un paquete especialmente formado. En este caso busca por la cadena "|exec comando|". Esta cadena puede ser enviada como nombre de usuario durante el proceso de autenticación, por ejemplo. A continuación se muestra un vídeo a modo de demostración de la aplicación y de este plugin:


La herramienta se puede descargar libremente. La licencia y más detalles están disponibles desde su página oficial https://code.google.com/p/hookme/

Manuen Fernández
manuel.fernandez@11paths.com

2 comentarios:

  1. La tecnica es muy conocida, de hecho es muy usada para analizar malware, el problema es que puede ser facilmente burlada ya que al poner el "columpio" al inicio de la API no es tan profundo y quizas hasta la llamada se haga a un nivel profundo. Tengo una tool que hace todo algo similar pero para malware y ciertas funciones especificas del malware quizas pueda compartirles el codigo en MASM, les mando un saludo!

    ResponderEliminar
  2. Esta muy bueno para facilitar la vida de los estudiantes como para cualquier persona felicidades.
    nosotros en alquiler de sim card facilitamos la comunicacion con muchas formas de pago.

    ResponderEliminar