29 views

Rootkit技术 2–Linux Rootkit之中的隐藏技术

 

image

Linux Rootkit的资料很少,市面上主要是Windows图书。有关Linux OS相关的隐藏技术也都很直接了当(相比Windows,Linux这方面比较简单),都是工程技术没有什么太多技巧可言,有如下实现方式:

1.Hook Handler(替换处理函数)

2.从系统结构上将自身摘除

 

Netstat的链接信息隐藏

显示来源:

netstat 从/proc/net/tcp得到连接信息

隐藏策略:

替换这个目录的读函数,如果发现读取的连接信息匹配设置的信息则不显示。代码参照从【2】

1.如何找到读的handler函数

 

 

 

文件操作的handlers如下:

rootkit主要关注的是open、read、readdir、writer等。

 

 

2.实现显示过滤

这个很容易,do_read_tcp中根据配置的端口等过滤即可

 

Process隐藏

原理同上,替换的是“/proc”目录的readdir指针。

如果发现进程名和配置的相同则不显示。

 

user id隐藏

这次读取的是/var/run/utmp文件,因此替换文件的read handler。

如果发现user和名字匹配则不显示,现象是,使用who无法列出当前用户。

 

从lsmod中隐藏Kernel Module

方法1:替换/proc/modules文件的readhandler

方法2:

【1】中直接将kmodule从kmodule list管理链表中摘除,这样下列命令都无法显示出安装的kmodule。

grep rooty /proc/modules
ls /sys/modules | grep rooty       —-    通过kobject_del删除这个kernel module
modinfo rooty
modprobe -c | grep rooty
grep rooty /proc/kallsyms

这种彻底的做法有一个问题是,

除非重启,hacker也无法将这个kmodule删除掉了。

 

通过拦截System Call进行隐藏

前面的hack都是kernel内部的实现,可以通过替换System Call这一层,稳定的进行隐藏。其技术难点是

1.sys_call_table的获取。从2.6.x开始,table不再export symbol,因此要通过内存搜索的方式来查找定位这个table。64bit和32bit OS起始搜索的位置不同,参照【1】。

2.sys_call_table内存区域是写保护的,要设置cr0寄存器,清除写保护标记,参照【1】。

3.使用echg()函数交换系统调用的指针和hacker函数的指针,这个应该是为了保证原子操作。

4.hook过的system call必须要使用asmlinkage修饰符声明,其含义是所有待传递参数要放到栈上,不能优化。系统调用是entry.s调用C函数,也就是汇编调用C函数。这样的规定system call的特殊函数调用规约。至于原因,这里描述的是,在系统调用从用户模式切换到kernel模式的时候,为了现场恢复,kernel保存所有的寄存器到栈,因此这样调用不需要额外开销。

 

【参考】

1.Modern Linux Rootkits 101,http://turbochaos.blogspot.hk/2013/09/linux-rootkits-101-1-of-3.html

Google doc对应的Slides,https://docs.google.com/file/d/0ByaHyu9Ur1vidXVnUGVtNjlDMWM/edit

2.Linux rootkit implementation ,http://average-coder.blogspot.hk/2011/12/linux-rootkit.html

代码参照https://github.com/mfontanini/Programs-Scripts/blob/master/rootkit/rootkit.c

其hack了/proc/buddyinfo,增加了writer(本来是readonly的),通过这个虚拟文件写入控制命令。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">