《漏洞战争:软件漏洞分析精要》勘误表

后面会在github上维护一款《漏洞战争》的勘误表:https://github.com/riusksk/vul_wars_error ,会不定期更新,也欢迎各位读者通过微博@riusksk反馈书中的错误,等后面重印时更正,并在前言添加感谢。

当前错误列表

1、前言VIII 第4段落最后一句:专研 => 钻研
2、P7页中多处的 smail => smalibaksmail => baksmali (感谢 陈良@科恩实验室)
3、P529页第2段中,“按照图10-12所示的方法重新编译内核源码” => “按照第10.3.7章节的方法重新编译内核源码”(感谢 江小照)
4、P16页最后一行中Thread => Threat(感谢 “不高兴撒”)
5、P164页第3段第3行unsigned int(2字节) => unsigned int(4字符)(感谢 “55-AA”)

《漏洞战争:软件漏洞分析精要》已开售


购买地址 

China-Pub
京东
淘宝
当当
亚马逊

编辑推荐 

《漏洞战争:软件漏洞分析精要》是这些年来难得一见的系统、全面深入分析漏洞攻防心要与战术的书籍。《漏洞战争:软件漏洞分析精要》结合经典的漏洞案例,从攻防思路、分析方法与实战等方面对漏洞攻防做了详细的阐述。既照顾了全局的视野,又不失细节上的周到,对于有志于安全事业并想在安全技术分析上有所提升的读者,这是一本可信赖的必备书籍。正如wushi老师所说:”……对照本书动手调试这些经典漏洞,我相信只要认真做一遍,功力会大增。”
还犹豫什么呢,好书,一本就够!

内容简介

《漏洞战争:软件漏洞分析精要》系统地讲解软件漏洞分析与利用所需的各类工具、理论技术和实战方法,主要涉及Windows 和Android 系统平台。《漏洞战争:软件漏洞分析精要》根据不同的软件漏洞类型划分,比如堆栈溢出、沙盒逃逸、类型混淆、UAF、内核漏洞等,同时又针对当前流行的移动安全,加入Android 平台上的漏洞分析与利用。以精心挑选的经典漏洞为例,以分享漏洞的分析技巧和工具为主,对这些漏洞的成因、利用及修复方法进行详细讲解,旨在”授之以渔”。《漏洞战争:软件漏洞分析精要》最大的特点是以各种类型的经典漏洞作为实战讲解,摒弃空头理论,几乎是”一本用调试器写出来的书”。
《漏洞战争:软件漏洞分析精要》适合计算机相关专业的本科及研究生,信息安全爱好者,软件安全及移动安全相关的安全从业人员,软件开发与测试人员、黑客等阅读。

浅谈iOS应用安全自动化审计

前言

此前有人统计过2015年漏洞最多的产品,苹果的OSX与iOS系统分别占据第一二名,虽有人怀疑统计数据可能存在重复的不准确情况,但相信大趋势是不会变的。

2015年在iOS平台上也发生过不少安全大事,比如“XcodeGhost”事件、iOS9越狱、“iBackDoor“、“YouMi“事件等等,尤其是XcodeGhost影响甚大,注定要在iOS安全史上留下重重的一笔。

结合CVEDetails站点上对iOS系统漏洞的统计情况【图1】,整体处于上升的趋势,尤其是2015年增长迅速,是2014年的3倍多,由此也可以预见iOS平台上的安全漏洞正在快速增长,iOS应用亦然。



图1:iOS系统历年漏洞数量统计图

迁移技术文章

由于博客大巴体验太差,因此开始启用github去写博客,用markdown+hexo写静态博客的感觉也挺好的,而且更安全。
后面我会把以前写的技术文章迁移到本博客,顺便把买来很久一直未用的riusksk.me域名给派上用场了,之前是因为备案流程过于繁琐,才导致一直未使用,使用 http://riusksk.me 解析到 http://riusksk.github.io ,似乎就不用备案了。
近日,我已在本博客上添加RSS订阅和评论功能,欢迎大家订阅和交流。

PHDays安全大会议题分析

大会简介

PHDays(Positive Hack Days),俄罗斯著名的黑客大会,内容涵盖硬件安全、WEB安全、移动安全、网络安全等诸多专业安全领域,并且会议期间设有CTF夺旗竞技赛。

今年会议主要围绕以下主题:关键信息系统的安全性、欺诈管理、网络犯罪和事故调查、维基解密时代的政府与企业安全、网络战和网络间谍。同时,还设有安全论坛,云计算和虚拟基础设施的保护,0day攻防、DDOS防御、工控安全、业务应用和通信网络安全。

