hjm666 发表于 2020-7-2 11:04

ROOTKIT 初了解

本帖最后由 hjm666 于 2020-7-2 14:33 编辑

前言

       在看报告的时候,了解到一个很强很骚的技术BOOTKIT技术,一种用恶意代码写入MBR(磁盘主引记录)的方式技术【一种高级的内核劫持方式】,恶意代码写入后计算机开机时恶意代码会比内核还更早加载执行,及其隐蔽非常牛逼和难以清除【当然软格当我没说】。
       今天的主题却不是BOOTKIT,而是它的小弟ROOTKIT......    一搜就搜出来说BOOTKIT技术是ROOTKIT技术的升级版,那自然要了解一下了,结果就栽进去出不来了......
       人家都是学海无涯,苦做舟。我就是学海无涯,只沉不浮。   在没有一点内核知识基础和分析经验分析下来后,还有很多不懂,思虑良久,还是决定出来水一篇,权当"记仇"吧!
找样本还挺难找的,终在freebuf找到了rootkit的样本的hash还能用,说起来样本还是吾爱出来的:
   https://www.freebuf.com/articles/system/168650.html   【样本的行为分析地址】


介绍

首先要了解rootkit技术它是一样什么样的技术【扒衣才能坦诚相见{:301_986:}】
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信息,达到作者想要隐藏的网络行为。 struct _IO_STATUS_BLOCK IoStatusBlock; //
PMDL MemoryDescriptorList; //
PIRP Irp; //
PDEVICE_OBJECT DeviceObject; //
NTSTATUS v9; //
struct _KEVENT Event; //
ULONG *v11; //
__int64 v12; //
_MDL *v13; //
unsigned int v14; //
_FILE_OBJECT *FileObject; //
PVOID VirtualAddress; //
ULONG Length; //
int v18; //

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.htmrootkit之路   【这里有个大佬,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了(别为某某零卸载了还有文件删不掉了)】。 你说怎么发现你中了马? 这么秀的技术都拿来写锁首页,盗号了

minibeetuaman 发表于 2020-7-2 15:56

玩这个东西你得先告诉大家运行的环境,是32或者64环境,还有就是支持到哪个版本的windows

siqintu 发表于 2020-7-2 11:21

都说正经了就别说水不水的,照你这意思正经帖子都是水喽,

hjm666 发表于 2020-7-2 11:28

siqintu 发表于 2020-7-2 11:21
都说正经了就别说水不水的,照你这意思正经帖子都是水喽,

害,正经写了,内容水啊

罩到胸前必有沟 发表于 2020-7-2 11:14

说得好!

xieboo 发表于 2020-7-2 11:17

无言以对~~~

tlngln 发表于 2020-7-2 11:18

学习了!!!!

safe-夏天 发表于 2020-7-2 11:35

tql,看懂了一半{:301_971:}

shr123 发表于 2020-7-2 12:20

进来的时候是懵的
出去的时候更懵了

lep52 发表于 2020-7-2 12:47

终于看完了,虽然看不懂{:301_997:}

猪蹄不香 发表于 2020-7-2 12:59

我完完全全懵了
页: [1] 2 3 4 5 6 7 8
查看完整版本: ROOTKIT 初了解