Java DNS Deserialization, GadgetProbe and Java Deserialization Scanner
Richiesta DNS sulla deserializzazione
La classe java.net.URL
implementa Serializable
, ciò significa che questa classe può essere serializzata.
Questa classe ha un comportamento curioso. Dalla documentazione: "Due host sono considerati equivalenti se entrambi i nomi host possono essere risolti negli stessi indirizzi IP".
Quindi, ogni volta che un oggetto URL chiama una qualsiasi delle funzioni equals
o hashCode
verrà inviata una richiesta DNS per ottenere l'indirizzo IP.
Chiamare la funzione hashCode
da un oggetto URL è piuttosto semplice, è sufficiente inserire questo oggetto all'interno di una HashMap
che verrà deserializzata. Questo perché alla fine della funzione readObject
di HashMap
viene eseguito questo codice:
È in esecuzione il putVal
con ogni valore all'interno dell'HashMap
. Ma, più rilevante è la chiamata a hash
con ogni valore. Questo è il codice della funzione hash
:
Come puoi osservare, durante la deserializzazione di un HashMap
, la funzione hash
verrà eseguita con ogni oggetto e durante l'esecuzione di hash
verrà eseguito .hashCode()
dell'oggetto. Pertanto, se si deserializza un HashMap
che contiene un oggetto URL, l'oggetto URL eseguirà .hashCode()
.
Ora, diamo un'occhiata al codice di URLObject.hashCode()
:
Come puoi vedere, quando un URLObject
esegue .hashCode()
viene chiamato hashCode(this)
. Di seguito puoi vedere il codice di questa funzione:
Puoi vedere che viene eseguito un getHostAddress
sul dominio, avviando una query DNS.
Pertanto, questa classe può essere abusata per avviare una query DNS per dimostrare che la deserializzazione è possibile, o addirittura per esfiltrare informazioni (puoi aggiungere come sottodominio l'output di un'esecuzione di comando).
Esempio di codice payload URLDNS
Puoi trovare il codice payload URLDNS da ysoserial qui. Tuttavia, solo per rendere più facile capire come codificarlo, ho creato il mio PoC (basato su quello di ysoserial):
Ulteriori informazioni
Nell'idea originale il payload delle commons collections è stato modificato per eseguire una query DNS, questo era meno affidabile rispetto al metodo proposto, ma questo è il post: https://www.gosecure.net/blog/2017/03/22/detecting-deserialization-bugs-with-dns-exfiltration/
GadgetProbe
Puoi scaricare GadgetProbe dall'App Store di Burp Suite (Extender).
GadgetProbe cercherà di capire se alcune classi Java esistono nella classe Java del server in modo da poter sapere se è vulnerabile a qualche exploit conosciuto.
Come funziona
GadgetProbe utilizzerà lo stesso payload DNS della sezione precedente ma prima di eseguire la query DNS proverà a deserializzare una classe arbitraria. Se la classe arbitraria esiste, la query DNS verrà inviata e GadgetProbe noterà che questa classe esiste. Se la richiesta DNS non viene inviata, ciò significa che la classe arbitraria non è stata deserializzata con successo, quindi o non è presente o non è serializzabile/sfruttabile.
All'interno di GitHub, GadgetProbe ha alcune liste di parole con classi Java da testare.
Ulteriori informazioni
Java Deserialization Scanner
Questo scanner può essere scaricato dall'App Store di Burp (Extender). L'estensione ha funzionalità passive e attive.
Passive
Per impostazione predefinita controlla passivamente tutte le richieste e le risposte inviate cercando i magic bytes serializzati Java e presenterà un avviso di vulnerabilità se ne trova uno:
Attivo
Test manuale
Puoi selezionare una richiesta, fare clic con il tasto destro e Invia richiesta a DS - Test manuale
.
Quindi, all'interno della scheda Deserialization Scanner --> scheda Test manuale puoi selezionare il punto di inserimento. E avviare il test (Seleziona l'attacco appropriato a seconda dell'encoding utilizzato).
Anche se questo viene chiamato "Test manuale", è piuttosto automatizzato. Verificherà automaticamente se la deserializzazione è vulnerabile a qualsiasi payload ysoserial controllando le librerie presenti sul server web e evidenzierà quelle vulnerabili. Per verificare le librerie vulnerabili puoi selezionare di lanciare Javas Sleeps, sleeps tramite consumo CPU, o utilizzando DNS come già menzionato.
Sfruttamento
Una volta identificata una libreria vulnerabile, puoi inviare la richiesta alla scheda Sfruttamento. In questa scheda devi selezionare nuovamente il punto di iniezione, scrivere la libreria vulnerabile per la quale desideri creare un payload e il comando. Quindi, premi semplicemente il pulsante Attacco appropriato.
Informazioni sull'esfiltrazione DNS della deserializzazione Java
Fai in modo che il tuo payload esegua qualcosa di simile a quanto segue:
Ulteriori informazioni
Last updated