作者: 大鹰by e4gle Netguard Security Teams,from ,e4gle.org, 前言: 可以说是重提旧话了,以前每次翻译或写文章都很马虎,其实很多代码自己都没调试成功,还发个p啊, 正好和alert7合搞超级lkm后门,寻找一种可以逃避kstat的方法.其实是老话题了,于是翻以前的文章,研究一下发现当时自己真是很马虎,,就把文章发表了,所以以后真的不敢再轻易发文章了,呵呵. ok,我们进入正题,我个人认为这项技术还是不错的,真的很难被发现,呵呵:) 我现在要阐述一种可以不利用syscall table来挂接系统调用的方法(在linux的实现),我们都知道kstat的工作原理,它检测系统调用表即:syscall table,这个表大家都很了解,可恶的是,我们每次要挂接自己的系统调用时都需要在此表操作,所以极易被kstat发觉.我们看,我写一个lkm加载时我用kstat时显示如下(片断): ——————————————————————————– SysCall Address sys_exit 0xc01175c9 sys_fork 0xc381c408 WARNING! Should be at 0xc0108fdc sys_read 0xc381c050 WARNING! Should be at 0xc0125199 sys_execve 0xc381c148 WARNING! Should be at 0xc0109033 sys_kill 0xc381c470 WARNING! Should be at 0xc01106f2 sys_getdents 0xc381c278 WARNING! Should be at 0xc012e155 ——————————————————————————– 很显然看出哪些系统调用被修改了,所以我们现在挂接系统调用的方法的目的就是为了让kstat发现不了我们的踪迹.基本的前提是攻击时需要改变旧的系统调用来跳转到新的系统调用,因此控制权交给新的系统调用并且syscall table并没有变化。当然,当系统调用创建的时候原来的code必须被保存下来,这是大家都熟知的必须步骤了。原来的code被跳转指针替代并且系统调用看起来和平常一样正常运行。在这之后,跳转指针会再次放置等待下次使用。要发现这种攻击手段必须非常小心仔细地比较原系统调用的头几个字节来判断系统调用是否被截获。也就是说我们以前的截获实现是通过给syscall table注册一个new的sys call来截获,现在,新的方法是我们来修改旧的系统调用的code来实现挂接,加一个跳转指针指向new的sys call,并不需要添加注册到syscall table中,从而可以逃避kstat的检测。 ok,还是程序最具有说服力,偶写了这个简单的实现方法的code,很简单,我们修改uname调用,为了更清楚说明问题,我让它打印出一个标志代表lkm的正常运行,这个标志可以在/var/log/messages里面看到. ———————————cut————————————————- /*test only~ by e4gle from netguard security teams*/ #define __KERNEL__ #define MODULE #define MODVERSIONS #define S_KERNEL_VERSION(a,b,c) (((a) 可以一个人,可以几个人,一起放松那劳累的心情或者劳累自己的身体,