Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
ermir — Rogue RMI Registry は、list/lookup/bind メソッドを介した安全でない Java デシリアライゼーションを悪用します。Ysoserial ガジェットを生成・配信し、脆弱なクライアント上でリモートコード実行をトリガーします。 | Kitploit
ツール/GitHubGitHub/hakivvi/ermir
ペイロード生成脆弱性分析エクスプロイトペネトレーションテスト
GitHubhakivvi/ermir

ermir

Rogue RMI Registry は、list/lookup/bind メソッドを介した安全でない Java デシリアライゼーションを悪用します。Ysoserial ガジェットを生成・配信し、脆弱なクライアント上でリモートコード実行をトリガーします。

リポジトリを見る
5043年前Kitploit レビュー済み

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

Ermir

Ermir は Evil/Rogue RMI Registry(悪意のある/不正なRMIレジストリ)であり、標準的なRMIメソッド(list()/lookup()/bind()/rebind()/unbind())を呼び出す任意のJavaコード上の安全でないデシリアライゼーションを悪用します。

要件

  • Ruby v3 またはそれ以上。

インストール

rubygems.org から Ermir をインストール:

root@kitploit:~
$ gem install ermir

または、リポジトリをクローンしてgemをビルド:

root@kitploit:~
$ git clone https://github.com/hakivvi/ermir.git
$ rake install

使用方法

Ermir は CLI gem であり、2つのCLIファイルermirとgadgetmarshalが付属しています。ermirが実際のgemで、後者は Ysoserial のガジェットをMarshalInputStreamの要件に合わせて書き換える GadgetMarshaller.java ファイルへの便利なインターフェースです。出力はermirまたはファイルにパイプする必要があります。カスタムガジェットの場合は、ObjectOutputStreamの代わりにMarshalOutputStreamを使用して、シリアライズされたオブジェクトを出力ストリームに書き込みます。

ermir の使用方法:

root@kitploit:~
➜  ~ ermir
Ermir by @hakivvi * https://github.com/hakivvi/ermir.
Info:
    Ermir is a Rogue/Evil RMI Registry which exploits unsecure Java deserialization on any Java code calling standard RMI methods on it.
Usage: ermir [options]
    -l, --listen   bind the RMI Registry to this ip and port (default: 0.0.0.0:1099).
    -f, --file     path to file containing the gadget to be deserialized.
    -p, --pipe     read the serialized gadget from the standard input stream.
    -v, --version  print Ermir version.
    -h, --help     print options help.
Example:
    $ gadgetmarshal /path/to/ysoserial.jar Groovy1 calc.exe | ermir --listen 127.0.0.1:1099 --pipe

gadgetmarshal の使用方法:

root@kitploit:~
➜  ~ gadgetmarshal
Usage: gadgetmarshal /path/to/ysoserial.jar Gadget1 cmd (optional)/path/to/output/file

仕組み

java.rmi.registry.Registry は5つのメソッドを提供します: list(), lookup(), bind(), rebind(), unbind():

  • public Remote lookup(String name): lookup() は、名前でレジストリ内のバインドされたオブジェクトを検索します。レジストリは、検索されたリモートオブジェクトを参照する Remote オブジェクトを返します。返されたオブジェクトは、MarshalInputStream.readObject() を使用して読み取られます。これは ObjectInputStream の上にある単なる別のレイヤーであり、基本的には各クラス/プロキシ記述子(TC_CLASSDESC/TC_PROXYCLASSDESC)の後に、このクラスまたはプロキシクラスをロードするためのURLを期待します。これは jdk7u21 で修正された同じワイルドバグです。(Ermir はこのURLを指定しません。古いJavaバージョンのみが脆弱であり、代わりに null を書き込みます)。Ysoserial ガジェットは ObjectOutputStream を使用してシリアライズされているため、Ermir は gadgetmarshal(GadgetMarshaller.java のラッパー)を使用して、指定されたガジェットを MarshalInputStream の要件に合わせてシリアライズします。

PoC

ermir

コントリビューション

バグレポートとプルリクエストは GitHub (https://github.com/hakivvi/ermir) で歓迎します。このプロジェクトは、安全で歓迎的なコラボレーションの場を意図しており、コントリビューターは 行動規範 に従うことが期待されています。

ライセンス

このgemは MITライセンス の条件の下でオープンソースとして利用可能です。

行動規範

Ermirプロジェクトのコードベース、Issueトラッカー、チャットルーム、メーリングリストで交流するすべての人は、行動規範 に従うことが期待されています。

ツールをダウンロード
image
  • public String[] list(): list() はレジストリにバインドされたすべてのオブジェクト名を要求します。String 型は通常のオブジェクトとは異なり、readObject() ではなく readUTF() を使用して読み取られるため、悪意のあるガジェットで代用することはできません。しかし、list() は String[](実際のオブジェクト)を返し、これは readObject() を使用して読み取られるため、Ermir はこの String[] 型の代わりにガジェットを送信します。 image

  • public void bind(java.lang.String $param_String_1, java.rmi.Remote $param_Remote_2): bind() はオブジェクトをレジストリの名前にバインドします。bind() の場合、戻り値の型は void であり、何も返されません。しかし、レジストリがRMI戻りデータパケットでこの戻りが例外的な戻りであると指定した場合、クライアント/サーバークライアントは戻り値の型が void であるにもかかわらず、readObject() を呼び出します。これは、レジストリが例外(通常は java.lang.ClassNotFoundException)をクライアントに送信する方法です。Ermir は、正当なExceptionオブジェクトの代わりにシリアライズされたガジェットを配信します。 image

  • public void rebind(java.lang.String $param_String_1, java.rmi.Remote $param_Remote_2): rebind() は、渡された名前のバインディングを指定されたリモート参照で置き換えます。これも void を返します。Ermir は bind() と同様に例外を返します。

  • public void unbind(java.lang.String $param_String_1): unbind() は RMI レジストリ内のリモートオブジェクトを名前でバインド解除します。これも void を返します。