UAC工作原理
UAC是微软Microsoft Windows vista
以后版本引入的一种安全机制。其原理是通知用户是否对应用程序使用硬盘驱动器和系统文件授权,以达到帮助阻止恶意程序(有时也称为”恶意软件”)损坏系统的效果。
通过UAC,应用程序和任务可始终在非管理员账户的安全上下文中运行,除非管理员特别授予管理员级别的系统访问权限。UAC可以阻止未经授权的应用程序自动进行安装,并阻止无意中更改系统设置。
在开启了UAC后,如果用户是标准用户,windows会给用户分配一个标准Access Token
,如果用户以管理员权限登录,会生成两份访问令牌,一份是完整的管理员访问令牌(Full Access Token),一份是标准用户令牌。当我们需要其他特权的时候,会弹出窗口,询问你是否要允许以下程序对此计算机更改?如果你有完整的访问令牌(即,你以管理员的身份登录,或者你属于管理员组),则可以选择是,然后继续进行。但是,如果已为了分配了标准的用户访问令牌,则会提示你输入具有特权的管理员的凭据。
UAC需要授权的过程有以下:
- 配置windows update
- 增加或者删除用户账户
- 改变用户的账户类型
- 改变UAC设置
- 安装ActiveX
- 安装或移除程序
- 设置家长控制
- 将文件移动或者复制到Program Files或windows目录
- 查看其他用户文件夹
rundll32.exe
rundll32.exe是windows系统中的一个程序,顾名思义,就是用来执行32位的DLL文件(DLL内部的具体函数)。
系统各种还有一个Rundll.exe文件,他的意思是“执行16位的DLL文件”
rundll32.exe的具体作用是以命令行的方式调用动态链接程序库中的规定形式的导出函数。导出函数必须是如下形式:
1 | void` `CALLBACK BypassUAC(``HWND` `hWnd, ``HINSTANCE` `hInstance, ``LPSTR` |
rundll32.exe在命令行下的使用方法为
1 | Rundll32.exe DLLname,Functionname [Arguments] |
DLLname
位需要执行的DLL文件名
Functionname
为需要执行的DLL文件的规定形式导出函数
[Arguments]
为引出函数的具体参数
UACME项目
1 | https://github.com/hfiref0x/UACME |
利用方式主要可以分为两大类:
- 各类UAC白名单程序的DLL劫持(DLL hijack)
- 各类提升权限的COM接口利用(Elevated COM interface)
项目的主程序为Akagi,其中主要包含了所有的method,进行了本地编译后可以使用akagi32_41
,或者akagi64_41
启动程序。运行后可以直接得到管理员权限的cmd窗口。
DLL劫持
何为劫持
在正常事物发生之前进行一个旁路操作
DLL是什么
DLL(Dynamic Link Library)文件为动态链接库文件,又称”应用程序拓展”,是软件文件类型。在windows
中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。
DLL的加载过程
- 程序所在目录
- 程序加载目录(SetCurrentDirecctory)
- 系统目录即SYSTEM32目录
- 16位系统目录即SYSTEM目录
- windows目录
- PATH环境变量中列出的目录
应用程序-DLL文件-DLL寻找顺序(找到对应DLL文件前放置一个恶意DLL文件(恶意文件+本身DLL文件内容))-加载DLL文件-运行
PS:WIndows
操作系统通过DLL路径搜索目标顺序和Know DLLS注册表项
的机制来确定应用程序所要调用的DLL的路径之后,应用程序就将DLL载入了自己的内存空间,执行相应的函数功能。
Know DLLS
注册表项指定的DLL是已经被操作系统加载过后的DLL,不会被应用程序搜索并加载。
1 | HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs |
查找进程工具
Process Monitor是Windows的⾼级监视⼯具,可显示实时⽂件系统,注册表和进程/线程活动。它结合了两个传统 Sysinternals实⽤程序Filemon和Regmon的功能,并添加了⼤量增强功能,包括丰富和⾮破坏性过滤,全⾯的事件 属性,如会话ID和⽤户名,可靠的流程信息,带有集成符号⽀持的完整线程堆栈对于每个操作,同时记录到⽂件等 等。其独特的强⼤功能将使Process Monitor成为系统故障排除和恶意软件搜索⼯具包的核⼼实⽤程序
DLL劫持原理
DLL寻找目录
- 程序所在目录
- 程序加载目录(SetCurrentDirecctory)
- 系统目录即SYSTEM32目录
- 16位系统目录即SYSTEM目录
- windows目录
- PATH环境变量中列出的目录
如果在应用程序寻找成功之前,将我们自己创造的DLL文件放入寻找的目录中,那么应用程序就会加载我们自己的DLL(恶意DLL+本身DLL)
COM组件
什么是COM
COM是Component Object Model
(组件,对象模型)的缩写。COM是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术。在COM
构架下,人们可以开发出各种各样的功能专一的组件,然后将它们按照需要组合起来,构成复杂的应用系统。
应用程序与COM注册表的关系
首先需要介绍一下注册表,注册表可以理解为一个树状结构的数据库,它具有一些特殊的数据类型用来存储一些数据满足应用程序的需要。
1 | HKEY_CLASSES_ROOT=HKEY_LOCAL_MACHINE+HKEY_CURRENT_USER |
这儿还需要介绍一下CLSID(ClassIdentifier),中文翻译为”全局唯一标识符”。CLSID是指Windows系统对于不同的应用程序,文件类型,OLE对象,特殊文件夹以及各种系统组件分配的一个唯一表示它的ID代码,用于对其身份的标识和与其他对象进行区分。
这里有一个很装逼的打开我的电脑的方式,win+R键入::{20D04FE0-3AEA-1069-A2D8-08002B30309D}
即可打开”我的电脑”。
COM组件加载过程
HKCU\Software\Classes\CLSID
HKCU\CLSID
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ShellCompatibility\Objects
ByPass UAC的几种方式
- 白名单提权机制-autoElevate
- DLL劫持
- Windows自身漏洞提权
- 远程注入
- COM接口技术