现在你可能要问,如何防止你的系统发生这种情况,也许你有兴趣与找到你自己:)
下面我们来看几种检测的方法:
7.1 检查符号表
在上面的例子中,我们看到了系统调用表被修改了,所以你可以检查系统调用表来发现修改,一种方法就是,在系统启动时加载一个
包含有特殊目的的系统调用的模块,这个系统调用用来检查并与先前保存系统调用表对比。
上面的方法很通用,但是启它的表被修改了呢?当然你可以添加更多别的表的检查,这种方法是不能检测到jump这种方法和
直接修改内核的方法。
你应该通过/dev/kmem 监察系统调用表,在tools/checkcall有个例子,它带有两个参数,一个是syscall的名字,还有一个就是
系统调用号,以此载系统调用表中来检查。
但是这样还是有问题,比如利用在实战节中我们介绍的方法,我们只能得到错误的地址,下面的例子中将用来证明,假如我们
加载了CY,现在假如我们想要检查open这个系统调用,SYS_open的系统调用号为5,定义于/sys/sys/syscall.h
我们作如下检测
# tools/checkcall open 5
Checking syscall 5: open
sysent is 0x4 at 0xc03b7308
sysent[5] is at 0xc03b7330 and will go to function at 0xc0cd5bf4
ALERT! It should go to 0xc01ce5f8 instead
当然我们通过setsym来修复这个问题,当然你需要首先加载symtable这个模块
# exp/setsym 0xc0cd5bf4 open
现在再用checkcall检查,不会出现ALERT了,它假设open就是在0xc0cd5bf4,但是故事并没有结束,我们可以通过实际检查kernel
来证实objdump -d /kernel --start-address=0xc0cd5bf4 我们就会怀疑这个系统调用的地址过高,objdump在这个地址却没有
发现任何东西,暗示有问题了。这表明你的内核或者objdump被文件重向了,然而这将会引起一点小的争论。
7.2 陷阱模块
另外的你可以做的就是加在一个模块用来纪录kldload的调用,然后判断是拒绝还是加载,在trapmod/有个例子,你可以用非隐藏的方式
加载这个模块,当然在安全级别提升前。
7.3(略)
7.4 概论(略)
8.结论
正如你所见到的,很多攻击的技术同样可以用来防御,通常隐藏一个用来管理的模块很重要,作为一个系统管理员隐藏一些用来检测入侵
的shell和文件是必要的。如果你是个freebsd系统管理员,应该时刻意识到即使系统处在一个高的安全级别也有很多需要注意的地方。
这篇文章可以让你学到更多的kernel works , 这是最重要的;)
9.代码
文中提到的所有代码都可以在Curious Yellow 包中找到 (地址:http://www.r4k.net/mod/cyellow-0.01.tar.gz
Freebsd内核模块源码实现以及应用探
0
相关文章