Polymorph: Modificando paquetes de red en tiempo real. Inyectando JavaScript en peticiones HTTP (3 de 3)
Llegados a este punto, ya se han comprendido los conceptos básicos de la herramienta y de su funcionamiento, y lo único que nos queda es añadir las precondiciones, ejecuciones y postcondiciones adecuadas para empezar a modificar paquetes HTTP. Vamos a empezar por las precondiciones.
Nuestro objetivo es modificar paquetes HTTP, y, por lo tanto, el resto de los paquetes que interceptemos no nos interesan, vamos a escribir una precondición que filtre los paquetes que se corresponden al protocolo HTTP y en el caso de que no pertenezca o de que el paquete no contenga el campo, lo reenvíe sin ejecutar más funciones condicionales.
Modificando paquetes HTTP
Para realizar el ejemplo, vamos a centrarnos en insertar un XSS (Cross-Site Scripting) básico en la página de Phrack, y, en primer lugar, vamos a hacerlo sin modificar la longitud del paquete. Para ello vamos a coger información que contiene el paquete y la vamos a sustituir por la nuestra.
Figura 18: Insección de un XSS en Phrack
Además, vamos a hacerlo al final de la página para que cuando la web se cargue en el navegador, no se note que se ha sustituido información, en concreto, vamos a sustituirlo por la frase de CopyLeft que aparece al final de todas las páginas.
Como muchos sabéis, los mensajes HTTP muchas veces llevan demasiada información y no caben en un solo paquete de red, así que se fragmentan y se envían en varios paquetes, como nosotros solo queremos modificar el paquete concreto que transporta la información donde aparece la frase del CopyLeft, vamos a añadir otra precondición que filtre por el contenido del paquete.
En este punto ya tenemos filtrados todos los paquetes que pertenecen al protocolo HTTP y además contienen el texto del CopyLeft en su interior, para el resto, se retornará None y serán reenviados sin que sigan ejecutando ninguna función más. Ahora, vamos a añadir una función de ejecución para inyectar nuestro valor.
El código es muy sencillo, simplemente calculamos el tamaño de la cadena que queremos insertar, en este caso:
Como estamos modificando el contenido del paquete, los campos chksum de las capas TCP e IP quedan inconsistentes, por lo tanto, tenemos que añadir una pequeña postcondición que los recalcule antes de reenviar el paquete. Yo he utilizado Scapy para que sea más sencillo recalcularlos. Tened en cuenta que esta postcondición es muy genérica y puede utilizarse para otros protocolos.
Si hemos seguido todos los pasos, ya tendríamos lista nuestra plantilla con nuestras funciones condicionales. Solo tendríamos que introducir el comando:
No olvidéis guardar la plantilla al terminar con el comando save para compartirla con vuestros compañeros o transportarla a otro PC (para importarla se utiliza el comando polymorph -t seguido del nombre de la plantilla). ¡Aquí tenéis la mía!
En este vídeo tenéis el ejemplo completo que hemos visto en este artículo realizado en solo un minuto, para que podáis ver lo rápido que funciona cuando tienes experiencia.
Manipulación avanzada de paquete HTTP
No quería terminar el artículo sin dar una pequeña pincelada de manipulaciones un poco más avanzadas que de vez en cuando algunos me han preguntado. Supongamos que no queremos sustituir el texto del paquete original por el nuestro, sino que queremos insertar texto, aumentando la longitud del paquete y, en consecuencia, del mensaje HTTP.
En estos casos hay algunas cosas a tener en cuenta, la primera, hay que recalcular la longitud del campo len de la capa IP del paquete que modifiquemos, la segunda, hay que modificar el campo Content-Length de la cabecera HTTP, y como dije anteriormente, no siempre va a circular en el mismo paquete de red que el resto del contenido.
Para realizar esto, lo que voy a hacer es añadir una precondición justo antes de la que filtra por el CopyLeft de Phrack, de manera que recalcule el Content-Length y deje el mensaje HTTP consistente. Esto funcionaría incluso si el mensaje HTTP va en distintos paquetes de red. Como no quiero extenderme mucho más, aquí os dejo la precondición y queréis más información, al final del artículo os dejo mi información de contacto.
Aquí tenéis un ejemplo de lo que se podría llegar a hacer. Fijaos cómo he extendido la web de Phrack por la parte final de esta.
Por último, comentaros que si queréis seguir el desarrollo del proyecto o queréis más información sobre los procesamientos avanzados de los que he hablado, podéis pedírmela a través de mi cuenta de Twitter @santiagohramos o a través del repositorio GitHub de Polymorph.
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 17: Polymorph: Modificando paquetes de red en tiempo real. Inyectando JavaScript en peticiones HTTP (3 de 3) |
Nuestro objetivo es modificar paquetes HTTP, y, por lo tanto, el resto de los paquetes que interceptemos no nos interesan, vamos a escribir una precondición que filtre los paquetes que se corresponden al protocolo HTTP y en el caso de que no pertenezca o de que el paquete no contenga el campo, lo reenvíe sin ejecutar más funciones condicionales.
Modificando paquetes HTTP
Para realizar el ejemplo, vamos a centrarnos en insertar un XSS (Cross-Site Scripting) básico en la página de Phrack, y, en primer lugar, vamos a hacerlo sin modificar la longitud del paquete. Para ello vamos a coger información que contiene el paquete y la vamos a sustituir por la nuestra.
Además, vamos a hacerlo al final de la página para que cuando la web se cargue en el navegador, no se note que se ha sustituido información, en concreto, vamos a sustituirlo por la frase de CopyLeft que aparece al final de todas las páginas.
Figura 19: Frase al final de cada página en Phrack Magazine |
Como muchos sabéis, los mensajes HTTP muchas veces llevan demasiada información y no caben en un solo paquete de red, así que se fragmentan y se envían en varios paquetes, como nosotros solo queremos modificar el paquete concreto que transporta la información donde aparece la frase del CopyLeft, vamos a añadir otra precondición que filtre por el contenido del paquete.
Figura 20: Precondición para filtrar el contenido del paquete
En este punto ya tenemos filtrados todos los paquetes que pertenecen al protocolo HTTP y además contienen el texto del CopyLeft en su interior, para el resto, se retornará None y serán reenviados sin que sigan ejecutando ninguna función más. Ahora, vamos a añadir una función de ejecución para inyectar nuestro valor.
Figura 21: Función de ejecución para inyectar nuestro payload
El código es muy sencillo, simplemente calculamos el tamaño de la cadena que queremos insertar, en este caso:
"><script>alert("You just got pwned with Polymorph!")</script>y lo insertamos al final del todo, respetando unos caracteres que corresponden a los tags </body></html>. Ya esta casi listo, solo queda un pequeño detalle.
Como estamos modificando el contenido del paquete, los campos chksum de las capas TCP e IP quedan inconsistentes, por lo tanto, tenemos que añadir una pequeña postcondición que los recalcule antes de reenviar el paquete. Yo he utilizado Scapy para que sea más sencillo recalcularlos. Tened en cuenta que esta postcondición es muy genérica y puede utilizarse para otros protocolos.
Figura 22: Postcondición para recalcular el tamaño del paquete y el chksum
Si hemos seguido todos los pasos, ya tendríamos lista nuestra plantilla con nuestras funciones condicionales. Solo tendríamos que introducir el comando:
intercept -ipt “iptables -A INPUT -j NFQUEUE –queue-num 1A partir de ese momento solo nos queda navegar por las páginas de Phrack. Veremos como cada vez que visitamos una página se inserta el Javascript y se ejecuta en nuestro navegador.
Figura 23: Inyección del payload a nivel de paquete con Polymorph |
No olvidéis guardar la plantilla al terminar con el comando save para compartirla con vuestros compañeros o transportarla a otro PC (para importarla se utiliza el comando polymorph -t seguido del nombre de la plantilla). ¡Aquí tenéis la mía!
Figura 24: PoC de Polymorph inyectando XSS en Phrack Magazine
En este vídeo tenéis el ejemplo completo que hemos visto en este artículo realizado en solo un minuto, para que podáis ver lo rápido que funciona cuando tienes experiencia.
Manipulación avanzada de paquete HTTP
No quería terminar el artículo sin dar una pequeña pincelada de manipulaciones un poco más avanzadas que de vez en cuando algunos me han preguntado. Supongamos que no queremos sustituir el texto del paquete original por el nuestro, sino que queremos insertar texto, aumentando la longitud del paquete y, en consecuencia, del mensaje HTTP.
En estos casos hay algunas cosas a tener en cuenta, la primera, hay que recalcular la longitud del campo len de la capa IP del paquete que modifiquemos, la segunda, hay que modificar el campo Content-Length de la cabecera HTTP, y como dije anteriormente, no siempre va a circular en el mismo paquete de red que el resto del contenido.
Para realizar esto, lo que voy a hacer es añadir una precondición justo antes de la que filtra por el CopyLeft de Phrack, de manera que recalcule el Content-Length y deje el mensaje HTTP consistente. Esto funcionaría incluso si el mensaje HTTP va en distintos paquetes de red. Como no quiero extenderme mucho más, aquí os dejo la precondición y queréis más información, al final del artículo os dejo mi información de contacto.
Figura 25: Precondición para inyectar tamaño
Aquí tenéis un ejemplo de lo que se podría llegar a hacer. Fijaos cómo he extendido la web de Phrack por la parte final de esta.
Figura 26: Página de Phrack extendida con Polymorph |
Por último, comentaros que si queréis seguir el desarrollo del proyecto o queréis más información sobre los procesamientos avanzados de los que he hablado, podéis pedírmela a través de mi cuenta de Twitter @santiagohramos o a través del repositorio GitHub de Polymorph.
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:
Hola, Santiago y Chema, excelente artículo. Gracias por la información, muy bien explicada y detallada. Aunque soy Ing. en Sistemas Computacionales, soy nuevo en esta área de la informática. Seguiré de cerca sus artículos y sus blogs. Enhorabuena y gracias otra vez.
Publicar un comentario