源码学习基于golang的LKM rootkit检测方案,简单又粗暴

admin 2025年2月15日09:07:07评论10 views字数 1686阅读5分37秒阅读模式
源码学习基于golang的LKM rootkit检测方案,简单又粗暴

    日常在逛公众号时发现一篇文章,主要是讲趋势科技于 2022 年 5 月记录了Reptile Rootkit 的首次使用,涉及追踪为 Earth Berberoka的入侵。该入侵集被发现使用该恶意软件来隐藏与跨平台 Python 木马相关的连接和进程。在针对中国赌博网站的攻击中被称为 Pupy RAT。

    而在此次攻击技术中,相关微信公众号作者推荐sandflysecurity开源的一款检测Linux LKM rootkit检测工具,用来检测隐藏的rootkit进程,https://github.com/sandflysecurity/sandfly-processdecloak

源码学习基于golang的LKM rootkit检测方案,简单又粗暴

    在相关项目github主页写道 “sandfly-processdecloak 是一个实用工具,用于快速扫描被常见和不太常见的可加载内核模块隐蔽根套件隐藏的 Linux 进程 ID (PIDs),并将其显现出来,以便可以被看到。”

源码学习基于golang的LKM rootkit检测方案,简单又粗暴

    看到这里就有点感兴趣了,隐藏进程、rootkit、木马、后门,这不就是我们日常工作接触最多的嘛?那我就得好好看这个项目,学习学习。

源码学习基于golang的LKM rootkit检测方案,简单又粗暴

    在github我们找到他的主程序,查看整个程序流的过程,在main函数里面,主要就是先通过processutils.DecloakPIDs()来获取到隐藏的pid,然后再根据这个返回的数组进行遍历,最后输出我们的结果。也就是说核心功能,在processutils这个文件里面。

源码学习基于golang的LKM rootkit检测方案,简单又粗暴

    进入到processutils文件里,先不看DecloakPIDs()这个函数,先看看文件开头写的东西,主要是配置信息,这个主要定义最小进程pid号和最大pid号,以及进程的状态信息。

源码学习基于golang的LKM rootkit检测方案,简单又粗暴

    进入到DecloakPIDs()这个函数,在循环内部,是直接调用IsPidHidden进行检查

源码学习基于golang的LKM rootkit检测方案,简单又粗暴

    进入到IsPidHidden,先调用PidMaps,来获取进程的/proc/pid/maps的文件信息

源码学习基于golang的LKM rootkit检测方案,简单又粗暴

    可以很明显的看到,这里是直接读取/proc/pid/maps这个文件,获取指定 PID 的内存映射信息,返回该进程的映射列表,在IsPidHidden里面进行进一步的分析

源码学习基于golang的LKM rootkit检测方案,简单又粗暴

    回到IsPidHidden,判断maps如果不为空的情况下,会使用Status函数来判断当前pid进程的状态

源码学习基于golang的LKM rootkit检测方案,简单又粗暴

    而判断pid进程状态,也是比较简单粗暴,也是和获取maps信息一样,直接读取/proc/pid/status文件来获取相关信息

源码学习基于golang的LKM rootkit检测方案,简单又粗暴

    当以上信息获取到以后,就通过os.Lstat来看相关进程目录,检查 /proc/[PID] 目录是否可访问(使用 os.Lstat)。如果无法访问,说明该进程可能被隐藏。

源码学习基于golang的LKM rootkit检测方案,简单又粗暴

    上面检查完后,还会进一步的进行检查,读取 /proc 目录下的所有文件,确认该 PID 是否在其中。如果不在,则标记为隐藏。

源码学习基于golang的LKM rootkit检测方案,简单又粗暴

总结:

  1. 遍历所有 PID:DecloakPIDs 函数从 1 到 4194304 遍历所有可能的 PID。
  2. 检查每个 PID:对于每个 PID,调用 IsPidHidden 函数进行检查。
  3. 读取映射信息:在 IsPidHidden 中,首先尝试读取 /proc/PID/maps 文件。如果该文件存在且有内容,说明该进程可能是活动的。
  4. 检查目录可访问性:接下来,使用 os.Lstat 检查 /proc/PID 目录是否可访问。如果无法访问,说明该进程可能被隐藏。
  5. 确认 PID 是否在/proc目录中:如果上一步未发现隐藏,程序会读取 /proc 目录下的所有文件,确认该 PID 是否存在。
  6. 双重验证:如果发现 PID 被标记为隐藏,程序会等待一秒钟后再次检查,以确认该 PID 确实是隐藏的,而不是瞬时消失的。

    通过以上方式,其实不难发现,整个代码逻辑比较简单,也比较有效,说的简单点,穷举遍历,根据条件进行检测,但是缺点也是比较明显,不知道攻击者是使用的何种rootkit进行隐藏,到底是挂载、库文件劫持还是说是内核劫持都无从得知,但是也是为检测隐藏进程提供了一个思路(有一说一,这个有点像unhide那个命令)。有趣的知识又增加了。

源码学习基于golang的LKM rootkit检测方案,简单又粗暴

原文始发于微信公众号(事件响应回忆录):源码学习基于golang的LKM rootkit检测方案,简单又粗暴

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年2月15日09:07:07
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   源码学习基于golang的LKM rootkit检测方案,简单又粗暴https://cn-sec.com/archives/3739976.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息