analyzing-network-traffic-of-malware について
マルウェアの PCAP を調べ、C2 通信を追跡してネットワーク検知ルールを作成するセキュリティ分析スキルです。パケット、DNS、Web トラフィックの分析から、ファイル抽出やシグネチャ作成までを扱います。
主な機能
- 01PCAP の概要とプロトコル分析
- 02DNS と C2 通信の調査
- 03ビーコン通信パターンの検出
- 04Suricata と Snort のルール作成
- 05ファイルと通信アーティファクトの抽出
活用シーン
- 01サンドボックスで取得したマルウェア通信の調査
- 02C2 インフラと外部送信データの特定
- 03DGA と DNS トンネリングの分析
- 04観測した通信に基づくネットワーク検知の作成
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill analyzing-network-traffic-of-malwareインストール後、Claude Code で/analyzing-network-traffic-of-malwareを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEreferences/api-reference.mdscripts/agent.py詳細
マルウェアのネットワークトラフィックを分析する
使用する場面
- サンドボックスの実行で PCAP ファイルが取得され、ネットワーク動作の詳細な分析が必要な場合
- ネットワーク検知シグネチャを作成するために、C2 プロトコルの構造を特定する場合
- マルウェアがどのようなデータを、どの外部インフラストラクチャに流出させているかを判断する場合
- DNS トンネリング、ドメイン生成アルゴリズム(DGA)、またはファストフラックスの動作を分析する場合
- 観測したマルウェアのネットワークパターンに基づいて Suricata/Snort のシグネチャを作成する場合
使用しないでください:マルウェアの動作をホストベースで分析する場合。プロセスレベルのアクティビティには、Cuckoo サンドボックスのレポートまたは Volatility によるメモリ分析を使用してください。
前提条件
- 対話型の PCAP 分析用に Wireshark 4.x がインストールされていること
- スクリプトによるパケット抽出用に tshark(Wireshark CLI)があること
- PCAP からメタデータを自動生成するために Zeek がインストールされていること
- シグネチャ照合用の ET Open/ET Pro ルールセットを備えた Suricata があること
- PCAP からのファイル抽出と認証情報検出に NetworkMiner があること
- プログラムによるパケット分析用に
scapyとdpktを備えた Python 3.8+ があること
ワークフロー
ステップ 1:PCAP の概要を把握する
ネットワークトラフィックの全体像を把握します。
# Capture statistics
capinfos malware.pcap
# Protocol hierarchy
tshark -r malware.pcap -q -z io,phs
# Endpoint statistics (top talkers)
tshark -r malware.pcap -q -z endpoints,ip
# Conversation statistics
tshark -r malware.pcap -q -z conv,tcp
# DNS query summary
tshark -r malware.pcap -q -z dns,tree
ステップ 2:DNS アクティビティを分析する
DGA、トンネリング、または C2 ドメインの名前解決について、DNS クエリを調べます。
# Extract all DNS queries
tshark -r malware.pcap -T fields -e frame.time -e dns.qry.name -e dns.a \
-Y "dns.flags.response == 1" | sort
# Detect DGA patterns (high entropy domain names)
python3 << 'PYEOF'
import math
from collections import Counter
def entropy(s):
p = [n/len(s) for n in Counter(s).values()]
return -sum(pi * math.log2(pi) for pi in p if pi > 0)
# Parse DNS queries from tshark output
import subprocess
result = subprocess.run(
["tshark", "-r", "malware.pcap", "-T", "fields", "-e", "dns.qry.name",
"-Y", "dns.flags.response == 0"],
capture_output=True, text=True
)
domains = set(result.stdout.strip().split('\n'))
print("Suspicious DNS queries (high entropy):")
for domain in domains:
if domain:
subdomain = domain.split('.')[0]
ent = entropy(subdomain)
if ent > 3.5 and len(subdomain) > 10:
print(f" {domain} (entropy: {ent:.2f})")
PYEOF
# Detect DNS tunneling (large TXT responses)
tshark -r malware.pcap -T fields -e dns.qry.name -e dns.txt \
-Y "dns.resp.type == 16 and dns.resp.len > 100"
ステップ 3:HTTP/HTTPS による C2 通信を分析する
Web ベースのコマンド&コントロールトラフィックを調べます。
# Extract HTTP requests
tshark -r malware.pcap -T fields \
-e frame.time -e ip.src -e ip.dst -e http.host \
-e http.request.method -e http.request.uri -e http.user_agent \
-Y "http.request"
# Extract HTTP response bodies (potential payload downloads)
tshark -r malware.pcap -T fields \
-e http.host -e http.request.uri -e http.content_type -e tcp.len \
-Y "http.response and tcp.len > 1000"
# Extract POST data (potential exfiltration)
tshark -r malware.pcap -T fields \
-e http.host -e http.request.uri -e http.file_data \
-Y "http.request.method == POST"
# TLS analysis (SNI, JA3 fingerprints)
tshark -r malware.pcap -T fields \
-e tls.handshake.extensions_server_name \
-e tls.handshake.ja3 \
-Y "tls.handshake.type == 1"
# Extract TLS certificate details
tshark -r malware.pcap -T fields \
-e x509ce.dNSName -e x509af.serialNumber \
-e x509sat.utf8String \
-Y "tls.handshake.type == 11"
# Export HTTP objects (downloaded files)
tshark -r malware.pcap --export-objects http,exported_files/
ステップ 4:ビーコンパターンを検出する
C2 ビーコンを示す、規則的かつ周期的な通信を特定します。
# Beacon detection from PCAP
from scapy.all import rdpcap, IP, TCP
from collections import defaultdict
import statistics
packets = rdpcap("malware.pcap")
# Group connections by destination IP:port
connections = defaultdict(list)
for pkt in packets:
if IP in pkt and TCP in pkt:
if pkt[TCP].flags & 0x02: # SYN flag
dst = f"{pkt[IP].dst}:{pkt[TCP].dport}"
connections[dst].append(float(pkt.time))
# Analyze timing intervals for beaconing
print("Beacon Analysis:")
for dst, times in connections.items():
if len(times) >= 5:
intervals = [times[i+1] - times[i] for i in range(len(times)-1)]
avg = statistics.mean(intervals)
stdev = statistics.stdev(intervals) if len(intervals) > 1 else 0
jitter = (stdev / avg * 100) if avg > 0 else 0
if 10 < avg < 3600 and jitter < 30: # Regular interval with < 30% jitter
print(f" [!] {dst}: {len(times)} connections")
print(f" Interval: {avg:.1f}s ± {stdev:.1f}s (jitter: {jitter:.1f}%)")
print(f" Pattern: LIKELY BEACONING")
ステップ 5:ネットワーク検知シグネチャを生成する
観測したトラフィックパターンから Suricata/Snort のルールを作成します。
# Run Suricata against the PCAP for existing signature matches
suricata -r malware.pcap -l suricata_output/ -c /etc/suricata/suricata.yaml
# Review alerts
cat suricata_output/fast.log
# Create custom Suricata rule from observed patterns
cat << 'EOF' > custom_malware.rules
# C2 beacon detection based on observed URI pattern
alert http $HOME_NET any -> $EXTERNAL_NET any (
msg:"MALWARE MalwareX C2 Beacon";
flow:established,to_server;
http.method; content:"POST";
http.uri; content:"/gate.php?id=";
http.user_agent; content:"Mozilla/5.0 (compatible; MSIE 10.0)";
sid:9000001; rev:1;
)
# DNS query for known C2 domain
alert dns $HOME_NET any -> any any (
msg:"MALWARE MalwareX C2 DNS Query";
dns.query; content:"update.malicious.com";
sid:9000002; rev:1;
)
# JA3 hash match for malware TLS client
alert tls $HOME_NET any -> $EXTERNAL_NET any (
msg:"MALWARE MalwareX JA3 Match";
ja3.hash; content:"a0e9f5d64349fb13191bc781f81f42e1";
sid:9000003; rev:1;
)
EOF
ステップ 6:トラフィックからファイルとアーティファクトを抽出する
転送されたファイルや埋め込まれたデータを復元します。
# Extract files using Zeek
zeek -r malware.pcap /opt/zeek/share/zeek/policy/frameworks/files/extract-all-files.zeek
ls extract_files/
# Extract files using NetworkMiner (GUI)
# Or use tshark for specific protocol exports
tshark -r malware.pcap --export-objects http,http_objects/
tshark -r malware.pcap --export-objects smb,smb_objects/
tshark -r malware.pcap --export-objects tftp,tftp_objects/
# Hash all extracted files
sha256sum http_objects/* smb_objects/* 2>/dev/null
# Generate Zeek logs for comprehensive metadata
zeek -r malware.pcap
# Output: conn.log, dns.log, http.log, ssl.log, files.log, etc.
主な概念
| 用語 | 定義 |
|---|---|
| ビーコン通信 | マルウェアから C2 サーバーへの規則的かつ周期的な接続です。一貫した時間間隔とパケットサイズによって識別できます |
| JA3/JA3S | ClientHello/ServerHello のパラメーターからハッシュを生成し、マルウェアの TLS 実装を一意に識別する TLS フィンガープリンティング手法です |
| DGA(ドメイン生成アルゴリズム) | 静的なドメインブロックリストを回避しながら C2 サーバーを探すため、マルウェアがクエリする疑似ランダムなドメイン名を生成するアルゴリズムです |
| DNS トンネリング | DNS クエリと応答にデータをエンコードし、C2 チャネルを確立したり、DNS インフラストラクチャを介してデータを流出させたりする手法です |
| ファストフラックス | ドメインの IP アドレスをすばやく切り替え、停止措置を回避するとともに、多数の侵害されたホストに C2 を分散させる DNS 技術です |
| SNI(Server Name Indication) | クライアントの接続先ホスト名を示す TLS 拡張機能です。暗号化された HTTPS 接続でも確認できます |
| ネットワークシグネチャ | ネットワークトラフィックの特定のパターン(ヘッダー、ペイロード、タイミング)に一致する Suricata/Snort のルールで、悪意のある通信を検出します |
ツールとシステム
- Wireshark:プロトコルレベルでネットワークトラフィックを詳細に対話型調査できるオープンソースのパケットアナライザー
- Zeek:ライブトラフィックまたはキャプチャ済みトラフィックから、構造化されたメタデータログ(conn、dns、http、ssl)を生成するネットワーク分析フレームワーク
- Suricata:カスタム検知ロジック向けの Lua スクリプティングに対応した、シグネチャベースの検出を行う高性能なネットワーク IDS/IPS
- NetworkMiner:PCAP ファイルからファイル、画像、認証情報を抽出するネットワークフォレンジック分析ツール
- Scapy:プログラムによるパケット分析、ビーコン検出、プロトコルデコードに使用する Python のパケット操作ライブラリ
よくあるシナリオ
シナリオ:カスタムバイナリ C2 プロトコルの解析
コンテキスト:マルウェアは、TCP ポート 8443 を介してカスタムバイナリプロトコルを使用し、C2 サーバーと通信します。標準的な HTTP 解析では何も検出されません。PCAP からプロトコル構造をリバースエンジニアリングする必要があります。
アプローチ:
- PCAP を TCP ポート 8443 の通信に絞り込み、TCP ストリームを追跡します
- メッセージのフレーミング(長さプレフィックス、区切り文字、固定サイズのヘッダー)を特定します
- 複数のメッセージを比較し、固定のヘッダーフィールドと可変のデータフィールドを特定します
- (バイナリを解析済みの場合は)Ghidra によるリバースエンジニアリングの調査結果と照合します
- カスタムプロトコル用の Wireshark ディセクタまたは Scapy パーサーを作成します
- ネットワーク検出用に、固定のヘッダーバイト列に一致する Suricata ルールを作成します
- 脅威インテリジェンスの共有に向けて、プロトコルの仕様全体を文書化します
注意点:
- 最初の数個のパケットだけを分析すること。C2 プロトコルの中には、初回ハンドシェイク後に動作を変えるものがあります
- サンドボックスに MITM 機能がある場合に、TLS トラフィックを復号しないこと
- 正規の CDN やクラウドトラフィックを C2 と混同すること(宛先 IP を検証してください)
- TCP/UDP の代わりに DNS や ICMP を使用する C2 トラフィックを見落とすこと
出力形式
MALWARE NETWORK TRAFFIC ANALYSIS
===================================
PCAP File: malware_sandbox.pcap
Duration: 300 seconds
Total Packets: 12,847
Total Bytes: 4.2 MB
DNS ACTIVITY
Total Queries: 47
DGA Detected: Yes (23 high-entropy queries to .com TLD)
Tunneling: No
Resolved C2: update.malicious[.]com -> 185.220.101[.]42
C2 COMMUNICATION
Protocol: HTTPS (TLS 1.2)
Server: 185.220.101[.]42:443
SNI: update.malicious[.]com
JA3 Hash: a0e9f5d64349fb13191bc781f81f42e1
Beacon Interval: 60.2s ± 6.8s (11.3% jitter)
Total Sessions: 237
Data Sent: 147 MB
Data Received: 2.3 MB
Certificate: CN=update.malicious[.]com (self-signed, expired)
PAYLOAD DOWNLOADS
GET /payload.dll from compromised-site[.]com
Size: 98,304 bytes
SHA-256: abc123def456...
Content-Type: application/octet-stream
EXFILTRATION
Method: HTTPS POST to /gate.php
Content-Type: application/octet-stream
Average Size: 15,432 bytes per request
Total Volume: 147 MB over 4 hours
SURICATA ALERTS
[1:2028401] ET MALWARE Generic C2 Beacon Pattern
[1:2028500] ET POLICY Self-Signed Certificate
GENERATED SIGNATURES
SID 9000001: MalwareX HTTP beacon pattern
SID 9000002: MalwareX DNS C2 domain
SID 9000003: MalwareX JA3 TLS fingerprint
コメント
Markdown 対応