驱动病毒那些事(完结)----劫持

  • 驱动病毒那些事(完结)----劫持已关闭评论
  • 16 views
  • A+

本篇作为驱动病毒分析系列的最后一篇,主要给大家展示一下驱动病毒常见的劫持手法。

对象劫持

驱动病毒经常通过对象劫持来把自己伪装成为系统正常的驱动文件,增强隐蔽性。

当系统加载驱动时,会为驱动构建一下_LDR_DATA_TABLE_ENTRY结构体,DRIVER_OBJECT结构体的DriverSection成员指向这个结构体。

看一下该结构体的定义:

wKg0C2Bf4SSARDMTAADinrXdEtA673.png
我们主要关注的是结构体中 FullDllName(驱动全路径)和 BaseDllname(驱动名)字段。对象劫持所劫持的正是这两个字段。

攻击实例

对象劫持攻击源代码:

```

include

typedef struct _LDR_DATA_TABLE_ENTRY {
LIST_ENTRY InLoadOrderLinks;
LIST_ENTRY InMemoryOrderLinks;
LIST_ENTRY InInitializationOrderLinks;
PVOID DllBase;
PVOID EntryPoint;
ULONG SizeOfImage;
UNICODE_STRING FullDllName;
UNICODE_STRING BaseDllName;
ULONG Flags;
USHORT LoadCount;
USHORT TlsIndex;
union {
LIST_ENTRY HashLinks;
struct {
PVOID SectionPointer;
ULONG CheckSum;
};
};
union {
struct {
ULONG TimeDateStamp;
};
struct {
PVOID LoadedImports;
};
};
//struct _ACTIVATION_CONTEXT * EntryPointActivationContext;
PVOID EntryPointActivationContext;
PVOID PatchInformation;
} LDR_DATA_TABLE_ENTRY, * PLDR_DATA_TABLE_ENTRY;

void Unload(IN PDRIVER_OBJECT DriverObject)
{
DbgPrint("UNLOAD ok");
}

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
{
DriverObject->DriverUnload = Unload;
UNICODE_STRING fake;
RtlInitUnicodeString(&fake, L"tdi.sys");
((PLDR_DATA_TABLE_ENTRY)DriverObject->DriverSection)->BaseDllName.Buffer = fake.Buffer;
((PLDR_DATA_TABLE_ENTRY)DriverObject->DriverSection)->FullDllName.Buffer = fake.Buffer;
return STATUS_SUCCESS;
}
```

这是一个简单的攻击实例,木马通过对象劫持将恶意驱动伪装成系统网络驱动tdi.sys。

反汇编效果:

wKg0C2Bf3SKACudpAABLGMHBV4g225.png

Windbg调试结果 :

劫持前:

wKg0C2Bf5WWAF5YoAAE6O07xe40425.png

劫持后:

wKg0C2Bf5SWAQe8oAAC3ocCrDI409.png

对象劫持后,PChunter会有提示:

wKg0C2BgLwiAIQk8AAAX0tHfd38695.png

下面我们来探索如何检测这种攻击,不仅是进程劫持,驱动病毒为了隐蔽,防止PChunter这类ARK工具枚举自身,会通过断掉LDR_DATA_TABLE_ENTRY的驱动加载链表,来对抗利用 ZwQuerySystemInformation的11号功能枚举驱动的手法。后来我们又想到打开驱动对象目录查找驱动的方法来检测到断这种链表的隐藏驱动。但是病毒能够通过断掉目录对象的的hash链来自我隐身。我们索性直接在内存中暴力搜索驱动对象的结构体来进行枚举,但是病毒有可以通过抹掉驱动对象和抹掉PE头,或者伪造驱动对象和PE头来对抗检测,这是一场攻防的博弈。

但是像本例中的对象劫持还是很好检测的,因为对象劫持修改的只是LDR_DATA_TABLE_ENTRY 结构体中的FullDllName和BaseDllName,但是并没有修改Driver_Object结构体中的Drivername字段,如图:

wKg0C2Bf8pmAbJ4WAACpTibLfzI424.png

我们可以通过 RjtlCompareUnicodeString函数,对比BaseDllName字段,判断两者是否相同,但是测试时遇到了问题,虽然Drivername字段是Uniconde_string类型,但是打印该字段时会出现非预期字符,乱码,对比时需要先对字符串进行处理,提取出驱动名称。

流量劫持

驱动病毒经常会恶意更改用户浏览器主页,进行流量,主页劫持,骗取用户点击量,进行牟利。

cmdline劫持

