老爹还有一件事:高贵的马儿驱除体内一切外力,不论怎么删除它都会死而复生
不死马是什么
一个经典的不死马是这样的:
1 |
|
可以看出其实就是一个在内存中运行的不断写马的函数
写马的这个文件名不需要和生成的马相同
不死马的清除
彻底清除
因为是在内存里,所以直接重启php-fpm清空内存,重启之后这个内存里的不断写马的程序就没有了
重启完之后再删马,就不会再生成了
也可以查找不死马的进程,杀掉之后再删除木马ps aux --sort=-%cpu|grep php
1 | root@ubuntu:/xp/www/192.168.29.128# ps aux --sort=-%cpu|grep php |
cpu占用高,且运行时间长的,基本就可以确定是不死马进程。由于time是cpu实际使用时间,而不死马一直在usleep,这段时间不运行,所以运行时间和开始时间对不上。但不死马的进程不像其他正常php-fpm进程一样最长运行30秒,所以这个时间会一直累积。隔一段时间再用ps aux --sort=-%cpu|grep php
查看,时间变长的就是不死马的进程。
pid在第二列。有了pid直接杀掉就行了:kill -9 580466
。这时候再删掉木马就不会生成了。
其他方法
不死马作为一个木马,要执行就必须可读。直接把不死马设置为不可读chmod -r 1.php
,外面就访问不到,也就没有危害了。
或者更改不死马的内容,然后将其设置为不可写echo '111'>1.php;chmod -w 1.php
删除后创建同名文件夹也是一样的思路,阻止不死马的写入rm ./'-test.php';mkdir ./'-test.php'
错误的方法
网上大部分博客都说自己搞一个不死马,写相同的文件,usleep时间设置为更短就行。这肯定会存在条件竞争的。实测不死马usleep(100000),自己写usleep(2000)都会有概率成功。
不死马的命名
不死马的命名上也有点东西,有的会带上-
和&
,直接rm -a&g.php
会识别为参数删不掉
但是删除失败shell里直接给了提示:
尝试使用”rm ./‘-a&g.php’”删除文件 ‘-a&g.php’。
这个写法直接就能删掉了,所以这种命名方式意义不大
还有一种命名方式是.test.php
,作为隐藏文件,这样直接ls的时候看不到,要ls -l
或者ls -a
才能看到。如果是一些没有经验的运维或许会有点作用。
学艺不精的马
1 |
|
首先这个md5,cmd5直接就出结果了:ljl
,用了等于没用
然后是写马,先判断-g&t.php
是否存在,如果不存在就写马。可能是想降低磁盘的占用。但是没有考虑过,如果改了马的内容,不死马也不会重新写入,这个马就没用了(实测删掉开头的php标签,马不会更新,不能正常用)。
再往下usleep(1)
,太短了,占用不高是因为先判断马是否存在,所以实际上每次循环都不写马。(属于是负负得正了)
最后,unlink(__FILE__)
不用写在循环里面。__FILE__
是最初的文件,删一次就没了。
更顽固的马
上面说到重启php-fpm就可以清除不死马了,但是假如不断写马的程序不是靠php-fpm运行的,那就清不掉了
比如用bash实现
1 |
|
这时候即使重启php-fpm也不会影响到bash,所以重启了还是删不掉,只能重启主机或者手动查杀进程。