hacktricks/pentesting-web/hacking-with-cookies/README.md

223 lines
16 KiB
Markdown
Raw Normal View History

2023-06-06 18:56:34 +00:00
# Hacking de Cookies
2022-04-28 16:01:33 +00:00
<details>
2023-04-25 18:35:28 +00:00
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
2022-04-28 16:01:33 +00:00
2023-06-06 18:56:34 +00:00
* Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud).
2022-04-28 16:01:33 +00:00
</details>
2023-06-06 18:56:34 +00:00
## Atributos de Cookies
### Expires & Max-Age
2023-06-06 18:56:34 +00:00
* `Expires` define uma data de expiração para quando um cookie será excluído
* `Max-age` define o tempo em segundos para quando um cookie será excluído **(use isso, não é mais 2009)**
### **Domain**
2023-06-06 18:56:34 +00:00
O atributo `Domain` especifica **quais hosts podem receber um cookie**. Se não especificado, o atributo **padrão** é o **mesmo host** que definiu o cookie, _**excluindo subdomínios**_. **Se `Domain` for especificado**, então **subdomínios são sempre incluídos**. Portanto, especificar `Domain` é menos restritivo do que omiti-lo. No entanto, pode ser útil quando subdomínios precisam compartilhar informações sobre um usuário.
2023-06-06 18:56:34 +00:00
Por exemplo, se você definir `Domain=mozilla.org`, os cookies estarão disponíveis em subdomínios como `developer.mozilla.org`. Mas se você não definir, o cookie não será enviado para subdomínios.
2023-06-06 18:56:34 +00:00
Se um **subdomínio** `sub.example.com` **definir um cookie** com o atributo _domain_ de **`.example.com`**, ele será **enviado** em solicitações para o **domínio pai.**
### **Path**
2023-06-06 18:56:34 +00:00
O atributo `Path` indica um **caminho de URL que deve existir no URL solicitado para enviar o cabeçalho `Cookie`**. O caractere `%x2F` ("/") é considerado um separador de diretório, e subdiretórios também correspondem.
2023-06-06 18:56:34 +00:00
#### Ordem
2023-06-06 18:56:34 +00:00
Quando 2 cookies têm o **mesmo nome**, aquele que é enviado é:
2023-06-06 18:56:34 +00:00
* Aquele com o **caminho mais longo** correspondente ao caminho do URL
* O **mais recente** se ambos tiverem o mesmo caminho
### SameSite
2023-06-06 18:56:34 +00:00
Isso indicará ao navegador se o **cookie** pode ser enviado **de outros domínios**. Tem 3 valores possíveis:
2023-06-06 18:56:34 +00:00
* **Estrito**: o cookie não será enviado junto com uma solicitação por sites de terceiros.
* **Lax**: o cookie será enviado junto com a solicitação GET iniciada por sites de terceiros.
* **Nenhum**: o cookie é enviado de qualquer domínio de terceiros
2023-06-06 18:56:34 +00:00
| **Tipo de solicitação** | **Código de exemplo** | **Cookies enviados quando** |
| ----------------------- | ---------------------------------- | --------------------------- |
| Link | \<a href="...">\</a> | Não definido\*, Lax, Nenhum |
| Prerender | \<link rel="prerender" href=".."/> | Não definido\*, Lax, Nenhum |
| Formulário GET | \<form method="GET" action="..."> | Não definido\*, Lax, Nenhum |
| Formulário POST | \<form method="POST" action="..."> | Não definido\*, Nenhum |
| iframe | \<iframe src="...">\</iframe> | Não definido\*, Nenhum |
| AJAX | $.get("...") | Não definido\*, Nenhum |
| Imagem | \<img src="..."> | NetSet\*, Nenhum |
2023-06-06 18:56:34 +00:00
Tabela de [Invicti](https://www.netsparker.com/blog/web-security/same-site-cookie-attribute-prevent-cross-site-request-forgery/) e ligeiramente modificada.\
Um cookie com o atributo _**SameSite**_ irá **mitigar ataques CSRF** onde é necessária uma sessão iniciada.
2023-06-06 18:56:34 +00:00
**\*Observe que a partir do Chrome80 (fev/2019) o comportamento padrão de um cookie sem um 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/)).\
Observe que temporariamente, após a aplicação dessa alteração, os **cookies sem uma política SameSite** no Chrome serão **tratados como Nenhum** durante os **primeiros 2 minutos e depois como Lax para solicitações POST entre sites de nível superior.**
2023-06-06 18:56:34 +00:00
## Flags de Cookies
### HttpOnly
2023-06-06 18:56:34 +00:00
Isso evita que o **cliente** acesse o cookie (por exemplo, via **Javascript**: `document.cookie`)
#### **Bypasses**
2023-06-06 18:56:34 +00:00
* Se a página estiver **enviando os cookies como resposta** de uma solicitação (por exemplo, em uma página **PHPinfo**), é possível abusar do XSS para enviar uma solicitação para esta página e **roubar os cookies** da resposta (verifique um exemplo em [https://hackcommander.github.io/pentesting-article-1/)](https://hackcommander.github.io/pentesting-article-1/)
* Isso pode ser contornado com solicitações **HTTP TRACE** **se a resposta do servidor refletir os cookies enviados** (se este método HTTP estiver disponível). Essa técnica é chamada de **Cross-Site Tracking**.
* Essa técnica é evitada por **navegadores modernos por não permitir o envio de uma solicitação TRACE** de JS. No entanto, alguns contornos para isso foram encontrados em software específico, como o envio de `\
```js
document.cookie = "a=v1"
document.cookie = "=test value;" // empty name
document.cookie = "b=v2"
```
2023-06-06 18:56:34 +00:00
Isso resulta no cabeçalho de cookie enviado:
```
a=v1; test value; b=v2;
```
2023-06-06 18:56:34 +00:00
Mais interessante ainda, se você tiver um vetor que de alguma forma permita **definir o cookie vazio**, você pode **controlar qualquer outro cookie**:
```js
function setCookie(name, value) {
document.cookie = `${name}=${value}`;
}
setCookie("", "a=b"); // this sets the empty cookie to a=b
```
2023-06-06 18:56:34 +00:00
Embora internamente no navegador, isso seja definido como o cookie nomeado vazio, resultará no **cabeçalho do cookie enviado:**
```
a=b;
```
2023-06-06 18:56:34 +00:00
Significando que todo servidor web irá interpretá-lo como o cookie `a` sendo definido com o valor `b`.
2023-06-06 18:56:34 +00:00
### Bug do Chrome - corrupção do document.cookie <a href="#chrome-bugdocumentcookie-corruption" id="chrome-bugdocumentcookie-corruption"></a>
2023-06-06 18:56:34 +00:00
Se um ponto de código de substituto Unicode estiver em um cookie definido, `document.cookie` será permanentemente corrompido e retornará uma string vazia.
```js
document.cookie
// "a=b;"
document.cookie = "\ud800=meep";
document.cookie
// ""
```
2023-06-06 18:56:34 +00:00
### Contrabando de Cookies
2023-06-06 18:56:34 +00:00
Vários servidores web, incluindo os servidores Java Jetty, TomCat, Undertow e o framework web Python Zope, bem como servidores/frameworks web Python como cherrypy, web.py, aiohttp server, bottle e webob, são encontrados para **analisar incorretamente as strings de cookie** devido ao suporte restante para RFC2965, um mecanismo de citação de cookie desatualizado que usa RFC2616 para uma definição de string citada.
2023-06-06 18:56:34 +00:00
Especificamente, **esses servidores continuam lendo uma string de cookie quando encontram um valor de cookie entre aspas duplas (dquoted), mesmo que um ponto e vírgula seja encontrado**. Isso é problemático porque **pontos e vírgulas devem separar pares chave-valor** na string de cookie.
2023-06-06 18:56:34 +00:00
Por exemplo, se um **navegador envia três cookies, RENDER\_TEXT, JSESSIONID** e **ASDF:**
```basic
RENDER_TEXT="hello world; JSESSIONID=13371337; ASDF=end";
```
2023-06-06 18:56:34 +00:00
esses servidores os interpretam como parte de um **único valor de cookie** em vez de três cookies separados.
2023-06-06 18:56:34 +00:00
Isso leva a um risco de segurança: se um invasor ganhar acesso de script entre sites (XSS), ele pode usar esse bug para **extrair cookies sensíveis como cookies HttpOnly**.
2023-06-06 18:56:34 +00:00
### Injeção de Cookie
2023-06-06 18:56:34 +00:00
Muitos servidores da web, incluindo o Undertow do Java, o Zope do Python e aqueles que usam o http.cookie.SimpleCookie e http.cookie.BaseCookie do stdlib do Python, foram encontrados para **analisar incorretamente cookies, usando delimitadores errados para iniciar o próximo par de nome/valor do cookie**. Isso permite que um invasor **falsifique vários cookies enquanto controla apenas um valor de cookie**.
2023-06-06 18:56:34 +00:00
No caso do **Undertow**, ele começa a analisar o próximo cookie imediatamente após o **final de um valor de cookie entre aspas**, sem esperar por um ponto e vírgula:
```bash
LANGUAGE="en-us" CSRF_TOKEN="SPOOFED_VALUE"
```
2023-06-06 18:56:34 +00:00
**Zope** começa a analisar o próximo cookie em uma **vírgula**:
```bash
LANGUAGE=en-us,CSRF_TOKEN=SPOOFED_VALUE
```
2023-06-06 18:56:34 +00:00
E o **SimpleCookie** e o **BaseCookie** do Python imediatamente começam a analisar o próximo cookie em um caractere **espaço**.
```
LANGUAGE=en-us CSRF_TOKEN=SPOOFED_VALUE
```
2023-06-06 18:56:34 +00:00
Como resultado, servidores como **cherrypy**, **web.py**, servidor **aiohttp**, **bottle** e **webob** (Pyramid, TurboGears) são todos vulneráveis a esse tipo de ataque.
2023-06-06 18:56:34 +00:00
Esse problema apresenta implicações significativas de **segurança**. Por exemplo, se um aplicativo da web usa **proteção CSRF baseada em cookie**, um invasor pode **injetar** um **cookie de token CSRF falsificado** para contornar essa proteção. Além disso, o último nome de cookie duplicado nos pacotes http.cookie do Python substitui todos os anteriores, tornando esse tipo de ataque especialmente fácil.
2023-06-06 18:56:34 +00:00
Além disso, a **falsificação** de cookies **`__Secure-`** e **`__Host-`** pode ser explorada em um contexto inseguro. Além disso, em uma configuração em que os cookies são passados para um servidor backend, a **injeção de cookie pode levar a bypasses de autorização** se o servidor backend for suscetível a falsificação, mas o servidor frontend não for.
2023-06-06 18:56:34 +00:00
### Verificações extras de vulnerabilidade de cookies
2023-06-06 18:56:34 +00:00
#### **Verificações básicas**
2023-06-06 18:56:34 +00:00
* O **cookie** é o **mesmo** toda vez que você **faz login**.
* Faça logout e tente usar o mesmo cookie.
* Tente fazer login com 2 dispositivos (ou navegadores) na mesma conta usando o mesmo cookie.
* Verifique se o cookie tem alguma informação nele e tente modificá-lo.
* Tente criar várias contas com nomes de usuário quase iguais e verifique se você pode ver semelhanças.
* Verifique a opção "**lembrar-me**" se ela existir para ver como funciona. Se existir e puder ser vulnerável, sempre use o cookie de **lembrar-me** sem nenhum outro cookie.
* Verifique se o cookie anterior funciona mesmo depois de você alterar a senha.
2023-06-06 18:56:34 +00:00
#### **Ataques avançados de cookies**
2023-06-06 18:56:34 +00:00
Se o cookie permanecer o mesmo (ou quase o mesmo) quando você fizer login, isso provavelmente significa que o cookie está relacionado a algum campo da sua conta (provavelmente o nome de usuário). Então você pode:
2023-06-06 18:56:34 +00:00
* Tente criar muitas **contas** com nomes de usuário muito **semelhantes** e tente **adivinhar** como o algoritmo está funcionando.
* Tente **forçar o nome de usuário**. Se o cookie salvar apenas como um método de autenticação para o seu nome de usuário, você pode criar uma conta com o nome de usuário "**Bmin**" e **forçar** cada **bit** do seu cookie porque um dos cookies que você tentará será o que pertence a "**admin**".
* Tente o **Padding** **Oracle** (você pode descriptografar o conteúdo do cookie). Use o **padbuster**.
2023-06-06 18:56:34 +00:00
**Padding Oracle - Exemplos do Padbuster**
```bash
padbuster <URL/path/when/successfully/login/with/cookie> <COOKIE> <PAD[8-16]>
# 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
```
2023-06-06 18:56:34 +00:00
O Padbuster fará várias tentativas e perguntará qual é a condição de erro (aquela que não é válida).
2023-06-06 18:56:34 +00:00
Em seguida, ele começará a descriptografar o cookie (isso pode levar vários minutos).
2023-06-06 18:56:34 +00:00
Se o ataque for bem-sucedido, você poderá tentar criptografar uma string de sua escolha. Por exemplo, se você quiser **criptografar** **user=administrador**.
```
padbuster http://web.com/index.php 1dMjA5hfXh0jenxJQ0iW6QXKkzAGIWsiDAKV3UwJPT2lBP+zAD0D0w== 8 -cookies thecookie=1dMjA5hfXh0jenxJQ0iW6QXKkzAGIWsiDAKV3UwJPT2lBP+zAD0D0w== -plaintext user=administrator
```
2023-06-06 18:56:34 +00:00
Essa execução irá fornecer o cookie corretamente criptografado e codificado com a string **user=administrator** dentro.
**CBC-MAC**
2023-06-06 18:56:34 +00:00
Talvez um cookie possa ter algum valor e ser assinado usando CBC. Então, a integridade do valor é a assinatura criada usando CBC com o mesmo valor. Como é recomendado usar um vetor nulo como IV, esse tipo de verificação de integridade pode ser vulnerável.
2023-06-06 18:56:34 +00:00
**O ataque**
2023-06-06 18:56:34 +00:00
1. Obter a assinatura do nome de usuário **administ** = **t**
2. Obter a assinatura do nome de usuário **rator\x00\x00\x00 XOR t** = **t'**
3. Definir no cookie o valor **administrator+t'** (**t'** será uma assinatura válida de **(rator\x00\x00\x00 XOR t) XOR t** = **rator\x00\x00\x00**
**ECB**
2023-06-06 18:56:34 +00:00
Se o cookie for criptografado usando ECB, ele pode ser vulnerável.\
Quando você faz login, o cookie que você recebe tem que ser sempre o mesmo.
2023-06-06 18:56:34 +00:00
**Como detectar e atacar:**
2023-06-06 18:56:34 +00:00
Crie 2 usuários com dados quase iguais (nome de usuário, senha, e-mail, etc.) e tente descobrir algum padrão dentro do cookie fornecido.
2023-06-06 18:56:34 +00:00
Crie um usuário chamado, por exemplo, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" e verifique se há algum padrão no cookie (como ECB criptografa com a mesma chave a cada bloco, os mesmos bytes criptografados podem aparecer se o nome de usuário for criptografado).
2023-06-06 18:56:34 +00:00
Deve haver um padrão (com o tamanho de um bloco usado). Então, sabendo como um monte de "a" é criptografado, você pode criar um nome de usuário: "a"\*(tamanho do bloco)+"admin". Então, você pode excluir o padrão criptografado de um bloco de "a" do cookie. E você terá o cookie do nome de usuário "admin".
2023-06-06 18:56:34 +00:00
## Referências
* [https://blog.ankursundara.com/cookie-bugs/](https://blog.ankursundara.com/cookie-bugs/)
2022-04-28 16:01:33 +00:00
<details>
2023-04-25 18:35:28 +00:00
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
2022-04-28 16:01:33 +00:00
2023-06-06 18:56:34 +00:00
* Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e para o** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
2022-04-28 16:01:33 +00:00
</details>