【 CTF上級編|第2話/全10話】SSRFでクラウド内部に侵入|メタデータエンドポイントの罠

⚡ CTF上級編|第2話/全10話

SSRFでクラウド内部に侵入|メタデータエンドポイントの罠

サーバーに「代わり&#x306BURLを取得させる」機能は、ブログのリンクプレビーやSNS&#x306EOGP表示など、さまざまなサービスで使われています。しかしこの機能、URLの検証が生いと、外部には公開されていないはずの内部ネットワークやクラウドの管理用エンドポイントに、サーバー自身を「踏み台」として到達させてしまう危険があります。第2話では、この&#x300CSSRF(サーバーサイドリクエストフォージェリ)」という脆弱性クラスを使って、クラウドの内部メタデータサービスから認証情報を盗み出します。

🌐 SSRF(サーバーサイドリクエストフォージェリ) ☁️ クラウドメタデータサービス 🔑 IAM認証情報の窃取 ⭐ 難易度:★★★★☆
01

🌐 SSRFとは何か|サーバーに「代理リクエスト」を送らせる

あなたの代わりに、サーバーがリクエストを送ってくれる

SSRF(Server-Side Request Forgery、サーバーサイドリクエストフォージェリ)は、攻撃者が指定し&#x305FURLに対して、サーバー自身がリクエストを送ってしまう脆弱性です。たとえばチャットツールでURLを貼ると自動的にタイトルや画像が表示される「リンクプレビー」機能、画像を外部URLから取り込む「画像インポート」機能、PDF生成のために外部ページを読み込も機能など、「サーバーに代わり&#x306BURLへアクセスしてもらう」機能は驚くほど多くのサービスに存在します。

通常はこの機能で取得した内容を、ユーザーがそのまま受け取れるだけです。ところがサーバーが取得先&#x306EURLを十分に検証していないと、ユーザーは「外部&#x306EWebページ」だけでなく、「サーバー自身からしか到達できない内部ネットワークのアドレス」を指定できてしまいます。サーバーは内部ネットワークの一部として扱われているため、外部のファイアウォールでは防げない、内側からのアクセスが成立してしまうのです。

SSRFの基本構造:サーバーを「踏み台」にする 攻撃者 悪&#x610FURL送信 公&#x958BWebサーバー (URL先読み機能) 代わりにオク・アス 内部ネットワーク (外部からは不可視) クラウドメタデー&#x30BF 169.254.169.254 🔒 外部のファイアウォールを迂回して、内部だけの対話を取りに行く
📌

この話の前提知識

上級編第1話で扱った「信頼境界」という考え方をそのまま使います。今回の信頼境界は「サーバーが、ユーザーから渡され&#x305FURLをどこまで信じてアクセスしてよいか」です。

  • 上級編 第1話「上級編へのレベルアップ|実務で使われる脆弱性とは」(信頼境界の考え方)

2019年に大手金融機関で発生し&#x305F1億人規模の顧客情報漏洩事件は、WAF(Web Application Firewall)の設定ミスを悪用し&#x305FSSRFが起点でした。攻撃者&#x306FSSRFを使ってクラウドの内部メタデータサービスに到達し、そこから強い権限を持つ認証情報を盗み出し、最終的に大量のデータが保存されたストレージへのアクセス権を獲得しました。本話で体験する攻撃の流れは、この事件の構造を学習用に再現したものです。

02

☁️ クラウドのメタデータサービス|なぜ狙われるのか

サーバー自身に「パスワードを聴かずに」権限を渡す仕組み

