linux漏洞利用思路

Posted by Rohex on 2020-01-03
Words 1.2k and Reading Time 4 Minutes
Viewed Times

栈溢出-rop链

待更新…

堆漏洞利用

  1. 普通溢出:溢出多个字节,覆盖下一个chunk结构,造成unlink
    first chunk溢出覆盖second chunk的size、fd、bk,将size覆盖为0;释放first chunk时,ptmalloc会通过second chunk的尾部(通过second chunk size字段寻址)定位到second chunk下一个chunk的presize字段;通过second下一个chunk的prevsize判断second是否为空闲chunk,由于此时定位的prevsize即是被覆盖为0的second chunk size,因此ptmalloc判断second chunk为空闲,由此发生向前合并,并发生second chunk的unlink。

  2. off by one:伪造chunk,溢出prevsize和size,造成unlink
    在first chunk中伪造一个fake chunk,并溢出覆盖second chunk size的PREV_IN_USE flag 为0,将prevsize改为伪造的size;那么释放掉second chunk时,就会发生向后合并,并发生fake chunk的unlink。

  3. off by one:溢出prevsize为较大值,修改size的PREV_IN_USE,伪造向后合并的pre chunk size(house of einherjar,由 Hiroki Matsukuma 提出)
    把seconde chunk的 size 位的 PREV_IN_USE flag 改为0,prev_size 改为一个自己想要的值,free 掉第二个 chunk 的时候就会连带着把前面的一大片空间(自己伪造的 prev_size)给 unlink 掉(伪造合适的 fd 和 bk 来绕过 unlink 的 check!),然后合并成一块更大的 chunk,放入 bin 里面,下一次 malloc 的时候就能 malloc 到那块空间,然后就能覆盖那块空间上原有的内容(数组指针、函数指针等等)。

  4. double free思路:第一次free一个chunk后,得到一个野指针指向堆的空闲内存区域;申请内存覆盖该区域,伪造两个连续的chunk,第二个chunk以野指针为chunk的起始地址;第二次释放该chunk,造成两个伪造chunk的向后合并,造成第一个fake chunk的unlink。(unlink加入一个检测double free的机制:如果该chunk块的下一个chunk size的PREV_IN_USE flag 为0,那释放该chunk会引发异常,如下图)

  5. UAF思路:释放一个chunk后没有将指针置NULL(存在野指针),导致后面有机会可以向该内存写入数据;假如后面申请内存的chunk head在野指针控制范围内,可以修改chunk的head,使释放时发生unlink。
  6. fastbins思路(chunk属于fastbins管理,利用需存在堆漏洞,fastbins无unlink时对双向链表的检查)

    • Double free造成任意内存指针分配:
      a.假如fastbins上存在2个chunk,fastbins链表结构为:fastbins[i]-> chunk2 -> chunk1(最近释放的chunk指针放在fastbins中管理);
      b.再次释放chunk1(double free),那么chunk1的指针被写入fastbins[i],chunk1的fd也指向chunk2,链表结构为:fastbins[i]-> chunk1 -> chunk2 -> chunk1;
      c.如果此时malloc掉chunk1,然后伪造fd指针到fake chunk,再malooc掉chunk2,chunk1,那么fake chunk的指针会被写到fastbins;d.再次malloc将会分配该块地址(fake chunk,可以是任意空间)。

    • House of Spirit:
      覆盖一个fast chunk的fd,使其指向可控的区域,只要构造好数据,释放后系统会错误的将该区域作为空闲chunk放到相应的fast bin里面,最后再分配出来的时候,就可能将目标区域分配给用户。

      注:fastbins使用单项链表管理空闲chunk,只是用fd指针;fastbins数组中存放的是链表尾指针;每当malloc时,返回fastbins数组里chunk指针,更新为返回chunk的fd;每次free一个fast chunk时,chunk放到链表尾(fd指向当前chunk链表最后一个chunk),更新fastbins数组chunk链表尾指针。
  7. Topchunk (House Of Force)
    a.覆写top chunk的size为一个较大值(可以是(unsigned long) -1)),这样可以绕过是否大于用户申请大小的检查;b.申请一个chunk,可以使top chunk切分后,更新的top chunk指针指向目标区域;再次申请时就可以申请到目标区域。

  1. 任意地址free漏洞
    free一片可控地址空间,在该地址空间伪造chunk,使释放时发生unlink。

  2. unlink的注意事项:
    由于glibc增加了unlink的校验,目前只能导致一次固定地址写,伪造 fd 和 bk 的时候需要某个地址存放有有指向该 chunk 的指针,而且这个地址不会因为 ASLR 随机化并且是可写的,满足这两个条件的话一般来说只有 binary 的 bss 段了。如果在堆上的话那么就需要首先 leak 堆地址,其他同理。

内核漏洞利用

待更新…

作者声明

本文版权归作者(rohex)所有,旨在技术交流使用。未经作者同意禁止转载,转载后需在文章页面明显位置给出原文连接,否则相关责任自行承担。

This is copyright.