gdb可以调试suid根程序吗?


16

我编写了一个调用setuid(0)和的程序execve("/bin/bash",NULL,NULL)

然后我做了 chown root:root a.out && chmod +s a.out

当我执行时,./a.out我得到一个root shell。但是,当我执行gdb a.out此操作时,它将以普通用户身份启动该过程,并启动一个用户外壳程序。

所以...我可以调试setuid根程序吗?

Answers:


22

如果调试器以root身份运行,则只能调试setuid或setgid程序。内核不允许您调用ptrace以额外特权运行的程序。如果这样做的话,您将能够使程序执行任何事情,这实际上意味着您可以例如通过在上调用调试器来运行root shell /bin/su

如果以root身份运行Gdb,则可以运行程序,但是只有在以root身份运行时,才能观察其行为。

如果需要在不是root用户启动的情况下调试该程序,请在Gdb外部启动该程序,使其以某种方式暂停,然后再进入有问题的部分,并attach在Gdb中启动进程(at 1234其中1234为进程ID)。


是的,我尝试过,但是该进程以root身份启动,而gdb也应该以root身份启动,以便能够附加root的进程。
jyz 2011年

@jyzuz是的,在我写这篇文章时,您必须以root身份启动gdb。或者,如果您愿意,可以使用远程调试并gdbserver以root用户身份运行,然后以普通用户身份连接到它。从您的评论看来,您似乎没有设法以简单的方式(以root身份运行gdb)来执行此操作,但是我不知道出了什么问题,所以我无能为力。
吉尔(Gilles)'所以

7

如果可以的话,这是在停止状态下启动该过程的一种方法。使用bash脚本执行以下操作:

echo $BASHPID; kill -STOP $BASHPID; exec sudo -u unpriviledged_user -g the_group_if_not_primary command

使它在后台运行。

然后启动gdb,并附加到已打印的pid。

您必须使用来逐步执行exec命令gdb,但是您将能够从一开始就进行调试。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.