64位具备任意写权限的程序如何绕过seccomp strict模式?
64位程序seccomp strict模式绕过方案
前置规则说明
seccomp strict模式默认仅放开4类系统调用的执行权限:read、write、_exit、rt_sigreturn,直接调用其他系统调用会直接被内核终止进程。结合你给出的环境条件,可按以下路径完成绕过:
具体利用步骤
- 第一步:准备兼容模式execve shellcode
64位进程默认运行在长模式下,绝大多数场景下seccomp strict默认只会检查64位系统调用,不会拦截32位兼容模式的系统调用。你可以把「切换到32位兼容模式+执行execve」的shellcode写入给定的rwxp缓冲区,1024字节的空间完全足够放下这段代码。 - 第二步:用rt_sigreturn构造执行上下文
rt_sigreturn属于strict模式允许的系统调用,你可以在rwxp缓冲区的代码里伪造完整的ucontext信号上下文结构体,把上下文中的cs段寄存器值改成32位用户态代码段选择子(固定为0x23),rip指向提前写好的32位execve shellcode入口,主动触发rt_sigreturn后内核会按照伪造的上下文恢复寄存器,自动完成模式切换,直接执行execve拿到shell。 - 第三步:写入/bin/sh字符串
用提供的任意地址写能力,把/bin/sh\x00字符串写到任意用户态可写区域(比如rwxp缓冲区的空白位置、或者libc的可写段都可以),作为execve的入参使用。 - 第四步:绕过canary检测(按需使用)
程序开启了canary保护,如果你的利用逻辑需要修改栈上数据,可以直接用任意地址写能力先读出栈上存储的canary值,修改完栈数据后把原canary回填即可,不需要额外做信息泄露。
备用方案(兼容严格拦截32位调用的场景)
如果目标内核特意配置了拦截32位兼容模式的系统调用,可以直接用允许的read/write系统调用完成读旗操作,不需要getshell:
- 利用partial RELRO的可写GOT特性,把程序中已有的
open函数GOT表项修改为read的PLT地址,先读入flag文件路径,再调用修改后的open(实际执行read逻辑)读入flag内容,最后调用write把内容输出到标准输出即可。
内容的提问来源于stack exchange,提问作者Dotch
相关产品推荐
相关产品推荐

