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).
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 |
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:
- send (WS2_32.dll)
- sendto (WS2_32.dll)
- recv (WS2_32.dll)
- recvfrom (WS2_32.dll)
- WSASend (WS2_32.dll)
- WSARecv (WS2_32.dll)
- EncryptMessage (Secur32.dll)
- DecryptMessage (Secur32.dll)
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: