House of orange🍊



House Of Orange 是AnglyBoy在hitcon-2016中出的一道Pwn题
题目中使用了一种全新的攻击手段House-Of-Orange,利用Unsotred bin attack攻击_IO_List_all,劫持控制流。

逆向分析

题目中创建了两种数据结构orange与house

题目中共分为4种操作

  1. build house
    创建一个包含orange和name的house,其中orange 结构中包含其price与color
  2. see house
    打印house的name与orange
  3. upgrade house
    更新house的信息,包括name与orange
  4. exit
    退出程序

其中build的操作限制次数为4次,upagrade的次数为3次。

漏洞

题目中存在两个主要漏洞
1.Heap Overflow
在Upgrade中,重新输入house的name时没有判断大小,可能导致HeapOverflow

2.Information Leak
在input_string函数中,read在输入的字符串后没有加入’\0’可能导致信息泄露

漏洞利用

我们在进行漏洞利用的时候会遇到以下困难:

  • 使用House-Of-Force尝试去修改name指针,但是题目中限制了name的最大大小为0x1000,方案不可行。
  • 题目中并没有进行free,所以尝试使用HeapOverflow溢出到name pointer必然会用到free后再malloc,方案不可行

官方的解决思路是利用House-Of-Orange

Overwrite TopChunk

由于程序保护全开,首先需要做的是地址泄露。

information leak需要free,而题目中没有free,我们需要使用sysmalloc中的_int_free()

1.触发sysmalloc的条件:当top chunk的大小不足够分配时空间时,malloc会调用sysmalloc分配,题目中限制malloc最大为0x1000,所以我们必须利用HeapOverflow,溢出修改TopChunk的Size。之后申请一个大小大于TopChunk,小于mmap_threshold的值,mmap_threshold的值为128*1024。
如下图,Trigger sysmalloc

同时在Trigger intfree in sysmalloc时,申请的大小还需要绕过以下assert:

  • Size大于最小chunk的大小,x64下应该是0x20
  • Size的Prcv_inuse位是1,即其最后一个bit为1
  • TopChunk+TopChunk_Size页面对齐,已知页面Page_size的大小为0x1000。例如之前的Topchunk大小为0x20f31,则另Overflow修改后的Topchunk大小为0xf31就可满足页面对齐。

  • Size+MINSIZE>old_topchunk的大小,输入的Size+0x20>原TopChunk大小

我们再次malloc一个大于该Size的chunk时,就会调用sysmalloc 中的_int_free掉top chunk,这样TopChunk被free掉到UnsortedBin中。在malloc.c中sysmalloc的调用_int_free的相关代码如下:


TopChunk free后到UnsortedBin中的情况如下图:

Information Leak

UnosrtedBin中是old_chunk之后,我们可以再次malloc,通过see来泄露libc_base与heap_base
这里选择maloc一个Large Bin,因为LargerBin拥有fd,bk中可泄露libc地址,并且还有fd_nextsize,bk_nextsize可泄露heap地址
如下图:

分别通过upgrade对该chunk进行适当的覆盖
我们可以通过see操作泄露出分别libc_base 与heap_base
之后对我们下面需要用到的libc的地址进行计算。

Hijack ControlFlow

到目前为止,我们已经使用了3次build,2次upgrade,只剩下最后一次build,upgrade的机会,也由此可见,作者对该题目的解法限制地比较死。
下面简略介绍一下Hijack ControlFlow的思路:
利用upgreade触发Heap overflow,UnsortedBin Attack修改_IO_list_all全局变量,将其更改到main_arnea的地址空间中,之后利用最后一次build的机会构造fake IOfile结构,在malloc的abort的过程中,会调用_IO_flush_all_lockup,我们可控制其调用fake IOfile结构中的虚表指针,从而劫持程序控制流。这种做法被作者称之为File Stream Oriented Programming即FSOP。

