非主流Fuzzing-模糊测试在⾮内存型漏洞挖掘中的应⽤
Author: hei@knownsec.com
Date: 2016-07-06
该内容由 heige 2016年6月23日于 《中国网络安全大会 2016》演讲内容整理。
PDF 下载:非主流Fuzzing.pdf
什么是Fuzzing
Fuzzing是⼀种常⽤漏洞挖掘的⽅法。
“通过向应⽤程序提供⾮预期的输⼊并监控输出中的异常来发现软件中的故障(faults)的⽅法”
“模糊测试利⽤⾃动化或半⾃动化的⽅法重复地向有⽤程序输⼊”
Fuzzing的结构及流程
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)
现状
⽬前内存型漏洞的主要挖掘⼿段,竞争激烈。
⾼度定制化、私有化、复杂化
- 安全研究结构或者个⼈都开始⾃⼰开发私有化框架或者根据开源框架修改
- 针对不同的⽬标进⾏定制化开发
- 针对不同的安全理解进⾏定制化开发
- 各种定制化修改开发必然带来复杂化
集群化、⼤规模化(云), 计算资源成为主要的竞争⼿段。
问题来了!?
- “⾮预期输⼊”⼀定⾮得随机化?
- “异常输出”就⼀定是crash吗?
- 换个提法:Fuzzing只对内存型的漏洞有效?
- 只有“⼤规模的计算资源”才能Fuzzing吗?
- Fuzzing⼀定很复杂?
⾮主流Fuzzing
Fuzzing不只是⼀种⽅法,更是⼀种思想!
漏洞挖掘的“⽅法论” 到 Fuzzing
根据不同的漏洞类型设计简单的Fuzzing
输⼊数据构造:
- 根据漏洞类型提炼更加精准的数据字典,⽐如可以确定的某个参数只能为数字
- 某些特定漏洞的触发数据模型(如SQL注⼊提交’触发异常)
异常输出:
- 不同的漏洞类型异常输出⽅式不⼀样(如SQL注⼊出现错误信息、xss的’弹框’、⽹络请求记录等)
XSS Fuzzing
在xss攻防对抗了有⼀个很关键点就是:新的xss策略
原型:<script/src=‘1.js’></script> 使⽤了/替带了空格
那么我们可以设计⼀个简单的Fuzzing:
http://docs.google.com/Doc?id=dd7x5smw_16hdd34ggz
SQL注⼊ Fuzzing
对于常见SQL注⼊来说,⾮预期的数据直接给参数提交’ 或者”,异常输出直接取错误信息
ORACLE”存储过程”注⼊Fuzzing
- 这种场景的关键是需要⾃动遍历所有”存储过程”及参数 ⾃动提交⾮预期数据进⾏测试
1 |
SELECT SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TA BLES(‘FOO','BAR','DBMS_OUTPUT".PUT(:P1);SYS.DBMS_OUT PUT.PUT_LINE(''KJ021320'');END;--','SYS',0,'1',0) FROM DUAL |
ORACLE”存储过程”注⼊Fuzzing
a.根据object_name得到package的object_id
1 2 3 4 5 6 7 8 9 |
SQL> select object_id,object_type from all_objects where object_name='DRILOAD'; OBJECT_ID OBJECT_TYPE ---------- ------------------ 30192 PACKAGE 30243 PACKAGE BODY |
b.根据object_id得到函数/过程名
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
SQL> SELECT DISTINCT PROCEDURE$ FROM SYS.ARGUMENT$ WHERE OBJ#=30192; PROCEDURE$ ------------------------------ BUILD_DML RESOLVE_SQE VALIDATE_POL VALIDATE_STMT |
c.得到具体PROCEDURE$的参数个数及类型
1 2 3 4 5 6 7 8 9 |
SQL> select distinct position#,argument,pls_type from sys.argument$ where obj#=30192 and PROCEDURE$='VALIDATE_STMT'; POSITION# ARGUMENT PLS_TYPE ---------- ------------------------------ ------------------------------ 1 SQLSTMT VARCHAR2 |
d.构造fuzz数据
1 2 3 4 5 6 7 8 9 10 11 12 13 |
SQL> CALL CTXSYS.DRILOAD.VALIDATE_STMT(''''); CALL CTXSYS.DRILOAD.VALIDATE_STMT('''') * ERROR 位于第 1 ⾏: ORA-06510: PL/SQL: ⽆法处理的⽤户⾃定义异常事件 ORA-06512: 在"CTXSYS.DRILOAD", line 42 ORA-01756: 括号内的字符串没有正确结束 |
iis6 ⽂件名解析 Fuzzing
iis6下 1.asp;.jpg 可以解析asp
渗透测试中的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”
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的值即可
⾮主流Fuzzing的秘籍
Fuzzing不只是的⼀种漏洞挖掘的⽅法,更是⼀种思想可以应⽤于各种场景
Fuzzing的秘籍:“Just Do it” 中⽂知乎版:“整就⽜”
“跨维思维”:不要局限在原有的漏洞模型上,要多发散思维
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
结果:还是只有\
再总结思考:
- ⾸先这个是⼀个典型的“标准不⼀致”带来的安全问题
- 那么除了“new URL(str_1).getHost()”外还有没有其他的可能的攻击⾯?如js⾥的“document.domain”
于是继续设计了新的Fuzzing
sudo python f.py 80
结果:
- android平台下QQ浏览器、微信、QQ UXSSQQ浏览器安卓版
- poc: <iframe src="http://192.168.1.102..163.com"></iframe>
结果:
全平台下的Firefox UXSS漏洞
poc: