
Strumento di enumerazione e attacco RMI Java.
BaRMIe è uno strumento per enumerare e attaccare i servizi Java RMI (Remote Method Invocation).
I servizi RMI spesso espongono funzionalità pericolose senza controlli di sicurezza adeguati, tuttavia tendono a passare inosservati durante le valutazioni di sicurezza a causa della mancanza di strumenti di test efficaci. Nel 2008 Adam Boulton ha parlato ad AppSec USA (YouTube) e ha rilasciato alcuni strumenti di attacco RMI che sono scomparsi poco dopo, ma anche con quegli strumenti un attacco zero-knowledge riuscito si basa su un significativo attacco di forza bruta (~64 bit/9 quintilioni di possibilità) eseguito sulla rete.
L'obiettivo di BaRMIe è consentire ai professionisti della sicurezza di identificare, attaccare e mettere in sicurezza i servizi RMI non sicuri. Utilizzando interfacce RMI parziali da software esistenti, BaRMIe può interagire direttamente con quei servizi senza prima forzare 64 bit sulla rete.
Scarica l'ultima build della versione pronta per l'esecuzione qui: https://github.com/NickstaDB/BaRMIe/releases/latest
BaRMIe è stato scritto per aiutare i professionisti della sicurezza a identificare servizi RMI insicuri su sistemi per i quali l'utente ha ottenuto preventivamente il permesso di attaccare. L'accesso non autorizzato ai sistemi informatici è illegale e BaRMIe deve essere utilizzato in conformità con tutte le leggi pertinenti. La mancata osservanza potrebbe portare a procedimenti penali. Gli sviluppatori di BaRMIe non si assumono alcuna responsabilità e non sono responsabili per qualsiasi uso improprio o danno causato da questo programma.
L'uso di BaRMIe è semplice. Esegui BaRMIe senza parametri per le informazioni sull'uso.
$ java -jar BaRMIe.jar
▄▄▄▄ ▄▄▄ ██▀███ ███▄ ▄███▓ ██▓▓█████
▓█████▄ ▒████▄ ▓██ ▒ ██▒▓██▒▀█▀ ██▒▓██▒▓█ ▀
▒██▒ ▄██▒██ ▀█▄ ▓██ ░▄█ ▒▓██ ▓██░▒██▒▒███
▒██░█▀ ░██▄▄▄▄██ ▒██▀▀█▄ ▒██ ▒██ ░██░▒▓█ ▄
░▓█ ▀█▓ ▓█ ▓██▒░██▓ ▒██▒▒██▒ ░██▒░██░░▒████▒
░▒▓███▀▒ ▒▒ ▓▒█░░ ▒▓ ░▒▓░░ ▒░ ░ ░░▓ ░░ ▒░ ░
▒░▒ ░ ▒ ▒▒ ░ ░▒ ░ ▒░░ ░ ░ ▒ ░ ░ ░ ░
░ ░ ░ ▒ ░░ ░ ░ ░ ▒ ░ ░
░ ░ ░ ░ ░ ░ ░ ░
░ v1.0
Java RMI enumeration tool.
Written by Nicky Bloor (@NickstaDB)
Warning: BaRMIe was written to aid security professionals in identifying the
insecure use of RMI services on systems which the user has prior
permission to attack. BaRMIe must be used in accordance with all
relevant laws. Failure to do so could lead to your prosecution.
The developers assume no liability and are not responsible for any
misuse or damage caused by this program.
Usage:
BaRMIe -enum [options] [host] [port]
Enumerate RMI services on the given endpoint(s).
Note: if -enum is not specified, this is the default mode.
BaRMIe -attack [options] [host] [port]
Enumerate and attack the given target(s).
Options:
--threads Il numero di thread da utilizzare per l'enumerazione (default 10).
--timeout Il timeout per le operazioni di socket bloccanti (default 5.000 ms).
--targets Un file contenente i target da scansionare.
Il file deve contenere un singolo host o una coppia host e porta separata da spazio per riga.
In alternativa, sono supportati tutti i formati di output di nmap, BaRMIe analizzerà l'output di nmap per i servizi sulla porta 1099, 'rmiregistry' o 'Java RMI' da colpire.
Nota: [host] [porta] non supportato quando si usa --targets.
Affidabilità:
Viene utilizzato un sistema +/- per indicare l'affidabilità dell'attacco come segue:
[+ ]: Indica un attacco specifico dell'applicazione
[- ]: Indica un attacco JRE
[ + ]: Attacca metodi non sicuri (come 'writeFile' senza autenticazione)
[ - ]: Attacca la deserializzazione Java (cioè parametri Object)
[ +]: Non richiede dipendenze non predefinite
[ -]: Richiede dipendenze non predefinite
La modalità di enumerazione (-enum) estrae i dettagli degli oggetti esposti tramite un servizio di registro RMI e elenca eventuali attacchi noti che interessano l'endpoint.
La modalità di attacco (-attack) prima enumera i target indicati, quindi fornisce un sistema di menu per lanciare attacchi noti contro i servizi RMI.
Un singolo target può essere specificato sulla riga di comando. In alternativa BaRMIe può estrarre target da un semplice file di testo o dall'output di nmap.
Grande! Questa è la tua opportunità per contribuire a migliorare BaRMIe! BaRMIe si basa su una certa conoscenza delle classi esposte tramite RMI, quindi i contributi saranno molto utili per migliorare BaRMIe e la sicurezza dei servizi RMI.
Se hai accesso a file JAR o al codice sorgente dell'applicazione target, produrre un attacco è semplice come compilare codice contro i file JAR pertinenti. Recupera l'oggetto remoto pertinente utilizzando le classi LocateRegistry e Registry e chiama i metodi desiderati. In alternativa, cerca metodi remoti che accettano oggetti arbitrari o altri parametri non primitivi, poiché questi possono essere utilizzati per fornire payload di deserializzazione. Maggiore documentazione sull'attacco a RMI e sulla produzione di attacchi per BaRMIe sarà resa disponibile in futuro.
In alternativa, mettiti in contatto e fornisci quanti più dettagli possibile, inclusi l'output di BaRMIe -enum e idealmente i file JAR pertinenti.
BaRMIe è in grado di eseguire tre tipi di attacchi contro i servizi RMI. Di seguito una breve descrizione di ciascuno. Ulteriori dettagli tecnici saranno pubblicati in futuro su https://nickbloor.co.uk/. Inoltre, ho presentato i risultati della mia ricerca al 44CON 2017 e le diapositive sono disponibili qui: BaRMIe - Poking Java's Back Door.
Il primo e più semplice metodo per attaccare servizi RMI non sicuri è semplicemente chiamare metodi remoti non sicuri. Spesso funzionalità pericolose vengono esposte tramite RMI e possono essere attivate semplicemente recuperando il riferimento all'oggetto remoto e chiamando il metodo pericoloso. Il seguente codice ne è un esempio:
//Get a reference to the remote RMI registry service
Registry reg = LocateRegistry.getRegistry(targetHost, targetPort);
//Get a reference to the target RMI object
Foo bar = (Foo)reg.lookup(objectName);
//Call the remote executeCommand() method
bar.executeCommand(cmd);
Alcuni servizi RMI non espongono funzionalità pericolose, oppure implementano controlli di sicurezza come l'autenticazione e la gestione delle sessioni. Se il servizio RMI espone un metodo che accetta un Object arbitrario come parametro, allora il metodo può essere utilizzato come punto di ingresso per attacchi di deserializzazione. Alcuni esempi di tali metodi sono mostrati di seguito:
public void setOption(String name, Object value);
public void addAll(List values);
A causa dell'uso della serializzazione e della gestione non sicura dei parametri dei metodi sul server, è possibile utilizzare qualsiasi metodo con tipi di parametro non primitivi come punto di ingresso per attacchi di deserializzazione. BaRMIe raggiunge questo risultato utilizzando proxy TCP per modificare i parametri dei metodi a livello di rete, innescando essenzialmente invocazioni illegali di metodi. Alcuni esempi di metodi vulnerabili sono mostrati di seguito:
public void setName(String name);
public Long add(Integer i1, Integer i2);
public void sum(int[] values);
I parametri di ciascuno di questi metodi possono essere sostituiti con un payload di deserializzazione mentre l'invocazione del metodo passa attraverso un proxy. Questo attacco è possibile perché Java non tenta di verificare che i parametri dei metodi remoti ricevuti sulla rete siano compatibili con i tipi di parametro effettivi prima di deserializzarli.