$npx -y skills add killvxk/cybersecurity-skills-zh --skill analyzing-network-traffic-of-malware分析恶意软件在沙箱执行或实时事件响应期间生成的网络流量, 使用 Wireshark、Zeek 和 Suricata 识别 C2 协议、数据泄露信道、 载荷下载和横向移动模式。适用于恶意软件网络分析、C2 流量解码、 恶意软件 PCAP 分析或基于网络的恶意软件检测相关请求。
| 1 | # 分析恶意软件的网络流量 |
| 2 | |
| 3 | ## 适用场景 |
| 4 | |
| 5 | - 沙箱执行已捕获 PCAP 文件,需要详细分析网络行为 |
| 6 | - 识别 C2 协议结构,用于编写网络检测签名 |
| 7 | - 确定恶意软件泄露的数据及其目标外部基础设施 |
| 8 | - 分析 DNS 隧道、域名生成算法(DGA)或快速通量行为 |
| 9 | - 根据观察到的恶意软件网络模式创建 Suricata/Snort 签名 |
| 10 | |
| 11 | **不适用于**恶意软件行为的基于主机的分析;请使用 Cuckoo 沙箱报告或 Volatility 内存分析进行进程级活动分析。 |
| 12 | |
| 13 | ## 前置条件 |
| 14 | |
| 15 | - Wireshark 4.x,用于交互式 PCAP 分析 |
| 16 | - tshark(Wireshark CLI),用于脚本化数据包提取 |
| 17 | - Zeek,用于从 PCAP 自动生成元数据 |
| 18 | - Suricata,带 ET Open/ET Pro 规则集用于签名匹配 |
| 19 | - NetworkMiner,用于从 PCAP 中提取文件和检测凭据 |
| 20 | - Python 3.8+,安装 `scapy` 和 `dpkt` 用于程序化数据包分析 |
| 21 | |
| 22 | ## 工作流程 |
| 23 | |
| 24 | ### 步骤 1:PCAP 初步概览 |
| 25 | |
| 26 | 获取网络流量的高层次理解: |
| 27 | |
| 28 | ```bash |
| 29 | # 捕获统计 |
| 30 | capinfos malware.pcap |
| 31 | |
| 32 | # 协议层次 |
| 33 | tshark -r malware.pcap -q -z io,phs |
| 34 | |
| 35 | # 端点统计(主要通信方) |
| 36 | tshark -r malware.pcap -q -z endpoints,ip |
| 37 | |
| 38 | # 会话统计 |
| 39 | tshark -r malware.pcap -q -z conv,tcp |
| 40 | |
| 41 | # DNS 查询摘要 |
| 42 | tshark -r malware.pcap -q -z dns,tree |
| 43 | ``` |
| 44 | |
| 45 | ### 步骤 2:分析 DNS 活动 |
| 46 | |
| 47 | 检查 DNS 查询中的 DGA、隧道或 C2 域名解析: |
| 48 | |
| 49 | ```bash |
| 50 | # 提取所有 DNS 查询 |
| 51 | tshark -r malware.pcap -T fields -e frame.time -e dns.qry.name -e dns.a \ |
| 52 | -Y "dns.flags.response == 1" | sort |
| 53 | |
| 54 | # 检测 DGA 模式(高熵域名) |
| 55 | python3 << 'PYEOF' |
| 56 | import math |
| 57 | from collections import Counter |
| 58 | |
| 59 | def entropy(s): |
| 60 | p = [n/len(s) for n in Counter(s).values()] |
| 61 | return -sum(pi * math.log2(pi) for pi in p if pi > 0) |
| 62 | |
| 63 | # 从 tshark 输出解析 DNS 查询 |
| 64 | import subprocess |
| 65 | result = subprocess.run( |
| 66 | ["tshark", "-r", "malware.pcap", "-T", "fields", "-e", "dns.qry.name", |
| 67 | "-Y", "dns.flags.response == 0"], |
| 68 | capture_output=True, text=True |
| 69 | ) |
| 70 | |
| 71 | domains = set(result.stdout.strip().split('\n')) |
| 72 | print("可疑 DNS 查询(高熵):") |
| 73 | for domain in domains: |
| 74 | if domain: |
| 75 | subdomain = domain.split('.')[0] |
| 76 | ent = entropy(subdomain) |
| 77 | if ent > 3.5 and len(subdomain) > 10: |
| 78 | print(f" {domain}(熵值:{ent:.2f})") |
| 79 | PYEOF |
| 80 | |
| 81 | # 检测 DNS 隧道(大型 TXT 响应) |
| 82 | tshark -r malware.pcap -T fields -e dns.qry.name -e dns.txt \ |
| 83 | -Y "dns.resp.type == 16 and dns.resp.len > 100" |
| 84 | ``` |
| 85 | |
| 86 | ### 步骤 3:分析 HTTP/HTTPS C2 通信 |
| 87 | |
| 88 | 检查基于 Web 的命令与控制流量: |
| 89 | |
| 90 | ```bash |
| 91 | # 提取 HTTP 请求 |
| 92 | tshark -r malware.pcap -T fields \ |
| 93 | -e frame.time -e ip.src -e ip.dst -e http.host \ |
| 94 | -e http.request.method -e http.request.uri -e http.user_agent \ |
| 95 | -Y "http.request" |
| 96 | |
| 97 | # 提取 HTTP 响应体(潜在的载荷下载) |
| 98 | tshark -r malware.pcap -T fields \ |
| 99 | -e http.host -e http.request.uri -e http.content_type -e tcp.len \ |
| 100 | -Y "http.response and tcp.len > 1000" |
| 101 | |
| 102 | # 提取 POST 数据(潜在的数据泄露) |
| 103 | tshark -r malware.pcap -T fields \ |
| 104 | -e http.host -e http.request.uri -e http.file_data \ |
| 105 | -Y "http.request.method == POST" |
| 106 | |
| 107 | # TLS 分析(SNI、JA3 指纹) |
| 108 | tshark -r malware.pcap -T fields \ |
| 109 | -e tls.handshake.extensions_server_name \ |
| 110 | -e tls.handshake.ja3 \ |
| 111 | -Y "tls.handshake.type == 1" |
| 112 | |
| 113 | # 提取 TLS 证书详情 |
| 114 | tshark -r malware.pcap -T fields \ |
| 115 | -e x509ce.dNSName -e x509af.serialNumber \ |
| 116 | -e x509sat.utf8String \ |
| 117 | -Y "tls.handshake.type == 11" |
| 118 | |
| 119 | # 导出 HTTP 对象(下载的文件) |
| 120 | tshark -r malware.pcap --export-objects http,exported_files/ |
| 121 | ``` |
| 122 | |
| 123 | ### 步骤 4:检测信标模式 |
| 124 | |
| 125 | 识别表明 C2 信标的规律周期性通信: |
| 126 | |
| 127 | ```python |
| 128 | # 从 PCAP 进行信标检测 |
| 129 | from scapy.all import rdpcap, IP, TCP |
| 130 | from collections import defaultdict |
| 131 | import statistics |
| 132 | |
| 133 | packets = rdpcap("malware.pcap") |
| 134 | |
| 135 | # 按目标 IP:端口分组连接 |
| 136 | connections = defaultdict(list) |
| 137 | for pkt in packets: |
| 138 | if IP in pkt and TCP in pkt: |
| 139 | if pkt[TCP].flags & 0x02: # SYN 标志 |
| 140 | dst = f"{pkt[IP].dst}:{pkt[TCP].dport}" |
| 141 | connections[dst].append(float(pkt.time)) |
| 142 | |
| 143 | # 分析时序间隔以检测信标 |
| 144 | print("信标分析:") |
| 145 | for dst, times in connections.items(): |
| 146 | if len(times) >= 5: |
| 147 | intervals = [times[i+1] - times[i] for i in range(len(times)-1)] |
| 148 | avg = statistics.mean(intervals) |
| 149 | stdev = statistics.stdev(intervals) if len(intervals) > 1 else 0 |
| 150 | jitter = (stdev / avg * 100) if avg > 0 else 0 |
| 151 | |
| 152 | if 10 < avg < 3600 and jitter < 30: # 抖动 < 30% 的规律间隔 |
| 153 | print(f" [!] {dst}:{len(times)} 次连接") |
| 154 | print(f" 间隔:{avg:.1f}s ± {stdev:.1f}s(抖动:{jitter:.1f}%)") |
| 155 | print(f" 模式:可能是信标") |
| 156 | ``` |
| 157 | |
| 158 | ### 步骤 5:生成网络检测签名 |
| 159 | |
| 160 | 根据观察到的流量模式创建 Suricata/Snort 规则: |
| 161 | |
| 162 | ```bash |
| 163 | # 对 PCAP 运行 Suricata 以匹配现有签名 |
| 164 | suricata -r malware.pcap -l suricata_output/ -c /etc/suricata/suricata.yaml |
| 165 | |
| 166 | # 查看告警 |
| 167 | cat suricata_output/fast.log |
| 168 | |
| 169 | # 根据观察到的模式创建自定义 Suricata 规则 |
| 170 | cat << 'EOF' > custom_malware.rules |
| 171 | # 基于观察到的 URI 模式的 C2 信标检测 |
| 172 | alert http $HOME_NET any -> $EXTERNAL_NET any ( |
| 173 | msg:"MALWARE MalwareX C2 Beacon"; |
| 174 | flow:established,to_server; |
| 175 | http.method; content:"POST"; |
| 176 | http.uri; content:"/gate.php?id="; |
| 177 | http.user_agent; content:"Mozilla/5.0 (compatible; MSIE 10.0)"; |
| 178 | sid:9000001; rev:1; |
| 179 | ) |
| 180 | |
| 181 | # 已知 C2 域名的 DNS 查询 |
| 182 | alert dns $HOME_NET any -> any any ( |
| 183 | msg:"MALWARE MalwareX C2 DNS Query"; |
| 184 | dns.query; content:"update.malicious.com"; |
| 185 | sid:9000002; rev:1; |
| 186 | ) |
| 187 | |
| 188 | # 恶意软件 TLS 客户端的 JA3 哈希匹配 |
| 189 | alert tls $HOME_NET any -> $EXTERNAL_NET any ( |
| 190 | msg:"MALWARE MalwareX JA3 Match"; |
| 191 | ja3.hash; content:"a0e9f5d |