
BaRMIeは、Java RMI(Remote Method Invocation)サービスの列挙と攻撃を目的としたツールです。
RMIサービスは、適切なセキュリティ制御なしに危険な機能を公開することがよくありますが、効果的なテストツールが不足しているため、セキュリティ評価の際にRMIサービスは見過ごされがちです。2008年、Adam BoultonはAppSec USA(YouTube)で講演し、いくつかのRMI攻撃ツールを公開しましたが、これらはすぐに姿を消しました。しかし、それらのツールを使用しても、成功するゼロ知識攻撃は、ネットワーク上で大規模なブルートフォース攻撃(約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クラスを使用して関連するリモートオブジェクトを取得し、目的のメソッドを呼び出します。あるいは、任意のオブジェクトや非プリミティブなパラメータを受け入れるリモートメソッドを探します。これらはデシリアライゼーションペイロードを配信するために使用できます。BaRMIe向けの攻撃の作成とRMI攻撃に関する詳細なドキュメントは、近々公開される予定です。
または、連絡を取り、BaRMIe -enumの出力と、可能であれば関連するJARファイルを含む、できるだけ詳細な情報を提供してください。
BaRMIeはRMIサービスに対して3種類の攻撃を実行できます。以下にそれぞれの簡単な説明を示します。さらなる技術的詳細は、近々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がネットワーク経由で受信したリモートメソッドパラメータをデシリアライズする前に、それらが実際のパラメータ型と互換性があるかどうかを検証しようとしないためです。