本帖最后由 趣探坊 于 2022-7-26 16:40 编辑
在本文中,我将介绍如何为 Linux 编写一个简单的 rootkit。但是,要理解本文,您必须知道如何编写
linux内核模块。如果你不知道,你可以阅读Kernel modules — The Linux Kernel documentation (linux-kernel-labs.github.io)
什么是 Rootkit?当你闯入sb的系统时,你可能希望能够在一段时间后“回来”。当您在该系统中安装
Rootkit 时,您将能够随时获得管理员权限。好的 Rootkit 可以隐藏在受感染的系统中,
因此管理员无法找到它们。有很多方法可以隐藏在系统中。我不打算描述所有这些
什么是 Rootkit?当你闯入sb的系统时,你可能希望能够在一段时间后“回来”。当您在该系统中安装
Rootkit 时,您将能够随时获得管理员权限。好的 Rootkit 可以隐藏在受感染的系统中,
因此管理员无法找到它们。有很多方法可以隐藏在系统中。我不打算描述所有这些 在本文中,我们只讨论 Linux Rootkit。
Linux有一些主要类型的rootkit。
例如,有些rootkit将systems(ls,ps,netstat等)中一些最重要的程序替换为它们的修改版本,
这些版本不会让管理员看到有问题的地方。虽然,这样的rootkit很容易检测到。
其他 Rootkit 用作 Linux 内核模块。它们在内核模式下工作,因此它们可以执行任何操作。他们可以隐藏自己,文件,
进程等。在本教程中,我们将讨论这种类型的rootkit。 请注意,它不是“真正的”rootkit。要使用其功能(例如获取root权限),您必须具有
对已安装rootkit的系统的本地访问权限。它可以是“普通”用户帐户,但您必须能够登录到该帐户。此外,当安装了 rootkit
的系统重新启动时,我们的 rootkit 将被“卸载”,因为它不会在引导时加载。但是本文并不意味着要为脚本小子提供
他们能够使用的真正rootkit。本文只需要教你编程rootkit的基础知识。 首先,我将大致描述这个rootkit是如何工作的,然后我将展示它的代码,最后我将详细地编写它是如何工作的。
所以,让我们开始吧: - 我将首先描述它将具有哪些功能。
- 当用户向 rootkit“发送”正确的命令时,他将获得 root 权限。
- 另一个命令将允许用户隐藏进程
- 为了能够安全地卸载rootkit(没有任何糟糕或错误),它将具有使rootkit可见等功能。我很快就会描述它们。
- 另一个功能将让用户“取消隐藏”最后隐藏的进程。
- 让我们看看在加载 rootkit 期间将调用哪些函数:
- module_remember_info() - 此函数保存有关 rootkit 的一些信息,以便以后可以卸载它。
- proc_init() - 这是非常重要的函数,可以将命令“发送”到rootkit。
- module_hide() - 在此函数中,我们隐藏了 rootkit
- tidy() - 在这个函数中,我们做了一些清理。如果我们不这样做,在卸载rootkit时会出现一些错误。
- rootkit_protect() - 这是一个非常简单的函数,即使它是可见的,也无法通过“rmmod rootkit”命令
卸载rootkit。但是,如果内核 wa 是在支持
强制卸载模块的情况下编译的,则仍可以通过 “rmmod -f rootkit” 卸载。
- 现在,我将详细描述这些函数:
- proc_init():
- 如前所述,此函数可以将命令发送到 rootkit。首先,我想在proc中创建一个条目,
然后将其隐藏,以便无法通过“readdir”系统调用找到它。但这不是一个好主意。仍然可以通过在proc中浏览条目列表从内核模式中找到rootkit
。那么,我做了什么呢?rootkit 查找现有条目(例如 /proc/version),
并将其现有函数(如 read_proc 和 write_proc)替换为其他函数。命令通过写入或读取
“受感染”条目发送到 rootkit。你可以问:“那么通过阅读还是写作?还是两者兼而有之?这取决于哪些功能具有受感染的条目。
如果它只有写入功能,我们替换它。为什么不创建阅读功能?因为如果条目
突然获得写作功能,那将是可疑的。我们必须避免它 - 管理员无法检测到我们!如果条目只有读取功能,我们替换它。
如果它同时具有读取和写入功能,则我们仅替换写入功能。
那么,如何将命令传递给该条目呢?当写入函数被替换时,您只需写入该条目的正确命令即可。您可以使用 echo 或类似程序执行此操作
。但是,如果你想获得root权限,你必须编写自己的程序来写入该条目,然后
使用execve syscall run shell。
如果读取功能被替换,则必须编写特殊程序。它有什么作用?它必须使用读取系统调用从该条目读取。
此函数的参数之一是指向必须写入数据的缓冲区的指针。要将命令传递给我们的条目,您必须将该命令
保存在缓冲区中。然后,将指向该缓冲区的指针作为读取系统调用的参数。
稍后,我将展示示例程序的代码,该代码可用于将命令传递给rootkit。
让我们转到下一个函数。
- rootkit_hide():
|