HookMe, herramienta para interceptar comunicaciones con API hooking

ElevenPaths  4 noviembre, 2013
Segmentos Google Analytics 1
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

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!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *