exploiting-broken-link-hijacking について
認可済みのセキュリティ監査向けスキルです。ウェブサイトが参照する期限切れ・未取得の外部リソースを見つけ、リンク乗っ取りやサブドメイン乗っ取りのリスクを評価します。影響分析と報告も扱います。
主な機能
- 01外部参照のクロールと整理
- 02期限切れ・取得可能なリソースの確認
- 03サブドメイン乗っ取り可能性の評価
- 04影響分析とレポート作成
活用シーン
- 01ウェブサイトのサードパーティ参照の監査
- 02CDN とクラウドサービス依存関係の確認
- 03認可済みテストでのサブドメイン乗っ取り評価
- 04リンク乗っ取りの調査結果の記録
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill exploiting-broken-link-hijackingインストール後、Claude Code で/exploiting-broken-link-hijackingを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEreferences/api-reference.mdscripts/agent.py詳細
侵害されたリンクの乗っ取り
使用する場面
- 期限切れまたは未登録の外部リソースへの参照がないか、ウェブアプリケーションを監査するとき
- サードパーティ製スクリプトおよびリソース依存関係のサプライチェーンセキュリティ評価を行うとき
- 孤立した CNAME レコードを利用したサブドメイン乗っ取りの可能性をテストするとき
- バグバウンティで、侵害されたリンクの乗っ取りの脆弱性を探すとき
- 本番アプリケーションにおける外部リソース依存関係のセキュリティを評価するとき
前提条件
- すべての外部リンクを検出するウェブクローラーまたはスパイダー(Burp Suite Spider、Scrapy)
- CNAME レコードとドメインの取得可能性を確認する DNS ルックアップツール
- 期限切れドメインを取得するためのドメインレジストラへのアクセス(概念実証用)
- CDN およびクラウドサービスのプロビジョニングに関する知識(S3、Azure Blob、GitHub Pages)
- blc (broken-link-checker) または同様の自動リンク検証ツール
- サブドメイン乗っ取りに対して脆弱なサービスに関する知識(can-i-take-over-xyz)
法的通知: このスキルは、許可を得たセキュリティテストおよび教育目的に限り使用してください。所有していないシステム、またはテストの書面による許可を得ていないシステムに対する無許可の使用は違法であり、コンピューター詐欺に関する法律に違反する可能性があります。
ワークフロー
ステップ 1 — すべての外部参照をクロールして抽出する
# Use broken-link-checker to find dead links
npx broken-link-checker http://target.com --recursive --ordered \
--exclude-internal --filter-level 3 -o broken_links.txt
# Extract all external links from page source
curl -s http://target.com | grep -oP 'https?://[^"'"'"'\s>]+' | sort -u > all_links.txt
# Extract JavaScript sources
curl -s http://target.com | grep -oP 'src="[^"]*"' | grep -v target.com > external_scripts.txt
# Extract CSS references
curl -s http://target.com | grep -oP 'href="[^"]*\.css"' | grep -v target.com > external_css.txt
# Use wayback machine for historical external references
curl -s "https://web.archive.org/web/timemap/link/http://target.com" | \
grep -oP 'https?://[^>]+' | sort -u > historical_links.txt
# Spider with Burp Suite
# Configure Spider scope to include target.com
# Review Site Map > Filter by "External" to list all external references
ステップ 2 — 無効または取得可能なリソースを特定する
# Check if external domains are registered
for domain in $(cat external_domains.txt); do
whois $domain 2>/dev/null | grep -qi "no match\|not found\|available" && \
echo "[CLAIMABLE] $domain"
done
# Check HTTP status of external links
while read url; do
status=$(curl -o /dev/null -s -w "%{http_code}" "$url" --max-time 5)
if [ "$status" = "000" ] || [ "$status" = "404" ]; then
echo "[DEAD] $url (Status: $status)"
fi
done < all_links.txt
# Check for dangling CNAME records
for sub in $(cat subdomains.txt); do
cname=$(dig +short CNAME $sub)
if [ -n "$cname" ]; then
resolved=$(dig +short $cname)
if [ -z "$resolved" ]; then
echo "[DANGLING] $sub -> $cname (UNRESOLVED)"
fi
fi
done
# Check cloud resource availability
# AWS S3 bucket
aws s3 ls s3://target-assets 2>&1 | grep -q "NoSuchBucket" && echo "[CLAIMABLE] S3: target-assets"
ステップ 3 — サービス固有の乗っ取りの可能性を確認する
# Check GitHub Pages takeover
# If CNAME points to <user>.github.io and 404 is returned
curl -s https://subdomain.target.com | grep -q "There isn't a GitHub Pages site here"
# Check AWS S3 takeover
curl -s http://subdomain.target.com | grep -q "NoSuchBucket"
# Check Azure Blob Storage
curl -s http://subdomain.target.com | grep -q "The specified container does not exist"
# Check Heroku
curl -s http://subdomain.target.com | grep -q "No such app"
# Check Shopify
curl -s http://subdomain.target.com | grep -q "Sorry, this shop is currently unavailable"
# Use subjack for automated takeover detection
subjack -w subdomains.txt -c fingerprints.json -t 100 -o takeover_candidates.txt
# Use nuclei takeover templates
subfinder -d target.com -silent | nuclei -t http/takeovers/ -o takeovers.txt
ステップ 4 — 外部スクリプトの乗っ取りを検証する
# Check if external JavaScript domains are available for registration
curl -s http://target.com | grep -oP 'src="https?://([^/"]+)' | \
cut -d'/' -f3 | sort -u | while read domain; do
whois "$domain" 2>/dev/null | grep -qi "no match\|available" && \
echo "[HIJACKABLE SCRIPT] $domain loaded by target.com"
done
# Check npm/CDN package references
curl -s http://target.com | grep -oP 'unpkg\.com/[^@/]+' | sort -u
curl -s http://target.com | grep -oP 'cdn\.jsdelivr\.net/npm/[^@/]+' | sort -u
# Verify if referenced packages still exist
# Check npm registry for deprecated or removed packages
ステップ 5 — 侵害されたリンクを悪用する(許可を得たテストのみ)
# For expired domain: Register the domain
# For S3 bucket: Create bucket with same name in same region
aws s3 mb s3://target-expired-bucket --region us-east-1
# For GitHub Pages: Create repository with matching name
# Create <org>.github.io repository with proof-of-concept content
# For unclaimed social media: Claim the handle
# Document the takeover with benign proof-of-concept content
# Serve proof-of-concept content
echo "<html><body><h1>Broken Link Hijacking PoC - [Your Name]</h1></body></html>" > index.html
# Upload to claimed resource
ステップ 6 — 影響を評価して報告する
# Determine impact based on resource type:
# - External JavaScript: Full XSS on all pages loading the script
# - External CSS: UI defacement, data exfiltration via CSS injection
# - External image/resource: Phishing, tracking
# - CNAME subdomain: Cookie theft, phishing, OAuth bypass
# Check if hijacked resource serves cookies for parent domain
# Check if hijacked subdomain is in OAuth redirect whitelist
# Verify if hijacked domain receives sensitive Referer headers
主な概念
| 概念 | 説明 |
|---|---|
| 侵害されたリンクの乗っ取り | 対象のウェブサイトから参照されている外部リソースの制御権を取得すること |
| 孤立した CNAME | 未登録または廃止されたサービスを指す DNS CNAME レコード |
| サブドメイン乗っ取り | CNAME が指すサービスをプロビジョニングしてサブドメインを取得すること |
| 外部スクリプトの乗っ取り | 対象が読み込む JavaScript を配信する期限切れドメインを登録すること |
| サプライチェーン攻撃 | 外部依存関係を侵害し、悪意のあるコンテンツを挿入すること |
| デッドリンク | 404 または DNS 解決エラーを返す URL 参照 |
| リソースフィンガープリンティング | エラーメッセージやヘッダーから特定のクラウドサービスを識別すること |
ツールとシステム
| ツール | 用途 |
|---|---|
| broken-link-checker | ウェブクローリングによるリンク切れの自動検出 |
| subjack | サブドメイン乗っ取り検出ツール |
| nuclei | テンプレートベースの乗っ取り検出スキャナー |
| can-i-take-over-xyz | 乗っ取りに対して脆弱なサービスのコミュニティデータベース |
| BadDNS | ドメインおよびサブドメインの乗っ取りを検出する DNS 監査ツール |
| Wayback Machine | 過去の外部参照を見つけるための URL 履歴分析 |
よくあるシナリオ
- JavaScript サプライチェーン — 対象が読み込む JavaScript を配信する期限切れドメインを登録し、すべての訪問者に影響する悪意のあるコードを挿入する
- S3 バケットの乗っ取り — 対象が参照する削除済み AWS S3 バケットを取得し、悪意のあるコンテンツを配信する、またはアップロードされたデータを盗む
- GitHub Pages の乗っ取り — 孤立した CNAME に一致する GitHub Pages リポジトリを作成し、対象のサブドメインでフィッシングページを配信する
- ソーシャルメディアでのなりすまし — 対象のウェブサイトからリンクされている未取得のソーシャルメディアアカウント名を取得し、ブランドになりすます
- CDN パッケージの乗っ取り — CDN URL 経由で参照されている非推奨の npm パッケージを取得し、悪意のある JavaScript を挿入する
出力形式
## Broken Link Hijacking Report
- **Target**: http://target.com
- **Total External Links**: 145
- **Dead Links**: 12
- **Hijackable Resources**: 3
### Findings
| # | Resource | Type | Status | Impact |
|---|----------|------|--------|--------|
| 1 | analytics.expired-domain.com | JavaScript | Domain available | Full XSS |
| 2 | assets.target.com -> S3 bucket | Static assets | Bucket deleted | Content injection |
| 3 | blog.target.com -> GitHub Pages | Subdomain | No GitHub repo | Subdomain takeover |
### Remediation
- Remove references to decommissioned external resources
- Delete dangling CNAME records for unused subdomains
- Implement Subresource Integrity (SRI) for external scripts
- Regularly audit external dependencies for availability
- Use Content Security Policy to restrict allowed script sources
コメント
Markdown 対応