iptables可通过-m string --hex-string和-m u32模块精准拦截木马通信:前者匹配明文载荷中未加密协议(如http/dns)的十六进制特征(如|6576616c|对应"eval"),需限定偏移范围并防绕过;后者按32位偏移匹配协议头部或固定位置二进制指纹(如tcp载荷第40字节是否为0x90),适合自定义c2或dns污染识别;部署时应组合多特征、优先input链前端插入、先log后drop,并避开tls等加密流量。

iptables 可以通过 -m string --hex-string 和 -m u32 两类模块匹配十六进制特征码,对木马通信报文实现精准拦截。关键不在于“能不能”,而在于选对模块、找准偏移、避开加密和混淆干扰。
用 --hex-string 匹配明文载荷中的木马特征
适用于 HTTP、DNS、ICMP 等未加密协议中嵌入的木马指令(如 Webshell 的 base64 编码命令、远控客户端的固定握手字段)。
-
语法核心:
iptables -A INPUT -p tcp --dport 80 -m string --hex-string "|6576616C|” --algo bm -j DROP,其中|6576616C|是 “eval” 的 ASCII 十六进制(小写、无空格) -
注意偏移范围:加
--from 40 --to 200限定在 TCP 载荷中段搜索,避免误匹配 IP/TCP 头部或响应体噪声 -
绕过常见陷阱:若木马使用大小写混合或 URL 编码(如
%65%76%61%6C),需分别写规则;也可配合--icase或额外匹配|256576616C| -
典型木马特征示例:
– Cobalt Strike beacon 的固定 User-Agent 片段:--hex-string "|436F62616C74|"("Cobalt")
– PHP Webshell 常见函数:|73797374656D|("system")、|7061737374687275|("passthru")
用 -m u32 匹配协议头部或固定位置的二进制指纹
适合识别具有稳定结构的恶意流量,比如自定义 C2 协议、畸形 ICMP 隧道、或 DNS 劫持响应中的污染 IP 标志位。
-
定位要准:u32 按 32 位(4 字节)为单位索引,偏移量从 IP 头起算。例如匹配 TCP 载荷第 5 字节(即偏移 20+20=40 字节处)是否为
0x90(NOP 指令常见于 shellcode):iptables -A INPUT -p tcp -m u32 --u32 "40 & 0xFF = 0x90" -j DROP -
组合判断更可靠:单字节易误杀,可叠加多条件,如“TCP 标志为 SYN+ACK 且载荷第 12 字节是 0x41”:
--u32 "20 & 0x3FFF0000 = 0x12000000 && 64 & 0xFF = 0x41" -
实战参考:GFW DNS 污染包常在 UDP 载荷第 8 字节开始写入伪造 IP,可用
"8 & 0xFFFFFFFF = 0x76053106"(对应 118.5.49.6)快速丢弃
规避木马绕过技巧的实用建议
攻击者会故意分片、加随机填充、改协议字段来逃逸检测。部署时需兼顾有效性与稳定性。
-
不依赖单一特征:一条规则匹配
|6576616C|,另一条匹配|617373657274|("assert"),再加一条限制 POST 请求体长度 >1KB 且含多个|3D|(等号)的组合规则 - 优先用 INPUT 链 + -I 插入前端:确保在 ACCEPT 规则之前生效,避免被放行后才检测
-
先 LOG 再 DROP:
-j LOG --log-prefix "HEX-MATCH: "记录匹配详情,确认无误后再换 DROP,防止误伤正常业务 - 避开 TLS 流量:HTTPS、DoH、QUIC 等加密流量无法用 string/u32 解析明文特征,这类端口(443/853/443)应交由应用层 WAF 或 eBPF 工具处理
验证是否生效的简单方法
别只看规则加没加上,要抓到真实匹配的包才算数。
-
用 tcpdump 抓特征包:
tcpdump -i any -XX 'tcp and (ip[40:4] == 0x6576616C)'—— 验证 hex-string 规则对应的原始字节位置 -
查内核日志确认命中:
dmesg | grep "HEX-MATCH"(前提是用了 LOG 动作) -
模拟发送测试载荷:
echo -ne "\x65\x76\x61\x6C" | nc target 80,观察连接是否被截断










