フェーズ1:構成を把握する
【クライアント側】 MacのFirefoxからJuice Shopへアクセス。
【サーバー側】 Ubuntu Server上のDockerでOWASP Juice Shopが稼働。
構成: Mac(クライアント) 192.168.128.117 ↓ HTTP Ubuntu Server 192.168.128.131:3000 ↓ Docker Juice Shop 172.17.0.2:3000
分かること: ブラウザで見ているJuice Shopは、Ubuntu Serverの3000番ポート経由でDockerコンテナに届いている。
Tips: IPアドレス=建物の住所 ポート番号=建物内の受付窓口 と考えると分かりやすい。
フェーズ2:Juice Shopが動いているか確認する
【サーバー側】
sudo docker ps
意味: 現在動いているDockerコンテナを確認する。
今回確認できたもの:
NAME PORTS juice-shop 0.0.0.0:3000->3000/tcp
分かること: Juice Shopが稼働中で、Ubuntu Serverの3000番ポートからアクセスできる。
注意: docker psだけでPermission deniedになる場合は、現在のユーザーにDocker操作権限がないためsudoを付ける。
フェーズ3:アプリのログを見る
【サーバー側】
sudo docker logs --tail 30 juice-shop
意味: Juice Shopが出力した直近30行のログを見る。
リアルタイム監視なら:
sudo docker logs -f juice-shop
-f = follow 新しいログを追い続ける。
分かること: ・アプリ内部のエラー ・認証エラー ・Challenge達成 ・Juice Shop内部で発生した一部イベント
今回分かったこと: 単純なログイン失敗は、Juice Shopの標準ログには出なかった。
重要: Webで起きたこと ≠ 全部docker logsに残る
備考: アプリログ、Webアクセスログ、OSログは別物。
フェーズ4:コンテナの負荷を見る
【サーバー側】
sudo docker stats juice-shop
意味: Juice ShopのCPU、メモリ、通信量などをリアルタイム確認する。
見る項目:
CPU % MEM USAGE NET I/O BLOCK I/O PIDS
【クライアント側】 Juice Shopでページ移動やログイン試行をする。
分かること: ブラウザ操作によって、実際にコンテナ側で通信や処理が発生している。
注意: これは「何を送ったか」までは分からない。 通信量や負荷を見るためのもの。
フェーズ5:ネットワーク通信そのものを見る
【サーバー側】
sudo tcpdump -i any port 3000
意味: 3000番ポートを通る通信をリアルタイム表示する。
tcpdump = パケットキャプチャツール
-i any = すべてのネットワークインターフェースを見る
port 3000 = 3000番ポートだけを見る
【クライアント側】 Juice Shopでログインなどの操作をする。
分かること: ・どのIPから通信が来たか ・どこへ送られたか ・TCP接続の開始・終了 ・通信量 ・Docker内部への転送
例:
192.168.128.117 → ubuntu-server:3000 ubuntu-server → 172.17.0.2:3000
つまり:
Mac ↓ Ubuntu Server ↓ Docker ↓ Juice Shop
という通信経路が確認できる。
Tips: tcpdumpは情報量がかなり多い。 初学者が全部を目で追う必要はない。 「必要な情報を絞る」ことが重要。
フェーズ6:必要な通信だけ絞り込む
tcpdumpは情報量が多いため、ngrepを使用する。
ngrepのインストール:
sudo apt update sudo apt install ngrep
意味:
sudo apt update = インストール可能なソフトウェア一覧を最新化
sudo apt install ngrep = ngrepをインストール
【サーバー側】
sudo ngrep -d any -W byline "login" port 3000
意味:
ngrep = ネットワーク通信版のgrep 通信内容から特定の文字列を探す
-d any = すべてのネットワークインターフェースを見る
-W byline = HTTPなどを行単位で読みやすく表示する
"login" = loginという文字を含む通信だけ表示する
port 3000 = 3000番ポートの通信だけ対象にする
【クライアント側】 Juice Shopでログインを試す。
結果:
POST /rest/user/login HTTP/1.1
さらに:
{"email":"bbb","password":"bbb"}
まで確認できた。
分かること: ブラウザからJuice Shopへ実際に送信されたHTTPリクエストの中身。
フェーズ7:HTTPリクエストを読む
今回見えた:
POST /rest/user/login HTTP/1.1
これは、
「/rest/user/loginというログイン用の受付にデータを送る」
という意味。
POSTとは:
HTTP Method(HTTPメソッド)の1つ。
例えると:
GET = 「この資料をください」
POST = 「この申込書を受け取って処理してください」
ログインでは、メールアドレスやパスワードなどのデータをサーバーへ送るため、POSTがよく使われる。
/rest/user/loginとは:
Endpoint(エンドポイント) またはURL Path(URLパス)。
例えると: Webアプリ内の「ログイン受付窓口」。
JSONとは:
今回送信されたデータ:
{"email":"bbb","password":"bbb"}
JSONは、Web APIでよく使われるデータ形式。
今回の場合:
email = bbb password = bbb
という情報を送っている。
フェーズ8:HTTPとHTTPSの違いを確認する
今回Juice Shopは:
http://192.168.128.131:3000
で動いていた。
先頭が:
http://
なのでHTTP通信。
HTTPは暗号化されていないため:
{"email":"bbb","password":"bbb"}
のような認証情報までネットワーク上から読めた。
例え:
HTTP = 内容が見えるハガキ
HTTPS = 鍵付きの封筒
HTTPSではTLSという仕組みで通信が暗号化される。
そのため通常は、ngrepで通信を取得してもパスワードなどの中身をそのまま読むことはできない。
フェーズ9:どんな時に何を使うか
Juice Shopが動いているか確認したい: sudo docker ps
アプリのログを見たい: sudo docker logs juice-shop
ログをリアルタイム監視したい: sudo docker logs -f juice-shop
CPU・メモリ・通信量を見たい: sudo docker stats juice-shop
3000番ポートの通信を見たい: sudo tcpdump -i any port 3000
loginを含むHTTP通信だけ見たい: sudo ngrep -d any -W byline "login" port 3000
3000番ポートの通信内容を広く見たい: sudo ngrep -d any -W byline port 3000
フェーズ10:クライアント側とサーバー側の役割
【クライアント側】
Firefox ↓ ログイン情報を入力 ↓ HTTPリクエストを作る ↓ サーバーへ送信
【サーバー側】
Ubuntu Server ↓ 3000番ポートで受信 ↓ Docker ↓ Juice Shop ↓ ログイン処理 ↓ HTTPレスポンスをクライアントへ返す
重要: ペンテストでは、このクライアントとサーバーの間を流れるHTTP通信を見ることが非常に重要。
フェーズ11:今回の注意点
・docker logsとネットワーク通信は別物。 ・docker statsは通信内容ではなく負荷を見るもの。 ・tcpdumpは情報量が多い。 ・大量の通信は全部読むのではなく、ngrepなどで絞り込む。 ・HTTPでは認証情報が平文で見える場合がある。 ・実サービスでは原則HTTPSを使う。 ・HTTPSでは通常、TLSによって中身が暗号化される。 ・ngrepやtcpdumpでのパケットキャプチャは、自分が管理する環境や許可された環境だけで行う。
フェーズ12:ペンテスター視点
今回学んだ基本の流れ:
画面を操作する ↓ HTTPリクエストが発生 ↓ ネットワークを通る ↓ サーバーへ届く ↓ Webアプリが処理する ↓ HTTPレスポンスが返る
Webペンテストでは、ブラウザ画面だけではなく、その裏で流れているHTTP通信を見る。
今回ngrepで確認した:
POST /rest/user/login
や:
{"email":"bbb","password":"bbb"}
も、そのHTTP通信の一部。
Burp Suiteも本質的には、
「クライアントとサーバーの間のHTTP通信を観察・分析する」
ために使う。
今回のngrep実習は、その仕組みをサーバー側から直接観察したもの。
今回最低限覚えておくこと:
1. Webブラウザは裏でHTTP通信をしている。 2. ログイン情報もHTTPリクエストとしてサーバーへ送られる。 3. サーバー側では、その通信をtcpdumpやngrepで観察できる。 4. ポート番号を指定すれば、特定サービスの通信に絞れる。 5. "login"のような文字列を指定すれば、さらに必要な通信だけ探せる。 6. HTTPは暗号化されていないため、通信内容が読める場合がある。 7. HTTPSでは通常、TLSによって通信内容が暗号化される。 8. ペンテストでは「画面」ではなく「HTTP通信」を見る視点が重要。