下面分别对上述的几个具体步骤进行分析:
1.Abort routine
House-of-Orange的目标是在malloc的abort routine的过程中劫持控制流。
Malloc_printerr的处理调用流程如下图:

它的处理过程调用了_IO_flush_all_lookup,并且使用了_IO_FILE结构。
调用关系如下:malloc_printerr->__libc_message -> __GI_abort() ->_IO_flush_all_lockp

Forge the IOFILE object
我们的目标是触发_IO_OVERFLOW,所以构造的FILE_structure,需要满足以下条件:
下面是_IO_flush_all_lookup的源代码:

当_IO_FILE结构满足下面的条件,

调用_IO_OVERFLOW (fp, EOF) == EOF),转而通过fp = fp->_chain寻找新的_IO_file结构来使用。我们通过这个特点可以进行Oriented Programming。
所以我们构造的fake IO_FILE如下:
fp->_mode > 0;
_IO_vtable_offset (fp) ==0
fp->_wide_data->_IO_write_ptr = (char *) 2
fp->_wide_data->_IO_write_base = (char *) 3;

这样才能成功调用_IO_OVERFLOW (fp, EOF)
Unsorted bin Attack
UnsortedBin Attack的原理不再赘述
首先利用UnsortedBin Attack去劫持_IO_list_all全局变量,可将_IO_list_all更改为unsorted_bin(av),即main_arena+0x58。

这样当触发_IO_flush_all_lookup时,我们可在main_arena寻求构造fake IO_file结构的机会。
Control the world
由于无法控制main_arena中的内容,所以我们决定使用指向next IOFILE对象的链指针,上面提到了_IO_flush_all_lookup 将会利用_chain选择下一个_IO_file,_chain的地址恰好是smallbin[4]的地址,所以我们通过upgrade修改Unsorted Bin的大小为0x61,再次maloc时,UnsortedBin中的chunk从链表中卸下来。smallbin[4]即_chain中就填入了heap内容,如下:main_arena下的_chain。

我们在smallbin[4]中构造一个fake IOfile,如下图:
flags中填入”/bin/sh\x00″,vtable填入一个写入systemaddr的地址,因为_flags等在_IO_flush_look_up判断中失败,将会调用_IO_OVERFLOW (fp, EOF) == EOF)

我们之前已经在heap中布置好了fake IO_jump_t,Vtable中我们的payload中修改__overflow的地址为system地址,并且第一个参数fp="/bin/sj\x00",则可顺利执行system(“/bin/sh\x00”),Getshell。

Fsop Summary

上面的FSOP的攻击流程可以简化成下图:

House-Of-Orange攻击有一定概率失败,主要原因是因为在Bypass时,

由于第一次将_IO_list_all劫持到main_arena时,由于main_arena不可控,该内存随机,所以有时
(fp->_mode <= 0 && fp->_IO_write_ptr > fp->_IO_write_base)结果为0,造成执行
_IO_OVERFLOW (fp, EOF) == EOF)调用未知Vtable错误地址,程序Abort,所以程序有一定概率失败。

所以,在ASLR开启时,(((fp->_mode <= 0 && fp->_IO_write_ptr > fp->_IO_write_base)随机结果必须为1时,才能够顺利实现FSOP,House-of—Orange攻击。

Script

ShellFish House-Of-Orange

在House-of-orange题目之后,它也成为了house系列中一个独立的攻击方法,shellfish在How2Heap中也加入了House-of-Orange的Poc
我们下面也可以通过POC的代码与注释来再次深入学习House-of-Orane的思想
我将该POC中的英文注释部分翻译后的代码如下:

代码已经将Horse-Of-Orange的整个攻击流程的来龙去脉讲解得非常详细了,下图是最终效果:

整个House-Of-Orange需要对ptmalloc的分配机制有很深入的理解和漏洞利用的功底,膜拜!

参考文献

Angly官方wp

发表评论