暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

详细解决服务器的挖矿病毒和端口扫描器

一个八月想偷懒的开发坑 2021-05-17
1970
看完点亮,支持作者






前言

        5月8号上班,阿里云服务器状态异常,终端连接服务器发现很卡而且很慢,clickhouse 无法连接(服务器带宽占满导致无法连接),通过 top 查看服务器性能指标发现最近几分钟的 CPU 占到 50% 左右,并且一直持续,但没看到耗 CPU 的进程,通过 jnettop 监控进程网络流量,没发现特别占带宽的进程,通过阿里云控制台的服务器监控发现,从 8 号半夜开始异常情况开始,CPU 持续稳定于 50% 左右,带宽持续稳定跑满(2 Mbps = 256 kb/s),确定服务器被攻击;






排查问题

服务器配置


问题1:ps、top 命令被篡改无法显示挖矿病毒进程
        百度了 Linux top 原理:Linux 的设计哲学是一切皆文件!进程也不例外, Linux系统中有一个特殊的目录:/proc/,这个目录下的内容,不是硬盘上的文件系统,而是操作系统内核暴露出的内核中进程、线程相关的数据接口,也就是 procfs,里面记录了系统上正在运行的进程和线程信息,这些以数字命名的目录,就是一个进程的 PID,里面记录了该进程的详细信息,而 ps、top 等命令的工作原理,实质上就是遍历这个目录,因此隐藏进程的方法有:
  • 通过命令替换:直接替换系统中的 ps、top 命令工具,可以从 GitHub 上下载它们的源码,加入对应的过滤逻辑,在遍历进程的时候,剔除挖矿进程,实现隐藏的目的;

  • 通过模块注入:编写一个动态链接库 so 文件,在 so 中,HOOK 遍历相关的函数(readdir/readdir64),遍历的时候,过滤挖矿进程;通过修改 LD_PRELOAD 环境变量或 /etc/ld.so.preload 文件,配置动态链接库,实现将其注入到目标进程中;

  • 内核级隐藏:模块注入的方式是在应用层执行函数 HOOK,隐藏挖矿进程,更进一步,可以通过加载驱动程序的方式在内核空间 HOOK 相应的系统调用来实现隐藏,遇到这样的病毒清理起来挑战也更大了;


问题2:带宽占满,但查看网络流量后无发现特别大耗带宽的进程

        在通过 jnettop 监控进程网络流量时,没有发现某个进程的传输数据包太大而占带宽,但发现十几个陌生 IP 进程,而且都是 6379 端口(前一天才刚装 Redis,所以可以确定是通过6379端口进来的);

问题3:被修改 ~/.ssh/authorized_keys 文件
        病毒添加了 RSA 密钥登录凭证,留下一个后门,随时都能远程登录进来;


问题4:病毒进程 kill 后会重新启动,检查系统的定时任务

        在查找到挖矿病毒和端口扫描器脚本进程后,观察这些进程,发现进程的 PID 会经常改变,kill 后会重新启动,所以怀疑可能是在系统添加定时任务;




解决过程

删除 ~/.ssh/authorized_keys 里的登录凭证公钥
  1. lsattr 查看 authorized_keys 文件属性:lsattr authorized_keys;

  2. chattr 移除追加属性:chattr -a authorized_keys;

  3. 编辑 authorized_keys 里删除登录凭证:vim authorized_keys,后 dd 删除某行;

  4. chattr 增加锁定文件属性:chattr +i authorized_keys;

chattr 命令详解:


使用 htop 查询进程信息并 kill
        htop 是一个支持用户交互的进程查看器,具有树状方式查看进程、颜色主题定制等特性,概括来说,htop 工具是 top 工具的升级版,yum install htop 进行安装,htop 进入监控台;


检查系统定时任务
        在 /etc 下 ls -lrt -d cron* 查看定时任务脚本,发现都被修改,进入 cron.d 发现是空的,再 crontab -l 发现任务列表为空,那就是病毒启动了守护进程并依赖系统定时进程,或者父进程是 systemed;


查询病毒守护进程/父进程,并关闭和移除
  1. htop 查看进程 PID;

  2. 查看父进程:cat /proc/PID/status,PPid 就是父进程;

  3. 病毒直接作为一个系统服务进程,PID=1 是系统的第一个进程,即 systemd(系统守护进程),查看系统所有正在运行的且类型为 service 服务 systemctl list-units --type=service --all --state=active,果不其然发现 crypto.service,因为父进程是 systemd,所以 kill 后会重新启动(因为 systemd 依赖了定时任务服务),而且还找到了 dkscan.service 和 scan.service,扫描端口服务的也注册成系统服务;
  4. 关闭病毒服务:systemctl stop crypto.service,端口扫描的关闭也同理;

  5. 禁用病毒服务:systemctl status crypto.service 查看系统服务的状态,并在 systemd 默认目录(/etc/systemd/system)里找到进程文件位置,cat crypto.service 查看文件内容,发现依赖多用户 Target(一组 Unit 的集合)和默认的 Target,那么可以禁用该系统服务 systemctl disable crypto.service ,会自动取消开机重启(Removed symlink /etc/systemd/system/multi-user.target.wants/crypto.service.);

  6. 移除病毒服务:删除病毒进程文件,删除 /etc/systemd/system 下的 crypto.service、dkscan.service、scan.service 文件,再查询进程状态 systemctl status crypto.service,报 Unit crypto.service could not be found,卸载系统病毒服务成功!


清除挖矿病毒和端口扫描器文件
        通过 htop 监控面板看出,[crypto].pid 稳定消耗 CPU,pnscan 是挖矿蠕虫病毒,masscan 则是端口扫描器,进入所在目录位置清除文件;

而 htop 监控面板内没有 masscan 进程的位置,可以通过 ls -l /proc/pid/exe 找出文件所在位置,删除文件再 kill 进程即可(因为没有注册成系统服务,所以可以直接杀掉啊);




推测下被入侵原因

        前一天运维刚装完 Redis,隔天流程就被入侵并植入挖矿病毒和端口扫描器,原因可能是由于 Redis 可以直接直接通过IP:port 访问,因为不配置密码或者密码过于简单,也打开外网端口,所以在通过 redis-cli 修改数据持久化路径指定到.ssh/authorized_keys,将自己的 ssh 公钥持久化到服务器公钥,就可以直接 ssh 登录服务器进行操作;

        解决:更改 Redis 默认端口,且在 Redis 的配置文件里加上密码验证,这样在 redis-cli 里不用密码是没有办法进行操作的,且可以在配置文件里 bind 固定地址才可以访问 Redis,启动机器的防护墙;

(完)

识别二维码,关注我,不定时更


文章转载自一个八月想偷懒的开发坑,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论