Operating system 从内核调用根shell

Operating system 从内核调用根shell,operating-system,linux-kernel,root,Operating System,Linux Kernel,Root,我正在从事一个利用漏洞的项目,该项目需要我从内核中调用根shell。在搜索了各种文档和网站后,我知道唯一的方法是将当前进程提升到root权限,然后执行指令调用shell。这是因为我们不能简单地从内核调用系统调用 同样,我遇到了调用commit_creds(prepare_kernel_cred(0)),可用于向进程授予根权限。但是,我使用的是Red Hat Enterprise Linux 4.4 Base,它没有上述调用: [dmazumd@bn19-62 ~]$ grep commit_cr

我正在从事一个利用漏洞的项目,该项目需要我从内核中调用根shell。在搜索了各种文档和网站后,我知道唯一的方法是将当前进程提升到root权限,然后执行指令调用shell。这是因为我们不能简单地从内核调用系统调用

同样,我遇到了调用
commit_creds(prepare_kernel_cred(0)),可用于向进程授予根权限。但是,我使用的是Red Hat Enterprise Linux 4.4 Base,它没有上述调用:

[dmazumd@bn19-62 ~]$ grep commit_cred /proc/kallsyms 
[dmazumd@bn19-62 ~]$ grep _cred /proc/kallsyms 
c0164655 T compute_creds
c01a7cdd t dummy_bprm_apply_creds.....
所以,我的问题是,怎么做? 我知道需要将进程的
uid
设置为零,这将为它提供root权限。现在,
uid
驻留在
struct\u cred
中,而不是
struct\u任务中。我不知道我是否可以不使用上面提到的任何API直接访问这些结构。是否还有其他要求实现同样目标的呼声?或者,还有其他方法吗


PS:我不是在问我的问题的确切答案,任何指导/帮助都将不胜感激。

为了澄清问题:您的内核不需要“根权限”。事实上,这是在上面。您需要的是一个可以拥有特权的进程

您可以开始查看
execve
如何启动流程并执行该操作

如果您已经运行了一个shell,并且处于内核模式,那么只需在
task_struct
()中修改
uid


另外,看一看。

我最终可以通过在内核中首先将进程提升到root状态来实现root shell。这是通过使用在
/proc/kallsyms
中定义的调用
set\u user(0)
来实现的


完成后,进程使用
iret
切换回用户空间,然后生成一个shell。这个shell有root权限。

首先,我正在纠正一个明显的打字错误(请看问题中的第二句话)。另外,我的问题不是关于如何生成shell,而是关于设置进程的根权限。我正在用更多的细节编辑我的问题。我对你一无所知,所以这对我来说并不明显:)至于设置特权,你可以按照我说的(任务结构修改)或查看
execve
syscall,看看uid是如何设置的。在调用
execve
之前,我研究了修改
uid
的方法。可以使用
setuid
完成此操作。但是,问题是
/bin/bash
周围有保护。我尝试将
/bin/sh
链接到
/bin/zsh
,但也没有帮助,请参阅此文档:如果我没记错,您正试图使用非特权程序中的缓冲区溢出来提升您的特权。这是不可能的。您只能在程序拥有的权限下操作。我在上面的链接中读到,只要您将
/bin/sh
链接到
/bin/zsh/
,就可以进行操作。为了提升权限,我使用了
setuid(0)
。请注意为什么这个问题被否决。你是说
setuid
而不是
set\u user
?不,
setuid
是一个系统调用,它是
set\u user
。这可能因您使用的操作系统而异。在内核中,我们只能调用
/proc/kallsyms
中定义的例程。此外,调用只是重定向到例程地址,而不是函数调用本身。如果您在源代码中链接到
set\u user
的定义,这将非常有用。我没有找到它。正如我前面所说,这些例程依赖于操作系统内核,请检查您的
/proc/kallsyms