🧩 目的:安全な環境で脆弱性を理解するための実験
本記事は、ローカルDocker環境上で完結するサイバーセキュリティ学習環境を構築し、
各種スキャン・調査ツールを使って「脆弱性の原理」を体験的に学ぶ手順をまとめたものです。
実際の攻撃を行うものではなく、防御・教育目的の演習として記載しています。
⚠️ 倫理的・法的な注意事項
- 本記事で紹介する内容は すべてローカル(Docker内)で実施 したものです。
- 公開サーバー・他者ネットワーク・実サービスに対するスキャン・侵入は
日本の不正アクセス禁止法により明確に違法です。 - 知識の習得目的であっても、検証環境外での実行は絶対に行わないでください。
- 本記事は「セキュリティを守る側の視点を理解する」ための教育資料です。
🧩 環境構成概要
| 役割 | コンテナ名 | イメージ | 用途 |
|---|---|---|---|
| 攻撃端末 | kali |
kalilinux/kali-rolling |
セキュリティツールの実行 |
| 脆弱アプリ1 | target-dvwa |
vulnerables/web-dvwa |
PHP製脆弱Webアプリ |
| 脆弱アプリ2 | target-juice |
bkimminich/juice-shop |
OWASP公式学習アプリ |
| DB | dvwa-db |
mariadb |
DVWA用MySQL互換DB |
🧱 Docker Compose 設定例
version: '3'
services:
kali:
image: kalilinux/kali-rolling
container_name: kali
tty: true
target-dvwa:
image: vulnerables/web-dvwa
container_name: target-dvwa
ports:
- "80:80"
target-juice:
image: bkimminich/juice-shop
container_name: target-juice
ports:
- "3000:3000"
dvwa-db:
image: mariadb
environment:
MYSQL_ROOT_PASSWORD: root
🚀 起動コマンド
mkdir ~/ceh-lab-docker
cd ~/ceh-lab-docker
docker compose -f lab-docker-compose.yml up -d
docker ps
起動後、以下のように各コンテナが Up 状態になれば成功です。
CONTAINER ID IMAGE COMMAND PORTS
5d08798bd12a vulnerables/web-dvwa "/main.sh" 0.0.0.0:80->80/tcp
50d4d50d18f3 bkimminich/juice-shop "/nodejs/bin/node /j…" 0.0.0.0:3000->3000/tcp
120df0359ebb kalilinux/kali-rolling "/bin/bash -lc 'whil…" ...
🔧 Kali側セットアップ
docker exec -it kali bash
apt update && apt install -y iputils-ping nmap curl nikto gobuster seclists jq unzip
🔍 スキャン・調査手法
1️⃣ Nmapによるポートスキャン
nmap -sS -Pn -T4 192.168.123.111
nmap -sV -sC 192.168.123.115
| 対象 | 結果 |
|---|---|
DVWA (192.168.123.111) |
80/tcp open (Apache/2.4.25) |
Juice Shop (192.168.123.115) |
3000/tcp open (Node.js) |
2️⃣ Niktoによる脆弱性スキャン
nikto -h http://192.168.123.111
nikto -h http://192.168.123.115:3000
検出例:
-
DVWA
-
/config//docs/のディレクトリインデックス公開 -
.gitignore,php.iniの露出 -
allow_url_include=On→ LFI/RFIリスク
-
-
Juice Shop
-
/robots.txtに/ftp/記載 -
/api/Products等のREST API公開確認
-
3️⃣ Gobusterでディレクトリ列挙
gobuster dir -u http://192.168.123.111 -w /usr/share/seclists/Discovery/Web-Content/common.txt -t 40
検出結果(抜粋):
/config
/docs
/.gitignore
/php.ini
/.htaccess
4️⃣ Curlでファイル確認
curl -I http://192.168.123.111/
curl -s http://192.168.123.111/.gitignore
curl -s http://192.168.123.111/php.ini | grep allow_
確認結果:
-
.gitignoreにconfig/config.inc.php記載 -
php.iniにallow_url_include=on -
/config//docs/がブラウザで閲覧可能(ディレクトリリスティング)
5️⃣ Juice Shop APIを確認
curl -s http://192.168.123.115:3000/api/Products | jq .
結果:
- 認証不要で全商品一覧が取得可能
- REST APIのオープン設計を学べる
🧠 学べるポイント
| 観点 | 内容 |
|---|---|
| 設定ファイル露出 |
.gitignore などに機密ファイルパスが含まれる |
| PHP設定の危険性 |
allow_url_include がONだとRFI攻撃が可能 |
| ディレクトリインデックス |
/config/ /docs/ などが閲覧可能に |
| REST API設計 | Juice ShopのAPIが無認証で公開されている例 |
| スキャン出力の読解 | Nikto/Gobusterの結果を整理し理解する |
📚 使用コマンドまとめ
docker compose up -d
docker exec -it kali bash
apt update && apt install -y nmap nikto gobuster seclists jq
nmap -sS -Pn -T4 192.168.123.111
nikto -h http://192.168.123.111
gobuster dir -u http://192.168.123.111 -w /usr/share/seclists/Discovery/Web-Content/common.txt -t 40
curl -s http://192.168.123.115:3000/api/Products | jq .
🧩 次のステップ
-
config/config.inc.phpの解析
→ DB接続情報の仕組みを確認(攻撃ではなく理解目的) -
DVWAの難易度設定変更(Security → Low)
→ SQLi・XSS・CSRFなどの実験を行い、ログを観察 -
Juice Shop CTFモードで練習
→ OWASP公式教材として安全に脆弱性探索を体験 -
防御側視点の実装学習
- セキュリティヘッダ付与
- ディレクトリリスティング無効化
- API認証化・CORS設定の理解
🧾 まとめ
Dockerを使えば、1台のPCで完結する完全隔離型の脆弱性学習環境が構築できます。
Kali + DVWA + Juice Shopを組み合わせることで、
攻撃と防御の両側面からWebセキュリティを体系的に学ぶことが可能です。
💡 学びの本質:
「攻撃手法を知ることは、防御を設計する最初の一歩。」
🏷️ タグ候補
#セキュリティ
#Docker
#KaliLinux
#脆弱性診断
#JuiceShop
#DVWA
#ペネトレーションテスト学習
✍️ 著者コメント
本記事の内容は、教育・研究目的で構築したローカル実験環境に基づくものです。
読者が「脆弱性を悪用する」のではなく、「安全なシステム設計を実現する」ための知識として活用することを願っています。