后门技术和Linux LKM Rootkit(2)

/ns/hk/hacker/data/20020821023840.htm




现在我们谈一下如何来截获系统调用。为了隐藏入侵者的足迹, 文件, 进程,网络连接必须
隐藏起来。 因为这些信息都是可以从特殊的系统调用里面获得的, 我们可以接获一些感兴趣
的系统调用。

1. 隐藏文件。象这些命令如"ls", "du" 使用sys_getdents() 来获得目录信息。 所以lkm程
序必须过滤这些输出来达到隐藏文件的目的。
2. 隐藏进程。在linux的实现中,进程的信息被映射到/proc文件系统去了。我们的工作仍旧
是捕获sys_getdents()调用在进程链表中标记为不可见。通常的手法是设置任务的信号标志
位为一些未用的信号量,比如31就是一个例子。
3. 隐藏网络连接。 和隐藏进程相似, 在这个例子中我们是这去隐藏一些包括/proc/net/tc
p和/proc/net/udp的文件。所以我们改变sys_read()。 无论何时读包含匹配字符串的这两个
文件的时候, 系统调用将不会声明在使用它。
4. 重定向可执行文件。 有时候, 入侵者可能会需要替换系统的二进制文件, 象"login", 但
不想改变原文件。他可以截获sys_execve()。因此, 无论何时系统尝试去执行"login"程序的
时候, 它都会被重定向到入侵者给定的其他程序。
5. 隐藏sniffer。这儿我们指隐藏网络接口的杂拨模式。在这里我们要替换的是sys_ioctl(
)。
6. 和lkm通信。 黑客已经很好的安装了他的lkm。现在他需要告诉内核来隐藏其他文件。他
该怎么做呢?我们知道从用户态切换到和心态通常是通过系统调用来进行的, 所以我们必须
修改一些系统调用。
例如, 我们将截获sys_settimeofday()。当一个指定的参数被传递, 我们的系统调用将会为
我们做一些适当的事情。
7. 隐藏lkm本身。一个优秀的lkm程序必须很好地隐藏它自己。系统里的lkm是用单向链表连
接起来的, 为了隐藏lkm本身我们必须把它从链表中移走以至于lsmod这样的命令不能把它显
示出来。
8. 隐藏符号表。通常的lkm中的函数将会被导出以至于其他模块可以使用它。因为我们是入
侵者, 所以隐藏这些符号是必须的。幸运的是, 有一个宏可以供我们使用:"EXPORT_NO_SYM
BOLS"。 把这个宏放在lkm的最后可以防止任何符号的输出。


----[ 经验和结论。

做个lkm程序是一个非常有趣而又非常危险的事情。有趣的是你可以在系统内核中作你想做的
事情。 但这也是非常危险的, 它可以使你的服务陷入混乱, 破坏你的数据, 并且可以在你的
系统里做任何怪异的事情。 我们的经验有: 在安装了lkm程序几天后我们的网络层不工作了
, 只工作五分钟就要重起一次; 无论何时发送数据包, 象这些应用程序 telnet, netscape,
pine都将会产生core dump; 在安装lkm程序后立马重起。所以, 就象标题所说的那样,后果
自负!

值得一提的是写一个lkm程序你可以更好地了解到系统是如何工作的。例如, /proc文件系统
有很好的特性。因为lkm程序工作在内核空间, 调试lkm程序就变得比一般程序要困难。 使用
"printk"函数可以解决一些问题。但这不是最好的解决方法。通过注册在/proc文件系统里的
我们的文件和目录的数据结构, 我们可以访问到任何时间的内核空间的信息。我们甚至可以
通过写这个文件来修改内存, 尽管一般不建议这样做。

结束语。 从经验来看, 很明显的lkm程序可以在linux上安装,一旦系统被攻破并且被安装了
lkm的rootkit程序, 这就变的很难被发现了。因为甚至操作系统都不能信任了。如果机器不
允许关机,唯一的发现入侵者的方法是通过分析在网络其他机器上的sniffer结果。 或者,
利用其他的操作系统来监测硬盘。所有这两个方法都很难去做, 因为你不知道你要找什么。


所以,所以最好的安全措施就是防止被攻击者入侵系统。

----[ 参考资料。

1. Bypassing Integrity Checking Systems. http://phrack.infonexus.com/search.phtm
l?view&article=p51-9

2. Weakening the Linux Kernel. http://phrack.infonexus.com/search.phtml?view&art
icle=p52-18

3. Building Into The Linux Network Layer. http://phrack.infonexus.com/search.pht
ml?view&article=p55-12

4. (nearly) Complete Linux Loadable Kernel Modules. http://packetstorm.securify.
com/groups/thc/LKM_HACKING.html

5. Backdoors. http://www.dataguard.no/bugtraq/1997_3/0310.html

6. Runtime Kernel Kmem Patching. http://www.big.net.au/~silvio/runtime-kernel-km
em-patching.txt