RSS Feed
更好更安全的互联网

非主流Fuzzing-模糊测试在⾮内存型漏洞挖掘中的应⽤

2016-07-06

Author: hei@knownsec.com

Date: 2016-07-06

该内容由 heige 2016年6月23日于 《中国网络安全大会 2016》演讲内容整理。

PDF 下载:非主流Fuzzing.pdf

 

什么是Fuzzing

Fuzzing是⼀种常⽤漏洞挖掘的⽅法。

“通过向应⽤程序提供⾮预期的输⼊并监控输出中的异常来发现软件中的故障(faults)的⽅法”

“模糊测试利⽤⾃动化或半⾃动化的⽅法重复地向有⽤程序输⼊”

 

Fuzzing的结构及流程

Fuzzing的结构及流程
《Fuzzing Brute Force Vulnerability Discovery》模糊测 试强制发掘安全漏洞的利器

 

 

 

 

 

 

 

 

 

 

 

 

1、构造⾮预期的输⼊

构造⾮预期的输⼊(⽣成模糊测试的数据)是找到漏洞的关键,也是Fuzzing框架设计的⼀个关键点。

数据的构造⼀般包括:基本数据(结构)模板及对应值:

  • 基本数据模板:如⽂件格式(pdf、doc、html等)、⽹络协议、语⾔的语法等
  • 对应值:包括规定格式的属性及常见的引起异常的数据值或者正常值(如:随机超长字符串等)

需要前期分析总结准备,⾃动化随机构造数据样本

数据样本

2、应⽤程序解析执⾏

把“构造⾮预期的输⼊”提交给应⽤程序执⾏。

需要⾃动化、持续不间断的执⾏。如:应⽤程序出现崩溃后能重新启动并执⾏。

这是Fuzzing框架稳定性最关键的步骤,这个点如果中断整个Fuzzing流程就没办法持续。

3、监控异常输出

提供记录异常输出信息及对应的“⾮预期的输⼊”内容。

需要根据异常信息做好分类,⽐如重复的crash归类等。

排除不稳定的异常输出,⽐如不能复现的。

监控异常输出

主流Fuzzing的历史和现状

历史

模糊测试的发展历史

  • 2010年 lcamtuf发布cross_fuzz

  • 2011年 Stephen Fewer发布grinder

  • 2013年 lcamtuf发布american fuzzy lop(afl)

现状

⽬前内存型漏洞的主要挖掘⼿段,竞争激烈。

⾼度定制化、私有化、复杂化

  • 安全研究结构或者个⼈都开始⾃⼰开发私有化框架或者根据开源框架修改
  • 针对不同的⽬标进⾏定制化开发
  • 针对不同的安全理解进⾏定制化开发
  • 各种定制化修改开发必然带来复杂化

集群化、⼤规模化(云), 计算资源成为主要的竞争⼿段。

bugzilla@mozilla

ClusterFuzz

批量Fuzzing

问题来了!?

  • “⾮预期输⼊”⼀定⾮得随机化?
  • “异常输出”就⼀定是crash吗?
  • 换个提法:Fuzzing只对内存型的漏洞有效?
  • 只有“⼤规模的计算资源”才能Fuzzing吗?
  • Fuzzing⼀定很复杂?

⾮主流Fuzzing

Fuzzing不只是⼀种⽅法,更是⼀种思想!

漏洞挖掘的“⽅法论” 到 Fuzzing

漏洞挖掘的“⽅法论” 到 Fuzzing1 漏洞挖掘的“⽅法论” 到 Fuzzing2

根据不同的漏洞类型设计简单的Fuzzing

输⼊数据构造:

  • 根据漏洞类型提炼更加精准的数据字典,⽐如可以确定的某个参数只能为数字
  • 某些特定漏洞的触发数据模型(如SQL注⼊提交’触发异常)

异常输出:

  • 不同的漏洞类型异常输出⽅式不⼀样(如SQL注⼊出现错误信息、xss的’弹框’、⽹络请求记录等)

