はじめに
ペネトレーションテストやセキュリティ学習をしていると、
次のような“違和感のある現象”に出会うことがあります。
-
nmap -p- TARGET_IPを実行しても 特定のポートが見えない - しかし SSRF 脆弱性を使うと、そのポートに アクセスできてしまう
このとき多くの人がこう思います。
「nmap が見逃している?」
「SSRF はなにか特別な裏技なのか?」
結論から言うと、どちらも正しい挙動です。
鍵は「どこから見ているか(視点)」にあります。
nmap が実際に見ているもの
nmap -p- TARGET_IP は、よく「対象マシンの全ポートを調べるコマンド」と説明されますが、
これは正確ではありません。
nmap が調べているのは:
「自分(スキャナ)から見て、到達可能なポート」
です。
つまり nmap は、
- 対象マシンに存在する すべてのサービス
- 対象マシンが内部で使っている すべてのポート
を調べているわけではありません。
ポートが「見えなくなる」典型的な理由
1. サービスが localhost にのみバインドされている
多くの管理系サービスは、次のように設定されています。
127.0.0.1:10000localhost:8080
この場合:
- 外部からは接続不可
- マシン自身からのみ接続可能
nmap は外部ホストからの通信なので、当然このポートは見えません。
2. ファイアウォール / セキュリティグループによる遮断
サービスが 0.0.0.0:PORT で待ち受けていても、
- iptables / ufw
- クラウドのセキュリティグループ
によって外部通信が遮断されていることがあります。
この場合も、nmap からは
filtered- あるいは何も表示されない
という結果になります。
SSRF が見ている世界は「まったく別」
ここで SSRF(Server-Side Request Forgery)が登場します。
SSRF とは簡単に言うと:
サーバ自身にリクエストを送らせる脆弱性
です。
つまり通信の視点がこう変わります:
| 手法 | リクエストの発信元 |
|---|---|
| nmap | あなたのマシン |
| SSRF | 対象サーバ自身 |
この違いが、結果の差を生みます。
なぜ SSRF だと見えるのか
対象サーバ自身から見た場合:
-
127.0.0.1は 自分自身 - ファイアウォールの外部制限は 関係ない
- localhost 専用サービスにも 普通に接続できる
結果として:
- nmap では見えなかったポート
- 外部からは到達できない管理画面
- 内部用 API やサービス
が、SSRF 経由では見えてしまうのです。
図で見る視点の違い(概念)
[ Attacker ]
|
| nmap(外部視点)
v
[ Firewall ] ----X----> [ 127.0.0.1:10000 ]
|
|
v
[ Web Server ]
|
| SSRF(内部視点)
v
[ 127.0.0.1:10000 ]
nmap は 外側から叩く
SSRF は 中から覗く
これが決定的な違いです。
重要な誤解:SSRF は「スキャン技術」ではない
ここで強調しておきたいのは:
SSRF は nmap の代替ではない
SSRF は「ネットワーク境界を飛び越える」脆弱性である
という点です。
SSRF が危険なのは:
- 外部に公開していない前提のサービス
- 内部にしか存在しない管理機能
にアクセスできてしまう点にあります。
セキュリティ評価における意味
この現象が確認できた場合、評価としては次のようになります。
- 単なる URL フェッチ機能 → 低〜中リスク
- 内部ネットワーク / localhost へのアクセスが可能 → 高リスク
- 内部管理サービスや認証なし API に到達可能 → 極めて高リスク
「nmap で見えないから安全」という判断は、ここで完全に崩れます。
まとめ
- nmap は 外部から見えるポート しか教えてくれない
- SSRF は サーバ自身の視点 を攻撃者に与える
- 見えないはずの内部ポートが見えるのは、異常ではなく必然
- SSRF の本質は「ネットワーク境界の破壊」にある
一言で言うなら
nmap が見ているのは「公開面」
SSRF が覗いているのは「内部構造」
この違いを理解できたとき、
SSRF は単なる脆弱性ではなく、設計上の破綻として見えるようになります。