クラウド環境(AWS&#x30FBAzure&#x30FBGCPなど)では、サーバー(インスタンス)が安全に認証情報を取得できるよう、特別な「メタデータサービス」という仕組みが用意されています。AWSではこれを「インスタンスメタデータサービス(IMDS)」と呼び、169.254.169.254という特別なアドレスにアクセスすると、そのサーバーに割り当てられた一時的&#x306AIAM認証情報を、パスワードなしで取得できます。

169.254.169.254は「リンクローカルアドレス」と呼ばれる特殊な範囲&#x306EIPで、インターネットからは到達できず、そのサーバー自身からしかアクセスできません。本来は「サーバー自身しかアクセスできない」という前提に守られた、安全な仕組みです。ところがSSRFを使うと、攻撃者は「サーバー自身になりすまして」このアドレスにアクセスさせることができてしまいます。

項目IMDSv1(旧版)IMDSv2(新版)
アクセス方法GETリクエストだけで認証情報を取得可能事前&#x306BPUTリクエストでセッショントークンを取得する必要がある
SSRFへの強さ弱い(GETだけで完結す&#x308BSSRFで突破されやすい)強い(多く&#x306ESSRF&#x306FGETしか送れないため、PUTが必要な分だけ防御になる)
ホップ数制限なしデフォルトでTTL=1(プロキグし越しのリクエストを拒否しやすい)
現在の推奨非推奨AWSが強く推奨
⏱️

一時的な認証情報こそ危険

メタデータサービスが返す認証情報は、長期間有効な固定パスワードではなく、数時間で失効する一時的なものです。「すぐ失効するから安全」と思われがちですが、攻撃者はその数時間の間に必要な操作(データのダウンロード、設定の変更など)を実行できてしまうため、有効期限の短さは決定的な防御にはなりません。

03

🧩 ブロックリストの落とし泴|なぜ簡単に回避されるのか

「禁止リスト」は名前と数字の数だけ穴がある

SSRF対策としてよくあるのが、「169.254.169.254127.0.0.1localhostといった文字列が含まれていたらブロックする」というブロックリスト(denylist)方式です。一見もっともらしい対策ですが、IPアドレスには複数の「別の書き方」が存在するため、文字列の完全一致や単純な部分一致だけでは簡単に回避されてしまいます。

表現方法
10進数表記169.254.169.2542852039166&#xFF0832bit整数)
8進数表記各オクテットを0始まりの8進数で記述
16進数表記0xA9FEA9FEのように一文字列で表記
IPv6マップ表記::ffff:169.254.169.254
リダイレクト経由許可されたドメインから内部IPへの302リダイレクトを挑んだもの

本話のチャレンジでは、このうち最も基本的な「10進数表記」を使ったバイパスを体験します。サーバーのブロックリストは169.254.169.254という文字列だけをチョックしているため、同じ宛先を指す2852039166という数字をブラウザやHTTPクライアントに渡すと、ブロックリストをすり抜けて本来の宛先に到達してしまいます。

⚠️

「ブロックリストより許可リストを」

この問題の根本的な対策は、ブロックリストを増やし続けることではなく、「許可されたドメイン・許可され&#x305FIPアドレス範囲以外は、形式を問わず一律拒否する」という許可リスト(allowlist)方式に切り替えることです。実務のセキュリティ診断でも、ブロックリスト方式のSSRF対策を見つけた場合は「リストの不備」ではなく「方式そのものの脆弱性」として報告するのが一般的です。

04

🔓 実践チャレンジ:内部メタデータサービスから認証情報を盗み出せ

URLを2回変えるだけで、認証情報に到達する

架空のクラウドサービス「やさいクラウド」には、チャットのリンクプレビー機能を模した&#x300CURL先読みラボ」があります。URLを入力すると、サーバー(のふりをしたこのページ)が代わりにアクセスして、結果を表示します。ただし「内部アドレスとして有名な文字列」はブロックされます。

URLを入力して「取得」を押してください。

例:http://169.254.169.254/latest/meta-data/iam/security-credentials/ をそのまま試すとどうなるか確認してみましょう。

🧩 実践チャレンジ:2つのステージで認証情報を掃め

ステージ1をクリアすると、ステー&#x30B82が解放されます。両方クリアした時点でスコアが確定します。

📊 ステージ進捗: 0/2|挑戰回数: 0回

1ステー&#x30B81:ブロックリストを回避してROLE名を見つける

上のラボで、ブロックリストを回避してメタデータサービスの&#x306Erole一覧を取得し、ROLE-〇〇〇〇〇形式で入力してください(例:ROLE-EXAMPLE)。

第2話の攻撃チェーン ステー&#x30B81:10進数IPで回避 2852039166でrole一覧取得 ステー&#x30B82&#xFF1Arole名を追加 …/security-credentials/role名 認証情報取得 SecretAccessKey=CTF符号 ブロックリストの盲点+IMDSv2未導入=完全な侵入経路
05

🛡️ 防御側の視点|SSRFをどう防ぐか

一つの対策ではなく、層を重ねる

SSRFは「サーバーにリクエストを代行させる機能」自体をなくすことが難しいため、複数の対策を重ねる多層防御が基本です。

  • 許可リスト方式:到達可能な宛先を明示的に絞る
  • メタデータサービス側の対策:IMDSv2の強制(AWSではアカウント単位で設定可能)
  • ネットワーク分離:サーバーから内部管理用ネットワークへの経路自体を制限する
  • リダイレクトの検証:最初&#x306EURLだけでなく、リダイレクト先も毎回検証する

入力検証は「最初&#x306E1回」では終わらない

SSRF対策の難しさは、URLの検証を1回行えば終わりではない点にあります。DNS名は後から内部IPに変更できますし(DNSリバインディング)、リダイレクトは検証後に発生します。サーバー側で「最終的にどこへ接続したか」をネットワークレイヤーで都度確認する設計が、最も確実な対策とされています。

06

📝 まとめ+FAQ+次回予告

クラウドの堡を打ち抜いた

第2話では、SSRFという新しい脆弱性クラスを使って、ブロックリストの回避からクラウドメタデータサービスからの認証情報窃取まで一気に体験しました。次回はSSTI(テンプレートインジェクション)という、コード実行にもつながる脆弱性クラスを扱います。

✅ 今回のまとめチェック

・SSRFはサーバーに代わり&#x306BURLへのアクセスを送らせてしまう脆弱性
・クラウドのメタデータサービス(169.254.169.254)はIAM認証情報を返す重要な権限源
・文字列一致だけのブロックリストは10進数表記などの別表記で簡単に回避される
・防御は許可リスト方式+IMDSv2+ネットワーク分離の多層防御が基本

Q. 実際のWebサービスで、リンクプレビー機能だけで本当にSSRFが成立するのですか?

はい。SlackやDiscordのようなチャットツールの「URLを貼ると自動でカードが表示される」機能(リンクアンファール)は、過去に実際&#x306BSSRFの報告対象となった機能の典型例です。バグバウンティプログラムでもSSRFは上位の報酬対象として頻出します。

Q. クラウドを使っていない自前サーバーでもSSRFの被害はありますか?

あります。内部管理用ダッシュボードや社内API(認証不要で信頼されていることが多い)にサーバーから到達し、情報を取得したり設定を変更したりできる可能性があります。クラウド固有の問題ではなく、「サーバーからしか到達できない重要な仕組み」が存在する限り、どんな環境でもSSRFのリスクは残ります。

Q. IMDSv2を使っていればSSRFは完全に防げますか?

大幅に難しくなりますが、完全には防ぐわけではありません。攻撃者&#x304CPUTリクエストを任意のヘッダーとともに送れ&#x308BSSRF(一部のHTTPリバース型など)を見つけられれば、IMDSv2でも突破される例が実際に報告されています。許可リスト方式との併用が推奨される理由です。

Q. スコアやURL検索の履歴はどこかに送信されますか?

送信されません。全英文字列(入力し&#x305FURL)も含めて、すべてブラウザ&#x306ElocalStorage(あなたの端末内)だけに保存され、外部のサーバーには一切送信されません。

次回.第3話

SSTIでテンプレートエンジンを乗っ取る|{{7*7}}から始ま&#x308BRCE

テンプレートエンジンの入力評価の仕組みと、コード実行に発展する経路を体験します。

📚 参考情報

  • &#x300CCTF上級編」第1話(信頼境界の考え方)
  • OWASP Top 10(A10:2021 Server-Side Request Forgery)

コメント