XSS Fuzzing

在xss攻防对抗了有⼀个很关键点就是:新的xss策略

原型:<script/src=‘1.js’></script> 使⽤了/替带了空格

那么我们可以设计⼀个简单的Fuzzing:

XSS Fuzzing

fuzzer

http://docs.google.com/Doc?id=dd7x5smw_16hdd34ggz

XSS Fuzzing2

SQL注⼊ Fuzzing

对于常见SQL注⼊来说,⾮预期的数据直接给参数提交’ 或者”,异常输出直接取错误信息

ORACLE”存储过程”注⼊Fuzzing

  • 这种场景的关键是需要⾃动遍历所有”存储过程”及参数 ⾃动提交⾮预期数据进⾏测试

ORACLE”存储过程”注⼊Fuzzing

a.根据object_name得到package的object_id

b.根据object_id得到函数/过程名

c.得到具体PROCEDURE$的参数个数及类型

d.构造fuzz数据

iis6 ⽂件名解析 Fuzzing

iis6下 1.asp;.jpg 可以解析asp

iis6 Fuzzing

渗透测试中的Fuzzing

渗透测试常见的暴⼒破解其实就是⼀种“朴素”的Fuzzing

如果加⼊“变异”、“智能”的概念可能⼤⼤提升成功率

  • 《⾃动化攻击背景下的过去现在与将来 》—猪猪侠

⾃动化攻击背景下的过去现在与将来

“相似的业务必然带来相似的漏洞”—漏洞的相似性之⼀

2012年 发现报告TSRC的漏洞:http://tel.exmail.qq.com/domain.html#aa|a|a&&b<script>/*///*/alert(1);</script>bb|ccc

2014年 通过“Fuzzing”我又找到并报告了腾讯业务“48个domain.html dom xss”

domain.html漏洞

http://security.tencent.com/index.php/report/detail/303

实现:

  • 第⼀步:获取基础数据,qq.com的⼦域名
  • 第⼆步:遍历所有⼦域名下 domail.html 的漏洞
    • “异常判断” 直接使⽤phantomjs解析:#aa|a|a&&b<script>window.xsstest=1;</script>bb|ccc判断window.xsstest的值即可

渗透测试Fuzzing2

⾮主流Fuzzing的秘籍

Fuzzing不只是的⼀种漏洞挖掘的⽅法,更是⼀种思想可以应⽤于各种场景

Fuzzing的秘籍:“Just Do it” 中⽂知乎版:“整就⽜”

“跨维思维”:不要局限在原有的漏洞模型上,要多发散思维

Bypass —> Fuzzing —>UXSS

Bypass —> Fuzzing —>UXSS

Bypass :

  • http://drops.wooyun.org\.360.cn —>newURL(str_1).getHost() 的结果为 360.cn 绕过判断
  • http://drops.wooyun.org\.360.cn —>浏览器访问的是http://drops.wooyun.org/.360.cn

原始漏洞模型:http://drops.wooyun.org[fuzz].360.cn—>对⽐new URL(str_1).getHost() 及 浏览器访问的结果

基于原漏洞模型的Fuzzing 异常记录:python -mSimpleHTTPServer 80

基于原漏洞模型的Fuzzing 异常记录

结果:还是只有\

再总结思考:

  • ⾸先这个是⼀个典型的“标准不⼀致”带来的安全问题
  • 那么除了“new URL(str_1).getHost()”外还有没有其他的可能的攻击⾯?如js⾥的“document.domain”

于是继续设计了新的Fuzzing

新的Fuzzing

sudo python f.py 80

f.py

结果:

  • android平台下QQ浏览器、微信、QQ UXSSQQ浏览器安卓版
  • poc: <iframe src="http://192.168.1.102..163.com"></iframe>

fuzzing_uxss_demo

结果:

全平台下的Firefox UXSS漏洞

poc:

Firefox UXSS PoC

Mozilla Foundation Security Advisory 2015-122

发表评论