Tras la primera parte de esta artículo [Polymorph: Modificando paquetes de red en tiempo real. Inyectando JavaScript en peticiones HTTP (1 de 3)] vamos a continuar con el uso de las plantillas en el framework. Para realizar un filtrado mucho más completo de las plantillas que Polymorph ha generado, podemos utilizar el comando Wireshark, que abrirá esta aplicación con los paquetes capturados.
En nuestro caso vamos a escoger una plantilla que tenga la capa RAW.HTTP. Para escoger la plantilla utilizamos el comando template seguido del número de la plantilla que queremos seleccionar.
Una vez elegida, podemos fijarnos como la interfaz cambia, en este punto estamos en el contexto de la plantilla, y todos los comandos se ejecutarán en este contexto. Con el comando show podemos ver todo el contenido de la plantilla.
En el caso de paquetes HTTP, el tamaño de la plantilla puede ser muy grande y difícil de visualizar. Para visualizar capas concretas podemos utilizar el comando show -l seguido del nombre de la capa, o acceder al contexto de la capa mediante el comando layer seguido del nombre de la capa y en este contexto ejecutar el comando show.
¡Estupendo!, ya tenemos una plantilla generada con el tipo de paquete que queremos interceptar y modificar en tiempo real (HTTP). Ahora vamos a ver como podemos interceptar los paquetes de manera que antes de que lleguen al navegador pasen por Polymorph para que sean modificados.
Precondiciones, Ejecuciones y Postcondiciones
Una vez que tenemos la plantilla generada, llega el momento de añadir código que realice algún procesamiento sobre los paquetes que interceptaremos en tiempo real. Para llevar esto acabo, el framework define el concepto de precondición, ejecución y postcondición.
Estas funciones se escriben en Python y reciben como parámetro el paquete que se intercepta en ese momento en tiempo real, retornando el propio paquete o la palabra reservada None. Su funcionamiento es similar al de una cadena:
Primero se ejecutan las precondiciones, luego las ejecuciones y por último las postcondiciones. Si en algún momento alguna de las funciones devuelve None, se rompe la cadena y el paquete se reenvía tal cual esté en ese momento.
Vamos a ver un ejemplo rápido de como añadir una de estas funciones y como se comporta cuando llegan paquetes. Vamos a añadir la siguiente precondición sencilla con este fragmento de código:
Cuando lleguen paquetes a Polymorph, se ejecutará la precondición que hemos añadido sobre estos paquetes, en este caso, sacará por pantalla que el paquete ha llegado y el contenido del paquete en bytes. Para añadir la precondición utilizamos el comando precs -a seguido del nombre que queramos ponerle a la precondición, por defecto se abre el editor pico, podemos elegir otro editor mediante con la opción -e.
Hay que recordar que no se debenmezclar espacios y tabulaciones en el caso de utilizar pico. Es mejor utilizar solo espacios para tabular el código. Una vez añadida la precondición, podemos consultarla con el comando precs -s.
Una vez introducida la precondición, vamos a utilizar el comando intercept para que los paquetes que en este momento se están reenviando a nivel de kernel, pasen primero por Polymorph, donde se ejecutarán las funciones que nosotros hayamos añadido sobre ellos y después serán reenviados.
Por defecto, cuando introducimos el comando intercept, Polymorph introduce una regla de iptables que servirá para redirigir los paquetes a la herramienta cuando hayamos interceptado la comunicación entre dos máquinas, como en este caso estamos haciéndolo en localhost, ejecutamos el comando con la regla de iptables que se muestra en la imagen:
Si en este punto, empezamos a navegar o generamos tráfico, veremos como todos los paquetes pasan por Polymorph y se ejecuta sobre ellos la precondición que hemos añadido.
[Continuará en la Parte 3 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 9: Polymorph: Modificando paquetes de red en tiempo real. Inyectando JavaScript en peticiones HTTP (2 de 3) |
En nuestro caso vamos a escoger una plantilla que tenga la capa RAW.HTTP. Para escoger la plantilla utilizamos el comando template seguido del número de la plantilla que queremos seleccionar.
Figura 10: Elección de plantclla con comando template |
Una vez elegida, podemos fijarnos como la interfaz cambia, en este punto estamos en el contexto de la plantilla, y todos los comandos se ejecutarán en este contexto. Con el comando show podemos ver todo el contenido de la plantilla.
Figura 11: Contenido de la plantilla |
En el caso de paquetes HTTP, el tamaño de la plantilla puede ser muy grande y difícil de visualizar. Para visualizar capas concretas podemos utilizar el comando show -l seguido del nombre de la capa, o acceder al contexto de la capa mediante el comando layer seguido del nombre de la capa y en este contexto ejecutar el comando show.
Figura 12: Acceso por capas para generar la plantilla |
¡Estupendo!, ya tenemos una plantilla generada con el tipo de paquete que queremos interceptar y modificar en tiempo real (HTTP). Ahora vamos a ver como podemos interceptar los paquetes de manera que antes de que lleguen al navegador pasen por Polymorph para que sean modificados.
Precondiciones, Ejecuciones y Postcondiciones
Una vez que tenemos la plantilla generada, llega el momento de añadir código que realice algún procesamiento sobre los paquetes que interceptaremos en tiempo real. Para llevar esto acabo, el framework define el concepto de precondición, ejecución y postcondición.
Estas funciones se escriben en Python y reciben como parámetro el paquete que se intercepta en ese momento en tiempo real, retornando el propio paquete o la palabra reservada None. Su funcionamiento es similar al de una cadena:
Figura 13: Precondiciones, ejecuciones y postcondiciones |
Primero se ejecutan las precondiciones, luego las ejecuciones y por último las postcondiciones. Si en algún momento alguna de las funciones devuelve None, se rompe la cadena y el paquete se reenvía tal cual esté en ese momento.
Vamos a ver un ejemplo rápido de como añadir una de estas funciones y como se comporta cuando llegan paquetes. Vamos a añadir la siguiente precondición sencilla con este fragmento de código:
Figura: 14: Añadiendo una precondición
Hay que recordar que no se debenmezclar espacios y tabulaciones en el caso de utilizar pico. Es mejor utilizar solo espacios para tabular el código. Una vez añadida la precondición, podemos consultarla con el comando precs -s.
Figura 15: Añadiendo la precondición |
Una vez introducida la precondición, vamos a utilizar el comando intercept para que los paquetes que en este momento se están reenviando a nivel de kernel, pasen primero por Polymorph, donde se ejecutarán las funciones que nosotros hayamos añadido sobre ellos y después serán reenviados.
Por defecto, cuando introducimos el comando intercept, Polymorph introduce una regla de iptables que servirá para redirigir los paquetes a la herramienta cuando hayamos interceptado la comunicación entre dos máquinas, como en este caso estamos haciéndolo en localhost, ejecutamos el comando con la regla de iptables que se muestra en la imagen:
Figura 16: Comando intercept con el comando iptables |
Si en este punto, empezamos a navegar o generamos tráfico, veremos como todos los paquetes pasan por Polymorph y se ejecuta sobre ellos la precondición que hemos añadido.
[Continuará en la Parte 3 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)
*********************************************************************************************