由于驱动运行在ring 0 级别,可以通过注册线程回调,当匹配到特点浏览器进/线程启动时,通过在浏览器线程启动时cmdline参数,进行主页劫持。

修改的是_RTL_USER_PROCESS_PARAMETERS结构体中的cmdline参数,结构体细节如下:

typedef struct _RTL_USER_PROCESS_PARAMETERS
{
ULONG MaximumLength;
ULONG Length;
ULONG Flags;
ULONG DebugFlags;
PVOID ConsoleHandle;
ULONG ConsoleFlags;
PVOID StandardInput;
PVOID StandardOutput;
PVOID StandardError;
CURDIR CurrentDirectory;
UNICODE_STRING DllPath;
UNICODE_STRING ImagePathName;
UNICODE_STRING CommandLine;
PVOID Environment;
ULONG StartingX;
ULONG StartingY;
ULONG CountX;
ULONG CountY;
ULONG CountCharsX;
ULONG CountCharsY;
ULONG FillAttribute;
ULONG WindowFlags;
ULONG ShowWindowFlags;
UNICODE_STRING WindowTitle;
UNICODE_STRING DesktopInfo;
UNICODE_STRING ShellInfo;
UNICODE_STRING RuntimeData;
RTL_DRIVE_LETTER_CURDIR CurrentDirectores[32];
ULONG EnvironmentSize;
} RTL_USER_PROCESS_PARAMETERS, *PRTL_USER_PROCESS_PARAMETERS;

由于病毒是通过注册回调方式进行劫持主页,比较底层,火绒剑无法捕获被劫持后的cmdline参数。

wKg0C2BgMV2AZ0AACcboMGjYQ514.png

劫持效果:

wKg0C2BgMtuAfaJnAAAagX7Xgls466.png

注册表项劫持

有些病毒劫持主页的手法更加简单粗暴,通过修改注册表项的方式进行劫持。

1修改HKEY_LOCAL_MACHINESOFTWAREMicrosoftInternet ExplorerMain和HKEY_CURRENT_USERSoftwareMicrosoftInternetExplorerMain下的Start Page串值,将其修改为恶意链接。

wKg0C2BgOcuAWDHFAABSsfvmMLE022.png

https根证书劫持

病毒通过向本地受信任列表导入伪造的根证书,做中间人攻击,劫持主机的https流量,tls加密形同虚设。

ssl加密的基础就是通过预置在机器上多个根证书来校验服务器是否是真的经过授权的。但是如果终端被导入了一张伪造的根证书,这个不可靠的根证书就可以伪造服务以骗过浏览器和应用的安全检查。

https协议本身安全性是可以得到保证的,但是由于客户端和服务器的脆弱性,也会导致协议的不安全。

具体案例可参考:

https://baijiahao.baidu.com/s?id=1692488693431728710&wfr=spider&for=pc

进程劫持

进程劫持的成因是病毒修改了IFEO下的Debugger串值。具体劫持路径如下:

```HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionImage File Execution Options

```

WindowsNT架构的系统里,IFEO的本意是为一些在默认系统环境中运行时可能引发错误的程序执行体提供特殊的环境设定,引发进程劫持的是Debugger参数,IFEO里第一个被处理的参数。

Debugger参数存在的本意是为了让程序员能够通过双击程序文件直接进入调试器里调试自己的程序,系统如果发现某个程序文件在IFEO列表中,它就会首先来读取Debugger参数,如果该参数不为空,系统则会把Debugger参数里指定的程序文件名作为用户试图启动的程序执行请求来处理。

测试代码:

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionImage File Execution Optionsregedit.exe]
"Debugger"=""C:\Windows\notepad.exe" "

运行效果:

wKg0C2Bf9XuAF1vpAABmmavIfV4070.png

wKg0C2Bf9ZyASCU6AAFSUdQGjL0996.png

参考链接:

  1. https://blog.csdn.net/liujiayu2/article/details/73943794?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-2&spm=1001.2101.3001.4242
  2. https://blog.csdn.net/guyue35/article/details/50073373

相关推荐: 沙盒逃逸之seccomp学习

前言 今年的国赛pwn出了2道关于沙盒逃逸的题目,但之前只是了解并没有接触过沙盒逃逸,所以没做,国赛后的几天又去学习了沙盒逃逸,又一次知道了自己多菜。。。写下本篇记录沙盒逃逸的学习,本文仅介绍与pwn有关的沙盒逃逸。 沙盒 介绍 为了保护系统安全,用户层的应用…