SkidMap是于2019年发现的一种 Linux 恶意软件,加载内核态Rootkit,来隐藏恶意挖矿活动 。它的出现也证明了加密货币挖掘威胁的复杂性在不断增加。
1.异常定位
某日,发现主机时常宕机重启,top命令并无发现高占用进程,但是发现有可疑的下载命令。由于用户态无法发现其他异常现象,怀疑有Rootkit植入。
2.取证分析
2.1 内核取证分析
用户态行为已经被隐藏,无法发现新的异常。首先尝试安装rkdetect检测工具。但是加载后发生 kernel panic,系统自动重启,怀疑有Rootkit阻止新的内核模块加载。
尝试使用在线内存取证的方式,来判断机器是否已经植入Rootkit。利用system.map确定sys_call_table地址。
确定内核text节区的范围。
以及一些常见的和文件操作相关的系统调用函数地址。
排查是否存在sys_call_table系统调用劫持情况,发现sys_call_table+98地址不在内核text节区段范围内。
跟进地址0xffffffffa06dfe30发现,内核符号表并未识别为正常系统调用。
根据偏移98,可以确定sys_bind系统调用函数地址被替换,发生了函数劫持。继续排查,发现sys_getdents系统调用函数地址被替换。
分析execve系统调用。
跟进地址,发现callq指令的地址不是sys_execve函数的地址,而是一个用户态函数地址0xffffffffa06c9c10。
跟进0xffffffffa06c9c10函数,可以发现通过判断进程名,kill指定进程的操作。
分析account_user_time函数,其过程序言被替换为了jmp指令,跳转到0xffffffffa06ef160地址,发生函数蹦床劫持。目的是劫持自上次更新后在用户空间CPU使用时间。
分析moudle_frob_arch_section函数,其过程序言被替换为了jmp指令,跳转到0xffffffffa06f1380地址,发生函数蹦床劫持。目的是阻止新的内核模块加载。
派遣例程的寄存器没有被劫持,保存的是sys_call_table地址。
通过内核内存分析发现确实存在植入内核态Rootkit的痕迹。
2.2 用户态取证分析
调查用户态痕迹,发现存在可疑authoried_keys免密登录公钥。
远控证书文件rctl_ca.crt。
通过绝对路径,发现可疑的jpeg可执行文件。
Jpeg被upx压缩unpatch后,其文件大致功能:下载挖矿程序以及Gold7系列恶意文件并执行。
Gold7.tar.gz解密key以及命令包含在jpeg文件里。
jpeg删除中间过程的程序以及清理计划任务、日志。
jpeg中两个Rootkit的内核模块ko文件路径。
kmeminfo.ko使用netfillter hook,过滤特定数据包。
mcpuinfo.ko文件使用了直接替换sys_call_table系统调用,挂钩虚拟文件系统函数指针、删除module双向链表以及kobject对象等方式,实现端口、文件、进程、内核模块等隐藏功能。两个Rootkit的功能都在内存取证阶段得到验证。
隐藏文件只是在文件目录显示上做了隐藏处理,当已知文件名和文件路径时可以直接查看。
因此,可以发现Gold7.tar.gz包含的一系列远控程序、自启动服务配置文件和服务程序在机器中的存在情况。
3.清除Rootkit
清除LKM型Rootkit,总体思路是破坏Rootkit重启后自动加载的条件,两个内核模块,通过两个自启动的系统服务,实现系统重启后自动加载Rootkit。
首先删除ko文件本体,清除系统服务、系统服务配置文件、用户态痕迹文件,其次,关闭kprobes机制,加固Redis防止二次感染。
Clear.sh清除程序以及所有链接文件,恢复ssh、scp文件,禁用恶意系统服务,开启审计服务。
向/sys/kernel/debug/krpobes/enabled文件写入0,禁用kprobes机制。
重启后,两个恶意系统服务没有加载,免密登录的公钥文件没有生成。
4.事件总结
本次属于 SkidMap 内核态 Rootkit 攻击事件,攻击者利用 Redis 未授权访问漏洞入侵主机,添加SSH公钥,以持久化远控失陷主机,下载包含挖矿木马、内核态Rootkit 的 Gold7.tar.gz 恶意软件压缩包,安装后接受远程指令,清除系统审计日志,关闭SELinux,加载内核态Rootkit,安装系统服务实现Rootkit二次自动加载,最终隐藏恶意挖矿行为。