Linux终端注意了!隐蔽性更强的后门木马Rmgr来了

发布者:深信服千里目
发布于:2021-09-22 14:47

背景概述

安全团队近期捕获到一个后门木马样本,是一个64位的Linux内核模块,根据代码中出现的关键词将其命名为Rmgr木马。该木马病毒会连接恶意域名,隐藏本身的进程,并对终端植入后门,用于后续进行其他入侵行为。

经过研究人员分析,木马包含如下几个文件:

执行流程

木马的母体文件只有 rmgr.ko 这一个文件,通过 insmod 命令装载到内核模块后开启运作,逐步释放木马的其他组件部分。木马本身作为一个内核模块,具有ring0的权限,可以从内核层面实现隐藏进程、文件、端口等操作,相较于ring3具有更强的隐藏能力。

 

样本分析

rmgr.ko 分析

隐藏自身模块

模块隐藏对自身进行了隐藏处理

其代码效果等同于如下:

list_del(&THIS_MODULE->list); //实现 lsmod 的隐藏
kobject_del(&THIS_MODULE->mkobj.kobj); //实现 /sys/modules 的隐藏

随后还通过底层替换 /proc/modules 文件的show函数过滤了ati_remote3模块的显示

隐藏进程加载模块

我们在使用诸如 cat /proc/PID/maps 这样的指令查看进程加载的模块时,底层会调用到 seq_path 函数,木马则使用了 register_kretprobe 技术对 seq_path 实施了监听,只要检测到路径为 /tmp/.tmp_ 开头的模块则将其信息隐藏,可实现 /proc/PID/maps 中木马模块的隐藏

隐藏文件

木马通过hook的方式替换了 sys_getdents 系统调用,然后执行如下流程: fake_sys_getdents -> vfs_readdir -> fake_filldir

fake_filldir 函数中可以看到模块隐藏了/proc/[PID]、/tmp/.tmp_*、模块自身以及所释放的数个文件,这样 ls 命令就再也看不到这些文件了

 

只有在明确知道文件名的情况下才能看到被隐藏的文件,增强了木马的隐蔽性

隐藏端口

木马还替换了 /proc/net/tcp 文件的 seq_show 函数,隐藏 6825/6826/6821/6822 端口

内核与用户态进程间通信

创建 /proc/.dot3 文件用于接受用户态进程的指令

在 proc_create_data 的第四个参数中,/proc/.dot3 文件的写入和读取操作分别由 dot_write 和 dot_open 控制

先看看 dot_write 的内容,通过switch case分支条件可以看出外部进程对 /proc/.dot3 写入不同的内容可以实现不同的功能:

这里是总结出来的功能列表:

• 8字节长度指令

– 0xFF11 = 向木马内核模块注册写入该命令的进程,该进程及子进程将会受到内核的保护

– 0x55AA = 更新木马内核模块的文件信息

– 0x66BC = 控制C2服务器的交互频率

– 0x66BD = 向指定进程注入rmgr_inject.so文件,替换部分C库函数

– 0x66BE = 取消0x66BD指令

• 40字节长度指令

– 0xA43F = 查看 rmgr_inject.so 文件的路径

– 0xA45F = 更新 rmgr_inject.so 文件的路径

– 0xF33F = 更新 rmgr.elf 文件的路径

– 0xF34F = 查看 rmgr.elf 文件的路径

• 其他非指令数据

– 直接存入内核缓冲区,其内容可以通过直接读取 /proc/.dot3 文件获得

/proc/.dot3 的写入功能分析完了,再看看读取部分。读取功能实际是由 dot_show 函数实现:

我们再看看 dot_show 的操作:

木马在读取的进程上做了限制,只允许 rmgr.elf 进程读取,而所读取到内容即是前面提到的向 /proc/.dot3 中写入的非指令数据

启动内核线程

完成前面的工作后,启动 dot_thread 线程

然后释放 rmgr_inject.so 和 rmgr.elf 文件,并使用 /bin/chmod 命令赋予了 755 权限

随后以 [khelper] 为名称启动了 rmgr.elf 进程

rmgr_inject.so 分析

rmgr_inject.so 是一个动态链接库,可以通过LD_PRELOAD环境变量及/etc/ld.so.preload等方式注入到普通进程中,达到替换C库函数的目的

