[原创]无路远征——GLIBC2.37后时代的IO攻击之道(终章)house_of_碎碎念
发表于:
2023-2-14 13:13
23696
[原创]无路远征——GLIBC2.37后时代的IO攻击之道(终章)house_of_碎碎念
1
2
如何做pwn手?堆栈内核和IO。征战万千比赛场,坐牢。无数爆零又重现。
年少万兜鍪,雄心壮志仍未休。我命由我不由天,开卷。万千大佬背影远。
看到这个题目,估计很多人都举得这篇文章没有实际内容,但是恰恰相反,如果你学会了很多技巧,但仍在在比赛中难以有所输出,还是有必要看一下的。
一、前文汇总
无路远征——GLIBC2.37后时代的IO攻击之道(零)
无路远征——GLIBC2.37后时代的IO攻击之道(一)houseof 琴瑟琵琶
无路远征——GLIBC2.37后时代的IO攻击之道(二)houseof 秦月汉关
无路远征——GLIBC2.37后时代的IO攻击之道(三)houseof 借刀杀人
无路远征——GLIBC2.37后时代的IO攻击之道(四)houseof 魑魅魍魉
无路远征——GLIBC2.37后时代的IO攻击之道(五)houseof 一骑当千
在除了第0章之外,个人认为house_of_魑魅魍魉
应该是综合评分最高的技巧,但大部分人可能觉得house_of_一骑当千
来的更暴力,毕竟以目前角度来看,它可以通杀沙盒,版主也把他列为了精华。说一下,house_of_魑魅魍魉
是我最先发现的链,发现它时因为攻击方式主要分为4步,所以我将各个步骤分为魑、魅、魍、魉
,这也是名字的由来。
二、GLIBC中IO_FILE挖洞经济型分析
1.从2.37看漏洞修复方向
从2.29中largbin_attack
第一条链修复已经过了4年,历经setcontext+53
变更,__malloc_assert
修复,exit
调整,再加上从2.27之后abort
不再刷新缓冲区,可以看出GNU对非正常退出函数的保护已经越来与完善,但是第二条链仍然坚挺的存活,所以可以认为:largbin_attack
第二条链是GNU的官方测试后门, 让我们帮助他们免费挖掘漏洞。当largbin attack
第二条链被修复时,就是GNU认为它没有利用价值的时候。 所以,目前包括IO在内所有结构体漏洞的挖掘都还是有意义的。
当然,2.37不会是常见版本,按照ubuntu的尿性,2.39大概率是稳定版本,到时候宽字符的问题是必然会解决的,也就是我们还有大概1年的时间挥霍。本来按照原有的路径挖掘方式,IO漏洞是可以很快就全部挖完的,从how2heap
中也可以看出,攻击手段越来越少,House of Banana
已经开始攻击rtld_global
结构体了,当GNU对exit函数下手的时候,就是IO的终点了。但是,GLIBC2.37让我看到了一些不同,GNU在对IO有着较大野心,可以看出他们有着程序的独特的固执,在代码的优雅性上越走越远。
2.压垮第二条链的最后一根稻草
我认为house_of_魑魅魍魉
应该是综合评分最高的利用方式,主要是鉴于它是一套攻击思路,而非简单的一个攻击链,攻击方式难以被修复,我在第4篇时写的它需要3个条件。
有结构体之间的强制转化,或者结构体指针的使用。
存在memcpy、memmove
等内存覆写函数。
执行完第2步后,还存在可能控制的执行流。
以下分析是个人观点,
对于第1步,这个就是GNU之后的修订方向,他们想使用更多的结构体复用。修订难度:7(0-9)
对于第2步,为了处理宽字符问题,这个基本不太可能。修订难度:9
对于第3步,从理论上这个修复很简单,但实际操作非常复杂,涉及exit,house_of_秦月汉关
,等等许多环节,属于不难但繁琐的内容。修订难度:8
如此看来,貌似第一步修订最简单。但关键点就在于,GLIBC2.37新加的内容就是在为了代码的复用性,代码的强复用就必然会在后面的修改中大量使用结构体的复用,也让这一步成了最难修订的一步。照此以往,house_of_魑魅魍魉
可能会变成压垮largbin attack
第二条链的最后一根稻草 。
3.setcontext
风云突变
在一骑当千中我说过,我本来不想把它公开的,这一技巧和house_of_琴瑟琵琶
一样其实非常简单,我也很好奇为什么5、6年了还没有人发现。不想公开的原因是它的修复非常简单,如果修复了今后将失去沙盒很多的乐趣。
三、挖掘及攻击思路
目前,各路大神的挖掘house
思路就是在操作次数尽量少(malloc free edit)的情况下攻击虚表。 因为堆题不能直接控制执行流,所以堆题就成了结合IO最好的工具。结合我做题以来的经验,我将堆的问题转化为几类。
首先是内存修改的次数,有些题目可以多次(2次及以上)修改内存,有些只能一次。
修改内存的情况,有些可以任意写,既可以申请到此块内存;有些不能任意写入,只能写入堆值或者unsortbin
地址,例如largebin attack
。
泄露的情况,除了个别方法外,大都需要泄露内存,有些题目还能够再次泄露内存中的数据,例如泄露ptr_guard
,我称为二次泄露 。除了个别情况外,大部分题目要想实现“二次泄露”必须要能申请到所要泄露的位置,显然,如果不能对内存有任意写的能力,是不可能实现“二次泄露”的(设置flag的沙雕题目除外)。
[注意]看雪招聘,专注安全领域的专业人才平台!