|
蠕虫
另外的一个影响广泛的技术就是蠕虫,想象一下Morris蠕虫:利用攻击程序--一般这些攻击程序都是已经存在的技术.这个蠕虫利用一个sendmail程序已存在的一个漏洞来获取其它机器的控制权.病毒一般会利用rexec,fingerd或者口令猜解来尝试连接.在成功入侵之后,它会编译在目标机器上编译源代码并且执行它.而且会有一个程序来专门负责隐藏自己的脚印.
internet的蠕虫病毒一般都是利用已知的攻击程序去获得目标机的管理员权限.但是蠕虫的生命也是很短暂的,当该病毒所利用的漏洞被修补的话,那么该蠕虫也就失去它的作用了,因为他们需要利用exploit这个媒介来进行自身的复制.而exploit又是只针对特定版本的特定程序才会有效的,所以蠕虫的跨平台能力很差,时效性也很弱.
欺骗库函数
我们可以愚弄那些比较傻的用户.如果你利用LD_PRELOAD环境变量来捉弄他,你可以让他执行你自己的代码,你已经利用LD_PRELOAD环境变量把标准的库函数替换成了你自己的程序.挺有意思吧?LD_PRELOAD并不是linux系统特有的并且它一般用在一些应用程序(比如老版本的StarOffice需要运行在较新版本的red hat系统上)必须用他们自己的(或者比较老的版本,或者修改过的)库函数,因为在安装的时候没有满足他们的需求.Quantum (Staog病毒的作者)在unix病毒的邮件列表里面提供了这些代码,我做了修改,也是为了便于大家理解:
------------------------tryld.c------------------------------------ extern int __open(char *, int, int); extern int execv(char *, char *[], char *envp[]);
int open(char *path, int flags, int mode){ printf("open: %s\n", path); return __open(path, flags, mode); }
/* 注意这里,原来它放弃了envp参数,这样会...:(?! 呵呵,所以我修改了一下,影响不大:)*/ int execve(char *path, char *args[], char *envp[]){ printf("execve: %s\n", path); return execv(path, args, envp); } -------------------------------------------------------------------
------------------------main.c------------------------------------- /*test only,by e4gle*/ #include #include #include #include
main() { int fd; execve("/bin/date","",NULL); if(fd=open("/etc/inittab",O_RDONLY)!=-1) { fprintf(stdout,"open file succeed!\n"); } else fprintf(stderr,"open error!\n"); close(fd); return 0; } -------------------------------------------------------------------
这段代码获取open和execv并且改变了它们的输出,好,我们测试一下:
[e4gle@redhat62 elf]$ gcc -o main main.c [e4gle@redhat62 elf]$ ./main open file succeed! <--证明我们打开文件成功了,open调用正常工作 [e4gle@redhat62 elf]$ ldd -v -r ./main libc.so.6 => /lib/libc.so.6 (0x4001c000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
Version information: ./main: libc.so.6 (GLIBC_2.0) => /lib/libc.so.6 /lib/libc.so.6: ld-linux.so.2 (GLIBC_2.1.1) => /lib/ld-linux.so.2 ld-linux.so.2 (GLIBC_2.1) => /lib/ld-linux.so.2 ld-linux.so.2 (GLIBC_2.0) => /lib/ld-linux.so.2 /*跟踪一下库函数的利用,都是glibc的标准库函数,solaris里面是sotruss,我个人认为sotruss 比较好用:)*/ [e4gle@redhat62 elf]$ gcc -shared -o tryld tryld.c [e4gle@redhat62 elf]$ export LD_PRELOAD=./tryld <--用我们自己的lib [e4gle@redhat62 elf]$ ./main execve: /bin/date open: /etc/inittab open file succeed! /*注意!不一样了吧?已经在用我们自己的open和execve了,呵呵:)*/
以上仅仅是个测试代码并且没有任何危害性,但是它足以说明我们利用欺骗函数库来攻击程序的原理.
内核级的传播
这里我们称作"内核级别的病毒",病毒可以传染内核映像,这样病毒可以控制系统的方方面面.但是这种病毒技术目前尚处于理论阶段,并没有真正实现,但并不代表以后都不会出现.
与平台兼容的病毒
如果我们用标准C来书写病毒代码的话,各种不同体系的unix系统对于我们来说变化不大.我们只需要对方计算机有一个c编译器.这样的病毒可以很轻易的扩散,利用普通用户的.rhosts文件这种小技俩就可以做到.假如没有exploits(是有可能的,因为病毒是跨平台的,因而它可以不借助exploit来四处扩散),这种可以跨平台的病毒的传染面是非常广的,而且似乎根本没有结束的时候.
当然,很多病毒都还是用汇编来编写的.有很多著名的病毒,但不是第一个linux病毒Bliss,第一次发表于1997年.Bliss传染ELF格式的二进制文件,但是并没有太多的伤害.它甚至可以利用被感染文件的--bliss-disinfect-files-please参数来卸载.假如你需要在你的文件里查找Bliss,注意以下字段:
E8ABD8FFFFC200003634 65643134373130363532
最早的linux病毒是Staog,比Bliss早半年.它用汇编书写并且利用三个/dev/kmem的exploits来获得的特权,它可以感染任何文件并且可以传播.
它的关键字段:215B31C966B9FF0131C0 884309884314B00FCD80
当我们利用ELF格式的二进制文件来做病毒:这种病毒被誉为计算机病毒中的标准模式--他们用汇编编写并且它们通过可执行程序感染,很象典型的DOS下的病毒.可以通过往elf文件的文本段之后的填充区增加代码来感染ELF文件,搜索目录树中文件的ET_EXEC和ET_DYN标记看看是否被隐藏(这些依靠管理员自身的经验).
当然,在linux系统下实现这种病毒并不太容易.一个病毒感染的文件属主是普通用户权限的话,那么病毒所得到的权限当然也就只有普通用户权限(并且病毒不会利用exploit来提升权限),只能对该用户权限级别的文件和数据造成危害.但是当一个病毒感染了一个root权限的文件的话,那么它就可以控制系统的一切了.
我们安全么? 一个很实际的问题.现在我们的linux系统还可能比较安全.但以后不代表一致这样.linux系统越来越流行,这将引来一大批的病毒制造者的目光.很多用户都有可能是潜在的病毒制造者,而且如果把unix的很多用户对unix本身的了解正在减少算在内的话,我们就麻烦了.现在已经有了一些linux系统上的反病毒程序.现在甚至包括我还有很多unix的系统管理员在内都对制造反病毒程序非常感兴趣.在一个蠕虫出现之后,我们可以查阅各种文档,甚至书籍.所以我们都一直也在努力着.(完) |