diff --git a/src/network-services-pentesting/5353-udp-multicast-dns-mdns.md b/src/network-services-pentesting/5353-udp-multicast-dns-mdns.md index bf413c31a..6024636d6 100644 --- a/src/network-services-pentesting/5353-udp-multicast-dns-mdns.md +++ b/src/network-services-pentesting/5353-udp-multicast-dns-mdns.md @@ -25,7 +25,7 @@ Os serviços são identificados como _._tcp ou _._udp sob .loc ```bash nmap -sU -p 5353 --script=dns-service-discovery ``` -- 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 -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 -stimeout 60 @@ -135,7 +135,7 @@ sudo python3 pholus3.py -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: diff --git a/src/pentesting-web/deserialization/README.md b/src/pentesting-web/deserialization/README.md index ae0022965..2a85002e5 100644 --- a/src/pentesting-web/deserialization/README.md +++ b/src/pentesting-web/deserialization/README.md @@ -74,7 +74,7 @@ This is a test
*/ ?> ``` -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}}