一、定义
rootkit是由有用的小型程序组成的工具包,使得攻击者能够保持访问计算机上具有最高权限的用户“root”。换句话说,rootkit是能够持久或可靠地、无法检测地存在于计算机上的一组程序和代码。
rootkit提供了两个主要功能:远程命令和控制,以及软件窃听。
远程命令和控制(简称远程控制):包括对文件进行控制,导致系统重启或“死机蓝屏”,以及访问命令shell(即cmd.exe或/bin/sh)。
软件窃听:就是观察人们在做什么,它包括嗅探报文、截获击键以及阅读电子邮件。攻击者可以使用这些技术来捕获口令和解密的文件,甚至加密密钥。
二、rootkit的工作方式
rootkit通过简单的修改概念来动作。软件通常设计为基于非常特定的数据来做出选定的决策。而rootkit对软件进行定位并修改,导致它做出不正确的决策。修改操作可以发生于软件中的许多位置,如下:
1、打补丁
可执行代码(有时称为二进制代码)具有非常选定的顺序,每个字节对于计算机来说都意味着某种含义。如果修改了这些字节,就会修改软件逻辑,这就称为打补丁。对数据字节打补丁是破解人员消除软件保护所用的主要技术之一,其他类型的字节补丁已用于在游戏中进行欺骗(如获取无限的金币、健康值等)。
2、复活节彩蛋
即程序员在自己编写的程序中放置后门。
3、间谍件修改
有时候一个程序会修改另一个程序,将其感染上“间谍件”。有些间谍件会钩进Web浏览器或shell程序里,从而难以检测和删除。
4、源代码修改
程序员可以将恶意的源代码插入到自己所编写的程序中,比如一些开源项目,因为很少有人会真逐行地分析代码。例如,恶意程序员故意将程序暴露出缓冲区溢出漏洞,它被识别为软件bug,因此是难以难测的。
5、软件修改的合法性
如网上下载的破解补丁。
三、绕过IDS(入侵检测系统)/IPS(入侵防护系统)
绕过防火墙和IDS/IPS软件有两种方法:主动方法和被动方法。这两种方法必须结合想来构造健壮的rootkit。
主动方法:在系统运行时进行工作,其设计思路是预防检测。主动进攻是对系统硬件和内核进行修改,其目的是破坏和迷惑入侵检测软件,用于对抗在内存中运行并试图检测rootkit的软件,可导致系统管理工具无法检测攻击。比如对病毒扫描器进行定位并将其禁用。
被动方法:即将数据存储和传输模糊化。如在将数据存储到文件系统之前对其进行加密,并将解密密钥存储到非易失性硬件存储器(例如闪存RAM或EEPROM)而不是文件系统中;或者从隐秘信道从网络中偷取数据;或者为了躲避病毒扫描器的离线扫描而将自身隐藏在文件系统中,以便扫描器无法检测到它。
四、绕过取证分析工具
1、对抗字节模式扫描:对rootkit自身进行加密,并对负责解密的部分使用多态技术以变换解密代码。
2、以非常规方式存储(例如在驱动器的坏扇区之中),或者存储为临时数据文件。
3、为了对抗文件系统的检测,将rootkit安装到内存中。缺点是在系统重启时会消失。
4、在极端情况下,rootkit也可以将自身安装到BIOS或闪存RAM芯片中的某处固件中。
五、自启动的方法
1、使用注册表键“run”(古老的可靠方法):所有的病毒扫描器都检查该键,可以在加载了rootkit后将该键的值隐藏起来。
2、使用特洛伊木马或被感染的文件:类似于病毒感染文件的方式,并且感染的最佳目标之一就是病毒扫毒或安全产品。
3、使用.ini文件:典型的如win.ini。
4、注册成为驱动程序:rootkit可以将自身注册为启动时加载的驱动程序,这需要创建注册表,一旦加载了rootkit之后,可以将该键隐藏起来。
5、注册为现有应用程序的附加件:比如注册为Web浏览器的扩展。
6、修改磁盘上的内核:可以直接修改内核并将其保存到磁盘上。
7、修改启动引导程序:可以修改启动引导程序,在内核加载之前对其打补丁。
六、rootkit的检测
1、检测rootkitr的存在
1)守护门口:在rootkit加载到内存时进行检测。rootkit可以利用许多操作系统函数将自身加载到内存中,通过监视这些入口点,有时能够发现rootkit。然而,存在着大量这类要监视的入口点,如果检测软件遗漏任何一种加载方法,就会前功尽弃。一般的入口点包括如下:
ZwOpenKey
ZwCreateKey
ZwSetValueKey
ZwCreateFile
ZwOpenFile
ZwOpenSection
ZwCreateLinkObject
ZwSetSystemInformation
ZwOpenProcess
2)扫描空间:周期性地扫描内存,查找与rootkit相对应的已知模块或模块签名。这种技术无法阻止rootkit的加载,而且只能发现已知的攻击者。优点在于简单。
3)查找钩子:在操作系统或进程之中查找钩子。缺点是无法阻止rootkit的加载,优点是它是一种通用方法,不存在着搜索已经签名或模式的问题。
2、检测rootkit的行为
1)检测隐藏的文件和注册表:在低层次上分析文件系统,然后调用高层API,二者进行比较,若有矛盾情况,则发现隐藏行为。
2)检测隐藏的进程:
(1)钩住SwapContext函数。调用SwapContext函数将当前运行线程的上下文与重新执行线程的上下文进行交换。通过钩住SwapContext函数,可以得到真实的进程列表。
(2)列出进程列表:除了通过ZwQuerySystemInformation函数之外,还有一些方法可以列出系统上的进程。例如通过netstat.exe列出端口就可能暴露出隐藏的进程。CSRSS.EXE进程是另一种发现系统上几乎全部进程的方法,它拥有除以下4个进程之外的所有进程的句柄:
Idle进程
System进程
SMSS.EXE
CSRSS.EXE