我正在学习Linux x86二进制文件中的缓冲区溢出漏洞。我正在做一个经典的堆栈粉碎,通过禁用ASLR并通过禁用NX位和堆栈金丝雀来编译二进制文件,在Ubuntu 12.04 VM中生成根shell。
在我执行期间,返回地址被覆盖并且shellcode正在执行,但我没有获得root shell,而是导致bash shell。
为了减轻bash保护,我使用的是zsh shell,我删除了sh-> bash符号链接,并在/ bin目录中创建了一个sh与zsh shell的符号链接
我尝试过root拥有的setuid启用二进制文件(对其他用户执行权限),但我仍然没有获得root shell。
我已经使用C程序验证了我的shell代码,同时编译了测试程序(我的shell代码)并在启用setuid后执行它。所以测试程序正在给root shell。但是当缓冲区溢出使用相同的shellcode时,我无法获得root shell。
当我在gdb中调试这个场景时,在溢出/ bin / zsh4执行过程中会产生bash shell。
即使我也无法通过返回libc攻击获得root shell。这也导致了bash shell。我在Ubuntu 12.04,Ubuntu 11.04和Ubuntu9中尝试了这些步骤,但结果仍然相同。
我是这个领域的初学者。因此,我在上述任何步骤中都可能会遇到一些错误。那么你们中的任何人都可以建议可能存在的问题以及解决方法
答案 0 :(得分:3)
最后我弄清楚了这个错误的原因。
在执行期间,我的root权限被删除,因为我已禁用进程系统级别的ptrace来处理另一个工具。 我已经将/ proc / sys / kernel / yama / ptrace_scope的值覆盖为0.这就是我没有获得root shell的原因。
我在execve的手册页中找到了这些信息(我用它来创建shellcode):
如果在指向的程序文件上设置了set-user-ID位 文件名,并且未安装基础文件系统nosuid (mount(2)的MS_NOSUID标志),而调用进程则不是 被ptraced,那么调用进程的有效用户ID是 更改为程序文件所有者的更改。同样,何时 程序文件的set-group-ID位设置为有效组ID 调用进程的设置被设置为程序文件的组。
所以现在当我没有禁用ptrace_scope时,我得到了一个root shell。
感谢merlin2011和naab参与讨论。