# Hacking de Cookies
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥 * ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)! * Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de exclusivos [**NFTs**](https://opensea.io/collection/the-peass-family) * Consigue el [**oficial PEASS & HackTricks swag**](https://peass.creator-spring.com) * **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.** * **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
## Atributos de Cookies ### Expires & Max-Age * `Expires` establece una fecha de caducidad para cuando se elimina una cookie. * `Max-age` establece el tiempo en segundos para cuando se eliminará una cookie **(utiliza esto, ya no estamos en 2009)**. ### **Dominio** El atributo `Domain` especifica **qué hosts pueden recibir una cookie**. Si no se especifica, el atributo **se establece por defecto** en el **mismo host** que estableció la cookie, _**excluyendo subdominios**_. **Si se especifica `Domain`, entonces los subdominios siempre están incluidos**. Por lo tanto, especificar `Domain` es menos restrictivo que omitirlo. Sin embargo, puede ser útil cuando los subdominios necesitan compartir información sobre un usuario. Por ejemplo, si estableces `Domain=mozilla.org`, las cookies están disponibles en subdominios como `developer.mozilla.org`. Pero si no lo haces, la cookie no se enviará a subdominios. Si un **subdominio** `sub.example.com` **establece una cookie** con el atributo _domain_ de **`.example.com`**, se enviará en solicitudes al **dominio principal**. ### **Ruta** El atributo `Path` indica una **ruta URL que debe existir en la URL solicitada para enviar la cabecera `Cookie`**. El carácter `%x2F` ("/") se considera un separador de directorios, y también se corresponden con subdirectorios. #### Orden Cuando 2 cookies tienen el **mismo nombre**, se envía: * La que tiene la **ruta más larga** que coincide con la ruta de la URL. * La **más reciente** si ambas tienen la misma ruta. ### SameSite Esto indicará al navegador si la **cookie** puede ser enviada **desde otros dominios**. Tiene 3 valores posibles: * **Strict**: La cookie no se enviará junto con una solicitud de sitios web de terceros. * **Lax**: La cookie se enviará junto con la solicitud GET iniciada por sitios web de terceros. * **None**: La cookie se envía desde cualquier dominio de terceros. | **Tipo de solicitud** | **Código de ejemplo** | **Cookies enviadas cuando** | | --------------------- | ---------------------------------- | --------------------------- | | Enlace | \\ | No establecido\*, Lax, None | | Prerender | \ | No establecido\*, Lax, None | | Formulario GET | \
| No establecido\*, Lax, None | | Formulario POST | \ | No establecido\*, None | | iframe | \ | No establecido\*, None | | AJAX | $.get("...") | No establecido\*, None | | Imagen | \ | NetSet\*, None | Tabla de [Invicti](https://www.netsparker.com/blog/web-security/same-site-cookie-attribute-prevent-cross-site-request-forgery/) y ligeramente modificada.\ Una cookie con el atributo _**SameSite**_ **mitigará los ataques CSRF** donde se necesita una sesión iniciada. **\*Ten en cuenta que a partir de Chrome80 (feb/2019) el comportamiento predeterminado de una cookie sin un atributo samesite de cookie será lax** ([https://www.troyhunt.com/promiscuous-cookies-and-their-impending-death-via-the-samesite-policy/](https://www.troyhunt.com/promiscuous-cookies-and-their-impending-death-via-the-samesite-policy/)).\ Ten en cuenta que temporalmente, después de aplicar este cambio, las **cookies sin una política SameSite** en Chrome se tratarán como **None** durante los **primeros 2 minutos y luego como Lax para las solicitudes POST de nivel superior entre sitios.** ## Flags de Cookies ### HttpOnly Esto evita que el **cliente** acceda a la cookie (por ejemplo, a través de **Javascript**: `document.cookie`) #### **Bypasses** * Si la página está **enviando las cookies como respuesta** de una solicitud (por ejemplo, en una página de **PHPinfo**), es posible abusar del XSS para enviar una solicitud a esta página y **robar las cookies** de la respuesta (comprueba un ejemplo en [https://hackcommander.github.io/pentesting-article-1/)](https://hackcommander.github.io/pentesting-article-1/) * Esto podría ser evadido con solicitudes **HTTP TRACE** ya que la respuesta del servidor (si este método HTTP está disponible) reflejará las cookies enviadas. Esta técnica se llama **Cross-Site Tracking**. * Esta técnica se evita por **los navegadores modernos al no permitir el envío de una solicitud TRACE desde JS**. Sin embargo, se han encontrado algunas formas de evadir esto en software específico, como enviar `\r\nTRACE` en lugar de `TRACE` a IE6.0 SP2. * Otra forma es la explotación de vulnerabilidades zero/day de los navegadores. * Es posible **sobrescribir cookies HttpOnly** realizando un ataque de desbordamiento ```js document.cookie = "a=v1" document.cookie = "=test value;" // empty name document.cookie = "b=v2" ``` Esto resulta en la cabecera de cookie enviada: ``` a=v1; test value; b=v2; ``` Más interesante aún, si tienes un vector que de alguna manera te permite **establecer la cookie vacía**, puedes **controlar cualquier otra cookie**: ```js function setCookie(name, value) { document.cookie = `${name}=${value}`; } setCookie("", "a=b"); // this sets the empty cookie to a=b ``` Aunque internamente en el navegador esto se establece como la cookie con nombre vacío, resultará en el **encabezado de cookie enviado:** ``` a=b; ``` Significa que cada servidor web lo interpretará como si la cookie `a` estuviera establecida con el valor `b`. ### Bug de Chrome - corrupción de document.cookie Si un punto de código de sustituto Unicode está en una cookie establecida, `document.cookie` quedará permanentemente corrompido y devolverá una cadena vacía. ```js document.cookie // "a=b;" document.cookie = "\ud800=meep"; document.cookie // "" ``` ### Contrabando de Cookies Se ha descubierto que varios servidores web, incluyendo los servidores Java Jetty, TomCat, Undertow y el framework web de Python Zope, así como los servidores/frameworks web de Python como cherrypy, web.py, aiohttp server, bottle y webob, **analizan incorrectamente las cadenas de cookies** debido al soporte restante para RFC2965, un mecanismo de citas de cookies obsoleto que utiliza RFC2616 para una definición de cadena entre comillas. Específicamente, **estos servidores continúan leyendo una cadena de cookies cuando encuentran un valor de cookie entre comillas dobles (dquoted), incluso si se encuentra un punto y coma**. Esto es problemático porque **los puntos y comas deben separar los pares clave-valor** en la cadena de cookies. Por ejemplo, si un **navegador envía tres cookies, RENDER\_TEXT, JSESSIONID,** y **ASDF:** ```basic RENDER_TEXT="hello world; JSESSIONID=13371337; ASDF=end"; ``` Estos servidores interpretan las cookies como parte de un **único valor de cookie** en lugar de tres cookies separadas. Esto conduce a un riesgo de seguridad: si un atacante obtiene acceso de scripting entre sitios (XSS), puede utilizar este error para **filtrar cookies sensibles como las cookies HttpOnly**. ### Inyección de Cookies Se ha descubierto que muchos servidores web, incluyendo Undertow de Java, Zope de Python y aquellos que utilizan http.cookie.SimpleCookie y http.cookie.BaseCookie de la biblioteca estándar de Python, **analizan incorrectamente las cookies, utilizando delimitadores incorrectos para iniciar el siguiente par de nombre/valor de cookie**. Esto permite a un atacante **falsificar múltiples cookies mientras controla solo un valor de cookie**. En el caso de **Undertow**, comienza a analizar la siguiente cookie inmediatamente después del **final de un valor de cookie entre comillas**, sin esperar un punto y coma: ```bash LANGUAGE="en-us" CSRF_TOKEN="SPOOFED_VALUE" ``` **Zope** comienza a analizar la siguiente cookie en una **coma**: ```bash LANGUAGE=en-us,CSRF_TOKEN=SPOOFED_VALUE ``` Y **SimpleCookie** y **BaseCookie** de Python inmediatamente comienzan a analizar la siguiente cookie en un carácter de **espacio**. ``` LANGUAGE=en-us CSRF_TOKEN=SPOOFED_VALUE ``` Como resultado, servidores como **cherrypy**, **web.py**, servidor **aiohttp**, **bottle** y **webob** (Pyramid, TurboGears) son vulnerables a este tipo de ataque. Este problema presenta importantes **implicaciones de seguridad**. Por ejemplo, si una aplicación web utiliza **protección CSRF basada en cookies**, un atacante puede **inyectar** una **cookie de token CSRF falsificada** para evitar esta protección. Además, el último nombre de cookie duplicado en los paquetes de cookies http de Python anula cualquier nombre anterior, lo que hace que este tipo de ataque sea especialmente fácil. Además, el **falsificación** de cookies **`__Secure-`** y **`__Host-`** puede ser abusada en un contexto inseguro. Además, en una configuración donde las cookies se pasan a un servidor backend, la **inyección de cookies podría llevar a la omisión de autorización** si el servidor backend es susceptible a la falsificación pero el servidor frontend no lo es. ### Comprobaciones adicionales de vulnerabilidad de cookies #### **Comprobaciones básicas** * La **cookie** es la **misma** cada vez que **inicia sesión**. * Cierre la sesión e intente usar la misma cookie. * Intente iniciar sesión con 2 dispositivos (o navegadores) en la misma cuenta usando la misma cookie. * Verifique si la cookie tiene alguna información y trate de modificarla. * Intente crear varias cuentas con nombres de usuario casi iguales y verifique si puede ver similitudes. * Verifique la opción "**recordarme**" si existe para ver cómo funciona. Si existe y podría ser vulnerable, siempre use la cookie de **recordarme** sin ninguna otra cookie. * Verifique si la cookie anterior funciona incluso después de cambiar la contraseña. #### **Ataques avanzados de cookies** Si la cookie sigue siendo la misma (o casi la misma) cuando inicia sesión, esto probablemente significa que la cookie está relacionada con algún campo de su cuenta (probablemente el nombre de usuario). Entonces puedes: * Intente crear muchas **cuentas** con nombres de usuario muy **similares** e intente **adivinar** cómo funciona el algoritmo. * Intente **atacar por fuerza bruta el nombre de usuario**. Si la cookie se guarda solo como un método de autenticación para su nombre de usuario, entonces puede crear una cuenta con el nombre de usuario "**Bmin**" y **atacar por fuerza bruta** cada **bit** de su cookie porque una de las cookies que intentará será la que pertenece a "**admin**". * Intente **Padding Oracle** (puede descifrar el contenido de la cookie). Use **padbuster**. **Padding Oracle - Ejemplos de Padbuster** ```bash padbuster # When cookies and regular Base64 padbuster http://web.com/index.php u7bvLewln6PJPSAbMb5pFfnCHSEd6olf 8 -cookies auth=u7bvLewln6PJPSAbMb5pFfnCHSEd6olf # If Base64 urlsafe or hex-lowercase or hex-uppercase --encoding parameter is needed, for example: padBuster http://web.com/home.jsp?UID=7B216A634951170FF851D6CC68FC9537858795A28ED4AAC6 7B216A634951170FF851D6CC68FC9537858795A28ED4AAC6 8 -encoding 2 ``` Padbuster realizará varios intentos y te preguntará cuál es la condición de error (la que no es válida). Luego comenzará a descifrar la cookie (esto puede tardar varios minutos). Si el ataque se ha realizado con éxito, entonces podrías intentar **encriptar** una cadena de tu elección. Por ejemplo, si quisieras **encriptar** **user=administrador**. ``` padbuster http://web.com/index.php 1dMjA5hfXh0jenxJQ0iW6QXKkzAGIWsiDAKV3UwJPT2lBP+zAD0D0w== 8 -cookies thecookie=1dMjA5hfXh0jenxJQ0iW6QXKkzAGIWsiDAKV3UwJPT2lBP+zAD0D0w== -plaintext user=administrator ``` Esta ejecución te dará la cookie correctamente encriptada y codificada con la cadena **user=administrator** dentro. **CBC-MAC** Tal vez una cookie podría tener algún valor y podría ser firmada usando CBC. Entonces, la integridad del valor es la firma creada usando CBC con el mismo valor. Como se recomienda usar como IV un vector nulo, este tipo de verificación de integridad podría ser vulnerable. **El ataque** 1. Obtener la firma del nombre de usuario **administ** = **t** 2. Obtener la firma del nombre de usuario **rator\x00\x00\x00 XOR t** = **t'** 3. Establecer en la cookie el valor **administrator+t'** (**t'** será una firma válida de **(rator\x00\x00\x00 XOR t) XOR t** = **rator\x00\x00\x00** **ECB** Si la cookie está encriptada usando ECB podría ser vulnerable.\ Cuando inicias sesión, la cookie que recibes tiene que ser siempre la misma. **Cómo detectar y atacar:** Crea 2 usuarios con datos casi iguales (nombre de usuario, contraseña, correo electrónico, etc.) e intenta descubrir algún patrón dentro de la cookie proporcionada. Crea un usuario llamado, por ejemplo, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" y comprueba si hay algún patrón en la cookie (como ECB encripta con la misma clave cada bloque, los mismos bytes encriptados podrían aparecer si el nombre de usuario está encriptado). Debería haber un patrón (con el tamaño de un bloque utilizado). Entonces, sabiendo cómo se encripta un montón de "a" puedes crear un nombre de usuario: "a"\*(tamaño del bloque)+"admin". Luego, podrías eliminar el patrón encriptado de un bloque de "a" de la cookie. Y tendrás la cookie del nombre de usuario "admin". ## Referencias * [https://blog.ankursundara.com/cookie-bugs/](https://blog.ankursundara.com/cookie-bugs/)
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥 * ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)! * Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección de exclusivos [**NFTs**](https://opensea.io/collection/the-peass-family) * Consigue el [**swag oficial de PEASS & HackTricks**](https://peass.creator-spring.com) * **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.** * **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).