日常在逛公众号时发现一篇文章,主要是讲趋势科技于 2022 年 5 月记录了Reptile Rootkit 的首次使用,涉及追踪为 Earth Berberoka的入侵。该入侵集被发现使用该恶意软件来隐藏与跨平台 Python 木马相关的连接和进程。在针对中国赌博网站的攻击中被称为 Pupy RAT。
而在此次攻击技术中,相关微信公众号作者推荐sandflysecurity开源的一款检测Linux LKM rootkit检测工具,用来检测隐藏的rootkit进程,https://github.com/sandflysecurity/sandfly-processdecloak
在相关项目github主页写道 “sandfly-processdecloak 是一个实用工具,用于快速扫描被常见和不太常见的可加载内核模块隐蔽根套件隐藏的 Linux 进程 ID (PIDs),并将其显现出来,以便可以被看到。”
看到这里就有点感兴趣了,隐藏进程、rootkit、木马、后门,这不就是我们日常工作接触最多的嘛?那我就得好好看这个项目,学习学习。
在github我们找到他的主程序,查看整个程序流的过程,在main函数里面,主要就是先通过processutils.DecloakPIDs()来获取到隐藏的pid,然后再根据这个返回的数组进行遍历,最后输出我们的结果。也就是说核心功能,在processutils这个文件里面。
进入到processutils文件里,先不看DecloakPIDs()这个函数,先看看文件开头写的东西,主要是配置信息,这个主要定义最小进程pid号和最大pid号,以及进程的状态信息。
进入到DecloakPIDs()这个函数,在循环内部,是直接调用IsPidHidden进行检查
进入到IsPidHidden,先调用PidMaps,来获取进程的/proc/pid/maps的文件信息
可以很明显的看到,这里是直接读取/proc/pid/maps这个文件,获取指定 PID 的内存映射信息,返回该进程的映射列表,在IsPidHidden里面进行进一步的分析
回到IsPidHidden,判断maps如果不为空的情况下,会使用Status函数来判断当前pid进程的状态
而判断pid进程状态,也是比较简单粗暴,也是和获取maps信息一样,直接读取/proc/pid/status文件来获取相关信息
当以上信息获取到以后,就通过os.Lstat来看相关进程目录,检查 /proc/[PID] 目录是否可访问(使用 os.Lstat)。如果无法访问,说明该进程可能被隐藏。
上面检查完后,还会进一步的进行检查,读取 /proc 目录下的所有文件,确认该 PID 是否在其中。如果不在,则标记为隐藏。
总结:
-
遍历所有 PID:DecloakPIDs 函数从 1 到 4194304 遍历所有可能的 PID。 -
检查每个 PID:对于每个 PID,调用 IsPidHidden 函数进行检查。 -
读取映射信息:在 IsPidHidden 中,首先尝试读取 /proc/PID/maps 文件。如果该文件存在且有内容,说明该进程可能是活动的。 -
检查目录可访问性:接下来,使用 os.Lstat 检查 /proc/PID 目录是否可访问。如果无法访问,说明该进程可能被隐藏。 -
确认 PID 是否在/proc目录中:如果上一步未发现隐藏,程序会读取 /proc 目录下的所有文件,确认该 PID 是否存在。 -
双重验证:如果发现 PID 被标记为隐藏,程序会等待一秒钟后再次检查,以确认该 PID 确实是隐藏的,而不是瞬时消失的。
通过以上方式,其实不难发现,整个代码逻辑比较简单,也比较有效,说的简单点,穷举遍历,根据条件进行检测,但是缺点也是比较明显,不知道攻击者是使用的何种rootkit进行隐藏,到底是挂载、库文件劫持还是说是内核劫持都无从得知,但是也是为检测隐藏进程提供了一个思路(有一说一,这个有点像unhide那个命令)。有趣的知识又增加了。
原文始发于微信公众号(事件响应回忆录):源码学习基于golang的LKM rootkit检测方案,简单又粗暴
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论