Deserialization
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
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 rekonstruisan 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 specifičnom 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.
U PHP-u, specifične magične metode se koriste tokom procesa serijalizacije i deserializacije:
__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 obaveštavanje o čekanju podataka ili obavljanje sličnih zadataka čišćenja.
__wakeup
: Poziva se kada se objekat deserializuje. Koristi se za ponovnu uspostavu 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 veću kontrolu nad procesom deserializacije u poređenju sa __wakeup
.
__destruct
: Ova metoda se poziva kada se objekat sprema da bude uništen ili kada skript završi. Obično se koristi za zadatke čišćenja, kao što su zatvaranje datotečnih rukovaoca 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.
Ako pogledate rezultate, možete videti da se funkcije __wakeup
i __destruct
pozivaju kada se objekat deserializuje. Imajte na umu da u nekoliko tutorijala možete pronaći da se funkcija __toString
poziva kada pokušavate da odštampate neku atribut, ali očigledno 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 serijalizovane podatke kao niz. Možete koristiti ovu metodu za deserializaciju svojstava i izvršavanje svih potrebnih zadataka prilikom deserializacije.
Možete pročitati objašnjeni 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/
Možete zloupotrebiti PHP autoload funkcionalnost da učitate proizvoljne php datoteke i još više:
Ako iz nekog razloga želite da serijalizujete vrednost kao referencu na drugu serijalizovanu vrednost možete:
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.
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.
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:
Kada se objekat unpickle, funkcija __reduce__ će biti izvršena. Kada se iskoristi, server može vratiti grešku.
Pre nego što proverite tehniku za zaobilaženje, pokušajte da koristite print(base64.b64encode(pickle.dumps(P(),2)))
da generišete objekat koji je kompatibilan sa python2 ako koristite python3.
Za više informacija o izlasku iz pickle jails proverite:
Sledeća stranica predstavlja tehniku za zloupotrebu nesigurne deserializacije u yaml python bibliotekama i završava alatom koji se može koristiti za generisanje RCE deserializacijskih payload-a za Pickle, PyYAML, jsonpickle i ruamel.yaml:
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.
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 drugi promise sa svojstvom pod nazivom "then" tipa funkcije, biće izvršen samo zato što je vraćen iz drugog promise-a. Pratite ovu vezu za više informacija.
__proto__
i prototype
zagađenjeAko želite da saznate više o ovoj tehnici pogledajte sledeći tutorijal:
Ova biblioteka omogućava serijalizaciju funkcija. Primer:
Serijalizovani objekat će izgledati ovako:
Možete videti u primeru da kada je funkcija serijalizovana, _$$ND_FUNC$$_
oznaka se dodaje serijalizovanom objektu.
Unutar datoteke node-serialize/lib/serialize.js
možete pronaći istu oznaku i kako se kod koristi.
Kao što možete videti u poslednjem delu koda, ako je oznaka pronađena eval
se koristi za deserializaciju funkcije, tako da suštinski korisnički unos se koristi unutar eval
funkcije.
Međutim, samo serijalizovanje funkcije neće je izvršiti jer bi bilo potrebno da neki deo koda poziva y.rce
u našem primeru i to je veoma neprikladno.
U svakom slučaju, mogli biste samo modifikovati serijalizovani objekat dodajući neke zagrade kako biste automatski izvršili serijalizovanu funkciju kada se objekat deserializuje.
U sledećem delu koda obratite pažnju na poslednju zagradu i kako će unserialize
funkcija automatski izvršiti kod:
Kao što je prethodno naznačeno, ova biblioteka će dobiti kod nakon _$$ND_FUNC$$_
i će izvršiti 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:
Možete pronaći ovde dodatne informacije o tome kako iskoristiti ovu ranjivost.
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:
Za više informacija pročitajte ovaj izvor.
Paket serialize-javascript je dizajniran isključivo za svrhe serijalizacije, bez ugrađenih mogućnosti deserializacije. Korisnici su odgovorni za implementaciju svoje metode za deserializaciju. Direktna upotreba eval
se sugeriše u zvaničnom primeru za deserializaciju serijalizovanih podataka:
Ako se ova funkcija koristi za deserializaciju objekata, možete je lako iskoristiti:
Za više informacija pročitajte ovaj izvor.
Na sledećim stranicama možete pronaći informacije o tome kako zloupotrebiti ovu biblioteku za izvršavanje proizvoljnih komandi:
U Javi, deserialization callback-ovi se izvršavaju tokom procesa deserialization. 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.
Da biste identifikovali potencijalne ranjivosti u serijalizaciji u kodu, tražite:
Klase koje implementiraju Serializable
interfejs.
Korišćenje java.io.ObjectInputStream
, readObject
, readUnshare
funkcija.
Obratite posebnu pažnju na:
XMLDecoder
korišćen sa parametrima koje definišu spoljski korisnici.
XStream
's fromXML
metoda, posebno ako je verzija XStream-a manja ili jednaka 1.46, jer je podložna problemima sa serijalizacijom.
ObjectInputStream
u kombinaciji sa readObject
metodom.
Implementaciju metoda kao što su readObject
, readObjectNodData
, readResolve
, ili readExternal
.
ObjectInputStream.readUnshared
.
Opštu upotrebu Serializable
.
Za black box testiranje, tražite specifične potpise ili "Magic Bytes" koji označavaju java serijalizovane objekte (koji potiču od 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 izazove ispitivanje kao što je detaljno opisano u postu o Java JSF ViewState Deserialization.
Ako želite da naučite kako funkcioniše Java Deserialized exploit trebali biste pogledati Osnovna Java Deserializacija, Java DNS Deserializacija, i CommonsCollection1 Payload.
Možete proveriti da li je instalirana neka aplikacija sa poznatim ranjivostima.
Možete pokušati da proverite sve biblioteke za koje je poznato da su ranjive i za koje Ysoserial može da pruži eksploataciju. Ili možete proveriti biblioteke navedene na Java-Deserialization-Cheat-Sheet. Takođe možete koristiti 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.
Korišćenjem Burp ekstenzije gadgetprobe možete identifikovati koje biblioteke su dostupne (pa čak i verzije). Sa ovom informacijom može biti lakše odabrati payload za eksploataciju 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 eksploatisati sa ysoserial i iskoristiti ih.
Pročitajte ovo da biste saznali više o Java Deserialization Scanner.
Java Deserialization Scanner je fokusiran na ObjectInputStream
deserializacije.
Takođe možete koristiti Freddy da otkrijete deserializacije ranjivosti u Burp. Ovaj dodatak će otkriti ne samo ObjectInputStream
povezane ranjivosti, već takođe ranjivosti iz Json i Yml deserializacijskih biblioteka. 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.
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 u web aplikaciju, možete koristiti SerializationDumper da odštampate u čitljivijem formatu serijalizovani objekat koji se šalje. Znajući koje podatke šaljete, biće lakše izmeniti ih i zaobići neke provere.
Glavni alat za eksploataciju Java deserializacija je ysoserial (preuzmite ovde). Takođe možete razmotriti korišćenje ysoseral-modified koji će vam omogućiti da koristite složene komande (na primer, sa cevima).
Napomena: ovaj alat je fokusiran na eksploataciju ObjectInputStream
.
Počeo bih koristiti "URLDNS" payload pre RCE payloada 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 radi.
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 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.
Slobodno koristite sledeći skript za kreiranje svi mogućih kod izvršavanja payload-a za Windows i Linux, a zatim ih testirajte na ranjivoj veb stranici:
Možete koristiti https://github.com/pwntester/SerialKillerBypassGadgetCollection zajedno sa ysoserial da kreirate više eksploata. Više informacija o ovom alatu možete pronaći u prezentacijama gde je alat predstavljen: https://es.slideshare.net/codewhitesec/java-deserialization-vulnerabilities-the-forgotten-bug-class?next_slideshow=1
marshalsec može se koristiti za generisanje payload-a za eksploataciju različitih Json i Yml biblioteka za serijalizaciju u Javi.
Da bih kompajlirao projekat, morao sam da dodam ove zavisnosti u pom.xml
:
Instalirajte maven, i kompajlirajte projekat:
Pročitajte više o ovoj Java JSON biblioteci: https://www.alphabot.com/security/blog/2020/java/Fastjson-exceptional-deserialization-vulnerabilities.html
Ako želite da testirate neke ysoserial payload-ove možete pokrenuti ovu web aplikaciju: https://github.com/hvqzao/java-deserialize-webapp
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-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 nadolazećim primerima eksploatacije.
Klasa koja implementira Serializable
može implementirati kao transient
bilo koji objekat unutar klase koji ne bi trebao biti serijalizovan. Na primer:
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:
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.
Override-ujte resolveClass()
metodu da ograničite deserializaciju samo na dozvoljene klase. Ovo sprečava deserializaciju bilo koje klase osim onih koje su izričito dozvoljene, kao u sledećem primeru koji ograničava deserializaciju samo na klasu Bicycle
:
Korišćenje Java agenta za poboljšanje bezbednosti nudi rešenje kada modifikacija koda nije moguća. Ova metoda se primenjuje uglavnom za stavljanje na crnu listu štetnih klasa, koristeći JVM parametar:
Omogućava način za dinamičko osiguranje deserializacije, idealno za okruženja gde su trenutne promene koda nepraktične.
Pogledajte primer u rO0 by Contrast Security
Implementacija filtera za serijalizaciju: Java 9 je uvela filtere za serijalizaciju putem ObjectInputFilter
interfejsa, pružajući moćan mehanizam za određivanje kriterijuma koje serijalizovani objekti moraju ispuniti pre nego što budu deseralizovani. Ovi filteri se mogu primeniti globalno ili po toku, nudeći granularnu kontrolu nad procesom deseralizacije.
Da biste koristili filtere za serijalizaciju, možete postaviti globalni filter koji se primenjuje na sve operacije deseralizacije ili ga dinamički konfigurisati za specifične tokove. Na primer:
Korišćenje Spoljnih Biblioteka za Povećanu Bezbednost: Biblioteke kao što su NotSoSerial, jdeserialize i Kryo nude napredne funkcije za kontrolu i praćenje Java deserializacije. Ove biblioteke mogu pružiti dodatne slojeve bezbednosti, kao što su stavljanje na belu ili crnu listu klasa, analiziranje serijalizovanih objekata pre deserializacije i implementacija prilagođenih strategija serijalizacije.
NotSoSerial presreće procese deserializacije kako bi sprečio izvršavanje nepouzdanog koda.
jdeserialize omogućava analizu serijalizovanih Java objekata bez njihove deserializacije, pomažući u identifikaciji potencijalno zlonamernog sadržaja.
Kryo je alternativni okvir za serijalizaciju koji naglašava brzinu i efikasnost, nudeći konfigurisane strategije serijalizacije koje mogu poboljšati bezbednost.
Deserialization i ysoserial razgovor: http://frohoff.github.io/appseccali-marshalling-pickles/
Razgovor o gadgetinspectoru: 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 deserialization 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
Deserializacije CVE-ovi: https://paper.seebug.org/123/
Pronađite šta je JNDI Injekcija, kako je zloupotrebiti putem RMI, CORBA & LDAP i kako iskoristiti log4shell (i primer ove ranjivosti) na sledećoj stranici:
Java Poruka Servis (JMS) API je Java API 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, 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).
Postoji nekoliko proizvoda koji koriste ovaj middleware za slanje poruka:
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 kredencijale) mogli biste biti u mogućnosti da poš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 iskoristite ranjivost.
Alat JMET je kreiran da poveže i napadne ove usluge šaljući nekoliko zlonamernih objekata serijalizovanih koristeći poznate gadgete. Ove eksploatacije će raditi ako je usluga još uvek ranjiva i ako je neki od korišćenih gadgeta unutar ranjive aplikacije.
JMET razgovor: https://www.youtube.com/watch?v=0h8DWiOWGGA
U kontekstu .Net, eksploatacije deserializacije funkcionišu na način sličan onima u Javi, gde se gadgeti koriste za izvršavanje specifičnog koda tokom deserializacije objekta.
Izvorni kod treba pregledati zbog pojava:
TypeNameHandling
JavaScriptTypeResolver
Fokus treba biti na serijalizatorima koji omogućavaju da se tip odredi pomoću promenljive pod kontrolom korisnika.
Pretraga treba da cilja 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
.
U ovom slučaju možete koristiti alat ysoserial.net kako biste napravili eksploatacije deserializacije. Kada preuzmete git repozitorijum, trebali biste kompilirati alat koristeći Visual Studio, na primer.
Ako želite da saznate kako ysoserial.net kreira svoju eksploataciju 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 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 samo 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 plugine za kreiranje eksploatacija za specifične okvire kao što je ViewState.
--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 formatterom (Json.Net
u ovom slučaju)
--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:
ysoserial.net takođe ima veoma zanimljiv parametar koji pomaže da se bolje razume kako svaki exploit funkcioniše: --test
Ako navedete ovaj parametar, ysoserial.net će pokušati da izvrši exploit lokalno, tako da možete testirati da li će vaš payload raditi ispravno.
Ovaj parametar je koristan jer ako pregledate kod, naći ćete delove koda poput sledećeg (iz ObjectDataProviderGenerator.cs):
To znači da da bi testirali eksploataciju, kod će pozvati serializersHelper.JsonNet_deserialize
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 ta aplikacija takođe ranjiva.
Zato --test
parametar nam omogućava da razumemo koji delovi koda su ranjivi na deserializaciju exploit koji ysoserial.net može stvoriti.
Pogledajte ovaj POST o kako pokušati da iskoristite __ViewState parametar .Net da izvršite proizvoljan kod. Ako već znate tajne koje koristi žrtvinska mašina, pročitajte ovaj post da znate kako da izvršite kod.
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 modifikovati svojstva server fajlova, potencijalno dovodeći do napada uskraćivanja usluge.
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.
Izolujte potencijalno rizičan kod od koda sa pristupom internetu kako biste izbegli izlaganje poznatim gadgetima, kao što je System.Windows.Data.ObjectDataProvider
u WPF aplikacijama, nepouzdanim izvorima podataka.
Java i .Net JSON deserializacija rad: https://www.blackhat.com/docs/us-17/thursday/us-17-Munoz-Friday-The-13th-JSON-Attacks-wp.pdf, predavanje: 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
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:
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 u 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/
Kao što je objašnjeno u ovom izveštaju o ranjivosti, ako neki korisnički nesanitizovani unos dođe do .send()
metode ruby objekta, ova metoda omogućava pozivanje bilo koje druge metode objekta sa bilo kojim parametrima.
Na primer, pozivanje eval i zatim ruby kod kao drugi parametar će omogućiti izvršavanje proizvoljnog koda:
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.
Ova tehnika je preuzeta iz ovog blog posta.
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 iz učitane biblioteke kada se deserializuje (funkcija koja se zloupotrebljava za dobijanje RCE):
Biblioteka
Ulazni podaci
Metoda pokretanja unutar klase
Marshal (Ruby)
Binarnu
_load
Oj
JSON
hash
(klasa mora biti stavljena u hash(mapa) kao ključ)
Ox
XML
hash
(klasa mora biti stavljena u hash(mapa) kao ključ)
Psych (Ruby)
YAML
hash
(klasa mora biti stavljena u hash(mapa) kao ključ)
init_with
JSON (Ruby)
JSON
json_create
([vidi beleške o json_create na kraju](#table-vulnerable-sinks))
Osnovni primer:
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 bilo moguće učiniti da preuzme nasumičnu URL adresu, pružajući odličan detektor ovih vrsta nesanitizovanih ranjivosti deserializacije.
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 potpuni RCE sa nečim poput:
Proverite više detalja u originalnom postu.
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)