mcpField
D
detecting-ransomware-precursors-in-network

detecting-ransomware-precursors-in-network

github.com/mukul975セキュリティ35.2k54 回インストール8 週間前に更新
リポジトリ

detecting-ransomware-precursors-in-network について

SOCやネットワーク防御担当者向けに、ランサムウェア暗号化前の兆候となる通信を見つけるセキュリティスキルです。攻撃段階の指標、検知ルール、SIEM相関、脅威インテリジェンス、アラート対応を扱います。

主な機能

  1. 01ネットワーク指標を攻撃段階に対応付け
  2. 02SuricataとZeekの検知ルールを導入
  3. 03SIEMで前兆イベントを相関
  4. 04ランサムウェア脅威情報を取り込み
  5. 05確度に応じてアラートを振り分け

活用シーン

  1. 01Cobalt Strikeの通信や横展開を検知
  2. 02暗号化前の不審イベントを相関
  3. 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 と一緒にインストールされる参考資料やスクリプト。

LICENSE
assets/
template.md
references/
api-reference.md
standards.md
workflows.md
scripts/
agent.py
process.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パターンから検出できます
DCSyncDirectory 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台のホストに接続しました。

アプローチ:

  1. Zeekのconn.log分析により、10.1.5.42が01:55~02:05の間にポート445、135、3389経由で、社内の47個の一意なIPアドレスへの接続を開始したことが判明します
  2. Zeekのssl.logから、48バイトのペイロードを伴う外部IPアドレス185.x.x.xへのHTTPS接続が60秒ごとに発生していることがわかります(Cobalt Strikeのビーコンパターン)
  3. RITAによるビーコン分析で、外部IPアドレスのビーコンスコアが高い(0.96)ことと、60秒のジッターが確認されます
  4. Zeekのkerberos.logに、10.1.5.42から複数のSPNアカウントに対するTGS-REQが記録されています(Kerberoasting)
  5. SMBのtree_connectイベントから、12台のホスト上のADMIN$共有へのアクセスが確認されます(ラテラルムーブメントの準備)
  6. 封じ込め:ホストを隔離し、エンジニアリングユーザーの認証情報をリセットして、C2 IPアドレスをブロックするルールを適用します
  7. ランサムウェアの展開が始まる前に、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

コメント