detecting-ransomware-precursors-in-network について
SOCやネットワーク防御担当者向けに、ランサムウェア暗号化前の兆候となる通信を見つけるセキュリティスキルです。攻撃段階の指標、検知ルール、SIEM相関、脅威インテリジェンス、アラート対応を扱います。
主な機能
- 01ネットワーク指標を攻撃段階に対応付け
- 02SuricataとZeekの検知ルールを導入
- 03SIEMで前兆イベントを相関
- 04ランサムウェア脅威情報を取り込み
- 05確度に応じてアラートを振り分け
活用シーン
- 01Cobalt Strikeの通信や横展開を検知
- 02暗号化前の不審イベントを相関
- 03ランサムウェア侵入の足掛かりを調査
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill detecting-ransomware-precursors-in-networkインストール後、Claude Code で/detecting-ransomware-precursors-in-networkを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEassets/template.mdreferences/api-reference.mdstandards.mdworkflows.mdscripts/agent.pyprocess.py詳細
ネットワークトラフィックにおけるランサムウェアの前兆の検出
使用する場面
- ランサムウェア実行前のネットワーク活動に対する検出ルールを作成する場合(Cobalt Strike の展開から暗号化までの平均時間は 17 分です)
- ランサムウェアの展開に先行する初期アクセスブローカー(IAB)の兆候を監視する場合
- 複数の前兆イベントを連鎖させて信頼度の高いアラートを生成する、SIEM の相関ルールを作成する場合
- ランサムウェアの準備活動と通常の管理者作業を区別できるよう、ネットワーク検出システムを調整する場合
- ランサムウェア攻撃者が足場を確立したことを示す可能性のある、不審なネットワークパターンを調査する場合
使用しないでください。暗号化後の対応には使用しないでください(recovering-from-ransomware-attack を参照)。このスキルは、封じ込めによってデータ損失を防げる、暗号化前の検出期間に重点を置いています。
前提条件
- ネットワーク TAP または SPAN ポートに導入されたネットワーク検出プラットフォーム(Zeek/Bro、Suricata、または Arkime/Moloch)
- ネットワークログを取り込む SIEM プラットフォーム(Splunk、Elastic Security、Microsoft Sentinel、または QRadar)
- ランサムウェアの IOC を対象とする脅威インテリジェンスフィード(CISA、abuse.ch、OTX、MISP)
- コアルーターおよびファイアウォールからのネットワークフローデータ(NetFlow/IPFIX)
- 内部リゾルバーからの DNS クエリログ
- インシデント調査用のフルパケットキャプチャ機能
ワークフロー
ステップ 1:ネットワークトラフィックにおけるランサムウェアのキルチェーンフェーズを特定する
暗号化前の各フェーズに、ネットワーク上で観測可能な指標を対応付けます。
| キルチェーンフェーズ | ネットワーク指標 | 検出ソース |
|---|---|---|
| 初期アクセス | RDP ブルートフォース、VPN 認証情報の総当たり、フィッシングのコールバック | ファイアウォールログ、IDS、プロキシログ |
| C2 の確立 | Cobalt Strike ビーコン(HTTPS/DNS)、Sliver/Brute Ratel のコールバック | Zeek の SSL/HTTP ログ、DNS ログ |
| 認証情報の窃取 | NTLM リレー、Kerberoasting、DCSync トラフィック | Zeek の Kerberos/NTLM ログ、DC ログ |
| 偵察 | 内部ポートスキャン、AD 列挙(LDAP/SMB) | Zeek の conn.log、フローデータ |
| ラテラルムーブメント | PsExec/WMI/WinRM トラフィック、RDP によるピボット、SMB ファイルコピー | Zeek の SMB/DCE-RPC ログ |
| ステージング | データの集約、アーカイブの作成、クラウドへのアップロード準備 | プロキシログ、DNS ログ、DLP |
ステップ 2:ネットワーク検出ルールを導入する
一般的なランサムウェアの前兆を検出する Suricata ルール:
# Cobalt Strike default HTTPS beacon profile detection
alert tls $HOME_NET any -> $EXTERNAL_NET any (msg:"RANSOMWARE PRECURSOR - Cobalt Strike Default TLS Certificate"; tls.cert_subject; content:"Major Cobalt Strike"; sid:3000001; rev:1;)
# Cobalt Strike DNS beacon
alert dns $HOME_NET any -> any 53 (msg:"RANSOMWARE PRECURSOR - Cobalt Strike DNS Beacon Pattern"; dns.query; pcre:"/^[a-z0-9]{3}\.[a-z]{4,8}\./"; threshold:type both, track by_src, count 50, seconds 60; sid:3000002; rev:1;)
# Mimikatz network signature (DCSync - DRS GetNCChanges)
alert tcp $HOME_NET any -> $HOME_NET 135 (msg:"RANSOMWARE PRECURSOR - Possible DCSync/Mimikatz"; content:"|05 00 0b|"; offset:0; depth:3; content:"|e3 51 4d 2b 4b 47 15 d2|"; sid:3000003; rev:1;)
# Internal network scanning (many connections, few bytes)
alert tcp $HOME_NET any -> $HOME_NET any (msg:"RANSOMWARE PRECURSOR - Internal Port Scan"; flags:S; threshold:type both, track by_src, count 100, seconds 10; sid:3000004; rev:1;)
# PsExec service installation over SMB
alert tcp $HOME_NET any -> $HOME_NET 445 (msg:"RANSOMWARE PRECURSOR - PsExec Service Install"; content:"|ff|SMB"; content:"PSEXESVC"; nocase; sid:3000005; rev:1;)
# RDP brute force from internal host (lateral movement)
alert tcp $HOME_NET any -> $HOME_NET 3389 (msg:"RANSOMWARE PRECURSOR - Internal RDP Brute Force"; flow:to_server,established; threshold:type both, track by_src, count 20, seconds 60; sid:3000006; rev:1;)
# Large SMB file transfer (data staging)
alert tcp $HOME_NET any -> $HOME_NET 445 (msg:"RANSOMWARE PRECURSOR - Large SMB Transfer Possible Staging"; flow:to_server,established; dsize:>60000; threshold:type both, track by_src, count 100, seconds 300; sid:3000007; rev:1;)
振る舞い検出用の Zeek スクリプト:
# detect_ransomware_precursors.zeek
# Detect high volume of failed SMB connections (credential testing)
@load base/protocols/smb
module RansomwarePrecursor;
export {
redef enum Notice::Type += {
SMB_Brute_Force,
Suspicious_Internal_Scan,
Excessive_DNS_Queries,
SMB_Admin_Share_Access,
};
const smb_fail_threshold = 10 &redef;
const scan_threshold = 50 &redef;
const dns_query_threshold = 200 &redef;
}
global smb_fail_count: table[addr] of count &default=0 &create_expire=5min;
global conn_count: table[addr] of set[addr] &create_expire=1min;
event smb2_message(c: connection, hdr: SMB2::Header, is_orig: bool) {
if (hdr$status != 0) {
++smb_fail_count[c$id$orig_h];
if (smb_fail_count[c$id$orig_h] >= smb_fail_threshold) {
NOTICE([$note=SMB_Brute_Force,
$msg=fmt("Host %s has %d failed SMB attempts", c$id$orig_h, smb_fail_count[c$id$orig_h]),
$src=c$id$orig_h,
$identifier=cat(c$id$orig_h)]);
}
}
}
event new_connection(c: connection) {
if (c$id$orig_h in Site::local_nets && c$id$resp_h in Site::local_nets) {
if (c$id$orig_h !in conn_count)
conn_count[c$id$orig_h] = set();
add conn_count[c$id$orig_h][c$id$resp_h];
if (|conn_count[c$id$orig_h]| >= scan_threshold) {
NOTICE([$note=Suspicious_Internal_Scan,
$msg=fmt("Host %s connected to %d internal hosts in 1 min", c$id$orig_h, |conn_count[c$id$orig_h]|),
$src=c$id$orig_h,
$identifier=cat(c$id$orig_h)]);
}
}
}
ステップ 3:SIEM 相関ルールを作成する
ランサムウェアの前兆チェーンを相関させる Splunk ルール:
| tstats count FROM datamodel=Network_Traffic
WHERE earliest=-24h All_Traffic.dest_port IN (445, 135, 139, 3389, 5985, 5986)
AND All_Traffic.src_ip IN 10.0.0.0/8
AND All_Traffic.dest_ip IN 10.0.0.0/8
BY All_Traffic.src_ip, All_Traffic.dest_port, _time span=1h
| stats dc(All_Traffic.dest_port) as port_count,
values(All_Traffic.dest_port) as ports,
count as total_conns
BY All_Traffic.src_ip
| where port_count >= 3 AND total_conns > 50
| rename All_Traffic.src_ip as src_ip
| lookup threat_intel_ioc ip as src_ip OUTPUT threat_type
| eval risk_score = case(
port_count >= 5 AND total_conns > 200, "CRITICAL",
port_count >= 3 AND total_conns > 50, "HIGH",
1=1, "MEDIUM")
| table src_ip, ports, port_count, total_conns, risk_score, threat_type
Microsoft Sentinel KQL - ランサムウェアの前兆の相関:
let timeframe = 24h;
let RDPBruteForce = SecurityEvent
| where TimeGenerated > ago(timeframe)
| where EventID == 4625
| where LogonType == 10
| summarize FailedRDP = count() by TargetAccount, IpAddress, bin(TimeGenerated, 1h)
| where FailedRDP > 10;
let SuspiciousSMB = SecurityEvent
| where TimeGenerated > ago(timeframe)
| where EventID == 5145
| where ShareName has "ADMIN$" or ShareName has "C$" or ShareName has "IPC$"
| summarize AdminShareAccess = count() by SubjectUserName, IpAddress, bin(TimeGenerated, 1h)
| where AdminShareAccess > 5;
let ServiceInstalls = SecurityEvent
| where TimeGenerated > ago(timeframe)
| where EventID == 7045
| where ServiceName has_any ("PSEXESVC", "meterpreter", "beacon");
RDPBruteForce
| join kind=inner SuspiciousSMB on IpAddress
| project TimeGenerated, IpAddress, TargetAccount, FailedRDP, SubjectUserName, AdminShareAccess
| extend AlertTitle = "Ransomware Precursor: RDP Brute Force + Admin Share Access"
ステップ 4:脅威インテリジェンスを統合する
既知のランサムウェアインフラストラクチャ向けに、IOC フィードを自動的に設定します。
# Download and update ransomware C2 blocklists
# abuse.ch Feodo Tracker (Cobalt Strike, TrickBot, BazarLoader C2s)
curl -s https://feodotracker.abuse.ch/downloads/ipblocklist.csv | \
grep -v "^#" | cut -d, -f2 > /opt/threat-intel/feodo_ips.txt
# abuse.ch URLhaus (malware distribution URLs)
curl -s https://urlhaus.abuse.ch/downloads/csv_recent/ | \
grep -v "^#" | cut -d, -f3 > /opt/threat-intel/urlhaus_urls.txt
# abuse.ch ThreatFox (ransomware IOCs)
curl -s https://threatfox.abuse.ch/export/csv/recent/ | \
grep -i "ransomware" | cut -d, -f3 > /opt/threat-intel/ransomware_iocs.txt
# CISA Known Exploited Vulnerabilities (initial access vectors)
curl -s https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json | \
python3 -c "import json,sys; data=json.load(sys.stdin); [print(v['cveID'],v['vendorProject'],v['product']) for v in data['vulnerabilities'] if 'ransomware' in v.get('knownRansomwareCampaignUse','').lower()]"
ステップ 5:アラートのトリアージとエスカレーションを確立する
前兆の信頼度に基づいて、トリアージ手順を定義します。
| アラートの種類 | 信頼度 | 対応時間 | 対応 |
|---|---|---|---|
| 確認済みの Cobalt Strike ビーコン | 高 | 15 分 | 直ちにホストを隔離し、IR を開始する |
| 非 DC からの DCSync/Kerberoasting | 高 | 15 分 | アカウントを無効化し、ホストを隔離して、IR を開始する |
| 内部ポートスキャン + 管理共有へのアクセス | 中~高 | 30 分 | 送信元ホストを調査し、EDR テレメトリを確認する |
| 内部ホストからの RDP ブルートフォース | 中 | 1 時間 | 正当な管理者作業かどうかを確認し、ホストを調査する |
| 通常と異なる DNS クエリ量 | 低~中 | 4 時間 | DNS トンネリングの有無を確認し、他のアラートと関連付ける |
重要な概念
| 用語 | 定義 |
|---|---|
| ランサムウェアの前兆 | C2 通信、ラテラルムーブメント、データのステージングなど、ランサムウェアによる暗号化に先行するネットワークアクティビティ |
| 潜伏時間 | 初期侵害からランサムウェアの展開までの時間で、平均は21日ですが、17分の場合もあります |
| 初期アクセスブローカー(IAB) | ダークウェブのマーケットで、侵害したネットワークへのアクセス権をランサムウェアのオペレーターに販売する脅威アクター |
| ビーコン通信 | インプラント(Cobalt Strike、Sliver)からの定期的なC2コールバック。接続タイミングのパターンを分析して検出できます |
| Kerberoasting | オフラインでの解読を目的としてKerberosサービスチケットを要求し、認証情報を収集する手法です。通常とは異なるTGS-REQパターンから検出できます |
| DCSync | Directory Replication Serviceを使用してドメインコントローラーからパスワードハッシュを抽出する手法で、ランサムウェアの重大な前兆です |
ツールとシステム
- Zeek(旧称 Bro):SMB、Kerberos、DNS、HTTP、TLS接続の構造化ログを生成するネットワーク分析フレームワーク
- Suricata:ランサムウェアのシグネチャ検出に対応したプロトコル分析およびマルチスレッド機能を備える高性能IDS/IPS
- Arkime(旧称 Moloch):ネットワークイベントの詳細なフォレンジック調査に対応する、フルパケットキャプチャおよび検索プラットフォーム
- RITA(Real Intelligence Threat Analytics):Zeekログからビーコン通信、DNSトンネリング、長時間接続を検出するオープンソースツール
- AC-Hunter:ビーコン検出とC2特定に対応する、Active Countermeasuresのネットワーク脅威ハンティングプラットフォーム
よくあるシナリオ
シナリオ:製造ネットワークでLockBitの前兆を検出する
コンテキスト:製造会社のSOCが、エンジニアリング部門のワークステーション(10.1.5.42)から発生した異常なSMBトラフィックのアラートを受信します。ワークステーションは午前2時に、5分以内にポート445経由で社内の47台のホストに接続しました。
アプローチ:
- Zeekのconn.log分析により、10.1.5.42が01:55~02:05の間にポート445、135、3389経由で、社内の47個の一意なIPアドレスへの接続を開始したことが判明します
- Zeekのssl.logから、48バイトのペイロードを伴う外部IPアドレス185.x.x.xへのHTTPS接続が60秒ごとに発生していることがわかります(Cobalt Strikeのビーコンパターン)
- RITAによるビーコン分析で、外部IPアドレスのビーコンスコアが高い(0.96)ことと、60秒のジッターが確認されます
- Zeekのkerberos.logに、10.1.5.42から複数のSPNアカウントに対するTGS-REQが記録されています(Kerberoasting)
- SMBのtree_connectイベントから、12台のホスト上のADMIN$共有へのアクセスが確認されます(ラテラルムーブメントの準備)
- 封じ込め:ホストを隔離し、エンジニアリングユーザーの認証情報をリセットして、C2 IPアドレスをブロックするルールを適用します
- ランサムウェアの展開が始まる前に、IR全体を開始します
落とし穴:
- 発信元が許可されたスキャナーであることを確認せずに、内部のポートスキャンを脆弱性スキャナーの動作だと判断する
- 重大度の低い個別のアラート(DNSの異常+SMBアクセス+ログイン失敗)を相関させず、重大度の高い一連の活動として捉えられない
- 誤検知を避けるために検出しきい値を高く設定しすぎ、目立たない低速の偵察を見逃す
- TLSトンネル内でもCobalt Strikeを特定できる、暗号化トラフィック分析(JA3/JA4フィンガープリンティング)を無視する
出力形式
## Ransomware Precursor Detection Alert
**Alert ID**: [SIEM-generated ID]
**Detection Time**: [Timestamp]
**Source Host**: [IP / Hostname]
**Confidence**: [High / Medium / Low]
**Kill Chain Phase**: [Initial Access / C2 / Credential Harvest / Recon / Lateral Movement / Staging]
### Indicators Detected
| Indicator | Source | Detail | MITRE ATT&CK |
|-----------|--------|--------|--------------|
| [Type] | [Zeek/Suricata/SIEM] | [Description] | [T-ID] |
### Correlation Chain
1. [Timestamp] - [Event 1]
2. [Timestamp] - [Event 2]
3. [Timestamp] - [Event 3]
### Recommended Actions
- [ ] Isolate source host from network
- [ ] Check EDR telemetry for host-based indicators
- [ ] Reset credentials for affected user accounts
- [ ] Block identified C2 infrastructure
- [ ] Escalate to incident response team
コメント
Markdown 対応