Deserialization
Osnovne informacije
Serijalizacija se shvata kao metoda pretvaranja 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 često koristi kako bi se osiguralo da objekat može biti rekreiran u kasnijem trenutku, održavajući njegovu strukturu i stanje.
Deserijalizacija, obrnuto, je proces koji deluje suprotno serijalizaciji. Uključuje uzimanje podataka koji su strukturirani u određenom formatu i rekonstruisanje ih nazad u objekat.
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 deserijalizacije:
__sleep
: Poziva se kada se objekat serijalizuje. Ova metoda treba da vrati niz imena svih svojstava objekta koji treba da budu serijalizovani. Često se koristi za potvrđivanje čekajućih podataka ili izvođenje sličnih zadataka čišćenja.__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 izvođenje drugih zadataka ponovnog inicijalizovanja.__unserialize
: Ova metoda se poziva umesto__wakeup
(ako postoji) kada se objekat deserijalizuje. Pruža više kontrole nad procesom deserijalizacije u poređenju sa__wakeup
.__destruct
: Ova metoda se poziva kada se objekat uništava ili kada se skripta završava. Obično se koristi za zadatke čišćenja, poput zatvaranja fajl rukovaoca ili veza sa bazom podataka.__toString
: Ova metoda omogućava da se objekat tretira kao string. Može se koristiti za čitanje fajla ili druge zadatke na osnovu poziva funkcija unutar nje, efikasno pružajući tekstualnu reprezentaciju objekta.
Ako pogledate rezultate, možete videti da se funkcije __wakeup
i __destruct
pozivaju prilikom deserializacije objekta. Imajte na umu da u nekoliko tutorijala ćete pronaći da se funkcija __toString
poziva prilikom pokušaja štampanja neke osobine, ali izgleda da se to više ne dešava.
Metoda __unserialize(array $data)
se poziva umesto __wakeup()
ako je implementirana u klasi. Omogućava vam da deserializujete objekat pružajući serijske podatke kao niz. Možete koristiti ovu metodu da deserializujete osobine i obavite sve neophodne zadatke prilikom deserializacije.
Možete pročitati objašnjen PHP primer ovde: https://www.notsosecure.com/remote-code-execution-via-php-unserialize/, ovde https://www.exploit-db.com/docs/english/44756-deserialization-vulnerability.pdf ili ovde https://securitycafe.ro/2015/01/05/understanding-php-object-injection/
PHP Deserial + Autoload Klasa
Možete zloupotrebiti PHP autoload funkcionalnost da učitate proizvoljne php fajlove i više:
pagePHP - Deserialization + Autoload ClassesSerijalizacija Referenciranih Vrednosti
Ako iz nekog razloga želite da serijalizujete vrednost kao referencu na drugu serijalizovanu vrednost možete:
PHPGGC (ysoserial za PHP)
PHPGGC može vam pomoći da generišete payload-ove za zloupotrebu PHP deserijalizacije.
Imajte na umu da u nekoliko slučajeva nećete moći pronaći način za zloupotrebu deserijalizacije u izvornom kodu aplikacije, ali biste možda mogli zloupotrebiti kod spoljnih PHP ekstenzija.
Dakle, ako možete, proverite phpinfo()
servera i tražite na internetu (čak i na gadgetima PHPGGC) neki mogući gadget koji biste mogli zloupotrebiti.
deserijalizacija metapodataka phar://
Ako ste pronašli LFI koji samo čita datoteku i ne izvršava PHP kod unutar nje, na primer koristeći funkcije poput file_get_contents(), fopen(), file() ili file_exists(), md5_file(), filemtime() ili filesize(), možete pokušati zloupotrebiti deserijalizaciju koja se dešava prilikom čitanja datoteke koristeći protokol phar. Za više informacija pročitajte sledeći post:
pagephar:// deserializationPython
Pickle
Kada se objekat depickla, funkcija __reduce__ će biti izvršena. Kada se iskoristi, server može vratiti grešku.
Za više informacija o bekstvu iz pickle zatvora proverite:
pageBypass Python sandboxesYaml & jsonpickle
Na sledećoj stranici je prikazana tehnika zloupotrebe nesigurne deserializacije u yaml python bibliotekama i završava se alatom koji se može koristiti za generisanje RCE deserializacijskog payload-a za Pickle, PyYAML, jsonpickle i ruamel.yaml:
pagePython Yaml DeserializationZagađenje klasa (Python Prototipno zagađenje)
pageClass Pollution (Python's Prototype Pollution)NodeJS
JS Magične funkcije
JS nema "magične" funkcije poput PHP-a ili Python-a koje će se izvršiti samo prilikom kreiranja objekta. Ali ima neke funkcije koje se često koriste čak i bez direktnog pozivanja kao što su toString
, valueOf
, toJSON
.
Ako zloupotrebite deserializaciju, možete ugroziti ove funkcije da izvrše drugi kod (potencijalno zloupotrebljavajući prototipno zagađenje) i možete izvršiti proizvoljan kod kada se pozovu.
Još jedan "magičan" način pozivanja funkcije bez direktnog pozivanja je ugrožavanje objekta koji vraća asinhrona funkcija (promise). Jer, ako transformišete taj vraćeni objekat u drugi promise sa svojstvom nazvanim "then" tipa funkcija, biće izvršen samo zato što je vraćen od drugog promise-a. Pratite ovaj link za više informacija.
__proto__
и prototype
зagađenje
__proto__
и prototype
зagađenjeAko želite da saznate više o ovoj tehnici pogledajte sledeći tutorijal:
pageNodeJS - __proto__ & prototype PollutionOva biblioteka omogućava serializaciju funkcija. Primer:
Serializovani objekat će izgledati ovako:
Možete videti u primeru da kada je funkcija serializovana, zastava _$$ND_FUNC$$_
se dodaje serializovanom objektu.
Unutar fajla node-serialize/lib/serialize.js
možete pronaći istu zastavu i kako je kod koristi.
Kao što možete videti u poslednjem delu koda, ako se zastava pronađe, eval
se koristi za deserializaciju funkcije, tako da se korisnički unos koristi unutar funkcije eval
.
Međutim, samo serializovanje funkcije neće je izvršiti jer bi bilo potrebno da neki deo koda poziva y.rce
u našem primeru, što je veoma neverovatno.
U svakom slučaju, možete jednostavno izmeniti serializovani objekat dodavanjem zagrada kako bi se automatski izvršila serializovana funkcija prilikom deserializacije objekta.
U sledećem delu koda obratite pažnju na poslednje zagrade i kako će funkcija unserialize
automatski izvršiti kod:
Kao što je prethodno naznačeno, ova biblioteka će dobiti kod nakon _$$ND_FUNC$$_
i izvršiti ga koristeći eval
. Stoga, kako bi se automatski izvršio kod, možete izbrisati deo kreiranja funkcije i poslednju zatvorenu zagradu i samo izvršiti JS jednolinijski kod kao u sledećem primeru:
Možete ovde pronaći dodatne informacije o tome kako iskoristiti ovu ranjivost.
Značajna karakteristika funcster-a je nepristupačnost standardnih ugrađenih objekata; oni su van dosega. Ovo ograničenje sprečava izvršavanje koda koji pokušava da pozove metode na ugrađenim objektima, što dovodi do izuzetaka poput "ReferenceError: console is not defined"
kada se koriste komande poput console.log()
ili require(something)
.
Ipak, uprkos ovom ograničenju, moguće je povratiti pun pristup globalnom kontekstu, uključujući sve standardne ugrađene objekte, kroz određeni pristup. Iskorišćavanjem globalnog konteksta direktno, moguće je zaobići ovo ograničenje. Na primer, pristup može biti ponovo uspostavljen korišćenjem sledećeg isečka koda:
Za više informacija pročitajte ovaj izvor.
Paket serialize-javascript je dizajniran isključivo za potrebe serializacije, bez ugrađenih mogućnosti za deserializaciju. Korisnici su odgovorni za implementaciju sopstvene metode za deserializaciju. Direktna upotreba eval
-a je predložena u zvaničnom primeru za deserializaciju serializovanih podataka:
Ako se ova funkcija koristi za deserializaciju objekata, možete je lako iskoristiti:
Za više informacija pročitajte ovaj izvor.
Cryo biblioteka
Na sledećim stranicama možete pronaći informacije o tome kako zloupotrebiti ovu biblioteku da biste izvršili proizvoljne komande:
Java - HTTP
U Javi, callback-ovi za deserializaciju se izvršavaju tokom procesa deserializacije. Ovu izvršnu moć mogu iskoristiti napadači koji kreiraju zlonamerne sadržaje koji pokreću ove callback-ove, što može dovesti do potencijalnog izvršenja štetnih akcija.
Otisci prstiju
Bela kutija
Da biste identifikovali potencijalne ranjivosti serijalizacije u kodnoj bazi, potražite:
Klase koje implementiraju interfejs
Serializable
.Korišćenje funkcija
java.io.ObjectInputStream
,readObject
,readUnshare
.
Posebno obratite pažnju na:
XMLDecoder
korišćen sa parametrima definisanim od strane spoljnih korisnika.XStream
-ovu metodufromXML
, posebno ako je verzija XStream-a manja ili jednaka 1.46, jer je podložna problemima sa serijalizacijom.ObjectInputStream
uparen sa metodomreadObject
.Implementacija metoda poput
readObject
,readObjectNodData
,readResolve
ilireadExternal
.ObjectInputStream.readUnshared
.Opšta upotreba
Serializable
.
Crna kutija
Za testiranje crne kutije, potražite specifične potpise ili "Magic Bytes" koji označavaju java serijalizovane objekte (potičući od ObjectInputStream
):
Heksadecimalni obrazac:
AC ED 00 05
.Base64 obrazac:
rO0
.HTTP odgovori sa zaglavljima
Content-type
postavljenim naapplication/x-java-serialized-object
.Heksadecimalni obrazac koji ukazuje na prethodnu kompresiju:
1F 8B 08 00
.Base64 obrazac koji ukazuje na prethodnu kompresiju:
H4sIA
.Veb fajlovi sa ekstenzijom
.faces
i parametromfaces.ViewState
. Otkrivanje ovih obrazaca u veb aplikaciji trebalo bi da podstakne ispitivanje kako je detaljno opisano u postu o Java JSF ViewState Deserializaciji.
Provera da li je ranjiv
Ako želite da sažnate kako funkcioniše Java Deserialized eksploatacija, trebalo bi da pogledate Osnovna Java Deserializacija, Java DNS Deserializacija i CommonsCollection1 Payload.
Testiranje belom kutijom
Možete proveriti da li je instalirana neka aplikacija sa poznatim ranjivostima.
Možete pokušati proveriti sve biblioteke za koje je poznato da su ranjive i za koje Ysoserial može pružiti eksploataciju. Ili možete proveriti biblioteke navedene na Java-Deserialization-Cheat-Sheet. Takođe možete koristiti gadgetinspector da pretražite moguće lance gedžeta koji mogu biti iskorišćeni. Kada pokrenete gadgetinspector (nakon što ga izgradite), ne brinite o gomili upozorenja/grešaka kroz koje prolazi i pustite ga da završi. Sve rezultate će zapisati 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 ukazati na lažne pozitivne rezultate.
Test Crne Kutije
Korišćenjem Burp ekstenzije gadgetprobe možete identifikovati koje biblioteke su dostupne (čak i verzije). Sa ovim informacijama bi moglo biti jednostavnije izabrati payload za iskorišćavanje ranjivosti.
Pročitajte ovo da biste saznali više o GadgetProbe.
GadgetProbe je fokusiran na ObjectInputStream
deserializacije.
Korišćenjem Burp ekstenzije Java Deserialization Scanner možete identifikovati ranjive biblioteke koje se mogu iskoristiti sa ysoserial i ih iskoristiti.
Pročitajte ovo da biste saznali više o Java Deserialization Scanner-u.
Java Deserialization Scanner je fokusiran na ObjectInputStream
deserializacije.
Takođe možete koristiti Freddy da otkrijete ranjivosti u deserializaciji u Burp-u. Ovaj dodatak će otkriti ranjivosti koje nisu samo povezane sa ObjectInputStream
već i ranjivosti iz biblioteka za deserializaciju Json i Yml. U aktivnom režimu, pokušaće da ih potvrdi korišćenjem sleep ili DNS payloada.
Više informacija o Freddy-u možete pronaći ovde.
Testiranje Serijalizacije
Nije sve u proveri da li server koristi ranjive biblioteke. Ponekad možete promeniti podatke unutar serijalizovanog objekta i zaobići neke provere (možda vam omogućiti administratorske privilegije unutar veb aplikacije). Ako pronađete java serijalizovan objekat koji se šalje veb aplikaciji, možete koristiti SerializationDumper da odštampa u formatu koji je čitljiviji čoveku serijalizovani objekat koji se šalje. Poznavanje podataka koje šaljete olakšaće vam da ih izmenite i zaobiđete neke provere.
Eksploatacija
ysoserial
Glavni alat za eksploataciju Java deserializacija je ysoserial (preuzmite ovde). Takođe možete razmotriti korišćenje ysoseral-modified koji će vam omogućiti korišćenje kompleksnih komandi (sa cevima na primer).
Imajte na umu da je ovaj alat usmeren na iskorišćavanje ObjectInputStream
.
Preporučujem da počnete sa "URLDNS" payloadom pre RCE payloada da biste testirali da li je ubrizgavanje moguće. U svakom slučaju, imajte na umu da možda "URLDNS" payload ne radi, ali drugi RCE payload može.
Prilikom kreiranja payload-a za java.lang.Runtime.exec() ne možete koristiti specijalne karaktere poput ">" ili "|" za preusmeravanje izlaza iz izvršavanja, "$()" za izvršavanje komandi ili čak prosleđivanje argumenata komandi razdvojenih razmacima (možete uraditi echo -n "hello world"
ali ne možete uraditi python2 -c 'print "Hello world"'
). Da biste pravilno enkodovali payload, možete koristiti ovu web stranicu.
Slobodno koristite sledeći skript za kreiranje svih mogućih payload-a za izvršavanje koda za Windows i Linux, a zatim ih testirajte na ranjivoj web stranici:
serialkillerbypassgadgets
Možete koristiti https://github.com/pwntester/SerialKillerBypassGadgetCollection zajedno sa ysoserialom da biste kreirali više eksploatacija. Više informacija o ovom alatu možete pronaći u slajdovima predavanja na kojem je alat predstavljen: https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1
marshalsec
marshalsec može se koristiti za generisanje payloada za eksploataciju različitih Json i Yml biblioteka za serijalizaciju u Javi.
Da biste kompajlirali projekat, morao sam dodati ove zavisnosti u pom.xml
:
Instalirajte Maven, a zatim kompajlirajte projekat:
FastJSON
Pročitajte više o ovoj Java JSON biblioteci: https://www.alphabot.com/security/blog/2020/java/Fastjson-exceptional-deserialization-vulnerabilities.html
Laboratorije
Ako želite da testirate neke ysoserial payload-e, možete pokrenuti ovu web aplikaciju: https://github.com/hvqzao/java-deserialize-webapp
Zašto
Java koristi mnogo serijalizacije u 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 oslanja isključivo na serijalizaciju, osnova je za udaljenu komunikaciju u Java aplikacijama.
RMI preko HTTP-a: Ovaj metod se često koristi u Java baziranim debelim klijentskim web aplikacijama, 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 budućim primerima eksploatacije.
Prevencija
Privremeni objekti
Klasa koja implementira Serializable
može označiti bilo koji objekat unutar klase kao transient
ako taj objekat ne bi trebalo da bude serijalizovan. Na primer:
Izbegavajte serijalizaciju klase koja mora da implementira Serializable
U scenarijima gde određeni objekti moraju da implementiraju Serializable
interfejs zbog hijerarhije klasa, postoji rizik od nenamernog deserijalizovanja. Da biste to sprečili, obezbedite da ovi objekti nisu deserijalizovani definisanjem final
readObject()
metode koja dosledno baca izuzetak, kao što je prikazano u primeru ispod:
Unapređenje bezbednosti deserijalizacije u Javi
Prilagođavanje java.io.ObjectInputStream
je praktičan pristup za obezbeđivanje procesa deserijalizacije. Ova metoda je pogodna kada:
Kod deserijalizacije je pod vašom kontrolom.
Klase očekivane za deserijalizaciju su poznate.
Prepišite resolveClass()
metod kako biste ograničili deserijalizaciju samo na dozvoljene klase. Ovo sprečava deserijalizaciju bilo koje klase osim onih eksplicitno dozvoljenih, kao u sledećem primeru koji ograničava deserijalizaciju samo na klasu Bicycle
:
Korišćenje Java agenta za poboljšanje bezbednosti nudi alternativno rešenje kada modifikacija koda nije moguća. Ovaj metod se uglavnom primenjuje za crnu listu štetnih klasa, korišćenjem JVM parametra:
On pruža način da dinamički obezbedi deserijalizaciju, idealan za okruženja gde su odmahšnje promene koda nepraktične.
Pogledajte primer u rO0 od Contrast Security
Implementiranje Filtera za Serijalizaciju: Java 9 je uvela filtere za serijalizaciju putem interfejsa ObjectInputFilter
, pružajući moćan mehanizam za specificiranje kriterijuma koje serijalizovani objekti moraju zadovoljiti pre deserijalizacije. Ovi filteri mogu biti primenjeni globalno ili po toku, nudeći granularnu kontrolu nad procesom deserijalizacije.
Da biste koristili filtere za serijalizaciju, možete postaviti globalni filter koji se primenjuje na sve operacije deserijalizacije ili ga konfigurisati dinamički za specifične tokove. Na primer:
Iskorišćavanje Spoljnih Biblioteka za Unapređenu Bezbednost: Biblioteke poput NotSoSerial, jdeserialize i Kryo nude napredne funkcije za kontrolisanje i praćenje Java deserijalizacije. Ove biblioteke mogu pružiti dodatne slojeve bezbednosti, poput beleženja ili crnog liste klasa, analiziranja serijalizovanih objekata pre deserijalizacije i implementiranja prilagođenih strategija serijalizacije.
NotSoSerial presreće procese deserijalizacije kako bi sprečio izvršavanje nepoverljivog koda.
jdeserialize omogućava analizu serijalizovanih Java objekata bez njihove deserijalizacije, pomažući u identifikaciji potencijalno zlonamernog sadržaja.
Kryo je alternativni okvir za serijalizaciju koji naglašava brzinu i efikasnost, nudeći konfigurabilne strategije serijalizacije koje mogu unaprediti bezbednost.
Reference
Razgovor o deserijalizaciji i ysoserial: http://frohoff.github.io/appseccali-marshalling-pickles/
Razgovor o gadgetinspector-u: 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
Java i .Net JSON deserijalizacija rad: https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf, razgovor: https://www.youtube.com/watch?v=oUAeWhW5b8c i slajdovi: https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf
CVE-ovi deserijalizacije: https://paper.seebug.org/123/
JNDI Injection & log4Shell
Pronađite šta je JNDI Injection, kako zloupotrebiti putem RMI, CORBA & LDAP i kako iskoristiti log4shell (i primer ove ranjivosti) na sledećoj stranici:
pageJNDI - Java Naming and Directory Interface & Log4ShellJMS - 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č–potrošač. JMS je deo Java Platforme, Enterprise Edition (Java EE), i definisan je specifikacijom razvijenom u Sun Microsystems-u, ali koju je od tada vodio Java Community Process. To je standard za razmenu poruka koji omogućava komponentama aplikacije zasnovane 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 asinhrona. (Iz Vikipedije).
Proizvodi
Postoji nekoliko proizvoda koji koriste ovaj middleware za slanje poruka:
Iskorišćavanje
Dakle, u osnovi postoji niz usluga koje koriste JMS na opasan način. Stoga, ako imate dovoljno privilegija da šaljete poruke ovim uslugama (obično će vam biti potrebne validne akreditacije) možda ćete moći da pošaljete zlonamerne objekte serijalizovane koji će biti deserijalizovani od strane potrošača/pretplatnika. To znači da će svi klijenti koji koriste tu poruku biti zaraženi.
Trebalo bi da zapamtite da čak i ako je usluga ranjiva (jer nesigurno deserijalizuje korisnički unos) i dalje morate pronaći validne gedžete za iskorišćavanje ranjivosti.
Alat JMET je kreiran da poveže i napadne ove usluge slanjem nekoliko zlonamernih objekata serijalizovanih korišćenjem poznatih gedžeta. Ovi eksploati će raditi ako je usluga i dalje ranjiva i ako se neki od korišćenih gedžeta nalazi unutar ranjive aplikacije.
Reference
JMET razgovor: https://www.youtube.com/watch?v=0h8DWiOWGGA
.Net
U kontekstu .Net-a, eksploatacije deserijalizacije funkcionišu na način sličan onima pronađenim u Javi, gde se gedžeti iskorišćavaju kako bi se izvršio određeni kod tokom deserijalizacije objekta.
Fingerprint
WhiteBox
Izvorni kod treba da se pregleda radi pojavljivanja:
TypeNameHandling
JavaScriptTypeResolver
Fokus treba da bude na serijskim alatima koji dozvoljavaju da tip bude određen promenljivom pod kontrolom korisnika.
BlackBox
Pretraga treba da cilja Base64 kodiranu nisku AAEAAAD///// ili bilo koji sličan obrazac koji bi mogao biti deserijalizovan na serverskoj strani, dajući kontrolu nad tipom koji će biti deserijalizovan. Ovo može uključivati, ali nije ograničeno na, strukture JSON ili XML koje sadrže TypeObject
ili $type
.
ysoserial.net
U ovom slučaju možete koristiti alat ysoserial.net kako biste kreirali deserijalizacione eksploate. Nakon preuzimanja git repozitorijuma, trebalo bi da kompajlirate alat koristeći na primer Visual Studio.
Ako želite da saznate kako ysoserial.net kreira svoj eksploat možete proveriti ovu stranicu gde je objašnjen ObjectDataProvider gadget + ExpandedWrapper + Json.Net formatter.
Glavne opcije ysoserial.net su: --gadget
, --formatter
, --output
i --plugin
.
--gadget
se koristi da se naznači gadžet za zloupotrebu (naznačiti klasu/funkciju koja će biti zloupotrebljena tokom deserijalizacije radi izvršavanja komandi).--formatter
, koristi se da se naznači metoda za serijalizaciju eksploata (treba da znate koju biblioteku koristi serverska strana za deserijalizaciju payloada i koristite istu za serijalizaciju).--output
se koristi da se naznači da li želite eksploat u sirovom ili Base64 kodiranom obliku. Imajte na umu da će ysoserial.net enkodirati payload koristeći UTF-16LE (kodiranje koje se podrazumevano koristi na Windows-u), pa ako dobijete sirovu verziju i samo je enkodirate sa linux konzole, možda ćete imati nekih problema sa kompatibilnošću kodiranja koji će sprečiti eksploat da pravilno funkcioniše (u HTB JSON kutiji payload je radio i u UTF-16LE i ASCII, ali to ne znači da će uvek raditi).--plugin
ysoserial.net podržava dodatke za kreiranje eksploata za specifične okvire kao što je ViewState
Više parametara ysoserial.net
--minify
će pružiti manji payload (ako je moguće)--raf -f Json.Net -c "bilo šta"
Ovo će naznačiti sve gadžete koji se mogu koristiti sa naznačenim formatterom (Json.Net
u ovom slučaju)--sf xml
možete naznačiti gadžet (-g
) i ysoserial.net će tražiti formatare koji sadrže "xml" (bez obzira na velika/mala slova)
ysoserial primeri za kreiranje eksploata:
ysoserial.net takođe ima vrlo interesantan parametar koji pomaže da bolje razumete kako svaki eksploit funkcioniše: --test
Ako navedete ovaj parametar, ysoserial.net će pokušati eksploit lokalno, tako da možete testirati da li će vaš payload pravilno raditi.
Ovaj parametar je koristan jer ako pregledate kod, pronaći ćete delove koda poput sledećeg (iz ObjectDataProviderGenerator.cs):
Ovo znači da bi testiranje eksploatacije zahtevalo poziv koda serializersHelper.JsonNet_deserialize
U prethodnom kodu postoji ranjivost koju je kreirao exploit. Dakle, ako pronađete nešto slično u .Net aplikaciji, to znači da je ta aplikacija verovatno takođe ranjiva.
Stoga parametar --test
nam omogućava da razumemo koji delovi koda su ranjivi na deserializacijski exploit koji može kreirati ysoserial.net.
ViewState
Pogledajte ovaj POST o kako pokušati iskoristiti parametar __ViewState u .Net-u da biste izvršili proizvoljni kod. Ako već znate tajne koje koristi žrtvena mašina, pročitajte ovaj post da biste znali kako izvršiti kod.
Prevencija
Da biste smanjili rizike povezane sa deserializacijom u .Net-u:
Izbegavajte dozvoljavanje tokova podataka da definišu svoje tipove objekata. Koristite
DataContractSerializer
iliXmlSerializer
kada je moguće.Za
JSON.Net
, postaviteTypeNameHandling
naNone
: %%%TypeNameHandling = TypeNameHandling.None%%%Izbegavajte korišćenje
JavaScriptSerializer
saJavaScriptTypeResolver
-om.Ograničite tipove koji mogu biti deserializovani, razumevajući inherentne rizike sa .Net tipovima, kao što je
System.IO.FileInfo
, koji može menjati osobine serverskih fajlova, potencijalno dovodeći do napada uskraćivanjem usluge.Budite oprezni sa tipovima koji imaju rizične osobine, poput
System.ComponentModel.DataAnnotations.ValidationException
sa svojomValue
osobinom, koja može biti iskorišćena.Sigurno kontrolišite instanciranje tipova da biste sprečili napadače da utiču na proces deserializacije, čineći čak i
DataContractSerializer
iliXmlSerializer
ranjivim.Implementirajte kontrole bele liste koristeći prilagođeni
SerializationBinder
zaBinaryFormatter
iJSON.Net
.Budite informisani o poznatim nesigurnim deserializacijskim gedžetima unutar .Net-a i obezbedite da deserializatori ne instanciraju takve tipove.
Izolujte potencijalno rizičan kod od koda sa internet pristupom kako biste izbegli izlaganje poznatih gedžeta, poput
System.Windows.Data.ObjectDataProvider
u WPF aplikacijama, neosiguranim izvorima podataka.
Reference
Java i .Net JSON deserializacija rad: https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf, prezentacija: https://www.youtube.com/watch?v=oUAeWhW5b8c i slajdovi: https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-Json-Attacks.pdf
Ruby
U Ruby-u, serializacija se olakšava pomoću dve metode unutar biblioteke marshal. Prva metoda, poznata kao dump, koristi se za transformisanje objekta u niz bajtova. Ovaj proces se naziva serializacija. Nasuprot tome, druga metoda, load, koristi se za vraćanje niza bajtova u objekat, proces poznat kao deserializacija.
Za obezbeđivanje serializovanih objekata, Ruby koristi HMAC (Hash-Based Message Authentication Code), obezbeđujući integritet i autentičnost podataka. Ključ koji se koristi u tu svrhu čuva se na jednoj od nekoliko mogućih lokacija:
config/environment.rb
config/initializers/secret_token.rb
config/secrets.yml
/proc/self/environ
Ruby 2.X generička deserializacija u RCE gadget lanac (više informacija na https://www.elttam.com/blog/ruby-deserialization/):
Drugi RCE lanac za iskorišćavanje Ruby On Rails: https://codeclimate.com/blog/rails-remote-code-execution-vulnerability-explained/
Last updated