一次 “无文件”、“无进程”,在系统中 “几乎” 看不到异常的高配挖矿病毒处置实例 。
0x00 正经的内容介绍
本文记录了一次表象是 “无文件”、“无进程”,在系统中 “几乎” 看不到异常的高配挖矿病毒处置实例 ,包括处置过程,以及逆向分析其 原理实现,感兴趣的朋友我们一起抽丝剥茧,拨云见日。
通过本文可以收获到:
几个
Linux
应急处置小知识看不到文件、网络、进程?背后的原理解析!
几个过时的表情包
0x01 不正经的事件概述
2021 年 1 月份的一个阳光明媚的日子,虚拟化管理软件发现虚拟机列表界面里,有一台机器拥有色彩鲜艳且顶格显示的CPU
利用率指示条 ,显然是虚拟机中最靓的仔,此事必有蹊跷。
0x02 事件表现
2.1 CPU 占用率内外不符
服务器是运行在虚拟化的机器,在虚拟化管理软件中可以查看每台虚拟机的各项资源统计信息,出现异常的服务器在虚拟化管理软件中CPU占用率指示条直接顶格显示,就像这样:
但是在服务器中使用 top 等命令看到的 CPU 使用率却很低,并没有完全达到 100%,就像这样:
2.2 系统中未发现奇怪配置
查看系统中存在的 定时任务、服务、启动项均未发现有不对劲的情况,并且对系中常见目录下的文件进行列举,也未发现可疑文件,甚至怀疑是不是虚拟化管理软件有 BUG 了,初次检查后得到的结论:
0x03 百密必有一疏
检查一遍后发现事情没有那么简单,一通操作后竟毫无收获,这怎么行!
考虑下,文件、进程都看不到异常,很有可能是被隐藏了,先检查下系统命令的修改时间(虽然可以刻意修改),粗略看一下有没有被替换:
好家伙,这事情变得有意思了,既然是 CPU 高占用,那还是从进程入手吧,top 命令看不到,那就换一个,装个 htop 看一下。
直呼内行,头一次见规格这么高的挖矿病毒,据我所知,有一种从天而降的掌法(手段)可以实现通用性较强的隐藏效果,那就是 LD_PRELOAD。
LD_PRELOAD 是 Linux 系统的一个环境变量,它可以影响程序的运行时的链接(Runtime linker),它允许你定义在程序运行前优先加载的动态链接库。
这个功能主要就是用来有选择性的载入不同动态链接库中的相同函数。通过这个环境变量,我们可以在主程序和其动态链接库的中间加载别的动态链接库,甚至覆盖正常的函数库。
一方面,我们可以以此功能来使用自己的或是更好的函数(无需别人的源码),而另一方面,我们也可以以向别人的程序注入程序,从而达到特定的目的。(划重点)
这个机制可以按 Windows 系统中的 DLL 劫持来理解。
来检查一下 /etc/ld.so.preload:
好家伙,还是直接上 busybox 吧。
BusyBox 是一个集成了 N 多个最常用 Linux 命令和工具的软件。BusyBox 包含了一些简单的工具,例如 ls、cat 和 echo 等等,还包含了一些更大、更复杂的工具,例 grep、find、mount 以及 telnet 。有些人将 BusyBox 称为 Linux 工具里的瑞士军dao。简单的说 BusyBox 就是个大工具箱,它集成压缩了 Linux 的许多工具和命令。
使用busybox
再次查看/etc/ld.so.preload
,可以发现,文件是存在的,通过内容也可以看到恶意库文件的路径,至此可以判定此动态链接库对系统函数进行了过滤拦截,隐藏了不想让我们看到的信息。
有朋友可能要问了,判断是否使用该机制,难不成只有这一种方式? 当然不是,这里可以使用ldd
命令来查看动态链接库的依赖关系,正常系统下的输出是这样的:
But,引入运行时链接机制后,当前实例场景中是这样的:
既然动态链接库有别的法子看,那 CPU 使用率呢?当然也有的,可以用vmstat
来看:
其中 CPU 使用率相关的列字段代表的含义如下:
名称 | 描述 |
---|---|
us | 用户进程执行时间(user time)(单位为百分比) |
sy | 系统进程执行时间(system time)(单位为百分比) |
id | 空闲时间(包括 IO 等待时间),中央处理器的空闲时间 (单位为百分比) |
wa | 等待 IO 时间(单位为百分比) |
可以发现,病毒过滤的再多肯定也会有遗漏的地方。
回到正题,接下来使用busybox
中的top
再次查看 CPU利用率,占用最高的仔,就它了。
好了,水落石出,接下来就可以进行清理,关进程删文件一气呵成,要注意的是需要使用busybox
中的命令代替系统命令进行清除操作。
然鹅,事情还是没有那么简单,删除文件居然告诉我没有权限,真是对不上我 root 身份。
看一下文件属性,嗯~ 熟悉的味道,移除文件属性,继续删除即可。
另外通过逆向能够发现,病毒修改了/etc/resolv.conf
,贴心的为系统配置了 DNS 服务器,防止访问不到它的域名。
以及将公钥写入/root/.ssh/authorized_keys
,在清理时需要一并恢复至原始状态。
0x04 原理解析
回顾一下,为何看不到文件? 为何看不出网络、进程的异常?,这里一起来分析一下原理。
既然要分析,必然少不了逆向,将动态链接库libcurl.so.2.17.0
扔到 IDA 中看一哈,正是因为该链接库对关键函数进行了 Hook,也可以理解为过滤,所以才没有办法使用ls
、top
、netstat
等命令发现异常。
举个栗子,通过ls
源代码,能够发现是通过调用readdir
函数实现文件列举功能,那么,如果我们修改了这个函数,是不是可以控制ls
的执行结果呢?
是的,聪明的你肯定已经想到了,在该恶意库文件中,确实存在针对readdir
函数的过滤行为,判断当前列举出的是否为病毒相关的文件,是则跳过,不是则保留,从而达成了隐藏文件目的。
同理,该恶意库文件也对open
、fopen
、kill
等函数进行过滤,比如kill
函数的逻辑如下。
这么一操作,只要库被加载了,就永远也不可能使用自带的kill
命令操作病毒相关进程,也不能使用ls
等命令找到病毒相关的文件。
这波啊,是障眼法,文件及进程并没有真的消失,只是想瞒天过海。
0x05 总结一哈
通过本文,介绍了应急处置小思路、 Linux 系统下的一种隐藏手段及背后原理。
个人认为,真实应急过程中并无绝对的操作定式,需要根据现场实际环境,对自己掌握的各种技巧进行组合发挥,文中介绍的只多列举了一种方法,当然还有其他方法可以使用,这里给自己挖个坑,有时间整理一下不常见的排查方法,同时也给感兴趣的朋友留个种子引子,毕竟学习是多么快乐的一件事~
作者:Zero