investigating-phishing-email-incident について
フィッシングの疑いがあるメールを調査するセキュリティ・インシデント対応チーム向けのスキルです。ヘッダーとペイロードの分析、キャンペーン範囲の特定、影響評価、封じ込め、報告書作成を案内します。
主な機能
- 01メールヘッダーと認証結果の確認
- 02URLと添付ファイルの分析
- 03キャンペーン対象者の検索
- 04リンクを開いたユーザーと認証情報送信の確認
- 05メールの削除と指標のブロック
- 06インシデントの時系列と報告書作成
活用シーン
- 01ユーザー報告の不審メール調査
- 02フィッシング対象者の範囲特定
- 03リンクを開いたユーザーや認証情報送信者の特定
- 04フィッシングインシデントの封じ込めと記録
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill investigating-phishing-email-incidentインストール後、Claude Code で/investigating-phishing-email-incidentを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEreferences/api-reference.mdscripts/agent.py詳細
フィッシングメールインシデントの調査
使用するタイミング
以下の場合にこのスキルを使用します:
- ユーザーがフィッシング報告ボタンまたはヘルプデスクチケットを通じて不審なメールを報告した
- メールセキュリティゲートウェイが、初期フィルターをすり抜けたメッセージにフラグを立てた
- 自動検出により、認証情報を窃取する URL または悪意のある添付ファイルが特定された
- 組織を標的とするフィッシングキャンペーンの範囲を評価する必要がある
悪意のないスパムメールやマーケティングメールには使用しないでください。フィルターの調整のため、メール管理チームに回してください。
前提条件
- メールゲートウェイのログへのアクセス(Proofpoint、Mimecast、または Microsoft Defender for Office 365)
- メールログを取り込んでいる Splunk または SIEM(O365 Message Trace、Exchange トラッキングログ)
- URL/添付ファイルのデトネーション用サンドボックスへのアクセス(Any.Run、Joe Sandbox、または Hybrid Analysis)
- メールの検索と削除操作用の Microsoft Graph API または Exchange Admin Center
- URLScan.io および VirusTotal の API キー
ワークフロー
ステップ 1:メールヘッダーの抽出と分析
報告されたメッセージからメールヘッダー全体(.eml ファイル)を取得します:
import email
from email import policy
with open("phishing_sample.eml", "rb") as f:
msg = email.message_from_binary_file(f, policy=policy.default)
# Extract key headers
print(f"From: {msg['From']}")
print(f"Return-Path: {msg['Return-Path']}")
print(f"Reply-To: {msg['Reply-To']}")
print(f"Subject: {msg['Subject']}")
print(f"Message-ID: {msg['Message-ID']}")
print(f"X-Originating-IP: {msg['X-Originating-IP']}")
# Parse Received headers (bottom-up for true origin)
for header in reversed(msg.get_all('Received', [])):
print(f"Received: {header[:120]}")
# Check authentication results
print(f"Authentication-Results: {msg['Authentication-Results']}")
print(f"DKIM-Signature: {msg.get('DKIM-Signature', 'NONE')[:80]}")
確認する主な項目:
- SPF:
Return-Pathのドメインは送信元 IP と一致していますか?spf=passまたはspf=failを確認します - DKIM:署名は有効ですか?
dkim=passは、メールが転送中に改変されていないことを示します - DMARC:
Fromドメインは SPF/DKIM ドメインと整合していますか?dmarc=failはなりすましを示します
ステップ 2:URL と添付ファイルの分析
URL の分析:
import requests
# Submit URL to URLScan.io
url_to_scan = "https://evil-login.example.com/office365"
response = requests.post(
"https://urlscan.io/api/v1/scan/",
headers={"API-Key": "YOUR_KEY", "Content-Type": "application/json"},
json={"url": url_to_scan, "visibility": "unlisted"}
)
scan_id = response.json()["uuid"]
print(f"Scan URL: https://urlscan.io/result/{scan_id}/")
# Check VirusTotal for URL reputation
import vt
client = vt.Client("YOUR_VT_API_KEY")
url_id = vt.url_id(url_to_scan)
url_obj = client.get_object(f"/urls/{url_id}")
print(f"VT Score: {url_obj.last_analysis_stats}")
client.close()
添付ファイルの分析:
import hashlib
# Calculate file hashes
with open("attachment.docx", "rb") as f:
content = f.read()
md5 = hashlib.md5(content).hexdigest()
sha256 = hashlib.sha256(content).hexdigest()
print(f"MD5: {md5}")
print(f"SHA256: {sha256}")
# Submit to MalwareBazaar for lookup
response = requests.post(
"https://mb-api.abuse.ch/api/v1/",
data={"query": "get_info", "hash": sha256}
)
print(response.json()["query_status"])
マクロ、PowerShell の実行、C2 コールバックを動的に分析するため、サンドボックス(Any.Run または Joe Sandbox)に送信します。
ステップ 3:キャンペーンの範囲の特定
Splunk で同じフィッシングメールを受信したすべての宛先を検索します:
index=email sourcetype="o365:messageTrace"
(SenderAddress="[email protected]" OR Subject="Urgent: Password Reset Required"
OR MessageId="<[email protected]>")
earliest=-7d
| stats count by RecipientAddress, DeliveryStatus, MessageTraceId
| sort - count
または、Microsoft Graph API を使用します:
import requests
headers = {"Authorization": f"Bearer {access_token}"}
params = {
"$filter": f"subject eq 'Urgent: Password Reset Required' and "
f"receivedDateTime ge 2024-03-14T00:00:00Z",
"$select": "sender,toRecipients,subject,receivedDateTime",
"$top": 100
}
response = requests.get(
"https://graph.microsoft.com/v1.0/users/[email protected]/messages",
headers=headers, params=params
)
messages = response.json()["value"]
print(f"Found {len(messages)} matching messages")
ステップ 4:影響を受けたユーザーの特定(クリックしたユーザー)
プロキシ/Web ログを確認し、フィッシング URL にアクセスしたユーザーを特定します:
index=proxy dest="evil-login.example.com" earliest=-7d
| stats count, values(action) AS actions, latest(_time) AS last_access
by src_ip, user
| lookup asset_lookup_by_cidr ip AS src_ip OUTPUT owner, category
| sort - count
| table user, src_ip, owner, actions, count, last_access
認証情報が送信されたかどうかを確認します(フィッシングドメインへの POST リクエスト):
index=proxy dest="evil-login.example.com" http_method=POST earliest=-7d
| stats count by src_ip, user, url, status
ステップ 5:封じ込め措置
すべてのメールボックスからメールを削除します:
# Microsoft 365 Compliance Search and Purge
New-ComplianceSearch -Name "Phishing_Purge_2024_0315" `
-ExchangeLocation All `
-ContentMatchQuery '(From:[email protected]) AND (Subject:"Urgent: Password Reset Required")'
Start-ComplianceSearch -Identity "Phishing_Purge_2024_0315"
# After search completes, execute purge
New-ComplianceSearchAction -SearchName "Phishing_Purge_2024_0315" -Purge -PurgeType SoftDelete
インジケーターをブロックします:
- 送信者のドメインをメールゲートウェイのブロックリストに追加します
- フィッシング URL のドメインを Web プロキシのブロックリストに追加します
- 添付ファイルのハッシュをエンドポイント検出のブロックリストに追加します
- フィッシングドメインの DNS シンクホールエントリを作成します
侵害された認証情報をリセットします:
# Force password reset for impacted users
$impactedUsers = @("[email protected]", "[email protected]")
foreach ($user in $impactedUsers) {
Set-MsolUserPassword -UserPrincipalName $user -ForceChangePassword $true
Revoke-AzureADUserAllRefreshToken -ObjectId (Get-AzureADUser -ObjectId $user).ObjectId
}
ステップ 6:記録と報告
完全なタイムライン、IOC、影響を受けたユーザー、実施した修復措置を含むインシデントレポートを作成します。
| makeresults
| eval incident_id="PHI-2024-0315",
reported_time="2024-03-15 09:12:00",
sender="attacker@evil-domain[.]com",
subject="Urgent: Password Reset Required",
url="hxxps://evil-login[.]example[.]com/office365",
recipients_count=47,
clicked_count=5,
credentials_submitted=2,
emails_purged=47,
passwords_reset=2,
domains_blocked=1,
disposition="True Positive - Credential Phishing Campaign"
| table incident_id, reported_time, sender, subject, url, recipients_count,
clicked_count, credentials_submitted, emails_purged, passwords_reset, disposition
主な概念
| 用語 | 定義 |
|---|---|
| SPF(Sender Policy Framework) | ドメインに代わって送信することを許可されたメールサーバーを指定する DNS TXT レコード |
| DKIM | DomainKeys Identified Mail — メールの内容が転送中に改変されていないことを証明する暗号署名 |
| DMARC | Domain-based Message Authentication, Reporting and Conformance — SPF と DKIM の整合性を組み合わせたポリシー |
| 認証情報の窃取 | 偽のログインページを使用して、ユーザー名とパスワードの組み合わせを収集するフィッシング手法 |
| ビジネスメール詐欺(BEC) | 侵害またはなりすましされた経営幹部のメールを利用する、金銭詐欺を目的としたソーシャルエンジニアリング攻撃 |
| Message Trace | フォレンジック分析用に、メールの経路、配信状況、フィルタリング操作を示す O365/Exchange のログ |
ツールとシステム
- Microsoft Defender for Office 365:調査用の Safe Links、Safe Attachments、Threat Explorer を備えたメールセキュリティプラットフォーム
- URLScan.io:スクリーンショット、DOM、Cookie、ネットワークリクエストを取得する無料の URL 分析サービス
- Any.Run:リアルタイムの動作分析を行いながら、悪意のあるファイルや URL を実行するインタラクティブなサンドボックス
- Proofpoint TAP:ユーザーごとのクリック済み URL と配信された脅威を表示する Targeted Attack Protection ダッシュボード
- PhishTool:ヘッダー解析と IOC 抽出を自動化する、フィッシングメール分析専用プラットフォーム
よくあるシナリオ
- 認証情報のフィッシング:偽の O365 ログインページです。プロキシで POST リクエストを確認し、入力したユーザーのパスワードを強制リセットします
- マクロ有効ドキュメント:VBA マクロを含む Word ドキュメントです。サンドボックスで PowerShell のダウンロードクレードルが確認されたら、エンドポイントで実行の有無を確認します
- QR コードフィッシング(クイッシング):メールに認証情報を盗み取るサイトへのリンクを含む QR コードが添付されています。QR コードをデコードし、URL をサンドボックスに送信します
- スレッド乗っ取り:攻撃者が侵害したメールボックスを使い、既存のスレッドに返信します。不可能な移動や新しい受信トレイルールがないか確認します
- ボイスメールフィッシング:HTML 添付ファイル付きの偽のボイスメール通知です。添付ファイルを分析してリダイレクトチェーンを確認します
出力形式
PHISHING INCIDENT REPORT — PHI-2024-0315
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Reported: 2024-03-15 09:12 UTC by jsmith (Finance)
Sender: attacker@evil-domain[.]com (SPF: FAIL, DKIM: NONE, DMARC: FAIL)
Subject: Urgent: Password Reset Required
Payload: Credential harvesting URL
IOCs:
URL: hxxps://evil-login[.]example[.]com/office365
Domain: evil-login[.]example[.]com (registered 2024-03-14, Namecheap)
IP: 185.234.xx.xx (VT: 12/90 malicious)
Scope:
Recipients: 47 users across Finance and HR departments
Clicked: 5 users visited phishing URL
Submitted: 2 users entered credentials (confirmed via POST in proxy logs)
Containment:
[DONE] 47 emails purged via Compliance Search
[DONE] Domain blocked on proxy and DNS sinkhole
[DONE] 2 user passwords reset, sessions revoked
[DONE] MFA enforced for both compromised accounts
[DONE] Inbox rules audited — no forwarding rules found
Status: RESOLVED — No evidence of lateral movement post-compromise
コメント
Markdown 対応