这几天在看house of orange,然后遇到了HCTF这么一道题目,感觉能够用house of orange来做(和出题大佬spine聊完之后发现这个方法不算准确的预期解法,还有别的解法。),但是和house of orange的场景不一致,最后貌似学会了一种不需要知道heap地址的house of orange攻击方法,这样house of orange的攻击面更加广泛了,不知道各位大牛怎么看,有误之处,还望多多指教。
gets这里可以无限写入直到\n为止,所以通过这个漏洞可以修改top_chunk,所以想到了可以使用house of orange(关于house_of_orange有不懂的可以看我之前关于house of orange的博客http://simp1e.leanote.com/post/9571ae32e8ca)。
0x02 利用思路
1.信息泄露
先用格式化字符串漏洞泄露libc地址,为我们后面的house of orange做好准备。和普通的格式化字符串漏洞泄露方法差不多,就是需要把%n$前面的n-1个也打上就行。然后你可以去尝试用用%n,会发现被检测出来使用可写地址,然后结束了,我的泄露部分如下,能够泄露出来libc_start_main的返回地址,由偏移得到libc地址,同时栈上还有stack地址一并进行了泄露。
但是这里有一个问题就是我们无法泄露heap的地址,但是在house of orange里面是需要获取heap地址来设置vtable的,而且这里给出的服务器上libc的版本是2.24,在2.24的libc源码中对io_file的vtable进行了IO_vtable_check,源码如下https://code.woboq.org/userspace/glibc/libio/vtables.c.html#39
38 void attribute_hidden
39 _IO_vtable_check (void)
40 {
41 #ifdef SHARED
42 /* Honor the compatibility flag. */
43 void (*flag) (void) = atomic_load_relaxed (&IO_accept_foreign_vtables);
44 #ifdef PTR_DEMANGLE
45 PTR_DEMANGLE (flag);
46 #endif
47 if (flag == &_IO_vtable_check)
48 return;
49
50 /* In case this libc copy is in a non-default namespace, we always
51 need to accept foreign vtables because there is always a
52 possibility that FILE * objects are passed across the linking
53 boundary. */
54 {
55 Dl_info di;
56 struct link_map *l;
57 if (_dl_open_hook != NULL
58 || (_dl_addr (_IO_vtable_check, &di, &l, NULL) != 0
59 && l->l_ns != LM_ID_BASE))
60 return;
61 }
62
63 #else /* !SHARED */
64 /* We cannot perform vtable validation in the static dlopen case
65 because FILE * handles might be passed back and forth across the
66 boundary. Therefore, we disable checking in this case. */
67 if (__dlopen != NULL)
68 return;
69 #endif
70
71 __libc_fatal ("Fatal error: glibc detected an invalid stdio handle\n");
72 }
我们设置v7为binsh的地址,那么v6=(binsh-100) /2,把0xe0偏移位置设置成system地址就可以了,所以,这样的话house_of_orange是不需要依靠heap地址的,我还看了一下,其他版本的libc也有和这个io_str_jumps,所以这应该是一个通用的方法。 这里参考了lowkey师傅在安全客的文章,以及angelboy的house of orange,感谢他们的分享,学习到不少知识。
最近某湿敷发了一句话,know it then hack it,这几天重新学习堆方面的漏洞利用知识时候很受教,在学习新的攻击方法和漏洞利用思路时候,必须把每一个步骤都了解清楚,必要的时候比照libc源码进行分析,不知道内部原因的情况下,是无法吃透一个漏洞利用思路的精华所在的,那就更别谈对方法进行改进了。 题目附件我已经上传了,题目最近还开着,大家可以自己尝试去做做,据spine大佬说还有很多解法,我的解法不一定是官方出题思路,大家如果用别的姿势进行利用成功的话,也可以分享来学习一下。