Dockerを使ってCVE-2021-41773を検証する

セキュリティ

先日以下のニュースが出て、話題になりました。

「Apache HTTPD」がアップデート – 一部脆弱性はすでに悪用済み

今回はそのアップデートで修正された「CVE-2021-41773」について、検証を行います。

なお、ブログの内容については悪用を促すわけではないので、予めご了承ください。

Docker環境の準備

今回は「Docker」を使用して環境を構築します。

Windows版もありますが、いつものUbuntuにDockerを入れて環境を作ります。

VMとしてUbuntu20を立てて、私が作業しやすいようsshも入れておきます。

以下の記事を参考に「Docker」を入れていきます。Ubuntuのバージョンが多少違いますが、問題ありません。

Ubuntu 18.04 LTS に Docker をインストールする

$ sudo apt install \
>     apt-transport-https \
>     ca-certificates \
>     curl \
>     gnupg-agent \
>     software-properties-common
//必要なパッケージのインストール

「apt update」は行っていませんが、sshを入れる際にやるので、問題ありません。

続いて、「Docker 公式の GPG 公開鍵をインストール」

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
OK

「fingerprint 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88であることを確認」

$ sudo apt-key fingerprint 0EBFCD88
pub   rsa4096 2017-02-22 [SCEA]
      9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid           [  不明  ] Docker Release (CE deb) <docker@docker.com>
sub   rsa4096 2017-02-22 [S]

repository (stable) を追加

$ sudo add-apt-repository \
>     "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
>     $(lsb_release -cs) \
>     stable"

次にDockerのインストールです。

インストールする前に「sudo apt update」を行いましょう!

ではインストールします。

$ sudo apt-get install docker-ce docker-ce-cli containerd.io

先ほどの記事を確認するのはここまでで大丈夫です。

インストールが終わったら、「docker -v」と入力してみましょう。以下のように表示されれば大丈夫かと思います。

CVE-2021-41773の環境構築

Qiitaによい記事が投稿されていたので、これを参考に構築します。

CVE-2021-41773をDockerで確認する

なお、説明については軽く公式とかのドキュメントを読みながらやっているので、間違っているかもしれませんので、悪しからず。

実は私は「Docker」を触ったことがなかったのです!

まずは、Docker Hubからhttpd 2.4.49のイメージを引っ張ってきて、httpd.confを取得します。

最初ユーザ権限でやったら、パーミッションが的なエラーが出たんで、rootになっています。(sudo -s)

# docker pull httpd:2.4.49
2.4.49: Pulling from library/httpd
07aded7c29c6: Pull complete
05bb40c8f148: Pull complete
0827b74117da: Pull complete
35a526fdcc7d: Pull complete
59fed288cd32: Pull complete
Digest: sha256:dcba0d12e2362fb0c50ec524ae8aa1cca4a4ba7216617a57e7bbca20767e79cc
Status: Downloaded newer image for httpd:2.4.49
docker.io/library/httpd:2.4.49

次に「docker run」して、「httpd.conf」を持ってきます。

root@ubuntu:/home/tokoroten# docker run -v $(pwd):/tmp --name cve -it --entrypoint sh httpd:2.4.49
//現在のディレクトリをマウント(/tmp)
# cp conf/httpd.conf /tmp/
//httpd.conf を自分のVM側に持ってくる

上記が終わったら、「exit」で抜けます。その後「ls」すると、フォルダ内に「httpd.conf」が以下のようにあると思います。

次に取得した「httpd.comf」を編集します。

エディタはviでもnanoでもどちらでも構いません。私はnanoで編集します。

ここ↓を

以下に変更します。

<Directory />
    AllowOverride none
    Require all granted
</Directory>

変更終わったら、「ctrl+x」で保存します。(nanoの場合)

続いて、Dockerfileを作成します。

# nano Dockerfile
//ファイル内容は以下、「#」以降はコメントなので、無視して書かなくてOKです。
========ファイル内容========
FROM httpd:2.4.49
#ベースとなるイメージを指定、もちろん脆弱性のあるhttpd 2.4.49を指定
COPY ./httpd.conf /usr/local/apache2/conf/httpd.conf
#先ほど作成した「httpd.conf」を動かすapacheの設定ファイルにコピー
========ファイル内容========

書いたら先ほどと同様に「ctrl+x」で保存します。(nanoの場合)

さて、ここまできたら、あとはビルドして、動かすだけです。

# docker build -t apache-vuln .
Sending build context to Docker daemon  9.124MB
Step 1/2 : FROM httpd:2.4.49
 ---> e91425f38618
Step 2/2 : COPY ./httpd.conf /usr/local/apache2/conf/httpd.conf
 ---> 1a3c6c6c0256
Successfully built 1a3c6c6c0256
Successfully tagged apache-vuln:latest

コマンドの最後の「.」はDockerfileがあるディレクトリを指定しています。

現在自分が操作しているディレクトリとは別にある場合はそこを指定してください。

# docker run -dit --name cve-2021-41773 -p 12345:80 apache-vuln
f03e6b25febcdf1b5c60c9e7879eb1aeeada9a96b55cec15a0cef2f78358f5af

ポート「12345」でhttpdを動作させました。

windows側からアクセス可能なので、ブラウザにburp経由でアクセスしてみましょう!

今まで、さんざん見たApacheの「It works!」が表示されます。

CVE-2021-41773の検証

PoCについては、Twitterやら、ほかのブログやらで色々出ていますね。
※探さなくて楽でした!

以下のようなコードで実行可能とのことです。

/cgi-bin/.%2e/.%2e/.%2e/.%2e/etc/passwd

勉強会によく参加して頂いている「okukenさん」が作成したburpの「ISTE」を使ってやってみましょう!

はい!このとおり、トラバーサルができることが確認できました!

ハイ終わり!でもいいのですが、ちょこっと追加で検証します。

指定するディレクトリは「cgi-bin」のディレクトリじゃないとだめなのでしょうか?

実は以下のとおり、現在のサーバの状態では「cgi」は動きません。

「httpd.conf」を見てもらうとわかりますが、cgiモジュールはコメントアウトされたままです。

なので、cgiモジュールが動作することが原因ではありません。

以下の「ScriptAlias」に指定されたディレクトリに対して発生してしまいます。

なので、例えば、「ScriptAlias」として、「/nekodaisuki/」を指定してみると・・・
※自分で検証する際は再度ビルドしてくださいね。

/cgi-bin/.%2e/.%2e/.%2e/.%2e/etc/passwd

上記では以下のとおりステータスコード403になりますが、


「/cgi-bin/」ではなく、「/nekodaisuki/」を指定してみと・・・

/nekodaisuki/.%2e/.%2e/.%2e/.%2e/etc/passwd

トラバーサルが成功していますね!

なので、もし、「2.4.49」を使用していたら、「/cgi-bin/」なんてディレクトリは無いから大丈夫!というわけではないので、ご注意ください。

該当の脆弱性が発生するバージョンが「2.4.49」のみなので、それ以外を使用していれば「CVE-2021-41773」については問題ないと公式で発表されています。

最後に

CVE-2021-41773の検証を行いました。

今回は今まで、避けていた「Docker」を使用して環境構築を行いましたが、結構よかった!

今後は「Docker」を使ってしまいそうなくらい便利でしたね。

環境の変更もやりやすいので、興味がある方は触ってみてくださいね。

不明点や要望やこういったこともやって欲しいとの要望があれば、お問い合わせページやコメント、ツイッターからでも結構ですので、気軽にご連絡ください。

コメント