记一次阿里云被挖矿处理记录
摘要
莫名其妙的服务器就被攻击了,又被薅了羊毛,当做免费的挖矿劳动力了。
一、起因
上班(摸鱼)好好的,突然收到一条阿里云的推送短信,不看不知道,两台服务器被拉去作为苦力,挖矿去了。这不是耽误我摸鱼吗,再说你挖到的矿币又不带我分,岂能忍。本着对公司负责任的态度(实在没办法),这不收拾一下过分的挖矿脚本,对不起这么多年积攒的专业知识。
登录服务器,top
一下,ps
一下,crontab -l
一下,好家伙,只看到 CPU 异常占用了,却没发现到底是哪个玩意贪了我这么多资源。与以往的不太一样啊(你特么在逗我?)。
按照以往的经验,ps -aux --sort=-pcpu|head -10
一下,贪渎者肯定原形毕露。难不成穿了个马甲。仔细分析,可能不仅仅是马甲这么简单,更有可能是隐身衣。使出万能的百度大法,果然有几篇秘籍指出问题,一一对照下,只能发现大概,定位不到最终的“宝藏”地点。看来百度不行,得 google 一下了。这次秘籍多了起来,给出了一项专门破解隐藏进程的功法。
二、寻“宝”
BusyBox 是一个集成了 300 多个最常用 Linux 命令和工具的软件。甚至还集成了一个 http 服务器和 telnet 服务器,集成的包大小只有 1M 左右。有人将 BusyBox 称为 Linux 工具里的瑞士军刀。简单点说 BusyBox 就是一个集成了许多 Linux 工具和命令的大的工具箱。在嵌入式软件中,BusyBox 有着广泛的运用。
所以,下载 BusyBox,安装:
$ wget https://busybox.net/downloads/binaries/1.30.0-i686/busybox
$ mv busybox /usr/bin/busybox
$ chmod +x /usr/bin/busybox
查看 BusyBox 基本功能
$ busybox --help
使用瑞士军刀查看一下进程信息
$ busybox top
作祟者原型毕露,有个 /bin/daemon
进程,占用过高的 CPU 使用
同时使用 netstat
查看一下程序端口占用
$ netstat -anp | grep ESTAB
结果如下:
可以看到有一个程序占用端口 14444
,连接的ip为 217.182.169.148
,却并没有打印出程序的进程号,在shadan搜索一下,ip 为法国的,基本确定入侵使用的端口为 14444
,先把端口禁用掉。
三、“六娃”的能力
既然确定是 /bin/daemon
,那就需要找出这个玩意是怎么具有“六娃”的能力,又是如何进行挖矿的。
首先可以确定的是 /bin/daemon
是一个二进制执行程序,那就可以看看它的动态库依赖关系
$ ldd /bin/daemon
此时还未发现有任何异常的结果(请原谅眼神不好使,四个眼睛都没发现问题)
既然 ldd
无法找出异常,祭出大招,看看 /bin/daemon
所执行的系统调用
$ strace /bin/deamon
好家伙,不看不知道,居然有一个 ld.so.preload
,来了个预加载。
一般来说,预加载 so
有两种方式:
- 修改/etc/ld.so.preload配置文件,这种方法对配置修改后运行的进程有效,而无法影响已经在运行的进程
- 启动进程前设置LD_PRELOAD环境变量,此方法只对当前进程生效
LD_PRELOAD
可以影响程序的运行时链接,它允许定义在程序运行前优先加载的动态链接库,通过这个环境变量,可以在主程序和其动态链接库的中间加载别的动态链接库,甚至覆盖正常的函数。
进程在启动后,会按照一定的顺序加载动态库:
- 加载环境变量
LD_PRELOAD
指定的动态库 - 加载文件
/etc/ld.so.preload
指定的动态库 - 搜索环境变量
LD_LIBRARY_PATH
指定的动态库搜索路径 - 搜索路径
/lib64
下的动态库文件
从上面的结果来看,加载了一个 /usr/local/lib/libprocesshider.so
动态库,从上面的 ldd
返回结果也看到了这个动态库,再仔细一看,这名字,不就是 process+hider
。
libprocesshider.so,Hide a process under Linux using the ld preloader. 官方的解释,本来可能只是作者觉得一个好玩的玩意,却被别有用心的人拿来做坏事。
找到这家伙,那好办了,先把它直接干掉。
$ rm -rf /usr/local/lib/libprocesshider.so
啥?万能的 rm -rf
大法居然失效了,这家伙身上居然给自己加了个盾,大招居然没有收到人头。
冷静一下,仔细分析。既然不能删除,那就是有着隐藏属性,等待技能冷却,我还有招。
$ lsattr /usr/local/lib/libprocesshider.so
果然,文件被追加了隐藏属性。可以看到有 i
和 a
属性。
文件隐藏属性解释:
属性选项 | 功能 |
---|---|
i | 如果对文件设置 i 属性,不允许对文件进行删除、改名,也不能添加和修改数据;如果对目录设置 i 属性,只能修改目录下文件中的数据,但不允许建立和删除文件 |
a | 如果对文件设置 a 属性,只能在文件中增加数据,不能删除和修改数据;如果对目录设置 a 属性,只允许在目录中建立和修改文件,不允许删除文件 |
u | 设置此属性的文件或目录,在删除时,其内容会被保存,以保证后期能够恢复,常用来防止意外删除文件或目录 |
s | 和 u 相反,删除文件或目录时,会被彻底删除(直接从硬盘上删除,然后用 0 填充所占用的区域),不可恢复 |
既然加了盾,那把盾给破了就是:
$ chattr -ia /usr/local/lib/libprocesshider.so
什么,chattr
没权限,这是反弹伤害吗?这,玩不下去了啊。
试试分身术吧。
$ cp /usr/bin/chattr /usr/bin/chattr2
$ chattr2 -ia /usr/bin/chattr
没报错,嗯,再试试
$ chattr -ia /usr/local/lib/libprocesshider.so
咋,还提示没权限。
再看一下 chattr
$ file /usr/bin/chattr
这这这,跟我这虚晃一枪呢。你把我原来的文件删了,给我放个空文件,你是想骗谁呢。
看来要重装 chattr
了,但是机器上跑了不少服务,担心有影响。集中精力,冥想三分钟,条条大路通罗马,此路不通,换路走。谁让咱兄弟姐妹多呢。
服务器都是选择的一样的镜像,版本一致,从其它未被攻击的系统中拷贝一份 chattr
,(划重点)拷贝到服务器上时,请换一个文件名称,通过新的文件修改原来的文件。如 chattr2
。
$ chattr2 -ia /usr/bin/chattr
$ rm -rf /usr/bin/chattr
$ mv /usr/bin/chattr2 /usr/bin/chattr
正主归位,一切妖魔邪道即将化为无形。
$ chattr -ia /usr/local/lib/libprocesshider.so
$ chattr -ia /etc/ld.so.preload
$ rm -rf /usr/local/lib/libprocesshider.so
$ rm -rf /etc/ld.so.preload
此时,通过 top
即可看到 /bin/daemon
进程。没有了隐身衣,无所遁形了吧。
那么,接下来,就应该干掉“罪魁祸首”了。大蛇精和蝎子精已死,救爷爷终于有希望了。
/bin/daemon
是通过软链指向 /usr/bin/daemon
,不墨迹,直接干掉本尊。
$ chattr -ia /usr/bin/daemon
$ rm -rf /usr/bin/daemon
当然,记得杀掉运行中的 /bin/daemon
进程
$ kill -9 2415
四、守护者
一般的挖矿脚本程序肯定都有一个守护进程,保证挖矿的进程被杀之后,可以重新启动,绝大多数是用的定时任务的方式。既然通过 crontab -l
没看到定时任务,那就看看 /etc/cron.d
目录下有没有:
果然,在 /etc/cron.d
目录下,存在着定时任务脚本,查看脚本内容:
$ cat /etc/cron.d/systemd
果然运行了一条定时任务,查看指向的脚本内容:
$ cat /lib/systemd/systemd-login
脚本文件没有内容,file /lib/systemd/systemd-login
very short file(no magic)
什么👻 ,先不管了,干掉再说。
$ rm -rf /lib/systemd/systemd-login
$ rm -rf /etc/cron.d/systemd
$ rm -rf /etc/cron.d/systemd~
$ rm -rf /etc/cron.d/systemz~
打完野怪打小龙,打完小龙打大龙,等一段时间看看,还好,己方水晶没爆。
运行一段时间,一切稳定,算是暂告一段落。
五、总结
本篇文章还有很多的不足之处,并没有找到病毒攻击的入口,又是如何入侵到系统的,挖矿的脚本究竟运行在哪?按照正常的被攻击排错方式,一开始并不顺利。总结一下系统被入侵的排查思路,只是给后来者提供一下解决思路(希望大家的系统都很健壮,不被攻击)。
- 查看系统的
CPU
和内存占用
- 查询占用系统资源过高的进程
- 排查定时任务,
crontab -l
或者/etc/cron.d
目录 - 检查异常端口,如发现,禁用端口,堵漏
- 使用
last
命令查看系统异常登录情况(一般攻击者会抹去入侵记录) - 使用
history
命令查看系统历史执行命令(一般攻击者会抹去历史命令) - 查看开机启动脚本
/etc/rc.local
,是否插入了开机启动进程 - 通过
find /etc/cron.daily/* -mtime -1
查找前一天到现在被修改的文件 - 找一台正常的机器,比较一下被修改文件的
md5
值
后续救援不如从源头堵住疏漏,平时使用系统时,可以从以下方面尽量保证系统安全:
- 检查弱口令,使用强口令,能用证书的,尽量不使用密码
- 不需要在外网访问的端口,尽量不开启,只开放在内网
- 尽量使用普通用户启动服务,不要使用
root
用户启动服务 - 系统被入侵,一般都是通过部署的服务暴露出来的漏洞,及时更新软件版本,加固系统
- 修改常用软件服务的端口,尽量不要使用原有端口
- 定时备份重要的文件数据,以防止服务器被入侵时,丢失重要数据
未完待续…
相关文章:

记一次阿里云被挖矿处理记录
摘要 莫名其妙的服务器就被攻击了,又被薅了羊毛,当做免费的挖矿劳动力了。 一、起因 上班(摸鱼)好好的,突然收到一条阿里云的推送短信,不看不知道,两台服务器被拉去作为苦力,挖矿去…...

Linux系统使用(超详细)
目录 Linux操作系统简介 Linux和windows区别 Linux常见命令 Linux目录结构 Linux命令提示符 常用命令 ls cd pwd touch cat echo mkdir rm cp mv vim vim的基本使用 grep netstat Linux面试题 Linux操作系统简介 Linux操作系统是和windows操作系统是并列…...

【问题总结】Docker环境下备份和恢复postgresql数据库
目录 文章目录 以从备份恢复forest_resources库为例一、备份数据库二、需要还原的数据库准备1 删除掉远程的库。2 重新创建一个空的库。可以使用sql3 找到数据库存放的路径,并将备份文件上传到对应的路径下 三、 进入docker容器内部,执行数据库恢复附录…...

《TCP IP网络编程》第六章
《TCP IP网络编程》第六章:基于 UDP 的服务端/客户端 UDP 套接字的特点: 通过寄信来说明 UDP 的工作原理,这是讲解 UDP 时使用的传统示例,它与 UDP 的特点完全相同。寄信前应先在信封上填好寄信人和收信人的地址,之后…...
如何学习java
-学习Java是一个循序渐进的过程,下面提供一些学习Java的方法,帮助您有效地掌握这门编程语言: 定义学习目标:明确您学习Java的目标和用途。是为了进入软件开发行业,还是用于特定项目或兴趣爱好?明确学习目标…...

RabbitMQ实现六类工作模式
😊 作者: 一恍过去 💖 主页: https://blog.csdn.net/zhuocailing3390 🎊 社区: Java技术栈交流 🎉 主题: RabbitMQ实现六类工作模式 ⏱️ 创作时间: 2023年07月20日…...
all in one (群辉、软路由、win/linux)折腾日记
目录 生命不息,折腾不止名词解释硬件参数装机 生命不息,折腾不止 因自身能力有限,可能内容质量不高,欢迎志同道合的各路大神加入,共同折腾! 名词解释 ALL IN ONE :多功能一体机 OpenWrt【软路…...

【Redis】2、Redis应用之【根据 Session 和 Redis 进行登录校验和发送短信验证码】
目录 一、基于 Session 实现登录(1) 发送短信验证码① 手机号格式后端校验② 生成短信验证码 (2) 短信验证码登录、注册(3) 登录验证① 通过 SpringMVC 定义拦截器② ThreadLocal (4) 集群 Session 不共享问题 二、基于 Redis 实现共享 session 登录(1) 登录之后,缓…...

MiniGPT4系列之二推理篇命令行方式:在RTX-3090 Ubuntu服务器推理详解
MiniGPT4系列之一部署篇:在RTX-3090 Ubuntu服务器部署步骤详解_seaside2003的博客-CSDN博客 MiniGPT4系列之二推理篇命令行方式:在RTX-3090 Ubuntu服务器推理详解_seaside2003的博客-CSDN博客 MiniGPT4系列之三模型推理 (Web UI):在RTX-309…...

Android TvSettings Bug: 密码框无法点击唤起输入法
概述 Android 10 的Box方案, 默认使用的是TvSettings作为系统设置,输入操作的习惯上是使用鼠标,键盘,遥控,日常的场景是没有问题,也不会出现本文中提及的问题。当外接的USB触摸屏后,出现无法点击…...
Windows, MacOS还是Linux好?
今天我们来聊一个小话题:选操作系统,是哪个好?今天,我以一个介绍者的身份给大家推荐,我就不出什么点子了。 Windows Windows,是一个老牌的操作系统。他的优处和短处和有很多,我们来介绍一下 优…...

Gateway自定义过滤器——全局过滤器
一、什么是全局过滤器🍉 首先,我们要知道全局过滤器其实是特殊路由过滤器(特殊的GatewayFilter),会有条件地作用于所有路由。 为什么要自定义全局过滤器?就好比是看大门的保安大叔,平时主要是做好进出大门外来人员登记…...

Android App的几个核心概念
Application启动 点击桌面图标启动App(如下流程图) 针对以上流程图示: ActivityManagerService#startProcessLocked()Process#start()ActivityThread#main(),入口分析的地方ActivityThread#attach(),这个里面的逻辑很核心 ActivityManagerS…...

window10安装telnet
1、打开控制面板 2、点击程序和功能 3、点击启用或关闭Windows功能 4、选中Telnet客户端,然后点击确定,然后就可以使用telnent 主机 端口来查看本地是否能连通该主机的该端口。...
大厂sql真题讲解(黑马)
2023 http://yun.itheima.com/open/853.html | 面试宝典-如何备战大厂SQL真题 http://yun.itheima.com/open/858.html | 面试宝典–大厂必考知识开窗函数 http://yun.itheima.com/open/864.html | 面试宝典-详解美团SQL真题 http://yun.itheima.com/open/868.html | 图解大…...

SpringBoot整合EasyExcel实现读操作
😊 作者: 一恍过去 💖 主页: https://blog.csdn.net/zhuocailing3390 🎊 社区: Java技术栈交流 🎉 主题: SpringBoot整合EasyExcel实现读操作 ⏱️ 创作时间: 2023年…...

go mod 设置国内源 windows 环境 win10
启用 go module 功能 go env -w GO111MODULEon 配置 goproxy 变量 go env -w GOPROXYhttps://goproxy.cn,direct 下载包就行了,速度飞快 go mod tidy 检测 goproxy 是否配置好 运行 go env | findstr goproxy 查看 goproxy Go module 从 Go v1.12 版本开始存在&a…...
智能决策支持系统实现的关键技术分析
1.模 型 中 的 关 键 因 素 。 在 按 本 模 型 研 究 开 发 系 统 时 ,应 当 着 重 考 虑 以 下 几 个 因 素 : (1)设 备 保 护 需 求 计 划 。 保 护 需 求 包 括 了 人 员 、 物 质 、 财 务 等 各项 因 素 ; (2)考 虑 设 备 运行 及维修的 历史数据。 这是进 行 模 型 选 择…...

OSS对象存储后端实现+Vue实现图片上传【基于若依管理系统开发】
文章目录 基本介绍术语介绍图片上传方式介绍普通上传用户直传应用服务器签名后直传 OSS对象存储后端实现maven配置文件配置类ServiceController 图片上传前端图片上传组件api页面使用组件组件效果 基本介绍 术语介绍 Bucket(存储空间):用于…...
人工智能学习目录
1、人工智能-电脑如何像人一样思考? 从发展历史到人工智能的应用案例,再到人工智能本质是数学问题,从房价预测问题提出损失函数由参数导致,再由损失函数的最优值入手引入梯度下降法,最后到多参数方程的最优求解。 人工…...
OpenWrt:使用ALSA实现边录边播
ALSA是Linux系统中的高级音频架构(Advanced Linux Sound Architecture)。目前已经成为了linux的主流音频体系结构,想了解更多的关于ALSA的知识,详见:http://www.alsa-project.org 在内核设备驱动层,ALSA提供…...
Axios学习笔记
Axios简介 axios前端异步请求库类似JQuery ajax技术, ajax用来在页面发起异步请求到后端服务,并将后端服务响应数据渲染到页面上, jquery推荐ajax技术,但vue里面并不推荐在使用jquery框架,vue推荐使用axios异步请求库。…...

小黑一层层削苹果皮式大模型应用探索:langchain中智能体思考和执行工具的demo
引言 小黑黑通过探索langchain源码,设计了一个关于agent使用工具的一个简化版小demo(代码可以跑通),主要流程: 1.问题输入给大模型。 2.大模型进行思考,输出需要执行的action和相关思考信息。 3.通过代理&…...
DuckDB + Spring Boot + MyBatis 构建高性能本地数据分析引擎
DuckDB 是一款令人兴奋的内嵌式分析型数据库 (OLAP),它为本地数据分析和处理带来了前所未有的便捷与高效 🚀。它无需外部服务器,可以直接在应用程序进程中运行,并提供了强大的 SQL 支持和列式存储带来的高性能。 什么是 DuckDB&am…...

全生命周期的智慧城市管理
前言 全生命周期的智慧城市管理。未来,城市将在 实现从基础设施建设、日常运营到数据管理的 全生命周期统筹。这将避免过去智慧城市建设 中出现的“碎片化”问题,实现资源的高效配 置和项目的协调发展。城市管理者将运用先进 的信息技术,如物…...

Golang——5、函数详解、time包及日期函数
函数详解、time包及日期函数 1、函数1.1、函数定义1.2、函数参数1.3、函数返回值1.4、函数类型与变量1.5、函数作参数和返回值1.6、匿名函数、函数递归和闭包1.7、defer语句1.8、panic和recover 2、time包以及日期函数2.1、time.Now()获取当前时间2.2、Format方法格式化输出日期…...

python打卡day46@浙大疏锦行
知识点回顾: 不同CNN层的特征图:不同通道的特征图什么是注意力:注意力家族,类似于动物园,都是不同的模块,好不好试了才知道。通道注意力:模型的定义和插入的位置通道注意力后的特征图和热力图 内…...

制作个人Github学术主页
1.fork一个模板 从模板网站Jekyll Themes fork一个模板,并在repository name里填入yourname.github.io 2.生成自己的site 按顺序点击以下按钮,修改Branch为master /root 然后点击save ,等待一会后刷新,便会生成一个新的site。 3.…...

深入理解 transforms.Normalize():PyTorch 图像预处理中的关键一步
深入理解 transforms.Normalize():PyTorch 图像预处理中的关键一步 在使用 PyTorch 进行图像分类、目标检测等深度学习任务时,我们常常会在数据预处理部分看到如下代码: python复制编辑transform transforms.Compose([transforms.ToTensor…...

C语言字符数组初始化的5种方法(附带实例)
所谓初始化,就是在定义的同时进行赋值。 C语言中,初始化字符数组的方式多样,每种方式都有其特定的用途和优势。 1、使用字符串字面量初始化 最常见和简洁的初始化方式是使用字符串字面量。在这种方法中,我们直接将一个用双引号…...