议题分析

关于大会议题的在线视频参见:http://www.phdays.com/broadcast/

1、《Building Honeypots to Monitor DDoS》

作者通过搭建存在DDoS漏洞服务的网络蜜罐,从互联网中提取可视化信息,然后将数据反馈给ELK(Elasticsearch、Logstash、Kibana日志集中分析平台,为保护真实网络财产的系统提供数据支撑。据说,后面作者会开源一个网络管理系统,用于统计外部网络的一些反射DDoS攻击的数据。

CanSecWest 2016 大会议题分析

本周分析的安全大会主要以2016年CanSecWest黑客大会上的精彩议题为主,整体上,议题主要偏向于系统/软件漏洞挖掘与利用技术

各议题下载链接参见:http://www.slideshare.net/CanSecWest/presentations

1、《Sandbox Escape with Generous Help from Security Software》

腾讯玄武实验室分享的杀毒软件漏洞挖掘技巧,比如BitDefender、Comodo、Avast、Kaspersky等等国外知名杀软厂商,大多是一些敏感功能未鉴权导致的代码执行或者信息泄露的问题,比如攻击者伪造IO请求去读写、执行本地文件。这里比较好的一点是在漏洞利用场景上,他们将杀软漏洞用来绕过沙盒保护,因为杀软漏洞可以直接以System最高权限执行,允许直接关闭一些软件的沙盒防护。

BlackHat Asia 2016 大会议题分析报告

1、《A New CVE-2015-0057 Exploit Technology》

来自FireEye公司分享的一种针对微软内核 win32k!xxxEnableWndSBArrows tagSBINFO/tagPROPLIST UAF漏洞CVE-2015-0057/MS15-010的利用方法,是被FireEye捕获到的一款Dyre银行木马变种所采用的利用技术,分为32位和64位不同平台下的方法。
【传统攻击方法】:原有的攻击方法是由NCC Group安全组织公布的,采用”占坑“的攻击方式,用可控数据去填充已释放的tagPROPLIST,然后在32位下用SetScrollInfo去操作指向tagWND.strName.Buffer的tagWND.pSBInfo,而在64位下伪造的堆头结构_HEAP_ENTRY去指向tagWND.strName.Buffer,完成数据的覆盖,从而转化为任意地址读写。
【新型攻击方法】:在32位系统下,== 采用tagMENU对象去填充已tagPROPLIST,然后借助tagMENU.cItems和tagMENU.rgItems来完成控制 ==;而在64位系统下,既借鉴了NCC使用tagWND去操作tagPROPLIST,又使用tagMENU去覆盖tagMENU.rgItems,因为rgItems数组指针指向的第一个元素是wID,通过SetMenuItemInfo()可实现完全控制,最终实现任意地址读写。

Hacking Team 武器库研究(六):Mac OSX Rootkit 技术分析

泄露的 driver-macos-master 项目是一个Mac OS X Rootkit 病毒,从源码看,它可能就是当年红极一时的病毒“OSX.Crisis”,因为两者之间连一些函数名都一模一样(比如关键函数hide_proc、hide_kext_osarray,甚至连废弃的hide_kext_leopard也有),逻辑也基本相同。更为牛逼之处的是,Crisis是在2012年爆发的,而该份代码在2009就已完工,想想之间的差距吧,这也再一次证明Hacking Team的技术实力有多强大。

##【源码分析】

下面分析下该 OSX rootkit 技术内幕:

1、先从入口函数 mchook_start 开始分析,主要就是注册字符设备,然后在文件系统上创建设备节点,常规的驱动入口行为。

对应的字符设备转换表如下:

主IOCTL回调函数就下面3个,其中cdev_open和cdev_close为空,整个处理逻辑都包含在cdev_ioctl函数中:

2、关键看下cdev_ioctl 回调函数,里面包括各种潜伏隐藏的行为。在mchook.h文件头中就定义了一些cdev_ioctl中调用到的函数,从函数名上基本可以推测出该rootkit包含文件隐藏、进程隐藏、内核模块隐藏等功能。

3、进程隐藏:在mac osx上,每个进程的上下文都保存在proc结构中,而在allproc链表中就保存着所有进程proc结构的指针,通过allproc链表移除相应进程的proc结构可隐藏正在运行的进程,下面是关于隐藏进程的代码,位于hide_proc函数中(还有另一个未被调用到的函数hide_proc_l,也是用于实现相同功能),它相应进程从进程链表和进程Hash表里都移除掉。之前笔者在分析 rubilyn osx rootkit 时,发现它就没有从Hash表里移除进程相关信息,导致可通过“ps -p pid ”命令查找到进程。

4、内核模块隐藏:早期针对leopard系统的内核模块隐藏是调用 hide_kext_leopard 函数,现在已经不再使用,它只是简单地遍历kmod_info 内核模块链表结构,找到相匹配的模块名,然后将从它链表中踢除,这样当执行kextstat命令时就查看不到隐藏的内核模块,但这种方法现在无效。

为了支持多个系统版本,后来重写了个 hide_kext_osarray 函数。在“雪豹”苹果系统之后,有个叫sLoadedKexts 的 IOKit OSArray类引用到内核模块列表,不过它并没有导出符号,只要能够找到它,那么就可以对sLoadedKexts 数组进行修改,以达到隐藏内核模块的目的。

庆幸的是,OSKext::lookupKextWithLoadTag 函数里面引用到sLoadKexts(源码参见:http://www.opensource.apple.com/source/xnu/xnu-2782.1.97/libkern/c++/OSKext.cpp),通过它可以定位到sLoadKexts地址。

它对应的内核模块位于/System/Library/Extensions/System.kext/PlugIns/LibKern.kext/LibKern,不过当用IDA加载分析时,发现它只有导入表的函数信息,并无实际函数,包括PlugIns目录下的其它驱动也是大多如此。进一步分析,发现这些驱动其实都链接到/System/Library/Kernels/kernel里面,可以发现OSKext::lookupKextWithLoadTag函数对应的符号名为__ZN6OSKext21lookupKextWithLoadTagEj。

通过该符号即可找到OSKext::lookupKextWithLoadTag函数,然后开始搜索机器 E8,即CALL指令,从上面的源码看,调用的第一个函数是IORecursiveLockLock,然后跳过call指令(共5字节)进入下一条指令。

再根据32位/64位系统进行区分,对于32位比较简单,call下一条指令就包含有sLoadedKexts地址,下图就是32位系统Snow Leopard 10.6.8的OSKext::lookupKextWithLoadTag函数,由于笔者缺乏该环境,因此图片是从网上扣来的:

但对于64位系统会相对繁琐一些,它先找到机器码 48 8B,即mov指令,获取第2个操作数的实际内存地址,即为sLoadKexts,不过笔者在最新版10.10.4上发现必须是在第2个 48 8B才有效,因此该份rookit只适用于低版本的 64位Leopard系统

定位到sLoadedKext这个OSArray数组之后, sLoadedKext[OFFT_KEXT_COUNT] = sLoadedKext[0x14] = 元素个数,即已加载的内核模块个数。接着找到最后一个kext模块的kmod_info结构信息,判断该内核模块是否为com.apple.mdworker,若是则将递减模块数量,进而隐藏kext模块,所以实际要隐藏哪个模块就得去更改com.apple.mdworker为相应的模块名。

5、文件隐藏:为了对列出文件的相应系统函数进行挂钩,我们需要先对finder和ls所使用的函数进行进程跟踪,在mac上已经用Dtrace代替ktrace,在finder上主要是使用getdirentriesattr函数,而ls主要是使用getdirentries64,下面是用Dtrace分别对finder和ls的进程跟踪情况:

下面是查看finder进程2841的调用函数,其中的getdirentriesattr在最新版10.10.4上未发现被调用,以下测试是之前在10.9系统上测试的,但是在10.10.4中getdirentriesattr函数依然在syscall.h中被定义着。

1
2
3
4
5
6
7
riusksk@macosx:/usr/include/sys$ sudo dtrace -s ~/Reverse\ engineering/Dtrace/calltrace.d -p 2841 | grep getdir

dtrace: script '/Users/riusksk/Reverse engineering/Dtrace/calltrace.d' matched 573227 probes

2 1078881 getdirentriesattr:entry
2 1363229 getdirentriesattr:return =1
……

下面是ls命令(64位系统)调用的函数:

因此,我们若想在finder和ls中隐藏文件,只要对这两个函数 getdirentriesattr 和 getdirentries64 (32位的为getdirentries)进行挂钩处理即可。在系统调用函数表中,主要是由sysent结构数组构成,每个sysent结构中都包括参数个数sy_narg,执行函数sy_call 这些重要数据。sysent结构如下:

为了实现对上述系统函数的挂钩,通过修改相应函数sysent结构的sy_call来进行偷梁换柱,关于各系统函数的调用号和宏名均可在 /usr/include/sys/syscall.h中找到:

回头看源码,发现该rootkit也是对上面这3个函数进行hook:

看下其中的hook_getdirentiries64函数,其它类似,主要还是移除指定文件的dirent结构,其中dirent结构原型如下:

先调用原始函数,获取真实的文件信息(源码中的direntry对应的其实是dirent结构,在新版版本中这两个结构是独立存在的了):

然后遍历文件链表,找到相匹配的文件名,然后用后一个dirent文件结构覆盖当前找到的dirent文件结构,这样就相当于指定的文件结构信息从链表中移除,从而实现文件隐藏的目的。

10、官方另外在testuint目录下放有用于测试的rootkit的工具kextControl.c 和 solveKernel.c。

【总结】

实际测试时,由于没有合法签名,导致驱动也无法被正常加载,因此未能作实际测试。

1
15/7/17 下午2:23:27.921 com.apple.kextd[44]: ERROR: invalid signature for com.revenge.kext.machooker, will not load

此次泄露的OSX rootkit 相对还是比较常规的技术,毕竟是2009的源码了,年代久远,但在最新OSX 10.10上稍作修改,应该还是可以用的。

Hacking Team 武器库研究(五):Mac OSX 64位 Shellcode 技术分析

在此次泄露的Flash 0Day的利用代码都包含针对Mac OSX 64位系统的利用,以往在网上看到的大多是Windows平台32/64位的利用代码,很少有Mac版的flash利用代码曝光,刚好可以借机分析学习下军用级武器的写法。

##【源码分析】

下面以第1个Hacking Team泄露的CVE-2015-5119 Flash 0day 漏洞中的利用代码为例:

1、内在中暴力搜索Mach-o文件头magic标记 0xfeedfacf(类似搜索windows平台下的PE头MZ标记),它代表64位程序的意思,也是Mac OS X上可执行文件的开头。

可以用otool或者MachOView查看Mach-o可执行文件格式:

2、在Mach-o文件头之后是加载命令(Load Command)区域,接下来程序搜索用于映射文件中的段到进程内存空间的LC_SEGMENT_64加载命令,遍历每个被加载的段,找到包含段标记为S_SYMBOL_STUBS(代表包含符号信息) 和 S_ATTR_PURE_INSTRUCTIONS (代表包含机器码)的段,然后获取段地址Address、偏移量Offset、Size、Stubs Size、Stubs数量以及Indirect Sym Index(间接符号表索引值)。

3、找到 _LINKEDIT 段,从中获取相应的虚拟地址和文件偏移,然后互减得到两者之间的偏移量。

4、获取LC_SYMTAB加载命令的相关信息,该命令用于指定文件所使用的符号表,找到后分别获取符号表偏移量、符号数、字符串表偏移量、字符串表大小

5、获取LC_DYSYMTAB加载命令的相关信息,该命令用于指定动态链接库所使用的符号表,找到后获取间接符号表偏移量

6、将前面获取的符号表地址、间接符号表地址和字符串表地址分别加上第3步获取的偏移量

7、从前面获取的3个值,去字符串表中索引mprotect函数,找到其对应的内存地址,以利用它去真正的shellcode部分赋予可执行权限(这部分与Windows平台上的代码基本一致),以绕过DEP的保护。

8、前面都是为执行接下来x64 shellcode代码而作的准备,由于vfork所创建的子进程与父进程共享数据,因此可用于检测是否位于沙盒中,若在沙盒中vfrok会执行失效,进而退出执行。

9、通过为syscall指定调用号来调用execve函数,以执行”/Applications/Calulator.app/Contents/MacOS/Calculator”打开计算器,然后再调用exit退出子进程。

10、设置返回值为int atom类型,左移3位是为了对最后3 bits 清零,因为它代表着atom类型,再加6是为了设置为int atom类型,因为shellcode相当于自定义函数,它是用于替换payload的JIT函数去执行的,最后弹出栈数据,以维持栈平衡。

##【总结】

此次的Mac OSX 64位平台的利用,主要还是先根据Maco-o文件头标记找到flash模块,然后去索引符号表、间接符号表和字符串表,进而找到mprotect函数的地址,将shellcode内存块设置为可执行权限。真正用于弹出计算器的shellcode代码相对比较简单,向syscall传递调用号来执行execve函数,进而打开指定的程序文件Calculator,实现最终的任意代码执行。