一个浏览器Fuzzing框架的学习
2017-03-13 17:28
134 查看
一个浏览器Fuzzing框架的学习
关于框架
之前是LCatro师傅在小密圈分享的他写的这个Fuzzing框架(不过我以前翻github时好像就看到过),但是之前一直没啥时间搞这方面,这两天研究学习了一下。背景资料
其实浏览器Fuzzing框架的资料还是比较多的,之前walkerfuz在Freebuf发过一篇介绍已有开源框架的文章http://www.freebuf.com/sectool/93130.html
况且研究过浏览器的童鞋们都应该用过或是听过grinder、cross_fuzz这些大名鼎鼎的工具了。
此外对于框架开发来说有一篇有点老但比较有启发性的文章,http://bobao.360.cn/learning/detail/160.html
walkerfuz也开源了一个框架出来,链接在这里:https://github.com/walkerfuz/morph
其实对于浏览器fuzzer来说,我个人认为分为两个部分:fuzzer框架和模版。框架主要解决的是fuzz的速度、效率、稳定性的问题,而模版负责生成样本决定了到底能不能挖到漏洞和挖到什么漏洞。所以真正有价值的其实还是模版怎么设计,在网上放出的fuzz框架相当多,模版却没有多少。我这里分享几个我自己搜集的资料
1.烧博士在blackhat14上讲的,但是这个思路应该已经被搞过不知道多少次了。
https://www.blackhat.com/docs/eu-14/materials/eu-14-Lu-The-Power-Of-Pair-One-Template-That-Reveals-100-plus-UAF-IE-Vulnerabilities.pdf
2.这个其实就是作者的nduja说明文档,nduja就不用过多介绍了吧
https://docs.google.com/viewer?a=v&pid=sites&srcid=ZGVmYXVsdGRvbWFpbnx0ZW50YWNvbG92aW9sYXxneDo1MTgyOTgyYmUyYWY3MWQy
3.同样是Rosario valotta的议题,但是我觉得这个提出的一些思路比较有意思
https://www.syscan360.org/slides/2014_ZH_BrowserFuzzing_RosarioValotta.pdf
4.绿盟大牛的一次演讲ppt,篇幅相当足
https://hitcon.org/2014/downloads/P1_06_Chen%20Zhang%20-%20Smashing%20The%20Browser%20-%20From%20Vulnerability%20Discovery%20To%20Exploit.pdf
5.说的比较基础,我怀疑ppt不全??
http://www.leiphone.com/news/201612/YlysgkvgBbeBIkL9.html
Kite框架
好了我们来回归正题,我用过一些框架但是自己写还没有试过,所以这次来学习一下也是为自己动工做铺垫。首先看一下作者的使用说明
1.run web_server.py in this new console window 2.using your browser which you want to fuzzing to open http://127.0.0.1/vector 3.using get_poc.py dump crash poc when browser has been crash
这说明框架是从web_server.py开始执行的
我们查看这个模块发现导入了tornado,这是比较有名的web server模块,框架使用它来搭建本地服务器。
import tornado.web import tornado.ioloop
模块首先创建监视线程,使用的是threading模块
restart_thread=threading.Thread(target=time_wait_restart_process_monitor_thread) restart_thread.start()
threading是一个比thread更高层的API,基本用法如下
t=threading.Thread(target=thread_func) t.start()
线程的执行函数time_wait_restart_process_monitor_thread负责重启进程,并重复这个过程
def time_wait_restart_process_monitor_thread() : global BLOCK_TIME,globle_tick static_tick=globle_tick while True : is_restart=True for time_tick in range(BLOCK_TIME) :#重启线程 if static_tick!=globle_tick : static_tick=globle_tick is_restart=False break time.sleep(1) if is_restart : restart_process_monitor() def restart_process_monitor() : pid=get_process_id() if pid is not -1 : kill_process(get_process_id()) os.system('start process_monitor.py')
读取文件内容之后,使用tornado设置本地服务器
handler = [ (r"/vector", MainHandler, dict(copy_data=copy_data)), (r"/poc", PocHandler), (r"/(.*)", OtherHandler), ] http_Server = tornado.web.Application(handlers=handler)
调用tornado的Application类需要提供Handler列表,这些Handler组成了一个web应用程序。Handler定义了网页路径与函数之间的映射关系。
MainHandler —— /vector PocHandler —— /poc OtherHandler—— /(.*)
tornado官方给出了栗子🌰
只要传递类,并给出get方法即可
import tornado.ioloop import tornado.web class MainHandler(tornado.web.RequestHandler): def get(self): self.write("Hello, world") def make_app(): return tornado.web.Application([ (r"/", MainHandler), ]) if __name__ == "__main__": app = make_app() app.listen(8888) tornado.ioloop.IOLoop.current().start()
我们把注意力放在MainHandler上面来,根据上面的代码可以看出MainHandler是主要的fuzz样本生成类。
这个类提供了如下的get方法。
def get(self): global MOR_POC,globle_tick self.gen() MOR_POC = self.vectors self.write(self.vectors.encode('utf-8')) # Setting Timeout Restart Fuzzing Monitor thread.acquire() globle_tick+=1 thread.release()
可以看出此类的gen方法实现了实际的生成功能,首先生成了一个随机数数组包括数组的元素个数也是随机的。
int_max=700 for x in range(int_max): intArray.append(random.randint(0, int_max))
之后通过对读取的模版进行正则匹配,替换一些实现预设好的域来进行样本生成。
self.vectors = self.template.replace("%MOR_ARRAY%", str(intArray), 1) self.vectors = self.vectors.replace("%MOR_INDEX%", str(random.randint(0, 10)), 1) self.vectors = self.vectors.replace("%MOR_MOD%", str(random.randint(3, 21)), 1) self.vectors = self.vectors.replace("<!--HTML Element-->", make_dom_element(rand(MAKE_MAX_ELEMENT),rand_bool(),rand_bool())) self.vectors = self.vectors.replace("//turn_on_fuzzing", '', 1) self.vectors = self.vectors.replace("%DYNAMIC_MAKE_RANDOM_NUMBER_ARRAY%", str(intArray), 1)
核心的fuzz执行流程差不多就是这样。
在process_monitor.py模块中负责进行异常管理,使用pydbg进行调试。
debugger=pydbg.pydbg() #创建pydbg调试进程
PyDbg出生于2006年,是逆向工程框架PaiMei的核心组件。现在PyDbg已经用于各种各样的工具之中了,其中包括Taof(非常流行的fuzzer代理)ioctlizer(作者开发的一个针对windows驱动的fuzzer)。
详细操作见:
https://wizardforcel.gitbooks.io/grey-hat-python/content/16.html
之后设置了异常处理的函数,如果发生异常就会调用回调
debugger.set_callback(pydbg.defines.EXCEPTION_ACCESS_VIOLATION,crash_recall_access_violation) debugger.set_callback(pydbg.defines.EXCEPTION_GUARD_PAGE,crash_recall_guard_page) debugger.set_callback(EXCEPTION_STACK_OVEWFLOW,crash_recall_stack_overflow)
在异常处理中会使用get_poc.py来获取样本
os.system('get_poc.py "'+get_exception(exception)+'-'+str(hex(EIP))[:-1]+'-'+except_instruction[1][1]+'"')
get_poc.py会请求页面,并把页面保存在本地
result_linux=requests.get('http://127.0.0.1/poc') file_=open('poc/'+exception_data+'-'+get_md5(poc_data)+'.poc.html','w') poc_data=poc_data.replace('/*patch me in poc*/','//') file_.write(poc_data)
相关文章推荐
- 学习心得:数据结构与算法之回朔(一个“框架”)
- 转:一个学习案例: 使用 IBM Rational Unified Process 作为方法框架
- zirco-browser 源代码学习 -- 一个Android平台的浏览器,适合用在学UI
- 基于J2EE规范的TeaFramework框架(毕业设计用于学习J2EE写的一个框架)
- 学习go语言编程中 revel 框架的一个好例子
- 怎样在一个具有框架的窗口中关闭浏览器?
- 任务驱动,对比式学习.NET开发系列之开篇------开源2个小框架(一个Winform框架,一个Web框架)
- 今天起学习CI框架--写了一个很不完善注册页面
- (他山之石)MFC学习之路(二)如何在多文档视图中,程序一开始运行,只出现主框架,不打开一个文档?
- 最近学习框架做了一个小网站,基本功能都实现了但是分页没办法用框架思想实现,查了资料找到一个不错的,修改了下分享下
- Emit学习-实战篇-实现一个简单的AOP框架(一)
- .Net中的Interception--一个简单的AOP框架学习
- Spring.NET学习笔记3——实现一个简易的IoC框架(练习篇)(转)
- 今天学习asp.net mvc的过程中出现了一点问题,是有关浏览器的,一个疑问?
- 深入浅出学习Struts1框架(一):一个简单mvc模式代码示例开始
- 学习js,尝试写一个表单验证框架(1)-规划
- 学习DWR框架的一个实例
- .Net中的Interception--一个简单的AOP框架学习
- 最近在学习一个框架,集成的模板引擎!
- Python web框架Django学习(1)——在win7 64bit下配置开发环境Django:一个可以使Web开发工作愉快并且高效的Web开发框架。 使用Django,使你能够以最小的代价构建和