倾旋大佬:https://payloads.online/
DLL劫持
何为劫持
“在正常事物发生之前进行一个旁路操作”
DLL是什么
DLL(Dynamic Link Library)
文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型。在Windows
中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL
文件,放置于系统中。
DLL的加载过程
- 程序所在目录
- 程序加载目录(
SetCurrentDirecctory
) - 系统目录即
SYSTEM32
目录 - 16位系统目录即
SYSTEM
目录 Windows
目录PATH
环境变量中列出的目录
PS: Windows
操作系统通过DLL路径搜索目录顺序
和Know DLLs注册表项
的机制来确定应用程序所要调用的DLL
的路径之后,应用程序就将DLL
载入了自己的内存空间,执行相应的函数功能。
- Know DLLs注册表项指定的DLL是已经被操作系统加载过后的DLL,不会被应用程序搜索并加载。
- 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 Main
BOOL WINAPI DLLMain(
//指向自身句柄
_In_HINSTANCE hinstDLL,
//调用原因
_In_DWORD fdwReason,
//加载方式(隐式、显式)
_In_LPVOID IpvReserved
);
BOOL APIENTRY DLLMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOIDIpReserved)
{
printf("hModule.%p IpReserved.%p \n",hModule,IpReservesd);
switch(ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
printf("Process attach. \n");
break;
case DLL_PROCESS_DETACH:
printf("Process deatch. \n");
break;
case DLL_THREAD_ATTACH:
printf("Thread attach. \n");
break;
case DLL_THREAD_DETACH:
printf("Thread deatch. \n");
break;
}
return (TRUE)
}
实现一个DLL劫持-DLL Main
Q:如果应用程序调用的DLL没有DLLMain函数呢 ?
A:这需要实现指定导出函数,然后等待导出函数执行完毕再 oad真实DLL。
参考文章:
https://payloads.online/archivers/2018-06-09/1
https://payloads.online/archivers/2018-08-15/1
https://docs.microsoft.com/en-us/windows/win32/dlls/dllmain
实现一个DLL劫持-自动化测试
COM组件
什么是COM
COM
是Component Object Model
(组件 对象模型)的缩写。
COM
是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一-种新的软件开发技术。在COM
构架下,人们可以开发出各种各样的功能专一的组件,然后将它们按照需要组合起来,构成复杂的应用系统。
应用程序与COM注册表的关系-注册表
首先需要介绍一下注册表,注册表可以理解为一个树状结构的数据库,它具有一些特殊的数据类型用来存储一些数据满足应用程序的需要。
微软官方介绍:https://docs.microsoft.com/en-us/windows/win32/sysinfo/about-the-registry
HKEY_CLASSES_ROOT=HKEY_LOCAL_MACHINE+HKEY_CURRENT_USER
应用程序与COM注册表的关系
首先需要介绍一下CLSID(Classldentifier)
,中文翻译为:“全局唯一标识符”。
CLSID是指Windows系统对于不同的应用程序,文件类型,OLE对象,特殊文件夹以及各种系统组件分配的一个唯一表示它的ID代码,用于对其身份的标识和与其他对象进行区分。
按下Ctrl+R打开运行窗口,键入::{20D04FE0-3AEA-1069-A2D8-08002B30309D}
即可打开“我的电脑”。
::{645FF040-5081-101B-9F08-00AA002F954E}
回收站
typedef struct_GUID{
DWORD Data1;//随机数
WORD Data2;//和时间相关
WORD Data3;//和时间相关
BYTE Data4[8];//和网卡MAC相关
}GUID;
typedef GUID CLSID;//组件ID
typedef GUID IID;//接口ID
COM组件加载过程
- HKCU\Software\Classes\CLISD
- HKCU\CLSID
- HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\ShellCompatibility\Objects\
COM组件劫持原理
当进程寻找COM组件时,首先会寻找:HKCU\SoftwarelClasses\CLSID
我们直接在CLSID下新建一一个对象ID,就能够劫持某个进程或多个进程。
与DLL劫持原理相近,但是COM组件的劫持可以拓展很多东西,劫持的目标不一定是一个进程,劫持所需的文件不一定是一个DLL,它可以是一个.com文件、二进制PE文件、DLL文件,劫持的目标也可以是一个Windows API。
实现一个COM组件劫持-分析
bypassuac_comhijack
劫持事件查看器和控制台,此处打开事件查看器就会调用CLSID组件里的某个注册表项,它会把注册表项里的DLL加载到事件查看器的空间里面。msf是把shellcode写入到DLL Main函数里边,调用Main函数就会执行shell code就会反弹回会话。
UAC
简介
用户帐户控制(User Account Control,简写作UAC)是微软公司在其Windows Vista及更高版本操作系统中采用的一种控制机制。其原理是通知用户是否对应用程序使用硬
盘驱动器和系统文件授权,以达到帮助阻止恶意程序(有时也称为“恶意软件")损坏系统的效果。
触发授权条件
UAC需要授权的动作包括:
- 配置Windows Update
- 增加或删除用户账户
- 改变用户的账户类型
- 改变UAC设置
- 安装ActiveX_
- 安装或移除程序
- 安装设备驱动程序
- 设置家长控制
- 将文件移动或复制到Program Files或
- Windows目录
- 查看其他用户文件夹
ByPass UAC的几种方式
- 白名单提权机制-autoElevate
- DLL劫持
- Windows自身漏洞提权
- 远程注入
- COM接口技术
ByPass UAC的原理-自动提升(autoElevate)
具有autoElevate属性True的应用程序会在启动时自动提
升权限,而这些应用程序往往都具备微软的签名,微软
认为它是可信的。故此,在该程序启动时,将会以管理
员身份启动,假设我们通过COM技术或者DLL劫持该应
用程序,也能够获得管理员权限,但是,上述两种技术
比较苛刻: .
- 可能需要高权限才能完成
- 分析成本较高
挖掘ByPass UAC的方法-寻找自动提升权限的应用程序-Sigcheck.exe
String与Sigcheck,这两款工具目前均有微软官方提供,主要用于查看文件内相关信息。
string.exe -s *.exe|findstr /i autoelevate
sigcheck.exe -m C:\Windows\System32\cmd.exe