Moke|墨客

 找回密码
 立即注册
搜索
查看: 10573|回复: 0

给初学者的DLL?Side?Loading的UAC绕过

[复制链接]

3636

主题

0

回帖

3681

积分

超级版主

Rank: 8Rank: 8

积分
3681
发表于 2016-5-9 13:55:21 | 显示全部楼层 |阅读模式



    0x00 UAC是什么?
  在Windows从Vista版本之后加了多个安全性防护如随机化模组地址(ALSR)、资料防执行(DEP)、使者帐控制(UAC) … 等,ALSR与DEP为exploit上的shellcode插利带来的相当程度的困难度(当然站在现在技术言绕过并难事)不过今天要谈的并非这两者防护,是要谈使用者帐控制(UAC)。(后续再次提及使用者帐控制此防护都以缩写UAC代称)
  为什么微软要费周章再设计个UAC防护?在WinNT时代来临的第个版本也是由史以来活最久的系统— Windows XP,在开始设计上只要当下程式运的权限是在使者为管理员的时候,那么想为所欲为都是可被接受的,例如常见攻击行为注册表写、删除档案、增加帐号、下载档案、安装驱动… 等。经历了各式马后手法的洗礼后,微软深知马与后门攻击对象不再聪明的使用者上,多半聪明的电脑使者不会轻易开启来路不明的程式,通常受到攻击的人都为一般电脑使用者,多半对使用者权限没有什么观念,故导致Windows XP时代很容易中个木马就整台电脑被骇客Own走了!
  于是在下个版本Windows — Vista,微软增加了个策略性的UAC防护,这种防护根据维基百科上可以查询得到管辖的范畴如下:
  UAC需要授权的动作包括:
配置Windows Update
增加或删除户帐户
改变户的帐户类型
改变UAC设定
安装ActiveX
安装或移除程式
安装置驱动程式
设定家监护
将档案移动或复制到Program Files或Windows目录
检视其他户资料夹
  基本上,只要有涉及到存取系统磁碟的根目录(例如C:\),存取Windows目录,Windows系统目录,Program Files目录,存取Windows安全资讯以及读写系统登录资料库(Registry)的程式存取动作,都会需要通过UAC的认证。
  结果新增了UAC后的Vista做什么事情都会弹出视窗导致使者体验观感很差骂声连连,于是在WIndows7时候新增了四种UAC模式:
第级(最等级):相当于Windows Vista中的UAC,即对所有改变系统设定的为进行提醒
第级(预设):只有当程式试图改变系统设定时才会弹出UAC提示,使者改变系统设定时不会弹出提示
第三级:与第二级基本相同,但不使安全桌面
第四级:从不提(相当于关闭UAC)
  不过因为部分使者其实并不知道UAC存在的重要性(知道是什么的大多数也就觉得它很烦所以决定直接关闭)所以本文章接下来的讨论都是基于使用者设定为「预设」情况下来分析、探讨,并给出个绕过的思路。
  那么这边简单的说明下如果我们在写支程序在遇到Windows Vista以后的版本大致上什么时候会遇到UAC、以及令人觉得棘手的部分:
