CVE-2023-25690 — 概念実証エクスプロイト - Apache mod_proxy における CVE-2023-25690 HTTPリクエストスマグリング。Docker を使用したラボ環境、BurpSuite のウォークスルー、プロキシアクセス制御をバイパスして内部管理エンドポイントに到達する方法を含みます。 | Kitploit
ツール / GitHub / thanhlam-attt / cve-2023-25690
thanhlam-attt/cve-2023-25690 CVE-2023-25690 概念実証エクスプロイト - Apache mod_proxy における CVE-2023-25690 HTTPリクエストスマグリング。Docker を使用したラボ環境、BurpSuite のウォークスルー、プロキシアクセス制御をバイパスして内部管理エンドポイントに到達する方法を含みます。
4 1 2 2年前コミュニティで最も使われているツールを見つけましょう。
過去7日間 過去30日間
CVE-2023-25690
CVE-2023-25690の説明:
Apache HTTP Server バージョン 2.4.0 から 2.4.55 における mod_proxy の特定の設定は、HTTP Request Smuggling(1人または複数のユーザーから受信したHTTPリクエストチェーンをWebサイトが処理するプロセスに干渉する攻撃手法)を許容します。
これらの設定は、mod_proxy が特定の RewriteRule または ProxyPassMatch とともに有効になっている場合に影響を受け、リモート攻撃者がこの脆弱性を悪用してプロキシサーバーのアクセス制御を回避し、それによって意図しないURLをオリジンサーバーにプロキシすることができます。
この脆弱性により、攻撃者はプロキシによって隠された内部アプリケーションを標的にしてアクセスでき、不正アクセス、データ漏洩、またはシステムへのさらなる悪用につながる可能性があります。
CVE-2023-25690 の実験
攻撃マシンとしてWindowsマシンを使用
バックエンドサーバーとプロキシサーバーは、Kali Linux上のDockerを介してデプロイ
ラボのファイル構造:
実験モデル
Windows 10 マシンのIPアドレス: 192.168.1.177
Kali Linux マシンのIPアドレス: 192.168.27.139
バックエンドサーバーのIPアドレス: 172.18.0.2
プロキシサーバーのIPアドレス: 172.18.0.3
Windows 10 が Kali マシンのポート80でホストされている Apache HTTP Server にアクセスすると、トラフィックはプロキシサーバーのポート80に転送され、さらにポート8080を介してバックエンドサーバーに転送されます。
システム要件
攻撃マシン:
OS: Windows 10
インストールツール: Pycharm、BurpSuite、VScode
ブラウザ: FireFox、FoxyProxy拡張機能を使用してプロキシを設定
被害マシン:
インストールツールとサービス: Docker、Tcpdump
Dockerファイルの設定(付録参照)
悪用目標: HTTP Request Smuggling の脆弱性を悪用してプロキシサーバーの制限を回避し、admin.php ページの隠し機能にアクセスする。
実験の展開:
BurpSuite Community をプロキシとして構成し、リクエストをインターセプトして編集します。
ブラウザで FoxyProxy 拡張機能をインストールし、プロキシ情報を追加します:
ツールバーの FoxyProxy(ブラウザの拡張機能セクション)を Turn Off から BurpSuite Commu に切り替えます:
BurpSuite で、intercept を on にしてパケットキャプチャを開始します:
Kali マシンで、cd コマンドを使用して docker-composer.yml ファイルが含まれるラボディレクトリに移動し、docker composer を実行します: docker-composer up --build
CRLFインジェクションの確認:
まず、制御文字(CRLF)を含むリクエストをシステムに送信します。例: HTTP/1.1\r\nFoo:
baarr\r\r\n\n を URL エンコードすると: %20HTTP/1.1%0d%0aFoo:%20baarr
=> CRLF文字(%0d%0a)を挿入すると、サーバーはエラーや制限なしにリクエストを処理し、CRLF文字を挿入できることがわかります。
HTTP Request Smuggling の確認:
次に、次のような URI があります:
/categories/1 HTTP/1.1\r\nHost: Localhost\r\n\r\nGET /SMUGGLED、URL エンコードすると: /categories/1%20HTTP/1.1%0d%0aHost:%20localhost%0d%0a%0d%0aGET%20/SMUGGLED/
RewriteRule を適用した後、URL が解析され、プロキシを通過した後のリクエストは次の形式に変換されます:
1つのリクエストを送信したにもかかわらず、サーバーは2つのレスポンス(GET /categories と GET /SMUGGLED)を受信して返していることがわかります:
HTTP Request Smuggling の悪用:
仮に、httpd.conf ファイルで Proxy-Server が /admin/ ページへのアクセスをブロックするように設定されているとします:
次のリクエストで HTTP Request Smuggling を利用して apache-proxy のチェックメカニズムを回避できます:
ログを確認すると、apache-proxy を通過し、/admin へのリクエストが成功し、バックエンドも GET /admin に対してステータスコード200を返していることがわかります:
仮に、admin.php ファイルに nslookup システムコマンドを実行して任意のドメインにクエリを送信する関数があるとします。目標は、プロキシのメカニズムを回避してこの隠し機能にアクセスし、DNS クエリを
任意のドメインに送信することです。ここでは、自身の Kali マシンにクエリを送信します。
悪用コード(ファイル CVE-2023-25690.py)とファイル pre.txt(プロキシサーバーをバイパスしてシステムにリクエストを送信するために使用する smuggle リクエストが含まれています。ここでは /admin.php)があります。このコードは、pre.txt に含まれるリクエストを使用してリクエストスマグリングを作成し、サーバーに送信します。同時に、リクエストとレスポンスの結果をそれぞれ req.txt と res.txt の2つのファイルに記録します:
同時に、Kali マシンで TCPDUMP を使用してポート53の DNS パケットをキャプチャします:
送信したリクエストがプロキシを通過できたことがわかります。プロキシはこのリクエストを有効と判断しました。しかし、バックエンドサーバーでは、制御文字も解析されるため、1つのリクエストが3つのリクエストに分割されました。1つ目は GET /categories.php?id=1、2つ目は GET /admin.php?secret=192.168.1.194、最後に GET /abc です:
これで、プロキシがリクエスト送信を許可していない /admin.php にリクエストを送信することに成功しました:
=> TCPDUMP を確認すると、DNS パケットが送信されたことがキャプチャされました -> /admin.php の隠し機能が正常に実行されました。
付録
バックエンドフォルダの DockerFile 設定
この設定ファイルは、バックエンドサーバーが PHP 7.4-apache イメージを使用することを指定しています。これは PHP 7.4 と Apache Web サーバーを含むイメージです。
2番目のコマンドは、src/ ディレクトリのすべての内容を /var/www/html ディレクトリにコピーします。これは、Apache が Web コンテンツを構築するためのデフォルトディレクトリであり、Web ルートとも呼ばれます。
3番目のコマンドは、sed を使用して 80 をすべて 8080 に置き換えます。これにより、バックエンドサーバー内の Apache のデフォルトポートを 80 から 8080 に変更できます。
4番目のコマンドは、パッケージを更新し、パッケージ dnsutils をインストールするために使用されます。このパッケージの詳細については、こちらを参照してください https://github.com/iagox86/dnsutils/blob/master/README.md
最後のコマンドは、コンテナの実行時に実行され、Apache を使用して Apache Web サーバーを起動します。
フロントエンドフォルダの DockerFile 設定
このファイルは、フロントエンドフォルダ内の httpd.conf ファイルを /tmp/httd.conf にコピーし、最後にその httpd.conf ファイルの内容を /usr/local/apache2/conf/httpd.conf に書き込みます。
httpd.conf ファイルは、Apache HTTP サーバーのメイン設定ファイルであり、サーバーの設定や操作を定義します。ここではプロキシサーバーです。
httpd.conf ファイルは通常 /usr/local/apache2/conf/httpd.conf に配置されるため、そのパスに内容を配置する必要があります。フロントエンドフォルダに httpd.conf ファイルを作成することで、Apache をより柔軟に設定できます(毎回そのパスに cd して httpd.conf を書き直す必要がありません)。
docker-compose.yml ファイルの設定:
ここでは、アプリケーションの実行に必要なサービスやネットワークなどを定義します。
ここでは、apache-proxy と backend-server の2つの主要なサービスを宣言しています:
Apache-Proxy: ./frontend/DockerFile に基づいて構築され、ネットワークは backend-network(ブリッジ)です。さらに、depends_on: backend-server を設定して、Apache-Proxy は Backend-Server の起動が完了した後にのみ起動するように指定します。最後に ports: "80:80" でポートフォワーディングを指定し、ホストマシンのポート80へのトラフィックがコンテナのポート80に転送されます。
Backend-Server: ./backend/DockerFile に基づいて構築され、ネットワークは backend-network で Proxy と通信できるようにします。expose でポート8080を開放し、Apache-Proxy がこのポートを介してトラフィックを Backend-Server に転送できるようにします。最後に、ユーザーが新しい権限を作成できない(ファイルの追加・変更・削除、プロセスやネットワークへの権限追加など)ようにするセキュリティ機能と、プログラムによって実行されるシステムコールをフィルタリングする機能を設定します。
httpd.conf ファイルの設定
最初に、ログを /use/local/apache2/logs/error.log と /use/local/apache2/logs/access.log の2つのパスに保存する設定を行います。
次に、Rewrite Rule(リライトルール)を適用するために必要なモジュールをロードします。
次に、DocumentRoot を指定します。これは、Apache 設定ファイル内のパラメータで、サーバーのデータファイルがどこに配置されるかを決定します。
次に、/categories/ と /admin/ へのパスにリライトルールを適用します。
最後に、/admin/ へのリクエスト送信をブロックします -> これは、プロキシをバイパスしてこのページにアクセスするラボを実行するための目的です。