rmgr_inject.so 替换了 bash_add_history 函数,将用户执行过的命令一一记录,储存到/proc/.dot3文件中,可供将来发回C2服务端

同时监控 ss 指令,隐藏26660/26661/26662/26657/26658/26659这几个端口

rmgr.elf 分析

rmgr.elf加了UPX壳,脱壳后的函数列表如下:

可以看出该二进制文件是由C++编写的。经过分析后得知该文件包含两个类,rmgr_client类处理与C2服务器的交互,sshd_client类处理与sshd后门的交互

利用内核模块隐藏进程

 

进程启动后首先第一件事就是向 /proc/.dot 写入 0xFF11 指令获得保护,利用rmgr.ko 的ring0权限隐藏自身进程以及子进程

与C2服务器通信

随后与 hm2.yrnykx.com C2服务器进行连接,等待指令

rmgr_client::handle_read_body 函数负责处理C2服务端发来的命令

这里整理了一份可供C2服务端调用的功能指令,列表如下:

• 0x1000F = 从C2服务端下载更新木马的所有组件

• 0x10008 = 未知功能

• 0x1000A = 创建一个新的sshd后门会话

• 0x1000B = 关闭指定的sshd后门会话

• 0x10004 = 读取 /proc/.dot3 中储存的内容,发往C2服务器

• 0x10007 = 接收文件

• 0x10011 = 启动sshd后门

• 0x10012 = 停止sshd后门

• 0x10010 = 暂停sshd后门

其中比较值得注意的是,收到0x10011指令后,rmgr.elf会从自身释放出 rmgr_sshd.elf 后门文件并启动,这是个被修改过的openssh服务,后面会有这个文件的分析

创建好ssh后门后(监听地址是127.0.0.1:26657),C2服务端便可使用 0x1000A 指令连接,此时C2服务器和ssh后门的流量会通过sshd_client类进行处理和转发

rmgr.elf 还存在下载替换 /usr/sbin/sshd、/usr/bin/ssh、/lib/modules/%s/kernel/drivers/input/misc/ati_remote3.ko、/etc/sysconfig/modules/ati_remote3.modules 文件的行为,但一直没等到这些行为的触发

rmgr_sshd.elf 分析

rmgr_sshd.elf 由rmgr.elf释放,本身是一个被修改过的openssh,用于提供ssh后门。该后门的配置文件是硬编码的,监听地址为127.0.0.1:26657

ssh中硬编码的私钥文件:

这个ssh后门的认证函数还被修改过了,不论输入什么密码都会直接认证成功

由于ssh后门的监听地址位于本地,因此从外部扫描是观察不到这个后门存在的,并且只能通过rmgr.elf中的sshd_client对象进行流量转发访问。

IOC

rmgr_inject.so: MD5 a4013790035fc3021546c09e9cf85df1

rmgr.elf: MD5 5ecf30b7a6221af8f209a7b6681f91f9

rmgr_sshd.elf: MD5 7d859a22f38f0bcd55a46bc8b67c40df

rmgr.ko: MD5 82bf8e99391ec0cdc527f2fc94621899

hxxp://hm2.yrnykx.com

深信服安全产品解决方案

1.深信服安全感知管理平台SIP、下一代防火墙AF、终端响应检测平台EDR用户,建议及时升级最新版本,并接入安全云脑,使用云查服务以及时检测防御新威胁;

2.深信服安全产品集成深信服SAVE人工智能检测引擎,拥有强大的泛化能力,精准防御未知病毒;

3.深信服推出安全运营服务,通过以“人机共智”的服务模式帮助用户快速提高安全能力。针对此类威胁,安全运营服务提供安全设备策略检查、安全威胁检查、相关漏洞检查等服务,确保第一时间检测风险以及更新策略,防范此类威胁。


作为国内前沿的网络安全厂商,深信服多年来持续投入勒索防护研究,内容涵盖黑产洞察、病毒研究、情报追踪、投放分析,并沉淀出完整覆盖突破边界、病毒投放、加密勒索、横向传播等勒索攻击链的系统性解决方案,目前已协助1000+各行业用户有效构建起了勒索病毒防护最佳实践。


声明:该文观点仅代表作者本人,转载请注明来自看雪