OWASP Juice Shopの通信・ログ・HTTPリクエストをサーバー側から観察

フェーズ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通信」を見る視点が重要。

一覧へ戻る