Polymorph: Modificando paquetes de red en tiempo real. Inyectando JavaScript en peticiones HTTP (1 de 3)
Hoy os traigo un artículo - en tres partes - un poco especial. Hace tiempo publiqué un artículo sobre unas debilidades de seguridad que encontré en el protocolo de Registro Remoto de Windows, a través de las cuales, podías llegar a inyectar código remotamente en el registro de una víctima mediante un ataque de red IPv4&IPv6 para hacer un Man in the middle (MITM) y la modificación de paquetes de red en tiempo real.
Este trabajo, junto con otro que tuve la gran suerte de poder realizar con Alejandro Ramos (@aramosf) como Proyecto Final del Máster de Seguridad de la UEM (que co-dirige Chema Alonso) en el que verificábamos la seguridad de diferentes aplicaciones que implementaban el protocolo MQTT mediante Proxy Fuzzing, me llevaron a replantearme la necesidad de que existía de una herramienta capaz de modificar paquetes de red en tiempo real de manera sencilla, proporcionando la capacidad de realizar procesamientos complejos al usuario e interpretando el mayor número posible de protocolos existentes, incluso aquellos que no tienen especificación pública.
Es así como, después de varios meses de esfuerzo en mis ratos libres, os traigo Polymorph, un framework que permite todo lo anterior y mucho más.
Polymorph
Polymorph es un framework que permite la modificación de paquetes de red en tiempo real de prácticamente cualquier protocolo existente. Esto es posible gracias a que aprovecha los disectores de Tshark para realizar una primera interpretación de los bytes de los paquetes de red capturados y, además, implementa técnicas para que el usuario pueda definir e interpretar los bytes creando sus propios campos o capas. La herramienta la he publicado hace apenas dos semanas y está disponible en su repositorio de Github:
En este artículo voy a seguir demostrando la versatilidad del framework y voy a exponer un caso de uso en el que modificaré en tiempo real paquetes que implementan el protocolo HTTP para inyectar JavaScript que se ejecutará en el navegador del usuario. También veremos cómo extender los paquetes para que aparezca más información en el navegador de la víctima, incluso si la petición HTTP (por su tamaño) no se transmite en un solo paquete de red.
Podéis encontrar más información sobre el framework y sus casos de uso en estos artículos, modificando paquetes ICMP, creando un Proxy Fuzzer para el protocolo MQTT o en el propio Whitepaper sobre Polymorph que escribí, que os recomiendo consultar si necesitáis más información sobre algún concepto a lo largo de este artículo:
Instalación del Framework de Polymorph
Todo lo que se necesita para seguir el contenido de este artículo es tener instalada o virtualizada una máquina Kali Linux e instalar Polymorph en ella. Para realizar la instalación de Polymorph sólo tenemos que ejecutar los siguientes comandos:
Captura de paquetes y generación de una plantilla
Antes de comenzar, quería señalar que por simplicidad vamos a hacer toda la modificación de paquetes de manera local (en la misma máquina). Para realizarlo entre varias máquinas el proceso sería exactamente igual, con la salvedad de que tenéis que interceptar la comunicación entre ellas. Polymorph proporciona mecanismos para hacer esto, podéis encontrar más información en los artículos citados anteriormente o en el Whitepaper.
Vamos a empezar por ejecutar el framework, para ello, introducidos el comando polymorph desde la consola de comandos. Esto nos lleva a la interfaz principal de la herramienta, con la tecla tabulador podemos ver las opciones que nos ofrece esta interfaz. Como podemos observar tenemos pocas opciones en este punto, interceptar la comunicación entre máquinas mediante una técnica de spoofing o comenzar el proceso de sniffing o captura de paquetes de red.
El proceso de sniffing es necesario para poder realizar la modificación de paquetes en tiempo real, la herramienta captura todos los paquetes que circulan por la máquina y los transforma en una estructura que he llamado plantilla. Cada uno de los paquetes de red se convierte en una plantilla distinta.
Polymorph utiliza estas plantillas para facilitar al usuario el acceso a los distintos campos de cada uno de los paquetes interceptados en tiempo real sin conocer a priori el protocolo que implementan. Se puede pensar en este concepto como una plantilla física que posee cada uno de los campos y capas del paquete y la posición que ocupan en el conjunto de bytes, de manera que, cuando se intercepta un paquete de red, que en definitiva es un conjunto de bytes, podemos proyectar esa plantilla sobre los bytes y ver si el paquete se corresponde con el que nosotros estamos buscando.
Nuestro objetivo en este punto es capturar un paquete de red del mismo tipo que los paquetes que queremos modificar, de forma que, la herramienta genere una plantilla que podamos utilizar para filtrar y procesar los paquetes que posteriormente interceptemos en tiempo real.
Para realizar este paso, vamos a introducir en Polymorph el comando capture -f “tcp src port 80” con el que capturaremos paquetes aplicando un filtro que indica que el puerto de origen sea el 80 (HTTP). Una vez introducido el comando, visitamos una página web HTTP, a lo largo del artículo utilizaremos: http://phrack.org/.
Una vez hayamos visitado la página, pulsamos Ctr-C en Polymorph para salir del modo sniffing. Como podemos observar, la interfaz ha cambiado, con la tecla tabulador podemos ver los nuevos comandos, con el comando show podemos ver los paquetes que hemos capturado y que el framework ha transformado en plantillas.
Si os fijáis, la mayoría de las plantillas tienen una última capa RAW y ninguna tiene la capa HTTP, esto es porque los primeros disectores que utiliza la herramienta son los que proporciona Scapy, y no son capaces de diseccionar algunos protocolos, para utilizar disectores más avanzados para interpretar los bytes restantes, utilizamos el comando dissect.
Fijaos como en este caso, los paquetes que implementan otros protocolos se interpretan y se muestran cuando introducidos el comando show.
En este punto tenemos varias plantillas generadas, y tenemos que seleccionar aquella que se corresponde con los paquetes que vamos a querer modificar en tiempo real, en nuestro caso la respuesta HTTP del servidor que contiene la página web.
[Continuará en la Parte 2 de 3]
Autor: Santiago Hernández, Security Researcher en ElevenPaths
*********************************************************************************************
- Polymorph: Modificando paquetes de red en tiempo real (Parte 1 de 3)
- Polymorph: Modificando paquetes de red en tiempo real (Parte 2 de 3)
- Polymorph: Modificando paquetes de red en tiempo real (Parte 3 de 3)
*********************************************************************************************
Figura 1: Polymorph: Modificando paquetes de red en tiempo real. Inyectando JavaScript en peticiones HTTP (1 de 3) |
Este trabajo, junto con otro que tuve la gran suerte de poder realizar con Alejandro Ramos (@aramosf) como Proyecto Final del Máster de Seguridad de la UEM (que co-dirige Chema Alonso) en el que verificábamos la seguridad de diferentes aplicaciones que implementaban el protocolo MQTT mediante Proxy Fuzzing, me llevaron a replantearme la necesidad de que existía de una herramienta capaz de modificar paquetes de red en tiempo real de manera sencilla, proporcionando la capacidad de realizar procesamientos complejos al usuario e interpretando el mayor número posible de protocolos existentes, incluso aquellos que no tienen especificación pública.
Figura 2: Framework de Polymorph |
Es así como, después de varios meses de esfuerzo en mis ratos libres, os traigo Polymorph, un framework que permite todo lo anterior y mucho más.
Polymorph
Polymorph es un framework que permite la modificación de paquetes de red en tiempo real de prácticamente cualquier protocolo existente. Esto es posible gracias a que aprovecha los disectores de Tshark para realizar una primera interpretación de los bytes de los paquetes de red capturados y, además, implementa técnicas para que el usuario pueda definir e interpretar los bytes creando sus propios campos o capas. La herramienta la he publicado hace apenas dos semanas y está disponible en su repositorio de Github:
Figura 3 : Repositorio GitHub de Polymorph |
En este artículo voy a seguir demostrando la versatilidad del framework y voy a exponer un caso de uso en el que modificaré en tiempo real paquetes que implementan el protocolo HTTP para inyectar JavaScript que se ejecutará en el navegador del usuario. También veremos cómo extender los paquetes para que aparezca más información en el navegador de la víctima, incluso si la petición HTTP (por su tamaño) no se transmite en un solo paquete de red.
Figura 4: Whitepaper de Polymorph [PDF] |
Podéis encontrar más información sobre el framework y sus casos de uso en estos artículos, modificando paquetes ICMP, creando un Proxy Fuzzer para el protocolo MQTT o en el propio Whitepaper sobre Polymorph que escribí, que os recomiendo consultar si necesitáis más información sobre algún concepto a lo largo de este artículo:
Instalación del Framework de Polymorph
Todo lo que se necesita para seguir el contenido de este artículo es tener instalada o virtualizada una máquina Kali Linux e instalar Polymorph en ella. Para realizar la instalación de Polymorph sólo tenemos que ejecutar los siguientes comandos:
apt-get install build-essential python-dev libnetfilter-queue-dev tshark tcpdump python3-pip wireshark
pip3 install --process-dependency-links polymorph¡Una vez hecho esto nuestro entorno está listo!
Captura de paquetes y generación de una plantilla
Antes de comenzar, quería señalar que por simplicidad vamos a hacer toda la modificación de paquetes de manera local (en la misma máquina). Para realizarlo entre varias máquinas el proceso sería exactamente igual, con la salvedad de que tenéis que interceptar la comunicación entre ellas. Polymorph proporciona mecanismos para hacer esto, podéis encontrar más información en los artículos citados anteriormente o en el Whitepaper.
Figura 5: Inicio del framework de Polymorph |
Vamos a empezar por ejecutar el framework, para ello, introducidos el comando polymorph desde la consola de comandos. Esto nos lleva a la interfaz principal de la herramienta, con la tecla tabulador podemos ver las opciones que nos ofrece esta interfaz. Como podemos observar tenemos pocas opciones en este punto, interceptar la comunicación entre máquinas mediante una técnica de spoofing o comenzar el proceso de sniffing o captura de paquetes de red.
El proceso de sniffing es necesario para poder realizar la modificación de paquetes en tiempo real, la herramienta captura todos los paquetes que circulan por la máquina y los transforma en una estructura que he llamado plantilla. Cada uno de los paquetes de red se convierte en una plantilla distinta.
Polymorph utiliza estas plantillas para facilitar al usuario el acceso a los distintos campos de cada uno de los paquetes interceptados en tiempo real sin conocer a priori el protocolo que implementan. Se puede pensar en este concepto como una plantilla física que posee cada uno de los campos y capas del paquete y la posición que ocupan en el conjunto de bytes, de manera que, cuando se intercepta un paquete de red, que en definitiva es un conjunto de bytes, podemos proyectar esa plantilla sobre los bytes y ver si el paquete se corresponde con el que nosotros estamos buscando.
Nuestro objetivo en este punto es capturar un paquete de red del mismo tipo que los paquetes que queremos modificar, de forma que, la herramienta genere una plantilla que podamos utilizar para filtrar y procesar los paquetes que posteriormente interceptemos en tiempo real.
Para realizar este paso, vamos a introducir en Polymorph el comando capture -f “tcp src port 80” con el que capturaremos paquetes aplicando un filtro que indica que el puerto de origen sea el 80 (HTTP). Una vez introducido el comando, visitamos una página web HTTP, a lo largo del artículo utilizaremos: http://phrack.org/.
Figura 6: Visitando phrack.org con Polymorph capturando |
Una vez hayamos visitado la página, pulsamos Ctr-C en Polymorph para salir del modo sniffing. Como podemos observar, la interfaz ha cambiado, con la tecla tabulador podemos ver los nuevos comandos, con el comando show podemos ver los paquetes que hemos capturado y que el framework ha transformado en plantillas.
Figura 7: Plantillas disponibles |
Si os fijáis, la mayoría de las plantillas tienen una última capa RAW y ninguna tiene la capa HTTP, esto es porque los primeros disectores que utiliza la herramienta son los que proporciona Scapy, y no son capaces de diseccionar algunos protocolos, para utilizar disectores más avanzados para interpretar los bytes restantes, utilizamos el comando dissect.
Fijaos como en este caso, los paquetes que implementan otros protocolos se interpretan y se muestran cuando introducidos el comando show.
Figura 8: Paquetes diseccionados |
En este punto tenemos varias plantillas generadas, y tenemos que seleccionar aquella que se corresponde con los paquetes que vamos a querer modificar en tiempo real, en nuestro caso la respuesta HTTP del servidor que contiene la página web.
[Continuará en la Parte 2 de 3]
Autor: Santiago Hernández, Security Researcher en ElevenPaths
*********************************************************************************************
- Polymorph: Modificando paquetes de red en tiempo real (Parte 1 de 3)
- Polymorph: Modificando paquetes de red en tiempo real (Parte 2 de 3)
- Polymorph: Modificando paquetes de red en tiempo real (Parte 3 de 3)
*********************************************************************************************
1 comentario:
Esto solo refuerza la idea que tenia en la cabeza de hacerme el master de seguridad en la UEM. Gracias por estos articulos y al creador de semejante herramienta por ponerla en github. I hope I can return the favor some day!
Publicar un comentario