Introducción al Abuso de HTTP Pipelining

by

in

¿Qué es el HTTP Pipelining?

De acuerdo a Wikipedia, el HTTP pipelining(…) es una característica de HTTP/1.1 que permite enviar múltiples solicitudes HTTP sobre una única conexión TCP sin esperar las respuestas correspondientes. HTTP/1.1 requiere que los servidores respondan correctamente a las solicitudes en pipeline, con respuestas válidas aunque no sean en pipeline, incluso si el servidor no admite HTTP pipelining. A pesar de este requisito, muchos servidores heredados de HTTP/1.1 no admiten correctamente el pipelining, lo que obliga a la mayoría de los clientes HTTP a no utilizarlo. (…)

Más información complementaria o relevante:

Por lo tanto, podríamos decir que HTTP pipelining es una característica del protocolo HTTP en su versión 1.1, la cual permite procesar (enviar y recibir) múltiples solicitudes HTTP al mismo tiempo.

Abuso de HTTP Pipelining

En este sentido, después de haber realizado muchas pruebas en programas de Bug Bounty, pentesting o ethical hacking engagements, finalmente he llegado a la conclusión de que SÍ es posible abusar del HTTP pipelining, para explotar eventuales bugs de seguridad (cosa que durante mucho tiempo me lo cuestioné, así que acá está y ojalá les sea de utilidad).

La mayoría, si es que no todas las vulnerabilidades informáticas, están basadas en errores (de programación), ausencias de configuración (arquitectura) y/o, en el abuso de características por defecto.

¿Qué ocurre en un Abuso del HTTP Pipelining?

En las arquitecturas modernas de sistemas informáticos, existen múltiples componentes cuya presencia se ha tornado de suma importancia: API gateway, Proxy, WAF, Firewall y un largo etcétera; todos ellos, formando parte de una compleja gestión y procesamiento de solicitudes HTTP (recibiendo, validando, reenviando, filtrando…)

Es en este contexto, en el que es posible buscar algún comportamiento extraño abusando del proceso que lleva a cabo el HTTP pipelining, y para este caso de ejemplo, utilizar el redireccionamiento 301 para forzar que un componente desconocido de la arquitectura, proporcione información técnica del host.

Caso real de Abuso de HTTP Pipelining

Al igual que la mayoría de las vulnerabilidades, muchas veces es necesario encadenar varios issues de seguridad con tal de demostrar el impacto o la explotación misma.

En este ejemplo, demostraré cómo abusar del HTTP pipelining al procesar una redirección permanente y convencional de tipo 301, utilizando para esto una vulnerabilidad Host Header Injection (HHI), para conseguir un comportamiento extraño de la arquitectura, resultando en un descubrimiento o escaneo de puertos, o el uso de HTTP pipelining como calculadora (😂).

Como dato, esta vulnerabilidad la identifiqué en un activo digital de Google que forma parte del scope para bug bounty hunting.

La redirección permanente 301

Tal como muestra la imagen, el dominio *****.net redirecciona de forma obligatoria y permanente, al dominio *****.com

Host Header Injection (HHI)

Para el caso particular de este HHI, sólo es explotable añadiendo una letra /a como parámetro GET (probé con otras letras, y sólo ésta funcionó -weird-), permitiendo redireccionar el dominio *****.net hacia evil.com

Verificación de Abuso de HTTP Pipelining

Tras probar algunas formas convencionales para HTTP desync, compruebo que efectivamente está habilitado el método POST, y que el HTTP pipelining mantiene y procesa la vulnerabilidad HHI forzándola en el primer valor de la cabecera Host, haciendo uso de la rutina *****.net-a, respetando el redireccionamiento permanente de estado 301, ofreciéndome un HTTP response doble.

Abuso de HTTP Pipelining

Al explorar el encadenamiento del HHI con la redirección 301 que procesa el HTTP pipelining, obtuve una respuesta bastante extraña, en la cual se muestra el número total de puertos existentes (65535), al utilizar una combinación crafted al final:

De esta manera entonces, es posible verificar que durante el procesamiento de las solicitudes HTTP, mediante el HTTP pipelining, existe un componente en la arquitectura del sistema, que valida la cantidad de caracteres como valor int para la especificación de los puertos del host. Entonces:

11 caracteres 1 = 65535

Y al disminuir progresivamente la cantidad de caracteres, el HTTP pipelining comienza a actuar como calculadora, enumerando y descubriendo otros posibles puertos:

10 caracteres 1 = 13767

Conclusión

Para complementar esta idea de Abuso del HTTP Pipelining, no sólo la disminución de caracteres 1 ofrece información técnica, sino que el cambio de 1 a 2 e incluso combinación de diferentes números, entrega información técnica similar.

Es importante destacar que el Abuso de HTTP Pipelining es utilizado por defecto en ataques de tipo HTTP Request Smuggling, pero técnicamente hablando, no son lo mismo.

El caso demostrado acá sólo es un ejemplo de los eventuales comportamientos que pueden ser identificados, dependiendo de las arquitecturas informáticas que tengas delante para ejecutar pruebas de seguridad, por lo cual recomiendo utilizar cabeceras HTTP para identificar posibles vectores de ataque adicionales.

Finalmente, es posible ver cómo el HTTP pipelining utiliza el redireccionamiento 301 para forzar que un componente desconocido de la arquitectura ofrezca información técnica, como por ejemplo, puertos del host, o cálculos matemáticos de suma o resta.