BadStoreのコンテナを立てた際の備忘録です。
脆弱性診断やDockerの操作を練習したい方の参考になれば幸いです。
目次
経緯
学校の授業の一環として、やられサイトのBadStoreをVM上に構築し、webアプリケーションの脆弱性について学習していましたが、不具合によって一時的にVMを使用できなくなってしまいました。
課題提出の期限もあったため、代替案としてDocker上にBadStoreの環境を新しく構築することにしました。
使用していた教材
使用環境
WSL2(Ubuntu)+Dockerの環境を既に構築していたため、そちらを使用しました。
環境を構築していない方は、以下の記事を参考にすると良いと思います。
BadStoreを動かす
BadStoreのコンテナイメージが配布されているため、こちらを使用します。
sudo docker pull jvhoof/badstore-docker
私の環境では、既に80番ポートを使用していたため、8080番ポートからポートフォワードしました。
そのまま80番ポート経由でアクセスしたい場合、-p 8080:80
と指定している部分を、-p 80:80
と指定してください。
sudo docker run -d --name badstore --rm -i -p 8080:80 -t jvhoof/badstore-docker
起動できているか、プロセスを表示して確認します。
sudo docker ps
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1434d549eb85 jvhoof/badstore-docker "/usr/bin/supervisord" 10 seconds ago Up 9 seconds 0.0.0.0:8080->80/tcp, :::8080->80/tcp badstore
指定したコンテナイメージが動いており、起動していることが確認できました
dockerが動作しているホストにポート8080からアクセスすると、BadStoreのページが返ってきます。
WSLの場合は、http://localhost:8080
vmや別ホスト上のlinux端末上にDockerを構築している場合はhttp://(ホストのIPアドレス):8080
で接続できます。
BadStoreのシェルにアクセスする
ログファイル等を見るために、BadStoreが動いているコンテナのIDを指定して、シェルにアクセスします。
まず先ほどのdocker ps
の実行結果で表示された、BadStoreのコンテナIDを確認します。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1434d549eb85 jvhoof/badstore-docker "/usr/bin/supervisord" 10 seconds ago Up 9 seconds 0.0.0.0:8080->80/tcp, :::8080->80/tcp badstore
↑これ
コンテナIDを指定して、コンテナ内のbashシェルを起動します。
sudo docker exec -it (コンテナID) /bin/bash
これでシェルにアクセスすることができます。
root@(コンテナID):/var/www/html#
アクセスログを確認
/var/log/apache2/access.logを確認してもログは出力されていませんでした。
-rw-r----- 1 root adm 0 Jan 8 12:08 access.log
-rw-r----- 1 root adm 0 Jan 8 12:07 error.log
/etc/apache2/sites-available/badstore.confを確認すると以下のように記述されていました。
<VirtualHost *:80>
ServerAdmin jvanhoof@barracuda.com
DocumentRoot /data/apache2/htdocs
ScriptAlias /cgi-bin/ /data/apache2/cgi-bin/
<Directory "/data/apache2/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Require all granted
</Directory>
<Directory />
Options FollowSymLinks
AllowOverride FileInfo
Require all granted
</Directory>
ErrorLog /data/apache2/log/error.log
CustomLog /data/apache2/log/access.log combined
</VirtualHost>
そのため、/data/apache2/log配下のファイルを参照すればログを見ることができます。
172.17.0.1 - - [08/Jan/2025:12:34:21 +0000] "GET /cgi-bin/badstore.cgi HTTP/1.1" 200 1382 "http://localhost:8080/cgi-bin/badstore.cgi" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"
172.17.0.1 - - [08/Jan/2025:12:34:21 +0000] "GET /cgi-bin/bsheader.cgi HTTP/1.1" 200 604 "http://localhost:8080/cgi-bin/badstore.cgi" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"
/var/log配下に出力したい場合は、badstore.confを以下のように変更してください。
<VirtualHost *:80>
ServerAdmin jvanhoof@barracuda.com
DocumentRoot /data/apache2/htdocs
ScriptAlias /cgi-bin/ /data/apache2/cgi-bin/
<Directory "/data/apache2/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Require all granted
</Directory>
<Directory />
Options FollowSymLinks
AllowOverride FileInfo
Require all granted
</Directory>
#元の設定をコメントアウト
#ErrorLog /data/apache2/log/error.log
#CustomLog /data/apache2/log/access.log combined
#出力先を/var/log/apache2配下のログファイルに変更
ErrorLog /var/log/apache2/error.log
CustomLog /var/log/apache2/access.log combined
</VirtualHost>
service apache2 restart
コンテナの停止
コンテナを停止する場合は、Dockerが動作しているホスト上で以下のコマンドを実行します。
sudo docker stop (コンテナ名)
今回はコンテナを起動するコマンドで、コンテナ名を"badstore"に指定しています。
sudo docker run -d --name badstore --rm -i -p 8080:80 -t jvhoof/badstore-docker
↑ nameオプションでコンテナ名を指定している
そのため、以下のコマンドでコンテナを停止できます。
sudo docker stop badstore
$ sudo docker stop badstore
badstore
ちなみに、docker ps
の実行結果にもコンテナ名が表示されるため、分からなくなったらそちらを確認してください。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1434d549eb85 jvhoof/badstore-docker "/usr/bin/supervisord" 10 seconds ago Up 9 seconds 0.0.0.0:8080->80/tcp, :::8080->80/tcp badstore
↑これ
docker ps
でコンテナを停止できているか確認します。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dockerのプロセスが動いていないため、正常にコンテナを停止できています。
最後に
VM上に構築していた際、自動診断ツールなどを走らせたときに、途中からレスポンスが正常に返ってこない現象が発生していました。
VMのリソース不足かと思いましたが、スケールアップしても改善しませんでした。
こういったケースが発生した時の予備の環境として、今回の用意しておくのも良いと思います。