倾旋大佬:https://payloads.online/
“在正常事物发生之前进行一个旁路操作”
DLL(Dynamic Link Library)
文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型。在Windows
中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL
文件,放置于系统中。
SetCurrentDirecctory
)SYSTEM32
目录SYSTEM
目录Windows
目录PATH
环境变量中列出的目录PS: Windows
操作系统通过DLL路径搜索目录顺序
和Know DLLs注册表项
的机制来确定应用程序所要调用的DLL
的路径之后,应用程序就将DLL
载入了自己的内存空间,执行相应的函数功能。
Process Monitor
是Windows的高级监视工具,可显示实时文件系统,注册表和进程/线程活动。它结合了两个传统Sysinternals实用程序Filemon和Regmon的功能,并添加了大量增强功能,包括丰富和非破坏性过滤,全面的事件属性,如会话ID和用户名,可靠的流程信息,带有集成符号支持的完整线程堆栈对于每个操作,同时记录到文件等等。其独特的强大功能将使Process Monitor成为系统故障排除和恶意软件搜索工具包的核心实用程序。DLL寻找过程:
SetCurrentDirecctory
)SYSTEM32
目录SYSTEM
目录Windows
目录PATH
环境变量中列出的目录如果在应用程序寻找成功之前,将我们自己创造的DLL文件防入寻找的目录中,那么应用程序就会加载我们自己的DLL.
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)
}
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
COM
是Component Object Model
(组件 对象模型)的缩写。
COM
是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一-种新的软件开发技术。在COM
构架下,人们可以开发出各种各样的功能专一的组件,然后将它们按照需要组合起来,构成复杂的应用系统。
首先需要介绍一下注册表,注册表可以理解为一个树状结构的数据库,它具有一些特殊的数据类型用来存储一些数据满足应用程序的需要。
微软官方介绍:https://docs.microsoft.com/en-us/windows/win32/sysinfo/about-the-registry
HKEY_CLASSES_ROOT=HKEY_LOCAL_MACHINE+HKEY_CURRENT_USER
首先需要介绍一下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\SoftwarelClasses\CLSID
我们直接在CLSID下新建一一个对象ID,就能够劫持某个进程或多个进程。
与DLL劫持原理相近,但是COM组件的劫持可以拓展很多东西,劫持的目标不一定是一个进程,劫持所需的文件不一定是一个DLL,它可以是一个.com文件、二进制PE文件、DLL文件,劫持的目标也可以是一个Windows API。
bypassuac_comhijack
劫持事件查看器和控制台,此处打开事件查看器就会调用CLSID组件里的某个注册表项,它会把注册表项里的DLL加载到事件查看器的空间里面。msf是把shellcode写入到DLL Main函数里边,调用Main函数就会执行shell code就会反弹回会话。
用户帐户控制(User Account Control,简写作UAC)是微软公司在其Windows Vista及更高版本操作系统中采用的一种控制机制。其原理是通知用户是否对应用程序使用硬
盘驱动器和系统文件授权,以达到帮助阻止恶意程序(有时也称为“恶意软件")损坏系统的效果。
UAC需要授权的动作包括:
具有autoElevate属性True的应用程序会在启动时自动提
升权限,而这些应用程序往往都具备微软的签名,微软
认为它是可信的。故此,在该程序启动时,将会以管理
员身份启动,假设我们通过COM技术或者DLL劫持该应
用程序,也能够获得管理员权限,但是,上述两种技术
比较苛刻: .
String与Sigcheck,这两款工具目前均有微软官方提供,主要用于查看文件内相关信息。
下载地址
string.exe -s *.exe|findstr /i autoelevate
sigcheck.exe -m C:\Windows\System32\cmd.exe