前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >服务器遭遇挖矿:追踪与解决之路

服务器遭遇挖矿:追踪与解决之路

作者头像
叔牙
修改2024-01-24 11:13:06
3730
修改2024-01-24 11:13:06
举报

一、问题与现象

1.服务器无法登录

nc命令检查22端口是否开放,返回拒绝,然而如果端口没有开的话应该返回timeout,refused代表sshd进程没起来或者已经挂掉了。

2.cpu负载特别高
3.进出流量特别大
4.应用程序起不来

docker中安装了redis和mysql,容器都起不来:

代码语言:javascript
复制
Error response from daemon: failed to create shim task: 
OCI runtime create failed: runc create failed: 
unable to start container process: waiting for init preliminary
 setup: read init-p: connection reset by peer: unknown

二、尝试解决

刚开始感觉服务器被攻击了,没有往被挖矿上边想,尝试用一下解决方案处理:

1.修改公网ip

把原来的公网ip解绑,绑定新的静态ip。

2.重启服务器

由于登录不进去服务器,无法进行任何操作,所以要重启服务器,让sshd系统进程启动,才能进去服务器进行操作。

3.解决程序无法启动

在网上找到了类似的docker容器无法启动报错类似的案例《docker启动容器提示read init-p: connection reset by peer: unknown问题》

ld.so.preload是动态链接库预加载机制,也是系统提供给用户运行自定义动态链接库的一种方式,在可执行程序运行之前就会预先加载用户定义的动态链接库的一种技术。当然攻击者也可以修改动态链接器来实现恶意功能,例如修改动态链接器中默认的用于预加载的配置文件路径/etc/ld.so.preload为攻击者自定义路径,然后在里面写入待加载的恶意动态链接库。

发现/etc/ld.so.preload已经被重写,/etc/data/libsystem.so内容如下:

将动态连接库清空:

代码语言:javascript
复制
echo " " > /etc/ld.so.preload

将动态链接内容清空之后,应用程序启动问题解决了,但是观察监控cpu依旧负载比较高,网络进出流量仍然比较大。

4.cpu负载很高解决

通过top -c命令看到有个进程负载很高

在检查确认不是我们系统或者业务进程之后,尝试数次kill -9,但是进程都重新启动了,并且网上关键一搜全是挖矿的帖子,机器被挖矿无疑了。确定不是简单的强制kill进程那么简单了。

三、进程死而复生

有帖子说,通过ps命令找到kdevtmpfsi的父进程,将父进程kill掉即可,但是kdevtmpfsi的父进程号是1,这个是系统进程systemd的进程号,kill掉它,系统就挂了。

通过systemctl status pid命令查看进程状态、资源占用信息以及守护进程等信息

前边有讲到kdevtmpfsi进程数次被kill之后,又重新启动,肯定和kinsing有关,那么索性直接把kdevtmpfsi和kinsing资源路径删掉,然后再把两个进程kill掉:

代码语言:javascript
复制
# 删文件
rm -rf /tmp/kdevtmpfsi
rm -rf /etc/data/kinsing
# 杀进程
kill -9 1089 30082

然而,只是平静了一会儿,发现kdevtmpfsi进程又起来了,kinsing进程也在。。。

四、消灭kdevtmpfsi和kinsing

既然被攻击了,那么可能系统自带的crontab程序也被改写了,通过crontab -l查看有哪些任务

每分钟去一个俄罗斯莫斯科的ip静默下载rm.sh脚本,并且通过管道符直接bash执行不输出任何日志。。。

等我想去下载下来脚本看看内容的时候,发现大哥已经把服务停了

从这里来看,应该对于kdevtmpfsi进程有两层防被kill保护,一个是kinsing守护进程,一个是这个crontab任务。

那么方案应该相对清晰明了了,按照如下步骤逐一按顺序执行:

1.删除任务

可以删除任务重启系统调度:

代码语言:javascript
复制
crontab -e
#删除任务行,保存
systemctl restart crond

如果单单是这台机器,根本用不到系统调度的话,那么简单粗暴直接停掉crontab:

代码语言:javascript
复制
systemctl stop crond
2.删除kdevtmpfsi和kinsing资源路径

先全局查找kdevtmpfsi和kinsing资源路径

代码语言:javascript
复制
find / -name "kdevtmpfsi"
find / -name "kinsing"

然后把找到的路径删掉。

3.关停kdevtmpfsi和kinsing程序

找到kdevtmpfsi和kinsing进程id,然后直接kill -9

代码语言:javascript
复制
kill -9 pid pid

五、检查与防护

通过上述操作后,kdevtmpfsi和kinsing进程再也没用重新启动,通过清除挖矿程序的经历可以思考遇到类似问题如何排查,以及如何做服务器防护加固。

1.检查
  • top揪出来异常程序
  • systemctl status pid查看进程信息,并揪出来关联或者守护进程
  • find / -name "xxx"找出异常程序资源路径
  • crontab -l 检查和删除异常任务
  • 使用一些工具扫描磁盘,并清理垃圾文件
2.服务器加固
  • 收敛公网开放端口,除了80和443,原则上不应该在开放其他端口,如果用了alb或者云网关,80和443端口也不用对外开放
  • 基础服务和业务服务程序,尽量不要用root账户启动,如果程序有漏洞,那么入侵者就拥有了最高执行权限
  • 对于一些开源包和工具服务,要保持相对谨慎的态度,可能他的漏洞会成为攻击者的切入点
  • 关闭ssh账密登录能力,使用证书登录,或者如果有内网环境和跳板机环境,22端口根本不用暴露
  • 关闭ssh隧道和转发能力,禁止使用ssh作为跳板访问内网其他资源
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-01-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 PersistentCoder 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、问题与现象
    • 1.服务器无法登录
      • 2.cpu负载特别高
        • 3.进出流量特别大
          • 4.应用程序起不来
          • 二、尝试解决
            • 1.修改公网ip
              • 2.重启服务器
                • 3.解决程序无法启动
                  • 4.cpu负载很高解决
                  • 三、进程死而复生
                  • 四、消灭kdevtmpfsi和kinsing
                    • 1.删除任务
                      • 2.删除kdevtmpfsi和kinsing资源路径
                        • 3.关停kdevtmpfsi和kinsing程序
                        • 五、检查与防护
                          • 1.检查
                            • 2.服务器加固
                            相关产品与服务
                            容器服务
                            腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                            领券
                            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档