【備忘録】badstore-dockerの構築

BadStoreのコンテナを立てた際の備忘録です。
脆弱性診断やDockerの操作を練習したい方の参考になれば幸いです。
## 目次
- [経緯](#経緯)
    - [使用していた教材](#使用していた教材)
- [使用環境](#使用環境)
- [BadStoreを動かす](#badstoreを動かす)
- [BadStoreのシェルにアクセスする](#badstoreのシェルにアクセスする)
- [アクセスログを確認](#アクセスログを確認)
- [コンテナの停止](#コンテナの停止)
- [最後に](#最後に)

# 経緯
学校の授業の一環として、やられサイトのBadStoreをVM上に構築し、webアプリケーションの脆弱性について学習していましたが、不具合によって一時的にVMを使用できなくなってしまいました。
課題提出の期限もあったため、代替案としてDocker上にBadStoreの環境を新しく構築することにしました。

### 使用していた教材

https://amzn.asia/d/eYofTlH

# 使用環境
WSL2(Ubuntu)+Dockerの環境を既に構築していたため、そちらを使用しました。
環境を構築していない方は、以下の記事を参考にすると良いと思います。

https://qiita.com/haveAbook/items/0d0ae20a19214f65e7cd

# BadStoreを動かす
BadStoreのコンテナイメージが配布されているため、こちらを使用します。

https://github.com/jvhoof/badstore-docker
```sh:BadStoreのコンテナイメージの取得
sudo docker pull jvhoof/badstore-docker
```
私の環境では、既に80番ポートを使用していたため、8080番ポートからポートフォワードしました。
そのまま80番ポート経由でアクセスしたい場合、```-p 8080:80```と指定している部分を、```-p 80:80```と指定してください。
```sh:BadStoreコンテナ起動（ポート8080から80に繋がるようポートフォワード）
sudo docker run -d --name badstore --rm -i -p 8080:80 -t jvhoof/badstore-docker
```

起動できているか、プロセスを表示して確認します。

```sh:Dockerのプロセスを表示
sudo docker ps
```  
```sh:実行結果（例）
$ 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-docker](https://hackmd.io/_uploads/SyGGjrWLC.png)
# BadStoreのシェルにアクセスする
ログファイル等を見るために、BadStoreが動いているコンテナのIDを指定して、シェルにアクセスします。 

まず先ほどの```docker ps```の実行結果で表示された、BadStoreのコンテナIDを確認します。
```sh: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
　　　　↑これ
```
コンテナIDを指定して、コンテナ内のbashシェルを起動します。
```sh
sudo docker exec -it (コンテナID) /bin/bash
```


これでシェルにアクセスすることができます。
```sh:↓コンテナのシェルにrootでログインされる
root@(コンテナID):/var/www/html# 
```  
# アクセスログを確認
/var/log/apache2/access.logを確認してもログは出力されていませんでした。
```sh:ls -alで確認してもログファイルは0バイト
-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を確認すると以下のように記述されていました。
```sh:/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配下のファイルを参照すればログを見ることができます。

```sh:# tail -f /data/apache2/log/access.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を以下のように変更してください。
```sh:/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

        #出力先を/var/log/apache2配下のログファイルに変更
        ErrorLog /var/log/apache2/error.log
        CustomLog /var/log/apache2/access.log combined
</VirtualHost>
```
```shell:設定の反映
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
```

```sh:実行結果
$ sudo docker stop badstore
badstore
```

ちなみに、```docker ps```の実行結果にもコンテナ名が表示されるため、分からなくなったらそちらを確認してください。
```sh:$ 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
                                                                                                                                         ↑これ
```
<br/>

```docker ps```でコンテナを停止できているか確認します。

```:$ sudo docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
```
dockerのプロセスが動いていないため、正常にコンテナを停止できています。


# 最後に
VM上に構築していた際、自動診断ツールなどを走らせたときに、途中からレスポンスが正常に返ってこない現象が発生していました。
VMのリソース不足かと思いましたが、スケールアップしても改善しませんでした。

こういったケースが発生した時の予備の環境として、今回の用意しておくのも良いと思います。