开端
之前总算入门了Linux Kernel Pwn,想着找几个题练练手,注意到pwn.college里边有这样一个专题,于是就给它AK了
其实也就两三天的时间
注:本人所有利用手法均为非预期(?),正常解法还是得看视频复现
不得不感叹漏洞利用技术发展之迅速,拿最新的利用手法打这种传统UAF简直降维打击
保密一下就不放Exp了,只说一下大概思路
所有Linux版本均为v6.7.9
challenge1
刚开始吓我一跳,自己用kmem_cache_creat
造了一个slab,还以为要cross cache attack(记着待会要用)
仔细一分析,发现是一种最简单的UAF,很长的越界写/读,大小为kmalloc-512(如果是kmalloc分配的话),而且获取flag不用提权,它直接读到一个堆块里边了。
简单审计发现好像可以堆喷该文件(/proc/kheap),尝试发现确实可以,直接堆喷(其实两个就够了)文件,通过越界读读取相邻存放flag堆块里边的flag
独立slab的好处就是你能比较清楚得把控堆块排列与个数,因为一般只有该模块使用不会有其他的资源抢夺,但肯定比不上用户态heap的精准把握
challenge2
依旧是独立slab,这一次没有后门flag了,需要提权。
分析发现很长的越界写/读直接cross-cache overflow即可,给了一个函数调用我还真不大清楚怎么用()
通过pgv堆喷order-1的pages,先free第一个页,堆喷文件/proc/kheap占用,再free第二个页,堆喷cred_jar占用,通过越界写直接改cred_jar,成功率很高
堆喷cred_jar用
setuid(1000)
即可,但要注意数量。由于远程是比较接近实际环境的可能要多喷射一些,本地可以少一点
challenge3
依旧是独立slab,这一次没有越界读写了,这就需要cross-cache attack了。
其余功能还是一样,漏洞只有UAF了
通过构造特定数量的堆结构,并free特定堆块来填充满freelist,这样在遇到empty slab时,会调用__slab_free
将其释放,从而得到一个page UAF原语
利用思路还是堆喷cred_jar并用page UAF修改,成功率很高
challenge4 ~ 5
本来想好好做一下,但是不会by pass kaslr,看了PPT才知道要通过oops获取内核信息(这就是为什么很多内核题都会有panic_on_oops的设定)
challenge4多了kaslr,不影响任何步骤,利用同challenge3
challenge5看都没看直接打的,貌似是少了奇怪的函数调用,但我本身就不知道怎么利用()
challenge6
不是独立slab了,申请的堆块全都来自kmalloc-512,漏洞依旧是UAF,但是没有了读取功能,不过给了后门flag
读都不用读,闭着眼睛往里写就行,只需一个字节
有请pipe_buffer
上场,给大家来点小小的page UAF震撼
甚至不用堆喷cred_jar,直接堆喷flag即可(flag写入了一份kmalloc-512,多喷一点很容易取走UAF page的),用pipe读取
challenge7 ~ 8
challenge7和challenge6功能和漏洞都一样,就是没有了后门flag,依然page UAF堆喷cred_jar,UAF改写即可,成功率挺高的
challenge8好像在copy_from_user
之前加了一个检验__check_object_size
,然而page UAF才不管这些:),利用手法同上
总结
只能说太伟大了page UAF & cross cache,这种利用手法过于震撼了,完完全全是通杀
新方法没学到几个,只是练习了一下老方法,有空还得看一下提供的资料PPT和视频。