APT黑客组织已被大众耳熟能详,由于rootkit技术高权限,更底层等特性,常被恶意软件用于对抗杀毒软件,自我保护等方向,历来是黑白“兵家必争之地”。本文整理APT常用的自我保护技术,揭开rootkit神秘面纱,知己知彼,百战不殆
Darkhotel框架Ramsay于今年5月被披露,具备突破物理隔离限制新特性,引入Rootkit新组件,达到自我保护的目的。
1) 初始化配置:
2) sub_179FA(),构造初始化,主类HideDriver为纯虚类,如下所示:
3)初始化以下指针调用,如下所示:
4)主要初始化功能如下:
| sub_1AFE4 | 初始化Resource读写锁 |
| sub_1B000 | 初始化Mutex互斥体 |
| sub_1B054 | 获取KeServiceDescriptorTable基地址 |
| sub_1B064 | 获取KeServiceDescriptorTable.ServiceTableBase |
| sub_1B076 | 获取KeServiceDescriptorTable基地址 |
| sub_1B086 | 获取KeServiceDescriptorTable.ServiceTableBase|
| sub_1B01C | HideDriver::FileHider |
| sub_1B038 | HideDriver::ProcessHider |
5) IRP_MJ_DEVICE_CONTROL函数,如下所示:
6)PCHunter查看挂钩情况,如下所示:
7)枚举SyStem进程,好处可以兼容不同版本ImageFileName结构体偏移。
8)获取SSDT基地址,Hook函数NtQueryDirecToryFile。
9)完成钩子安装
10)ZwQuerDirectoryFile用于文件保护,过滤函数如下:
正常调用ZwQuerDirectoryFile访问,根据文件类型(不同结构体)进行分发处理,通过Hook-ZwQuerDirectoryFile隐藏文件有多种,过滤FileBotDir类型,pFileInfo->FileName命中,FILE_BOTH_DIR_INFORMATION.NextEntryOffset覆盖或摘链等。
11)ZwQuerSystemInfomation用于进程保护,过滤函数如下:
用户层使用EnumProcesses和CreateToolhelp32Snapshot遍历进程 ,底层调用ZwQuerSystemInfomation函数,解析SYSTEM_PROCESS_INFORMATION结构体,PID过滤,命中后对结构体篡改或摘链实现进程隐藏。
SSDT是一门古老的rootkit技术,中文称叫系统服务描述符表,该表将ring3的Win32 API和ring0内核API联系起来,包含地址索引的基地址、服务函数个数,内核攻防技术演变的过程中,SSDT是其中重要角色,对抗从未停止。
Hellsing黑客组织被披露黑吃黑,活跃在亚太地区,使用钓鱼手段破环东南亚,印度,美国等外交目标而闻名
1) 文件保护,如下所示:
FileSystem\FastFat和FileSystem\Ntfs,当系统删除一个文件时候向ntfs或者fastfat驱动发送派遣函数IRP_MJ_SET_INFORMATION请求,当打开一个文件会响应IRP_MJ_CREATE。
2) 利用ObReferenceObjectByName获取了NTFS驱动对象。
3) 替换派遣函数IRP_MJ_CREATE指针函数,如下所示:
4) Hook分析,通 _IO_STACK_LOCATION._FILE_OBJECT.FileName,来判断是否是保护的文件:
5) 将文件路径进行任意替换,指向其它的字符串,对文件操作时候,处理派遣IRP_MJ_CREATE修改FILE_OBJECT.FileName从而达到文件保护功能。
1)控制码:2352220,执行_EPROCESS.ActiveProcessLink摘链操作,隐藏进程。
2)编写测试驱动,发送CTL_PROCESS_HIDE隐藏PID成功。
#define CTL_PROCESS_HIDE \ CTL_CODE(FILE_DEVICE_VIDEO, 0x3917, METHOD_BUFFERED, FILE_ANY_ACCESS)
3)控制码: 23511128,用户层传递需要保护的文件数组,进行赋值操作。
该组织使用rootkit技术要比SSDTHook略高一筹,针对NTFS和FASTFAT驱动进行fsd Hook实现文件保护,使用EPROCESS结构体进行摘链实现进程隐藏。
上文讲述Ramsay框架和Hellsing组织使用的Rootkit技术手段,达到恶意软件自我保护的目的,如何检测RootKit实现挂钩恢复?一探究竟。
1.保存系统当前SSDT地址,发送至用户层或直接内核层作比较,代码如下:
2.将本地文件映射到内存,重定向地址,与当前系统函数地址对比,如果不相同标记为SSDTHOOK,替换原始函数地址,完成恢复。
1.通过IDA查看ntfs.sys派遣函数,观察机器码,读取ntfs和fastfat文件(PE),代码段进行枚举搜索,通过机器码寻找原始派遣函数地址,如下所示:
2.加载Ntfs,拷贝对象派遣函数,如下所示:
3.映射本体文件,以AddressOfEntryPoint+ImageBase为枚举机器码入口点,如下所示。
4.枚举机器码保存派遣函数地址,与当前内存加载派遣函数地址比较,需要重定位,不匹配标记为FSD HOOK,替换原始派遣函数,完成恢复,伪代码如下:
上文对rootkit挂钩介绍了扫描的方法,如何检测被隐藏的进程和文件呢?部分检测思路如下:
1.Windows 32bit系统空间0x80000000-0xFFFFFFFF ,0x80000000为起始地址,判断地址是否有效,逐一解析ObjectType是否进程类型,递增4kb枚举系统空间,该方式适用于其它类型内核对象隐藏。
2.枚举PspCidTable找到隐藏进程,PspCidTable系统中全部进程线程对象,索引便是PID和TID(如果该链也被断开,则无效)。
1.读取NTFS流,解析MFT,获取完整的文件列表,检测磁盘被隐藏的文件。
2.针对fsd hook,可以使用更底层方式来检测,挂钩disk.sys比fs更底层同样可以实现低层检测。
rootkit技术随着安全学术的普及,神秘面纱逐步被揭开,虽然64bit系统部分rootkit不再适用,道高一尺魔高一丈,盗取数字签名安装驱动木马现象一直存在,内核安全检测和防御技术是必要手段,也是安全核心。
3DE2A22BABB69E480DB11C3C15197586
07858D5562766D8239A7C961FEEA087C