当程序需要写档案到C槽、Windows或是System32底下可以吗?答案是否定的,因为资料权限有区分的关系,假如写之目标资料夹权限没有给予写入、修改权限(可在终端机下icacls命令查询),例如C槽、Windows、System、System32、Program Files …等目录,会有影响到系统或者其他程式的运作的可能性,就会弹出UAC视窗提醒是否要执此行为。
运外部程式可以吗?这倒是不一定,要看你准备要运行的程式是否有签章,如果今天你执的程式具有签章并且为微软或者微软授权认可之签章,那么将可直接通过UAC检查,不必跳出视窗提醒(这很重要,后续会利到);若没有签章或者私签章不受微软授权呢?那么UAC会提醒你这支程式可能会造成危害,弹出视窗提醒使用者。
0x01 UAC实际运作状况
  今天我们写了一支后门需要执行任何API或者指令时,如果是敏感的API例如写档案、开启注册表、 创建进程… 等,那么中途就会呼叫到个称为RtlQueryElevationFlags的API。(可参考外提供的微软不公开的API资料http://undoc.airesoft.co.uk/ntdll.dll/RtlQueryElevationFlags.php)
  这个API检测完当前权限之后会决定当前程式正在呼叫的命令是否符合当前进程拥有的权限,如果符合就不弹窗 没有则弹出使用者必须允许的视窗,这个视窗的检查只用于决定是否可以弹窗对于实际当前进程的权限是没有相关的,所以Inline Hook这个API其实对于获得权限没有任何用途。
  不过有趣的是,如果准备CreateProcess个进程具有签章但微软授权,那么就算使者在跳出UAC视窗时选择否(拒绝CreateProcess该具不知名签章的进程) 但是因为有签章关系,所以进程依然会创建!,于是就有外提出了是否可以直接透过修改自身进程内存来防止跳窗(反正依然可以创建进程成功)如果想看那篇防弹UAC窗的技术章可参见:
http://www.rohitab.com/discuss/topic/38607-disable-uac-elevation-dialog-by-patching-rtlqueryelevationflags-in-windows-explorer/
  那么UAC视窗究竟是什么?

  如果在Windows7把UAC权限设置为第三种模式(提醒但没有安全桌面)那么在弹出UAC视窗的同时可以透过作管理员选择到该视窗然后观看它的处理序资讯:

  你将会发现其实UAC视窗产者并非当前进程而是由system32底下个称为consent.exe(意味着授权)的进程创建的视窗,透过具如PCHunter可以查看到当前consent.exe的进程为svchost.exe并且创建UAC进程的svchost.exe为系统层级。到这边大致可以推敲一下今天如果我们进程做了一个敏感命令,那么大致上会是:
进程执行敏感命令
-> 透过未公开API发消息给系统
-> svchost(系统层级)创建consent.exe弹出提醒
-> 把结果告知回系统  
  利用IFileOperation COM白名单explorer.exe(件管理器)系统对于explorer.exe做写Windows、System、System32 … 等隐密资料夹、系统资料夹是完全信任的,我们可以透过这个漏洞,先透过DLL Injection式(用CreateRemoteThread、APC线程狭持注入、输法注入… 等都可)将身DLL注进explorer.exe,然后透过IFileOperation COM将身写入进系统资料夹内,然后透过DLL Side Loading的方式做组合技Combo达成DLL挂起拿下系统权限,本文最后以此案写了VC专案实测可穿透UAC,於目前各路牛们整理出来系统内可被DLL Side Loading的程式如下表所列:
C:\Windows\System32\sysprep\sysprep.exe 、Cryptbase.dll(Win7),shcore.dll(Win8)、ActionQueue.dll(Win7)
C:\Windows\System32\oobe\setupsqm.exe、wdscore.dll(Win7,Win8,Win10)
C:\Windows\System32\cliconfg.exe、ntwdblib.dll(Win7,Win8,Win10)
C:\Windows\System32\sysprep\winsat.exe、ntwdblib.dll(Win7)、devobj.dll(Win8.Win10)
C:\Windows\System32\mmc.exe参数:eventvwr,ntwdblib.dll(Win7)、elsext.dll(Win8,Win10)
0x03 IFileOperation名单穿透UAC
  在WIndows XP时代做件移动,explorer.exe是透过CopyFile API实作,但到了Vista后多了UAC会检测文件移动权限,而explorer.exe本身也改用了IFileOperation COM来实作,于CopyFile API依旧存在,而这个API变成了IFileOperation COM的封装版本并且公开给使用者层级的应用程式使用。
  於UAC检测就埋在IFileOperation COM内部的实作,有趣的是explorer.exe本身为IFileOperation COM的名单进程,至于这点怎么发现的呢?

  今天当使者想放置个档案入 C:\Windows\ 系统资料夹内依旧会发现UAC提醒这个行为会需要系统权限,但是用工作管理员查看会得知:这个UAC提醒视窗居然是explorer.exe本弹出的视窗!意味著explorer.exe本身调用IFileOperation COM来移动档案入系统权限的资料夹是不受管制的,弹跳提醒视窗是explorer.exe本身提醒的!因此我们可以得知只要想办法将己的dll注入explorer.exe进程,那么就可以拥有任意写入的系统权限了,关键代码撰写如下:

  透过建进程名单快照并且遍历进程找到Explorer.exe再做 OpenProcess 取得跨进程写入读取权限的握柄(Handle),接着我们需要做的就是把我们的dll(我撰写此专案时命名为Client.dll)注入进explorer.exe,另外 本次绕过UAC法上是透过系统内置的SQL本地端解析工具— cliconfg.exe 含有DLL Side Loading来做穿透(相对应的ntwdblib.dll可稳定的Side Loading Win7~Win10)等待DLL注入explorer.exe后,dll须在explorer.exe进程内将己dll复制份到C:\Windows\system32内的ntwdblib.dll(原本应该会呼叫system下的ntwdblib.dll),完成后,此时我们再呼叫次cliconfg.exe,这时候本来应该载入system下的ntwdblib.dll但因我们在同层目录下放同名的ntwdblib.dll(行撰写的dll)会被Loadlibrary优先载,我们的dll便可拥有System32下的权限了。
  关键代码如下:

  再来就是处理的是DLL内先确认是否被载入在explorer.exe进程内,若是则开始做SideLoading的前置作业,若是成功被cliconfg.exe载则提示过了UAC!

  注入完成后先检测当前进程路径如果是explorer.exe代表我们需要做复制dll到可被DLLSide Loading的位置(本文额外包成了DllHijacking函数)如果检测到当前进程已经存活在cliconfg.exe内,代表已经成功取得系统权限,就跳出成功的提醒视窗。
  至于DllHijacking函数内部的实现如下:

  最后编译后分别有一个exe执档与个Client.dll文件,执结果如下:
  执行ClientUAC.exe后,弹出了取得UAC权限的视窗提醒,透过作管理员查看该视窗的进程为cliconfg.exe程序,并且执过程没有任何UAC认证请求弹窗。

<img alt="SosoImg"/>

戾气2015-12-11 09:00:43  
  第一二段有乱码; 段落首行没有空两格; 入乡随俗,请转成简体。

Deep.2015-12-10 19:30:01  
  繁体看起怪怪的

hehehe2015-12-10 13:07:09  
  谢谢 ,学习了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

 

 

快速回复 返回顶部 返回列表