【一、楔子】:
趋势科技于 2022 年 5 月记录了Reptile Rootkit 的首次使用,涉及追踪为 Earth Berberoka的入侵。该入侵集被发现使用该恶意软件来隐藏与跨平台 Python 木马相关的连接和进程。在针对中国赌博网站的攻击中被称为 Pupy RAT。
然后在 2023 年 3 月,谷歌旗下的 Mandiant 详细介绍了一系列由疑似与中国有关的威胁行为者发起的攻击,该威胁行为者被称为 UNC3886,该攻击者利用Fortinet设备中的零日缺陷部署了许多定制植入程序以及 Reptile。
ExaTrack 披露了一个中国黑客组织使用基于 Reptile 的名为Mélofée的 Linux 恶意软件。最后,2023 年 6 月,微软发现的加密劫持操作使用 shell 脚本后门下载 Reptile,以掩盖其子进程、文件或其内容。
对 Reptile 的仔细检查揭示了加载程序的使用,该加载程序使用名为kmatryoshka的工具来解密并将 rootkit 的内核模块加载到内存中,之后它会打开特定端口并等待攻击者通过以下方式向主机传输魔术数据包协议,例如 TCP、UDP 或 ICMP。通过魔术包接收到的数据包含 C&C 服务器地址。基于此,反向 shell 连接到 C&C 服务器。
【二、LKM Rootkit】:
因为上面的Reptile属于内核加载的rootkit,我们来看下GPT对LKM rootkit的解释:
LKM rootkit 是指一种以加载的内核模块(Loadable Kernel Module,LKM)形式存在的 rootkit。Rootkit 是一类旨在隐藏或修改计算机系统中存在的恶意软件、进程或活动的恶意工具。LKM rootkit 通过在操作系统内核中注入自定义的模块来实现对系统的控制和隐藏。
以下是 LKM rootkit 的一些常见特征和行为:
隐藏进程和文件:
LKM rootkits 通常会努力隐藏恶意进程和文件,使它们不容易被检测。
修改系统调用表:
通过修改系统调用表,LKM rootkits 可能能够欺骗系统,使其不准确地处理请求或隐藏特定的系统活动。
网络欺骗:
LKM rootkits 可能会修改网络堆栈,使其能够截取、修改或隐藏网络通信,以避免被检测。
阻止检测工具:
这类 rootkits 常常会设法阻止安全工具的正常运行,以防止被检测。
权限提升:
通过利用操作系统漏洞或使用恶意内核模块,LKM rootkits 可能会尝试提升其在系统中的权限。
持久性:
LKM rootkits 常常设计成具有持久性,使其能够在系统重启后仍然存在。
【三、推荐工具】:sandfly-processdecloak
https://github.com/sandflysecurity/sandfly-processdecloak
官方介绍如下:sandfly-processdecloak
is a utility to quickly scan for Linux Process IDs (PIDs) that are hidden by common and not-so-common loadable kernel module stealth rootkits and decloak them so they are visible.
我们通过工具来检测,用Go 编译,然后运行,
Simply build and run sandfly-processdecloak
on the command line. Hidden PIDs will be shown if found.
按官方的检测,Reptile LKM rootkit,如下:
按官方的检测,Diamorphine LKM rootkit,如下:
【四、功能解读】:用GPT来辅助解读,真是又爽又快,以后不用花时间学什么语言了。
1、主程序:processdecloak.go
2、函数/子程序:processutils.DecloakPIDs
代码见源码。这个源码是个很好的借鉴示例,以下利用GPT分析下:
这是一个用 Go 语言编写的程序,用于检测是否存在隐藏的进程。
ConstMinPID
和 ConstMaxPID
定义了PID的最小和最大范围。
ConstHiddenVerifyDelay
定义了在再次验证之前的延迟时间。
PIDStatus
结构体包含了有关进程状态的信息,如名称、掩码、状态、线程组ID(Tgid)、新线程组ID(Ngid)、进程ID(PID)和父进程ID(PPID)。
DecloakPIDs
函数:循环遍历指定范围内的PID,调用 IsPidHidden
函数来检测是否有隐藏的进程。
如果发现隐藏的进程,则将其PID添加到 PidList
中。
功能: 该函数尝试查找隐藏的进程ID,通过循环检查一系列的PID范围。
返回值: 返回一个整数切片 PidList
,其中包含所有发现的隐藏进程的PID,以及可能的错误信息。
IsPidHidden
函数:通过调用 PidMaps
函数获取进程的映射信息。
通过调用 Status
函数获取进程的状态信息。
通过检查文件系统中的进程目录和 /proc
目录下的文件,判断PID是否被隐藏。
如果设置了 raceVerify
为 true
,则会在一定延迟后再次验证。
功能: 该函数用于检查给定的PID是否被隐藏。
参数: 接受两个参数,分别是待检查的PID和一个布尔值 raceVerify
,用于控制是否进行再次验证。
返回值: 返回一个布尔值,表示进程是否被隐藏,以及可能的错误信息。
PidMaps
函数:打开并读取进程的 /proc/[PID]/maps
文件,获取进程映射信息。
功能: 该函数用于获取给定PID的进程映射信息。
参数: 接受一个待查询的PID。
返回值: 返回一个字符串切片 pidMaps
,其中包含进程映射文件的内容,以及可能的错误信息。
Status
函数:
打开并读取进程的 /proc/[PID]/status
文件,解析文件中的信息并填充 PIDStatus
结构体。
在函数执行过程中,通过返回错误信息来处理潜在的问题,例如无法打开文件、无法转换字符串为整数等。
IsPidHidden 函数中使用 PidMaps 函数获取给定PID的进程映射信息。
通过检查 /proc/[PID]/status 文件,以及文件系统中是否存在与PID对应的目录,来判断PID是否被隐藏。
通过检查 /proc 目录下的文件,以及 os.Lstat 函数,来进一步验证PID是否被隐藏。
在 raceVerify 为 true 时,进行额外的延迟并再次验证。
【五、感想】:读老外的代码有什么感觉呢?
学习机会: 国外的开源项目通常由经验丰富的开发者团队维护,他们的代码可能包含先进的编程技巧、设计模式和最佳实践。通过阅读这些代码,你可以学到很多新的概念和技能。
文化差异: 不同的编程文化和编码风格可能存在差异。国外的开发者可能有不同的偏好和标准,这在代码中会有所体现。了解不同文化的编码风格有助于扩大视野,提高适应能力。
注释和文档: 一些国外的开源项目可能具有清晰而详细的注释和文档,有助于理解代码的目的和实现。这可以使你更容易理解代码背后的思想和逻辑。
技术深度: 国外的一些项目可能涉及到高度专业化的领域和技术。阅读这些源代码可以让你接触到一些在国内可能相对较少涉及的技术领域,从而拓宽你的技术广度。
挑战与成就感: 阅读复杂、高质量的源代码可能是一项具有挑战性的任务,但成功理解和运用源代码会带来成就感。这有助于提高解决问题和理解复杂系统的能力。
总的来说,阅读国外的源代码是一个有益的学习过程,可以让你不仅提高编程技能,还能了解全球范围内的编程实践和创新。然而,要注意不同项目之间的差异,以及在学习的过程中保持谦逊和开放的心态。
【六、最后】,晚上收到一消息,很烦,很不爽。最终选择放在一边不想了,找个喜欢的事专注下,忘记那些烦恼。从看到源码,到收集素材、组织语言,一气呵成,丝滑;晚上的单位很安静,耳边只有电脑的风扇在呼呼地响着,不知不觉码字来到了半夜。腿肚延到膝盖都感觉冷,脚也冰凉了,颈椎很生痛。
准备晚安了,再看看我的工作环境,很干净,很美。