
Инструмент для перечисления и атаки Java RMI.
BaRMIe — это инструмент для перечисления и атаки сервисов Java RMI (Remote Method Invocation).
Сервисы RMI часто предоставляют опасный функционал без надлежащих средств безопасности, однако они часто остаются незамеченными во время оценок безопасности из-за отсутствия эффективных инструментов тестирования. В 2008 году Адам Боултон выступал на AppSec USA (YouTube) и выпустил некоторые инструменты для атак на RMI, которые вскоре исчезли, однако даже с этими инструментами успешная zero-knowledge атака требует значительного перебора (~64 бита / 9 квинтиллионов возможностей) по сети.
Цель BaRMIe — дать специалистам по безопасности возможность выявлять, атаковать и защищать небезопасные сервисы RMI. Используя частичные интерфейсы RMI из существующего программного обеспечения, BaRMIe может напрямую взаимодействовать с этими сервисами, не выполняя предварительный перебор 64 бит по сети.
Загрузите последнюю сборку, готовую к запуску, здесь: https://github.com/NickstaDB/BaRMIe/releases/latest
BaRMIe был создан для помощи специалистам по безопасности в выявлении небезопасных сервисов RMI в системах, на атаку которых у пользователя есть предварительное разрешение. Несанкционированный доступ к компьютерным системам незаконен, и BaRMIe должен использоваться в соответствии со всеми применимыми законами. Несоблюдение этого требования может привести к уголовному преследованию. Разработчики BaRMIe не несут ответственности и не отвечают за любое неправильное использование или ущерб, причинённый этой программой.
Использовать BaRMIe просто. Запустите BaRMIe без параметров, чтобы получить информацию об использовании.
$ 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 The number of threads to use for enumeration (default 10).
--timeout The timeout for blocking socket operations (default 5,000ms).
--targets A file containing targets to scan.
The file should contain a single host or space-separated
host and port pair per line.
Alternatively, all nmap output formats are supported, BaRMIe will
parse nmap output for port 1099, 'rmiregistry', or 'Java RMI'
services to target.
Note: [host] [port] not supported when --targets is used.
Reliability:
A +/- system is used to indicate attack reliability as follows:
[+ ]: Indicates an application-specific attack
[- ]: Indicates a JRE attack
[ + ]: Attack insecure methods (such as 'writeFile' without auth)
[ - ]: Attack Java deserialization (i.e. Object parameters)
[ +]: Does not require non-default dependencies
[ -]: Non-default dependencies are required
Режим перечисления (-enum) извлекает детали объектов, предоставляемых через службу реестра RMI, и перечисляет известные атаки, затрагивающие конечную точку.
Режим атаки (-attack) сначала перечисляет заданные цели, затем предоставляет систему меню для запуска известных атак на сервисы RMI.
Одна цель может быть указана в командной строке. Кроме того, BaRMIe может извлекать цели из простого текстового файла или вывода nmap.
Отлично! Это ваша возможность помочь улучшить BaRMIe! BaRMIe полагается на некоторое знание классов, предоставляемых через RMI, поэтому ваш вклад поможет значительно улучшить BaRMIe и безопасность сервисов RMI.
Если у вас есть доступ к JAR-файлам или исходному коду целевого приложения, то создание атаки так же просто, как компиляция кода с помощью соответствующих JAR-файлов. Получите ссылку на нужный удалённый объект с помощью классов LocateRegistry и Registry и вызовите нужные методы. В качестве альтернативы ищите удалённые методы, которые принимают произвольные объекты или другие непримитивные параметры, так как их можно использовать для доставки полезных нагрузок десериализации. В ближайшее время будет предоставлена дополнительная документация по атакам на RMI и созданию атак для BaRMIe.
В качестве альтернативы свяжитесь, предоставив как можно больше деталей, включая вывод BaRMIe -enum и, в идеале, соответствующие JAR-файлы.
BaRMIe способен выполнять три типа атак на сервисы RMI. Краткое описание каждого приводится ниже. Дополнительные технические подробности будут опубликованы в ближайшее время на https://nickbloor.co.uk/. Кроме того, я представлял результаты своего исследования на 44CON 2017, и слайды можно найти здесь: BaRMIe - Poking Java's Back Door.
Первый и самый простой метод атаки на небезопасные сервисы RMI — это просто вызов небезопасных удалённых методов. Часто опасный функционал предоставляется через RMI, который можно запустить, просто получив ссылку на удалённый объект и вызвав опасный метод. Ниже приведён пример такого кода:
//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);
Некоторые сервисы RMI не предоставляют опасного функционала или реализуют средства безопасности, такие как аутентификация и управление сеансами. Если сервис RMI предоставляет метод, принимающий произвольный Object в качестве параметра, то этот метод может быть использован как точка входа для атак десериализации. Некоторые примеры таких методов приведены ниже:
public void setOption(String name, Object value);
public void addAll(List values);
Из-за использования сериализации и небезопасной обработки параметров методов на сервере можно использовать любой метод с непримитивными типами параметров в качестве точки входа для атак десериализации. BaRMIe достигает этого с помощью TCP-прокси, изменяя параметры методов на сетевом уровне, по сути вызывая недопустимые вызовы методов. Некоторые примеры уязвимых методов приведены ниже:
public void setName(String name);
public Long add(Integer i1, Integer i2);
public void sum(int[] values);
Параметры каждого из этих методов могут быть заменены полезной нагрузкой десериализации при прохождении вызова метода через прокси. Эта атака возможна, потому что Java не пытается проверить, совместимы ли параметры удалённого метода, полученные по сети, с фактическими типами параметров, до их десериализации.