UAF漏洞:UAF 漏洞是当我们 free 掉某个指针变量所指向的堆块的时候,未将该指针变量置0,导致该指针依然指着该堆块地址,当我们引用该指针的话,也就引用该指针所所指向的地址。这个漏洞对于开发者很容易忽略,但威力非常强大
条件竞争:在多线程的环境下,当多个线程同时访问某一个共享代码、变量或文件的时候,就有可能发生条件竞争的漏洞,利用该漏洞可以产生意想不到的效果,不过有时候需要碰撞该漏洞才行,有一定失败几率。(在linux kernel pwn里面一般开了多线程就很有可能是利用条件竞争)
cred:当我们fork一个新的进程的时候会产生cred结构体,在task_struct中大小为0xa8,注意当cred的uid,gid为0的话,我们就提权成功
ptmx:当我们open("/dev/ptmx")的时候,会分配一个tty_operation的结构体,覆盖该结构体可以将控制流劫持到我们的代码中
cr4:控制寄存器,功能之一开启关闭smep和smap保护,只要将cr4寄存器对应SMAP、SMEP保护位置为0即可关闭对应保护,常用mov,cr4,0x6f0
只开启了 nx 保护
只开启smep,不能ret2usr
ioctl:kfree 掉device_buf,kmalloc用户指定大小的堆块
babywrite:从用户的buf里面写入到device_buf,大小要小于堆块的大小
babyread :将device_buf读入到用户指定的buf
babyrelease:kfree 掉指定的 device_buf,但没有置0,UAF 漏洞
EXP思路1:
1.fd1,fd2打开device
2.fd1用ioctl 让 device 去 malloc 0xa8大小的堆块后free掉
3.fork一个新的进程
4.用fd2将device_buf全都置0
5.执行system('/bin/sh')
这里很多人可能看不明白3-5,详细讲下:linux kernel使用slab分配器来分配堆块,就像fastbin的后进先出一样,当我们fork一个新的进程后,会malloc一个0xa8大小的cred的结构体,此时slab会找到device_buf对应的堆块地址并分配给cred,只要我们用uaf将这个cred对应的uid,gid设置为0,则该进程对应的权限即为root权限,然后执行system("/bin/sh")就会得到shell了
exp代码如下:
一些编写exp的技巧我已写在上一篇文章中
EXP思路2:
关闭cr4,然后ret2usr
1.fd1,fd2打开device
2.fd1用ioctl 让 device 去 malloc 0x2e0大小的堆块后free掉
3.fd3打开ptmx创建tty_struct到device_buf的地址
4.fd2读取tty_struct到用户的buf中
5.利用uaf,让fd2的重写tty_struct,将里面的tty_operation劫持到我们伪造的fake_tty_operation,fake_tty_operation放入rop,使用write的时候即可调用rop
6.fd3执行write,调用tty_operation[3],这里放入mov,rsp,rax执行栈劫持,rax是我们fake_tty_opeartion的结构体,就可以实现rop了
exp代码如下:
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2020-8-30 12:01
被Vinadiak编辑
,原因: