二进制漏洞研究入门之上篇
前言
从本文开始,笔者将分享一些二进制漏洞研究的个人经验,希望可以给初学者提供一些做漏洞研究的思路。鉴于笔者当前擅长的是Windows平台下的漏洞,以下分享可能会侧重这一平台,但里面介绍的一些方法是通用的。
这个系列分为上下两篇文章,本文为上篇。
刚进入或还未进入二进制漏洞研究领域的同学经常会问的一个问题是:我想上手xxx领域的漏洞,请问有什么书籍、博客和其他资料领域可以推荐?笔者接下来举一个小明的例子进行说明。
小明的故事
假设小明已进入网络安全行业,想上手office漏洞研究,首先要明确对应的动机是什么。在笔者看来,小明的动机可以有如下几个:
- 1. 对该领域充满兴趣,愿意花时间研究
- 2. 接到任务要进行office漏洞研究,侧重于静态扫描,例如需要写一个杀毒引擎
- 3. 接到任务要进行office漏洞研究,侧重于动态分析,例如需要构建一套office漏洞动态分析系统,并在此基础上捕获一个零日漏洞
假设小明的动机是上述第3点,目前他在该领域的基础为零,该如何启动自己的研究?
首先,小明可以将上述任务1分解为如下子任务:
- 1. 收集待研究的漏洞信息
- 2. 仔细分析每一个漏洞
- 3. 将分析得到的专业知识融入检测系统
收集信息
先来讨论子任务1,如何对历史上常见的office漏洞进行研究呢?
第一当然是找出常见漏洞。那么,如何收集这些常见漏洞?在笔者看来,可以从以下几个来源入手:
a. 安全论坛上近年来经常有人讨论的漏洞
b. 各大安全厂商的博客最近经常有分析文章的漏洞
c. 各大安全厂商近几年披露的在野零日漏洞
收集上述资料的目的是为接下来的研究做准备,a,b的目的是收集高频漏洞信息,c的目的是收集那些出现过的在野零日漏洞信息。
首先,小明开始收集a信息,从a开始就涉及到信息收集能力了,a要求小明去搜寻该领域常见的安全论坛,国内比较有名的安全论坛有以下几个:
论坛名称 | 网址 |
看雪论坛 | https://bbs.pediy.com/ |
安全客 | https://www.anquanke.com/ |
Freebuf | https://www.freebuf.com/ |
先知社区 | https://xz.aliyun.com/ |
接下来,小明开始收集b信息,b要求小明整理出国内外具备较强漏洞研究能力的安全厂商的博客,并浏览里面的相关文章:
厂商名称 | 博客网址 |
Kaspersky | https://securelist.com/ |
FireEye | https://www.fireeye.com/blog/threat-research.html |
Microsoft | https://www.microsoft.com/security/blog/ |
Cisco Talos | https://blog.talosintelligence.com/ |
TrendMicro | https://blog.trendmicro.com/ |
ZDI | https://www.zerodayinitiative.com/blog |
Mcafee | https://www.mcafee.com/blogs/mcafee-labs/ |
Palo Alto Networks Unit42 | https://unit42.paloaltonetworks.com/ |
ESET | https://www.welivesecurity.com/ |
Gigamon | https://atr-blog.gigamon.com/category/threat-research/ |
Fortinet | https://www.fortinet.com/blog/threat-research.html |
Symantec | https://www.symantec.com/blogs/threat-intelligence |
CheckPoint | https://research.checkpoint.com/ |
f-secure | https://blog.f-secure.com/category/threats-research/ |
安恒信息 | https://ti.dbappsecurity.com.cn/blog/ |
360 | https://blogs.360.cn/ |
奇安信 | https://ti.qianxin.com/blog/ |
腾讯 | https://s.tencent.com/research/report/ |
知道创宇 | https://Paper.seebug.org/ |
天融信 | http://blog.topsec.com.cn/ |
最后,小明需要收集c信息,c的信息要求更精准一些,是那些曾发现过在野0day/1day漏洞攻击的厂商对相关事件进行披露的博文,比如关于office相关漏洞,小明可以整理出如下信息:
漏洞编号 | 分析文章 |
CVE-2013-3906 | https://www.mcafee.com/blogs/other-blogs/mcafee-labs/mcafee-labs-detects-zero-day-exploit-targeting-microsoft-office-2/ |
CVE-2014-1761 | https://www.mcafee.com/blogs/other-blogs/mcafee-labs/close-look-rtf-zero-day-attack-cve-2014-1761-shows-sophistication-attackers/ |
CVE-2015-0097 | https://www.fireeye.com/blog/threat-research/2015/07/cve-2015-0097_exploi.html |
CVE-2015-1641 | https://www.freebuf.com/vuls/81868.html |
CVE-2015-2545 | https://www.fireeye.com/content/dam/fireeye-www/blog/pdfs/twoforonefinal.pdf https://www.fireeye.com/blog/threat-research/2015/12/theepsawakens.html<br/>https://www.fireeye.com/blog/threat-research/2015/12/the-eps-awakens-part-two.html |
CVE-2016-4117 (以office为载体的flash漏洞) | https://www.fireeye.com/blog/threat-research/2016/05/cve-2016-4117-flash-zero-day.html |
CVE-2016-7193 | https://Paper.seebug.org/288/ |
CVE-2017-0199 | https://www.fireeye.com/blog/threat-research/2017/04/cve-2017-0199-hta-handler.html https://www.fireeye.com/blog/threat-research/2017/04/cve-2017-0199_useda.html |
CVE-2017-0261/CVE-2017-0262 | https://www.fireeye.com/blog/threat-research/2017/05/eps-processing-zero-days.html |
CVE-2017-8759 (以office为载体的.Net漏洞) | https://www.fireeye.com/blog/threat-research/2017/09/zero-day-used-to-distribute-finspy.html |
CVE-2017-11826 | https://blogs.360.cn/post/office0daycve-2017-11826_ch.html |
CVE-2018-0802 | https://www.freebuf.com/vuls/159789.html |
CVE-2018-8174 (以office为载体的vbscript漏洞) | https://blogs.360.cn/post/cve-2018-8174.html |
CVE-2018-5002 (以office为载体的flash漏洞) | https://blogs.360.cn/post/cve-2018-5002.html |
CVE-2018-8373 (以office为载体的vbscript漏洞) | https://blog.trendmicro.com/trendlabs-security-intelligence/use-after-free-uaf-vulnerability-cve-2018-8373-in-vbscript-engine-affects-internet-explorer-to-run-shellcode/ |
CVE-2018-15982 (以office为载体的flash漏洞) | https://blogs.360.cn/post/PoisonNeedles_CVE-2018-15982.html |
到这里假设上述步骤已完成,小明已经得到一个待研究的office漏洞的CVE编号列表。
如果小明借助这些编号整理得到一系列统一命名的文件夹、书签和笔记,就可以构建一个可扩展的资料检索系统,举例如下:
文件夹可以进行如下归类:
书签栏可以进行如下归类:
笔记系统可以进行如下归类:
上面展示的归类结果是笔者在长达几年的事件里逐渐积累得到的。这个案例中,小明一开始也许只能收集到office漏洞的若干个CVE,但只要进行合理设计,在往后的研究过程中上述资料系统可以被不断扩充,并且非常易于检索。文件夹主要放置该漏洞相关的一些资料,例如网上的调试报告,调试日志等;书签栏主要保存该漏洞相关的一些链接,如分析文章的地址,在制作书签栏时也可以对相应的链接进行备注;笔记系统主要收藏一些用于精读的文章以及不涉及敏感信息的调试笔记。
分析漏洞
接下来讨论子任务2,如何仔细分析每一个漏洞?这个问题可以描述为:如何仔细分析一个漏洞?然后将此扩展到一个集合。
在笔者看来,分析一个漏洞的基本思路如下:
第一步:复现问题
获得PoC
补丁分析
其他方式
搭建环境
如何制作环境
用正确的步骤触发
第二步:定位成因
静态逆向
IDA等工具的使用
动态调试
Windbg等工具的使用
第三步:利用编写
缓解机制绕过
GS/DEP/ASLR/CFG/...
高级利用方式
yuange的DVE
HackingTeam的Flash利用方式
TK教主的《Write Once,Pwn Anywhere》
...
第四步:漏洞挖掘
找出相似问题
假设小明第一个要分析的漏洞编号为CVE-2012-0158,这是一个office下的栈溢出漏洞,那么具体步骤又大概可以分解为如下:
CVE-2012-0158(office)
基本知识点
栈溢出的基本分析步骤
静态分析
动态分析
栈溢出原理
栈溢出利用编写
相似漏洞(进阶)
office
CVE-2010-3333
公式编辑器3个漏洞
CVE-2017-11882(office)
熟悉非宿主进程的漏洞调试方式
利用编写
CVE-2018-0802(office)
补丁绕过
过ASLR的奇技淫巧
CVE-2018-0798(office)
相似漏洞之间的细微差异
adobe reader
CVE-2010-0188
TIFF组件栈溢出漏洞
如何挖掘此类漏洞(进阶)
现在小明开始着手分析CVE-2012-0158了,第一步是获取漏洞的PoC(其实许多时候这一步就会卡住,如果小明不能获得在一个大平台的实习和工作的机会,有时候获取样本都是一个很大的问题),这里假设小明在一家知名的安全厂商工作,可以获取所需样本。那么就来到了下一步:如何制作正确的漏洞触发环境?
环境制作
在拿到样本之后,制作合适的环境进行触发是一门学问,笔者遇到过一些特殊样本,单是配置环境就花了很多时间。这里笔者简要介绍一下如何配置两种环境:Nday环境和0day环境。
所谓Nday环境是指那些可以触发老漏洞的环境。所谓0day环境是指截止目前待测试软件的全补丁环境。所谓全补丁,是指当前系统安装了待测试软件截止目前的所有安全更新。
首先是安装虚拟机镜像,这是基本功,网上资料很多,可以去MSDN I tell you下载对应的镜像,微软也提供了自己的制作的虚拟镜像供下载:
备注 | 网址 |
MSDN I tell you | https://msdn.itellyou.cn/ |
Microsoft VMs | https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/ https://developer.microsoft.com/en-us/windows/downloads/virtual-machines/ |
Nday环境比较好配置。由于许多漏洞在一些软件的默认安装包上就可以触发,所以安装旧版本软件包就可以构造出大多数样本的触发环境。但假设小明碰上了一个刁钻的样本,该样本只在特定版本的软件上工作,比如CVE-2014-1761的原始在野0day样本。这个时候就需要对没有打补丁的Office版本逐渐打补丁以进行挨个验证;或者借助社区的力量,许多时候有人会在论坛里说明自己制作环境的方式,这时就可以借鉴他人的经验,比如看雪这篇调试CVE-2014-1761的文章(https://bbs.pediy.com/thread-197382.htm)。
这里笔者总结了几个Windows平台下补丁包下载的网站,供有需要的读者进行收藏:
备注 | 网址 |
微软官方补丁检索网站 | https://www.catalog.update.microsoft.com/Home.aspx |
各版本IE11 | https://support.microsoft.com/zh-cn/help/18520/download-internet-explorer-11-offline-installer |
从几年前开始,笔者就养成了将每次下载的镜像、安装包找个专用的地方进行存储归类的习惯,随时间积累,这个存储量规模逐渐变大,笔者将其保存在一个移动硬盘中,这样既便携又易于检索,这些都会加快后面配置新环境的速度:
接下来谈一下0day环境的制作,一般来说,在虚拟机内制作0day环境有两个目的:
- 1. 进行漏洞挖掘
- 2. 进行0day Hunting
0day环境制作最主要的是打上全补丁,笔者在这里推荐一个打补丁神器:Dism++:
备注 | 网址 |
工具主页 | https://www.chuyu.me/zh-Hans/index.html |
Dism++最新版的更新管理功能需要去以下页面下载wsusscn3.cab,并按要求进行配置 | https://github.com/Chuyu-Team/Dism-Multi-language/releases |
Dism++工具陪伴了笔者好几年,在0day环境制作方面效果非常好。不过该工具目前的更新速度比官方略慢,有时候但并不能打上全补丁,最近1-2个月的补丁需要手动去微软相应界面下载并安装。
当然,有时候Dism++也会打不上补丁,比如笔者之前在尝试制作一个office 2007全补丁环境时,就遇到了Dism++无法打补丁的情况,这时候可以使用某卫士在虚拟机内对office 2007打补丁,打完补丁后再将其卸载(笔者也尝试了用某管家打office 2007全补丁,效果不太理想)。
静态分析
到这里假设小明已经制作了合适的环境,即将开始分析漏洞,笔者在分析一个样本之前一般会对样本进行静态分析,比较常用的为010 Editor、Nopepad++、IDA等工具。Nopepad++的主要作用是文本查看、010 Editor的主要作用进制/文件结构查看、IDA的主要作用是汇编代码查看和逆向。
此外每种样本都有一些该领域的小工具,比如office分析领域的oletools、olefileview、OffVis等工具,细心收集,纳入上述知识管理体系即可:
需要指出的是,每一个用IDA进行逆向过的模块,依然可以借助上面类似的分类系统进行整理归类,日积月累后将大大省去未来逆向相同文件的时间,特别是flash,mso,wwlib(后面两个为office的模块)这些大模块,举例如下:
动态分析
进行基本的静态分析后,小明开始在调试器中复现和调试漏洞细节,这个过程中同样涉及到动静态调试的配合,例如定位到相关模块,然后用IDA对相关模块进行逆向。
动态分析这块因人而异,本文不做过多讨论。
笔者目前的做法是:调试一个漏洞,先不要去看其他人的调试报告,先借助调试器去探索有疑问的地方,尝试在与调试器进行对话的过程中解决问题。如果可以完整地独立调试一个漏洞,那么调试其他漏洞和看其他人的漏洞报告都会显得简单很多。
另一方面,笔者也从其他人的调试报告中学到很多知识,例如笔者曾仔细阅读过FireEye写的所有0day漏洞分析文章,获益良多。
报告撰写
假设小明通过自己的努力分析完了一个漏洞。下一步的任务是将漏洞调试过程中的相关资料进行整理,并将实践过程中的一些探索点记录下来,形成自己的漏洞报告,该漏洞报告里面要重点写入自己在解决相关疑难点时的做法。假以时日若回头理解相关漏洞,这些疑难点的解决笔记就是非常有价值的资料了。
写完漏洞报告后,小明可以将相关报告在部门内共享,可以发到部门博客,也可以发到论坛和大家一起进行交流,当然也可以仅作为笔记归类到自己的知识系统,放置到对应CVE编号的文件夹下。需要注意的是,披露一些漏洞的细节时需要严格遵循国家的法律法规。
随着对漏洞的理解加深,假设在未来的某一刻小明对某个漏洞有了新的认知,他可以迅速检索之前的调试资料,在之前的基础上进行进一步调试,从而得到对该漏洞更深的理解,整理成相关报告后将知识继续融入知识系统,形成正向循环。
以下为笔者在2017年重新调试CVE-2012-0158时的调试日志和报告:
融入业务
作为一个漏洞方向的安全研究员,将自己研究所得的专业知识与公司的具体业务结合起来是一种比较正确的工作方式。例如,小明可以在调试完上述每个office漏洞后,都将相应的知识融入公司的检测系统。这方面每个公司的业务不一样,本文不对此做进一步探讨。
小结
在本文中,笔者借助小明的故事向读者介绍了一些漏洞研究经验。除此以外,笔者还有其他一些经验进行分享,我们下篇再见。
by 银雁冰