*本文原创作者:linken,属于FreeBuf原创奖励计划,禁止转载
0×01 引言
前段时间在github上看到了一个开源的rootkit源码,代码量比较少,OS适配也比较容易。将分析的笔记整理成一篇小文,分享出来。水平有限,难免有疏漏和错误,敬请指教。
0×02 rootkit简介
这次介绍的是Linux下R0层的rootkit。
Intel的x86处理器是通过Ring级别来进行访问控制的,级别共分4层,从Ring0到Ring3(后面简称R0、R1、R2、R3)。R0层拥有最高的权限,R3层拥有最低的权限。按照Intel原有的构想,应用程序工作在R3层,只能访问R3层的数据;操作系统工作在R0层,可以访问所有层的数据;而其他驱动程序位于R1、R2层,每一层只能访问本层以及权限更低层的数据。 这应该是很好的设计,这样操作系统工作在最核心层,没有其他代码可以修改它;其他驱动程序工作在R1、R2层,有要求则向R0层调用,这样可以有效保障操作系统的安全性。但现在的OS,包括Windows和Linux都没有采用4层权限,而只是使用2层——R0层和R3层,分别来存放操作系统数据和应用程序数据,从而导致一旦驱动加载了,就运行在R0层,就拥有了和操作系统同样的权限,可以做任何事情,而所谓的rootkit也就随之而生了。实际上,所有的内核代码都拥有根权限,当然,并不一定它们都叫做rootkit,这要看你用它来做什么。R3层的rootkit通过文件完整性检测较容易发现。
0×03 下载地址
https://github.com/ivyl/rootkit
0×04 使用方法
1、编译安装完成后,通过/proc/rtkit和内核进行交互,内核模块默认是隐藏的,所有lsmod查看不到。通过cat /proc/rtkit查看,具体的信息如下:
2、使用方法:
2.1、文件的隐藏 【 hides files prefixed with __rt or 10-__rt and gives root】
创建时候文件名以__rt或10-__rt开头即可默认隐藏。
2.2、进程隐藏的方法 【hpXXXX – hides proc with id XXXX】
echo -n hp1234>> /proc/rtkit
2.3、自身模块的隐藏和显示分别通过 【mh – module hide ms – module show】
echo -n mh >> /proc/rtkit
echo -n ms >> /proc/rtkit
0×05 源码分析
进程隐藏的代码实现,通过拦截具体文件系统的回调函数,在回调函数中将指定的进程过滤掉,从而达到隐藏的目的。具体如下:
ps命令的原理是通过读取/proc所有的信息,展示所有的进程。在读取/proc目录时,对应的函数被替换,从而达到隐藏进程的目的。文件隐藏的原理类似。
0×06 进程rootkit的检测
通过上文分析我们知道,所用到的rootkit隐藏技术是通过ps命令读取/proc的时候隐藏某些进程从而达到隐藏目的。所以如果我们将内核中进程链表所有的进程信息输出,并和ps查找到的进程进行比较,就可以找出哪些是被隐藏的进程。
在Linux中,内核通过进程链表把所有进程的描述符链接起来。每个task_struct结构体都包含一个list_head类型的tasks字段。表头是init_task描述符,即0进程的进程描述符。Init_task的tasks.prev字段指向链表中最后插入的进程描述符的tasks字段。#define for_each_process(p) \ for (p = &init_task ; (p = next_task(p)) != &init_task ; )这个宏用来遍历进程链表。检测的核心代码如下:
for_each_process(task_list) {
printk("[%d] %s",task_list->pid,task_list->comm);
}
此段代码将系统中所有的进程打印出来,将其结果和ps的结果对比即可找到隐藏的进程。测试的效果如下:
0×07 引述
https://www.cnblogs.com/findumars/p/5557283.html
<<linux内核设计与实现>> 机械工业出版社
0×08 特别说明
上文中提到的内容只是用作技术讨论,请勿用于非法用途!
*本文原创作者:linken,属于FreeBuf原创奖励计划,禁止转载
- 上一篇:英特尔承认其 ME、SPS、TXE等固件中存在漏洞
- 下一篇:如何绕过Android网络安全配置
0daybank
已有 13 条评论
写的不错
有没有Windows下的文章
@ 幕刃 平时工作主要在Linux上,所以比较熟悉。Windows的暂时没,我加加油,争取以后有。
@ linken 可以的,加油加油
不错
“请勿用于非法用途“,你写出来,大家都能看到,黑客也能,必然有被用于非法用途的可能性。不能免责的。
可以的,加油加油
编译完成后, 需要重新编译内核才可用?
@ vforbox 研究下insmod这个命令
rt: Unknown symbol __x86_indirect_thunk_rax
报这个问题怎么办呢
@ ericlee0517 您是x86平台的吗
怎么加不上你呢
@ jmcabc2008 再试试呢