记一次Linux系统被入侵的排查过程(三)

2016/08/1115:39:22 发表评论

大家好,又有一段时间没发这个系列的文章了。上次本来以为把病毒启动项清理完,系统命令重装下,重启后没有发现相关进程就以为万事大吉了,果哥偶然间又发现了这个病毒居然还有残余势力。有的小伙伴就惊呆了,马上就问我是什么,别急,咱们今天慢慢来看。

1、发现残余势力

偶然有一次,我想用Linux系统进行相关实验,就打开了上次“病毒被清除”的机器,偶然的输入了一个ps aux命令,结果如下:

1.png

发现每次执行ps aux命令,最后都会有些系统常用的命令列表显示出来,直觉告诉我,革命尚未成功。

2、开始定位顽固势力坐标

我们仍然用以下命令来查找程序的真实路径:

ls -l /proc/pid/exe

但有些程序执行后马上退出了,一时间也不太好确定到底哪个进程才是常驻内存的,只好每次进行进程名对比,而且根据Linux内核创建进程的原理来讲,如果一直在创建进程的程序,进程号是不断增大的,而常驻内存的那个进程号是不会变的,以此来对比,发现进程号由6000多慢慢在增加,到了8000多,可以确定的是这些变化的进程号肯定都是瞬时的,也定位不到真实路径,那么常驻内存的这个进程肯定在4265这个数字之前,只好把相关服务慢慢停掉来找了。这个过程需要点耐心,此处省略一千字的手工查找过程……

Wait a long time....

Hi,sir,我能说我放弃查找了么2.gif(有时候运气好能找到不变化 的进程,这个纯属看谁蹲厕所的功夫强)

3、转换思路才有出路

这个进程号变化实在是快,我已经眼花了,于是我选择直接查找启动项,命令命令:

find /etc/rc.d -mtime -6

幸运的是,我马上找到了一个可疑启动项:

[root@localhost init.d]# cat /etc/init.d/crsokopqfz 
#!/bin/sh
# chkconfig: 12345 90 90
# description: crsokopqfz
### BEGIN INIT INFO
# Provides:             crsokopqfz
# Required-Start:
# Required-Stop:
# Default-Start:        1 2 3 4 5
# Default-Stop:
# Short-Description:    crsokopqfz
### END INIT INFO
case $1 in
start)
        /usr/bin/crsokopqfz
        ;;
stop)
        ;;
*)
        /usr/bin/crsokopqfz
        ;;
esac

好吧,这个程序就在/usr/bin/crsokopqfz,那么我们如何定位到这个进程号呢(这个时候是不是后悔没好好学果哥的shell编程课程了呢),新建一个文件,名叫:proc.sh

#!/bin/bash
for pid in `find /proc/ -maxdepth 1 -type d`
do
    if [ -L $pid/exe ];then
        ls -l $pid/exe 2> /dev/null | grep crsokopqfz
    fi
done

执行结果如下图:

blob.png

居然是一个ls命令,它进行了进程名的伪装,oh shit!

我们尝试把它kill掉看看

kill -9 1624

我们再次查看进程列表,发现问题依旧,然后在/usr/bin/目录下又产生了一个英文乱序的进程名:/usr/bin/yjsibhyyai

为了让我们的shell脚本能复用,反复查找不同的进程名,我们把它适当改一下:

#!/bin/bash
PRO_NAME=$1
[ -z $PRO_NAME ] && echo "Please input program name: $0 [pro_name]" && exit 1
for pid in `find /proc/ -maxdepth 1 -type d`
do
    if [ -L $pid/exe ];then
        ls -l $pid/exe 2> /dev/null | grep $PRO_NAME
    fi
done

我们再次运行,发现目标如下:

blob.png

此时,我们不能直接把这个进程kill掉了,因为只要一kill掉它,它马上又会在/usr/bin目录下产生新的进程,同时会有/etc/rc.d目录下生成随机名字的启动项,而且测试结果发现,无论你是删除还是kill掉这个进程,它都会马上产生新的进程和开机启动项。有种发疯的感觉了

此时,果哥告诉你,千万不能被恶势力所打败,我们继续测试,我们可以通过我们这个系列的上一篇文章,先把启动项干掉试试,测试结果表明,并没有生成新的启动项,那么这个病毒的规律就出来了:删除或kill掉进程会产生新的开机启动项和新的进程名,删除启动项不会生成。

4、继续使绝招

好了,给它扔个命令

find /etc/rc.d -mtime -6 | grep -v 'd$' | xargs rm -f

一个番茄时间又到了(最近我在使用一款叫时间管理的软件),我们先喝杯茶休息下,平静下骚动的心情。

继续回来革命!

此时我想起一句话,最复杂的东西往往来源于最简单的知识。凭着果哥对Linux的 日 久生情,我们可以使用一个神奇的命令,防止任何程序对指定的目录进行写操作,即使root用户也不能写,对以下目录赋予特殊属性:

chattr +i /etc/rc.d
chattr +i /etc/init.d
chattr +i /usr/bin

接下来我们再把第3步找出来的进程干掉:

kill -9 16224

然后你用ps aux 查看进程列表时会发现,居然还有,原因是因为他在别的目录里又生成了,以下目录是我测试过的生成目录:

/bin /tmp 这个时候你会发现用ps aux 看进程列表时,进程名变化没那么快了,可以肉眼观察到不变化的进程名,如图:

blob.png

接下来,我们都给它加上不可写属性。

chattr +i /bin
chattr +i /tmp

继续重复上面操作,把非法进程干掉!

Fuck for a long time...

整个世界终于清净了,掌握在哪里?

5、收尾工作

最后我们依次把干掉的进程“尸体”移走,比如想移走/bin目录下的“虫子”,执行

chattr -i /bin;mv /bin/binname /opt/backup/

把所有“尸体”移动到一个备份目录,以便研究.

6、附录

病毒Linux虚拟机下载地址:

https://yunpan.cn/cBszaTyM4jZ6T  访问密码 3bf9   

Linux机器root密码123456

  • 微信扫码赞助
  • weinxin
  • 支付宝赞助
  • weinxin

发表评论

您必须才能发表评论!