应通过auditd在bind()系统调用执行瞬间捕获未使用端口被恶意激活行为,配置arch=b64/b32的bind/listen审计规则,启用enriched日志格式获取cmdline等上下文,并结合端口解码、非常规路径识别及定时巡检与siem联动实现精准监控。

要监控未使用端口被恶意激活的行为,关键不是“等端口被占用后再查”,而是**在绑定(bind)动作发生的瞬间捕获它**——因为任何服务对外提供 TCP/UDP 服务,都必须先调用 bind() 系统调用指定 IP 和端口。auditd 正是在这个内核层拦截,不依赖进程名、不依赖 netstat 输出,防绕过能力强。
配置 bind 和 listen 系统调用审计规则
恶意程序(如代理、反向隧道、后门监听器)启动时一定会执行 bind。需为这两个调用添加 exit 时机的审计规则,确保参数已确定:
- 编辑 /etc/audit/rules.d/10-network.rules,加入以下两行(x86_64 架构):
-a always,exit -F arch=b64 -S bind -k net_bind-a always,exit -F arch=b64 -S listen -k net_listen - 若系统存在 32 位兼容进程(如某些旧木马或容器内二进制),额外补充:
-a always,exit -F arch=b32 -S bind,listen -k net_bind32 - 保存后执行 sudo augenrules --load 或 sudo systemctl restart auditd 加载规则
确保日志含完整上下文,便于识别“谁在绑什么”
默认 auditd 日志字段有限,必须启用 ENRICHED 格式才能拿到真实意图:
- 检查 /etc/audit/auditd.conf 中是否设置:
log_format = ENRICHED(不能是 RAW 或 NO) - 该设置让每条日志自动包含:uid(执行者)、pid、comm(进程名)、exe(可执行路径)、cmdline(完整命令行)
- 特别注意 cmdline:能直接看到
--port 8080、-L :1080、./frpc -t ...这类可疑参数
识别“未使用端口被激活”的典型线索
auditd 不直接显示 “端口 8080”,但会在日志中以十六进制记录 addr= 字段。需结合解码与业务常识判断是否异常:
- 用 sudo ausearch -m bind -i -ts recent 查最近 bind 事件,重点关注:
addr=(解码后看 IP 是否为0.0.0.0或非127.0.0.1)、comm=(是否为python、node、sh等通用解释器)、exe=(是否来自/tmp、/dev/shm、/var/tmp等非常规路径) - 端口解码示例:
addr=02000400000000000000000000000000
前 4 字节0200表示 AF_INET,0400是小端序端口 → 十进制 1024;后面00000000对应0.0.0.0 - 重点怀疑场景:
绑定到0.0.0.0:1080(SOCKS5)、0.0.0.0:6379(Redis 伪装)、0.0.0.0:3128(Squid 代理)且 exe 不在/usr/bin或/opt合法目录下
交叉验证与定时巡检机制
单靠 auditd 日志易漏掉静默驻留进程,建议配合轻量级运行时检查形成闭环:
- 定时执行:
sudo ss -tlnp 2>/dev/null | grep -E ":(1080|8080|6379|3128)"
比对结果是否出现在 auditd 的 bind 日志中;若无对应记录,说明可能绕过 auditd(极少见)或规则未生效 - 写一个简单巡检脚本,每天凌晨提取过去 24 小时所有 bind 到非常规端口(如 1024–65535 中非白名单)的事件,并邮件告警:
ausearch -m bind -ts yesterday -i | awk '/addr=/ {ip=$NF; gsub(/[^0-9a-f]/,"",ip); if (length(ip)>=8) {port=strtonum("0x" substr(ip,5,4)); if (port>=1024 && port!=80 && port!=443 && port!=8080) print $0}}' | mail -s "Suspicious bind detected" admin@company.com - 把
net_bind关键词接入 SIEM(如 Wazuh/Elastic),设置规则:同一 uid 在 5 分钟内 bind 多个不同高危端口 → 触发高风险告警











