关于 analyzing-network-traffic-of-malware
面向安全分析人员的恶意软件 PCAP 分析技能,用于调查命令与控制流量并制定网络检测规则。内容涵盖数据包、DNS 和 Web 流量分析,以及文件提取和签名编写。
主要功能
- 01PCAP 概览与协议分析
- 02DNS 与 C2 流量调查
- 03信标通信模式检测
- 04编写 Suricata 和 Snort 规则
- 05文件与流量产物提取
适用场景
- 01调查沙箱捕获的恶意软件流量
- 02识别 C2 基础设施与外传数据
- 03检查 DGA 和 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 内存分析。
前提条件
- 已安装 Wireshark 4.x,用于交互式 PCAP 分析
- 使用 tshark(Wireshark 命令行工具)进行脚本化数据包提取
- 已安装 Zeek,用于从 PCAP 自动生成元数据
- 已安装 Suricata 和 ET Open/ET Pro 规则集,用于规则匹配
- 已安装 NetworkMiner,用于从 PCAP 提取文件和检测凭据
- 已安装 Python 3.8+,并配有
scapy和dpkt,用于以编程方式分析数据包
工作流
第 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 活动
检查 DNS 查询,寻找 DGA、隧道或 C2 域名解析:
# 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 | TLS 指纹识别方法,通过对 ClientHello/ServerHello 参数生成哈希值,唯一识别恶意软件的 TLS 实现 |
| DGA(域名生成算法) | 生成伪随机域名的算法,恶意软件通过查询这些域名来定位 C2 服务,从而规避静态域名拦截列表 |
| DNS 隧道 | 在 DNS 查询和响应中编码数据,以建立 C2 通道或通过 DNS 基础设施窃取数据 |
| 快速通量 | 一种 DNS 技术,通过快速轮换域名的 IP 地址来避免被查封,并将 C2 分布到许多已被入侵的主机上 |
| SNI(服务器名称指示) | 一种 TLS 扩展,用于显示客户端要连接的主机名;即使在加密的 HTTPS 连接中也可见 |
| 网络规则 | 用于匹配网络流量中特定模式(标头、负载、时间)的 Suricata/Snort 规则,以检测恶意通信 |
工具与系统
- Wireshark:开源数据包分析器,可在协议层面深入交互式检查网络流量
- Zeek:网络分析框架,可从实时流量或捕获的流量生成结构化元数据日志(conn、dns、http、ssl)
- Suricata:高性能网络 IDS/IPS,支持基于规则的检测,并可通过 Lua 脚本实现自定义检测逻辑
- NetworkMiner:网络取证分析工具,可从 PCAP 文件中提取文件、图像和凭据
- Scapy:Python 数据包操作库,可用于以编程方式分析数据包、检测信标和解码协议
常见场景
场景:解码自定义二进制 C2 协议
背景:恶意软件通过 TCP 8443 端口,使用自定义二进制协议与其 C2 服务通信。标准 HTTP 分析无法得出结果。需要根据 PCAP 对协议结构进行逆向工程。
方法:
- 筛选 PCAP 中 TCP 8443 端口的通信,并跟踪 TCP 流
- 确定消息帧格式(长度前缀、分隔符、固定大小的标头)
- 对比多条消息,识别静态标头字段与可变数据字段
- 与使用 Ghidra 得出的逆向分析结果交叉验证(如果已对二进制文件进行分析)
- 为自定义协议编写 Wireshark 解码器或 Scapy 解析器
- 创建匹配静态标头字节的 Suricata 规则,用于网络检测
- 编写完整的协议规范文档,以便共享威胁情报
注意事项:
- 只分析最初的几个数据包;有些 C2 协议会在初始握手后改变行为
- 沙箱具备 MITM 能力时,未对 TLS 流量进行解密
- 将合法的 CDN 或云流量误认为 C2 流量(请验证目标 IP)
- 遗漏使用 DNS 或 ICMP 而非 TCP/UDP 的 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