ASLRay

Linux ELF x32 / x64 ASLR DEP / NX绕过堆栈喷洒的攻击

属性:

  • ASLR旁路
  • DEP / NX旁路
  • 跨平台
  • 简约
  • 简单
  • Unpatchable

依赖关系:

  • Linux 2.6.12+ - 适用于任何基于x86-64 Linux的操作系统
  • BASH - 整个脚本

限制:

  • 堆栈需要是可执行的(-z execstack)for x64
  • 二进制必须通过本地参数(不是文件,套接字或输入)
  • 不支持其他架构和操作系统(TODO)
  • 需要知道缓冲区限制/大小

怎么运行的

您可能听说过堆喷洒攻击?那么,堆栈喷洒是相似的,然而,在大多数情况下,被认为是不切实际的,特别是x86-64上的ASLR

我的工作将证明是相反的。

对于32位,有2 ^ 32(4 294 967 296)的理论地址,不过,内核将允许控制大约只有一半的位(2 ^(32/2)= 65 536),以便在虚拟化内存,这意味着如果我们控制多于50000个字符的堆栈,我们几乎可以肯定地指向我们的shellcode,而不管地址是多亏了内核重定向和重新转换。根据我的测试,如果被调用的函数不包含其他变量创建,即使是100或10个字符也是足够的,这将允许ROP风格的攻击。

这可以通过使用shell变量来实现,而shell变量并不仅限于特定的长度,实际的限制大约是一千个,否则会使TTY饱和。

因此,为了成功地利用任何shellcode,我们需要把shellcode后面的NOP sled放到一个shell变量中,然后利用这个随机地址来开发这个二进制文件。请注意,NOP雪橇是没有必要的,这只是普遍的利用。

在64位系统中,情况是不同的,但不是我的发现。

当然,你不必覆盖所有2 ^ 64的可能性,事实上,内核只允许使用48位,加上其中的一部分是可预测的和静态的,这就给我们留下了大约2 ^(4x8 + 5)(137 438 953 472)的可能性。

我已经提到了shell变量的大小限制,但是也有一个计数限制,看起来大约是10个,因此我们可以存储一个100 000个字符的shellcode,使我们拥有十几万个可以快速测试的可能性并自动。然而,这一次,你需要暴力和使用NOP雪橇,以使事情更快。

也就是说,在32位和64位上的ASLR可以在几分钟内轻松绕过,而且只需几行外壳。

另一方面,DEP / NX可以在x32上使用return-to-libc技术,通过将其与不同操作系统的统计研究(更具体地说,它们的ASLR限制和实现)耦合,这可以导致成功的利用。第一个是ASLR在它的选择上没有那么随意,并且有一些常量和很差的熵(易于猜测libC地址,每个OS都有自己的常量)。第二个是把libC的shell参数传到环境中(很容易找到并把它传给libC)。

总而言之,由于ASLR,32位上的DEP / NX被削弱了。

如何

如果在您的生活中至少有一个缓冲区溢出,您可以跳过,但以防万一:

apt install gcc libc6-dev-i386 || kill -9 $$
chmod u+x ASLRay.sh
sudo gcc -z execstack test.c -o test
sudo gcc -m32 -z execstack test.c -o test32
sudo chmod +s test test32
source ASLRay.sh test32 1024
source ASLRay.sh test 1024
source ASLRay.sh test 1024 \x31\x80...your_shellcode_here
sudo gcc -m32 test.c -o test32x
sudo chmod +s test test32
source ASLRay.sh test32x 1024

为了证明Debian x32不需要NOP-sled:

警告 !!!这会修改你的/ etc / passwd并修改/ etc / shadow的权限,虚拟机执行提示

chmod u+x PoC.sh
source PoC.sh
grep ALI /etc/passwd

如果它仍然不起作用,只需添加一些NOP(\ x90)。

为了证明Debian x32甚至不需要环境变量:

chmod u+x PoC2.sh
source PoC.sh

因此,你可以把你的shellcode放到一个变量中,然后把随机地址赋给一个带有ASLR的shell的寄存器,这是因为这个函数只有一个变量会被重写的特定上下文,所以栈会弹出到EIP我们的shellcode,更像是一个ROP攻击。

对于Arch / Ubuntu,你还需要禁用堆栈粉碎保护,暴力破解可能需要更长时间(执行延迟,可能是由于brk(NULL / 0)系统调用):

sudo gcc -z execstack -fno-stack-protector test.c -o test
sudo gcc -m32 -z execstack -fno-stack-protector test.c -o test32
sudo gcc -m32 -fno-stack-protector test.c -o test32x

笔记

总是依靠多重保护,而不是一个一个。

我们需要新的系统安全机制。

“从我们站在那里,雨似乎是随机的,如果我们能站在别的地方,我们会看到它的秩序。”

托尼Hillerman,狼等待


转载请注明出处:https://www.freearoot.com/index.php/aslray.html

文章来源:https://github.com/cryptolok/ASLRay