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

2021-09-23 6,530

背景概述

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

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

微信截图_20210901163921.png

执行流程 

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

图片20.png

样本分析

rmgr.ko 分析

隐藏自身模块

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

图片21.png

其代码效果等同于如下:

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

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

图片22.png

图片23.png

隐藏进程加载模块

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

图片24.png

图片25.png

隐藏文件

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

图片26.png

图片27.png

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

图片28.png

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

图片29.png

隐藏端口

图片30.png

图片31.png

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

内核与用户态进程间通信

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

图片32.png

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

图片33.png

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

图片34.png

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

• 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 函数实现:

图片35.png

我们再看看 dot_show 的操作:

图片36.png

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

启动内核线程

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

图片37.png

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

图片38.png

图片39.png

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

图片40.png

rmgr_inject.so 分析

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

图片41.png

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

图片42.png 

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

rmgr.elf 分析

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

图片43.png

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

利用内核模块隐藏进程

图片44.png

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

与C2服务器通信

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

图片45.png

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

图片46.png

这里整理了一份可供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服务,后面会有这个文件的分析

图片47.png

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

图片48.png

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

图片49.png

rmgr_sshd.elf 分析

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

图片50.png

ssh中硬编码的私钥文件:

图片51.png

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

图片52.png

由于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

本文作者:Further_eye

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/166696.html

Tags:
评论  (0)
快来写下你的想法吧!

Further_eye

文章数:254 积分: 2030

深信服科技旗下安全实验室,致力于网络安全攻防技术的研究和积累,深度洞察未知网络安全威胁,解读前沿安全技术。

安全问答社区

安全问答社区

脉搏官方公众号

脉搏公众号