一、关于LKM
所谓LKM,就是Loadable Kernel Modules,这些模块本来是Linux系统用于扩展他的功能的。使用LKM的优点有:他们可以被动态的加载,而且不需要重新编译内核。由于这些优点,他们常常被特殊的设备(或者文件系统),例如声卡等使用。在linux、solaris以及*BSD中都存在同样的技术,这这里主要以linux下的lkm检测为主,结合部份其它系统的信息。
要了解LKM,我们需要对一些相关的重要文件、目录以及程序有一个基本的了解,首先是/lib/modules/"kernel_version",我们进入这个目录,可以看到:
------------------------------------------------------------------------------------
[root@test 2.2.14-5.0]# ls -laF
total 50
drwxr-xr-x 11 root root 1024 Apr 5 10:12 ./
drwxr-xr-x 4 root root 1024 Apr 4 12:02 ../
-rw-r--r-- 1 root root 149 Mar 8 2000 .rhkmvtag
drwxr-xr-x 2 root root 1024 Aug 23 1996 block/
drwxr-xr-x 2 root root 1024 Aug 23 1996 cdrom/
drwxr-xr-x 2 root root 1024 Aug 23 1996 fs/
drwxr-xr-x 2 root root 1024 Aug 23 1996 ipv4/
drwxr-xr-x 2 root root 4096 Aug 23 1996 misc/
-rw-r--r-- 1 root root 28633 Apr 7 18:35 modules.dep
-rw-r--r-- 1 root root 31 Apr 7 18:35 modules.generic_string
-rw-r--r-- 1 root root 81 Apr 7 18:35 modules.isapnpmap
-rw-r--r-- 1 root root 29 Apr 7 18:35 modules.parportmap
-rw-r--r-- 1 root root 99 Apr 7 18:35 modules.pcimap
-rw-r--r-- 1 root root 189 Apr 7 18:35 modules.usbmap
drwxr-xr-x 2 root root 2048 Aug 23 1996 net/
drwxr-xr-x 2 root root 1024 Aug 23 1996 pcmcia/
drwxr-xr-x 2 root root 1024 Aug 23 1996 scsi/
drwxr-xr-x 2 root root 1024 Aug 23 1996 video/
-------------------------------------------------------------------------------------
图一
这下面的目录及文件与LKM相关,比如modules.dep对各模块的依赖关系、modules.usbmap与usb设备的lkm都有着密切关系,另外有些与内核模块相关的命令,这些命令在/sbin目录下,一个个说吧:
modprobe:它可以从modules.dep来查找各个模块的依赖关系,然后加载进去,比如我们在加载网卡ne2000时,经常是用modprobe ne就可以了,而另一个依赖的模块8390.o也会自动地加载进去。
depmod:处理各种模块的从属关系。
lsmod:查看系统中加载的模块情况,但由于它是依赖于/proc/modules文件的,如果系统已经被人入侵过,那么这个命令展现出来的东西就不一定是真实的了。
insmod:加载内核模块的命令,如果我们要加载后门模块,也需要insmod -f troja.o
rmmod:从内核中删去模块,但是通常情况下,后门内核模块把自己从/proc/modules中摘除后,rmmod已经无法移除了。
我们可以再来看看/etc/modules.conf,这是对可加载内核模块的一个配置文件,它并不是必需的,你可以man 5 modules.conf看一看,一般情况下我们机器中这一文件看起来象是下面这个样子:
------------------------------------------
[root@test quack]# cat /etc/modules.conf
alias eth0 ne2k-pci
alias parport_lowlevel parport_pc
------------------------------------------
图二
如果对内核模块感兴趣的话,可以看看http://www.kernel.org/LDP/或者其中译版LINUX编程白皮书。也可以参见THC的文章。
二、关于LKM后门
1、knark
knark是sekure.net的成员creed开发的一个基于linux 2.2内核的后门模块,这并不是一个稳定版本,里面存在一些或许是故意,或许是无心留下的bug,我们可以先来看看它的功能。
--------------------------------------------------------------------------
[root@test knark-0.59]# lsmod
Module Size Used by
ne2k-pci 4688 1 (autoclean)
8390 6144 0 (autoclean) [ne2k-pci]
[root@test knark-0.59]# insmod knark.o
[root@test knark-0.59]# lsmod
Module Size Used by
knark 6944 0 (unused)
ne2k-pci 4688 1 (autoclean)
8390 6144 0 (autoclean) [ne2k-pci]
[root@test knark-0.59]# insmod modhide.o
[root@test knark-0.59]# lsmod
Module Size Used by
ne2k-pci 4688 1 (autoclean)
8390 6144 0 (autoclean) [ne2k-pci]
--------------------------------------------------------------------------
图三
knark的主要功能有隐藏文件、隐藏进程、重定向执行程序、隐藏网络连接、以root身份运行命令、改变用户id、远程执行命令(该功能尚不完善,作者自己注释了),它还有几个比较不错的特性,如:隐藏SIOCGIFFLAGS的标志位中IFF_PROMISC――接口为随机(promiscuous)模式的项,这可以防止部份检测网卡是否为混杂模式的工具发现入侵行为;另外,它能够用kill发送一个31的信号给某进程,以隐藏之。
----------------------------------------------------------------------------
[root@test src]# ps -aux |grep quack
root 412 0.0 1.7 2232 1116 pts/0 S 17:02 0:00 login -- quack
quack 413 0.0 1.5 1700 940 pts/0 S 17:02 0:00 -bash
[root@test src]# kill -31 412 413
[root@test src]# ps -aux |grep quack
[root@test src]#
-----------------------------------------------------------------------------
图四
同时它为了入侵者的方便查询,把一些隐藏起来的文件、进程等信息放在/proc/knark里。
2、adore
adore是由teso小组成员开发的一个lkm后门,当前版本是0.34,能够实现的功能有隐藏文件、隐藏进程、以root身份执行程序并提供了卸载功能(当然它的卸载是需要提供密码验证的),这个后门模块可以支持2.2及2.4的内核,同时易于配置使用。
-----------------------------------------------------------------------------
root@slackware:/home/quack/adore# ./ava
Usage: ./ava {h,u,r,R,i,v,U} [file, PID or dummy (for U)]
h hide file
u unhide file
r execute as root
R remove PID forever
U uninstall adore
i make PID invisible
v make PID visible
root@slackware:/home/quack/adore# cat startadore
#!/bin/sh
# Use this script to bootstrap adore!
# It will make adore invisible. You could also
# insmod adore without $0 but then its visible.
insmod adore.o
insmod cleaner.o
rmmod cleaner
-----------------------------------------------------------------------------
图五
adore的用途其实我想还在于建立honeypot,可以隐藏起一些东西,让入侵者摸不着头脑。
3、其它不常见的lkm小程序
a、Rkit-1.01.tgz:这个工具可以将你的编译前定义好的UID设为0,方便提升权限。未隐藏自身。
b、phide.tar.gz:这个工具可以隐藏进程
c、test.c:远程backdoor
……
……
三、关于LKM后门的探测
1、传统rootkit检测方法
a、完整性与真实性:用md5 checksums来对一些重要的文件或者二进制文件进行检验,或者用如tripware之类的工具来实现对机器的完整性做一个镜像,或者说,从cdrom等可信赖的介质中安装某些软件包……
b、某些入侵者使用的工具包、小程序中常常会有一些字符串是易于判断的,比如/bin/sh,或者说,它们可能会有些常见的打开的端口――毕竟自己写代码来攻击的人比较少……所以“默认”的东西,还是相当流行的。
2、THC的LKM检测理论
他们更多地是想防范于未然,在系统受侵害前就先做好一些准备,主要的思路有下面两点。
a、记录每一个模块的加载:把模块加载的情况记录在syslog中――或者其它地方,可以供比较及查对。
#define MODULE
#define __KERNEL__
#include
#include
#include #include#include#include#include#include#include#include#include#include#includeexter