好友
阅读权限25
听众
最后登录1970-1-1
|
使用论坛附件上传样本压缩包时必须使用压缩密码保护,压缩密码:52pojie,否则会导致论坛被杀毒软件等误报,论坛有权随时删除相关附件和帖子! 病毒分析分区附件样本、网址谨慎下载点击,可能对计算机产生破坏,仅供安全人员在法律允许范围内研究,禁止非法用途! 禁止求非法渗透测试、非法网络攻击、获取隐私等违法内容,即使对方是非法内容,也应向警方求助!
本帖最后由 hjm666 于 2020-7-2 14:33 编辑
前言
在看报告的时候,了解到一个很强很骚的技术BOOTKIT技术,一种用恶意代码写入MBR(磁盘主引记录)的方式技术【一种高级的内核劫持方式】,恶意代码写入后计算机开机时恶意代码会比内核还更早加载执行,及其隐蔽非常牛逼和难以清除【当然软格当我没说】。
今天的主题却不是BOOTKIT,而是它的小弟ROOTKIT...... 一搜就搜出来说BOOTKIT技术是ROOTKIT技术的升级版,那自然要了解一下了,结果就栽进去出不来了......
人家都是学海无涯,苦做舟。 我就是学海无涯,只沉不浮。 在没有一点内核知识基础和分析经验分析下来后,还有很多不懂,思虑良久,还是决定出来水一篇,权当"记仇"吧!
找样本还挺难找的,终在freebuf找到了rootkit的样本的hash还能用,说起来样本还是吾爱出来的:
https://www.freebuf.com/articles/system/168650.html 【样本的行为分析地址】
介绍
首先要了解rootkit技术它是一样什么样的技术【扒衣才能坦诚相见】
Rootkit木马解析:
Rootkit木马是一种系统内核级病毒木马,其进入内核模块后能获取到操作系统高级权限,从而使用各种底层技术隐藏和保护自身,绕开安全软件的检测和查杀,通过加载特殊的驱动,修改系统内核,进而达到隐藏信息的目的【一种高明的Hook技术,既然是一种Hook那么自然有多种的Hook方式】。
由dll 注入木马【Ring3层的注入到】,到内核层次的注入【Ring0层的注入】的一种技术转变.
截至百度:
后门作者把后门写成符合wdm规范(windows driver model)的驱动程序模块,把自身添加进注册表的驱动程序加载入口,便实现了“无启动项”运行。一般的进程查看器都只能枚举可执行文件exe的信息,所以通过驱动模块和执行文件结合的后门程序便得以生存下来,由于它运行在ring0级别,拥有与系统核心同等级的权限,因此它可以更轻易的把自己隐藏起来,无论是进程信息还是文件体,甚至通讯的端口和流量也能被隐藏起来,在如此强大的隐藏技术面前,无论是任务管理器还是系统配置实用程序,甚至系统自带的注册表工具都失去了效果。
【总结】 这是一种ring0 级别的高级注入技术。【不了解ring0,只需要理解为这是一个权限等级,ring3便是用户操作权限,权限逐级递增,ring0是最高权限】
样本背景 样本是一个盗号木马下载器,以及含有锁定计算机浏览器主页功能的系统计算机驱动木马文件,引擎判定是一个Rootkit木马。
本篇内容我将把重点放在这个样本的Rootkit技术上,进行简单且水的分析。
分析内容
DriverEntry函数是驱动文件的重要的主函数,其一切的函数行为都将在其中运行,通常情况下会存在一个DriverUnload函数用来卸载驱动程序,但多数情况下是驻留在系统中达到持久化的行为。
其次在Rootkit木马必须要做的一件事--- 创建文件句柄。为了从用户模式的程序中使用内核驱动程序,用户模式的程序必须打开一个驱动程序句柄。这只有当驱动程序已经注册了一个指定的设备之后才能进行。一旦注册完成,用户模式的程序就可以将指定设备像文件一样打开。创建了一个名为【\\Device\\93218ec2da92e0af】的设备对象。
一旦打开了文件句柄,它就可以在用户模式的函数如ReadFile和WriteFile 中充当参数,也可以用于进行IOCTL调用,这些操作会导致生成要在驱动程序中处理的IRP。【我一下消化不了IOCTL什么的,留给以后消化了】
还有一个重要的概念就是添加链接符号,为了便于用户模式的程序打开文件句柄,一些驱动程序使用了符号链接,这个步骤不是必需的。【对于Rootkit的实现是有益的】
这个样本中我所发现的Rootkit技术中,只发现了两种hook技术,一种SSTD HOOK 和 IRP HOOK。先从SSTD HOOK 开始, 图中是样本Hook的四个系统函数。
图中重点是qword_88540的值,跟一下函数过程可有一个了解是怎么做到Hook SSDT的,先是获取到获取到smss.exe 的进程pid.
先是通过PsGetProcessPeb函数获取了smss.exe进程的EPROCESS结构信息,再返回进程中EPROCESS结构体中关于ntdll.dll 的信息将其返回到v1。人菜不会说,以及EPROCESS结构体不熟,一搜好多好多不知道具体是什么信息。
V1返回后赋值到qword_88540后,传入到sub_735C0函数中,猜测是根据ntdll.dll的什么信息,计算出来的ZwProtectVirtualMemory等四个函数的具体地址,sub_735C0达到了GetProcessAddress函数的效果 。
另一波同样方法的hook.
剩下IRP HOOK就更水一些了。在其样本连接服务器下载盗号木马运行的这一块代码中,我找到了注入进程运行过程,尝试服务器是否存活过程,就是没发现连接服务器进行下载文件过程,也未有发现有网络相关的API以及相关API字符串。还好写样本的人为了方便调试留下了一些信息反推到IRP HOOK点。
通过构建的DeviceObject 信息 ,在利用IoBuildDeviceIoControlRequest函数创建一个IRP信息,并利用IofCallDriver 函数执行处理这个IRP信息,达到作者想要隐藏的网络行为。[C++] 纯文本查看 复制代码 struct _IO_STATUS_BLOCK IoStatusBlock; // [rsp+50h] [rbp-78h]
PMDL MemoryDescriptorList; // [rsp+60h] [rbp-68h]
PIRP Irp; // [rsp+68h] [rbp-60h]
PDEVICE_OBJECT DeviceObject; // [rsp+70h] [rbp-58h]
NTSTATUS v9; // [rsp+78h] [rbp-50h]
struct _KEVENT Event; // [rsp+80h] [rbp-48h]
ULONG *v11; // [rsp+98h] [rbp-30h]
__int64 v12; // [rsp+A0h] [rbp-28h]
_MDL *v13; // [rsp+A8h] [rbp-20h]
unsigned int v14; // [rsp+B0h] [rbp-18h]
_FILE_OBJECT *FileObject; // [rsp+D0h] [rbp+8h]
PVOID VirtualAddress; // [rsp+D8h] [rbp+10h]
ULONG Length; // [rsp+E0h] [rbp+18h]
int v18; // [rsp+E8h] [rbp+20h]
v18 = a4;
Length = a3;
VirtualAddress = a2;
FileObject = a1;
MemoryDescriptorList = 0i64;
DeviceObject = IoGetRelatedDeviceObject(a1);
KeInitializeEvent(&Event, 0, 0);
Irp = IoBuildDeviceIoControlRequest(3u, DeviceObject, 0i64, 0, 0i64, 0, 1u, &Event, &IoStatusBlock);///////////////////////////
if ( !Irp )
return 3221225626i64; // 资源不足
if ( Length )
{
MemoryDescriptorList = IoAllocateMdl(VirtualAddress, Length, 0, 0, 0i64);
if ( !MemoryDescriptorList )
{
IoFreeIrp(Irp);
return 3221225626i64;
}
MmProbeAndLockPages(MemoryDescriptorList, 0, 0);
v9 = 0;
}
sub_16320((__int64)Irp, 0i64, 0i64, 0, 0, 0);
v12 = sub_162C0((__int64)Irp);
*(_BYTE *)v12 = 15;
*(_BYTE *)(v12 + 1) = 7;
*(_QWORD *)(v12 + 40) = DeviceObject;
*(_QWORD *)(v12 + 48) = FileObject;
v11 = (ULONG *)(v12 + 8);
*(_DWORD *)(v12 + 12) = v18;
*v11 = Length;
if ( Length )
v13 = MemoryDescriptorList;
else
v13 = 0i64;
Irp->MdlAddress = v13;
v9 = IofCallDriver(DeviceObject, Irp);////////////////////
if ( v9 == 259 )
{
KeWaitForSingleObject(&Event, 0, 0, 0, 0i64);
v9 = IoStatusBlock.Status;
}
if ( v9 < 0 )
v14 = v9;
else
v14 = IoStatusBlock.Information;
return v14;
IRP介绍
IRP 是由 I/O 管理器发出的, I/O 管理器是用户态与内核态之间的桥梁,当用户态进程发出 I/O 请求时, I/O 管理器就捕获这些请求,将其转换为 IRP 请求,发送给驱动程序。 I/O 管理器无疑是非常重要的,具有核心地位。它负责所有 I/O 请求的调度和管理工作,根据请求的不同内容,选择相应的驱动程序对象,设备对象,并生成、发送、释放各种不同的 IRP 。整个 I/O 处理流程是在它的指挥下完成的。 【我的理解是比如说你说你要进P站,你网址栏打下了那个腥气满满的网址,浏览器就帮你访问打开解析下页面给你看,IRP就如浏览器生成的访问请求】
终
啊!!大海你全是水!!!! 水完了,查了很多资料也没啃下来,卑微.jpg 沉水里,尸骨无存都被鱼吃了个干净,骨灰都没了。哦,我主题是来"记仇"来着,挂知识点,https://bbs.pediy.com/thread-177772.htm 内核api运作知识
https://www.malwaretech.com/2013/09/ring3-ring0-rootkit-hook-detection-12.html rootkit 检测与原理
https://bbs.pediy.com/thread-57900.htm rootkit之路 【这里有个大佬,rootkit 啥hook都发帖子了,建议逛主页,不过我大多看不懂,心死.jpg】
https://blog.csdn.net/bcbobo21cn/article/details/51145258 rootkit 技术简介
最后,如果都以上文章所阐述点有自己观点和见解的,希望老师傅指点,带带彩笔!!! 给您鞠躬了!!!
然后还有一个问题这玩意中毒了后怎么清除,我查了下这玩意特点
1,无进程。RING0木马编译后是一个SYS文件,它和DLL文件那样,是插入到进程里运行的。但DLL插入的是地址在0x80000000下的用户区,而 RING0木马插入到地址在0x80000000以上的系统区,而且所有进程共享,只要它本身不提供unload例程,几乎不可能被卸载,而且没有多少个工具可以列举系统里装载的SYS模块。
2,无端口。RING0木马可以直接控制网卡收发包,系统和防火墙根本不知道,因此它可以使用任何端口,任何协议。或者通过使防火墙的NDIS驱动失效,突破防火墙的封堵。
3,难发现,难查杀,生存能力强。但是,要写出这样一匹好马,需要对系统内核和通讯协议非常熟悉的高手才能胜任,尤其要对ntoskrnl.exe, hal.dll,ndis.sys三个系统模块导出的函数要非常熟悉才行。 【所以能用ring0的代码让代码正确运行本身就是一门艺术,凑s*还写马】
清除的话也是众口难一,首先重做系统因该是可以的毕竟还不是bootkit, 大多数也就说进windows的安全模式开杀毒【也没毛病,病毒都进Ring0了,凭啥杀毒不能进Ring0了(别为某某零卸载了还有文件删不掉了)】。 你说怎么发现你中了马? 这么秀的技术都拿来写锁首页,盗号了 |
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|