一个浏览器Fuzzing框架的学习

发布者:Ox9A82
发布于:2017-03-13 17:28

一个浏览器Fuzzing框架的学习

关于框架

之前是LCatro师傅在小密圈分享的他写的这个Fuzzing框架(不过我以前翻github时好像就看到过),但是之前一直没啥时间搞这方面,这两天研究学习了一下。

背景资料

其实浏览器Fuzzing框架的资料还是比较多的,之前walkerfuz在Freebuf发过一篇介绍已有开源框架的文章
9bbK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3k6J5k6h3g2T1N6h3k6Q4x3X3g2U0L8$3#2Q4x3V1k6K6k6h3y4@1L8$3!0D9i4K6u0r3z5e0x3I4x3K6m8Q4x3X3g2Z5N6r3#2D9
况且研究过浏览器的童鞋们都应该用过或是听过grinder、cross_fuzz这些大名鼎鼎的工具了。
此外对于框架开发来说有一篇有点老但比较有启发性的文章,049K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3u0G2j5X3q4G2i4K6u0W2x3K6j5H3i4K6u0W2j5$3&6Q4x3V1k6D9k6h3q4J5L8X3W2F1k6#2)9J5c8X3c8W2N6r3q4A6L8q4)9J5c8U0p5$3x3q4)9J5k6h3S2@1L8h3H3`.
walkerfuz也开源了一个框架出来,链接在这里:5edK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6%4j5h3I4C8k6i4u0X3N6i4A6Q4x3V1k6E0L8%4u0H3K9l9`.`.

其实对于浏览器fuzzer来说,我个人认为分为两个部分:fuzzer框架和模版。框架主要解决的是fuzz的速度、效率、稳定性的问题,而模版负责生成样本决定了到底能不能挖到漏洞和挖到什么漏洞。所以真正有价值的其实还是模版怎么设计,在网上放出的fuzz框架相当多,模版却没有多少。我这里分享几个我自己搜集的资料

1.烧博士在blackhat14上讲的,但是这个思路应该已经被搞过不知道多少次了。
350K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2T1L8r3q4U0K9$3S2S2N6q4)9J5k6h3y4G2L8g2)9J5c8X3c8G2j5%4y4Q4x3V1k6W2N6g2)9J5k6o6p5@1i4K6u0r3L8h3q4@1k6i4u0A6j5h3I4K6i4K6u0r3k6i4g2Q4x3X3b7I4y4q4)9J5k6p5I4#2i4K6u0V1g2r3S2W2i4K6u0V1f1r3!0%4k6i4u0Q4x3X3c8a6k6W2)9J5k6q4m8S2K9i4u0Q4x3X3c8a6L8X3g2Q4x3X3c8f1k6h3#2H3L8r3q4@1k6g2)9J5k6q4c8Z5j5i4c8Q4x3X3c8d9k6i4k6W2j5h3I4K6i4K6u0V1x3e0l9H3i4K6u0V1M7r3I4#2M7#2)9J5k6q4g2m8c8W2)9J5k6p5W2q4i4K6u0V1g2Y4g2D9L8X3g2J5j5h3u0A6L8r3W2@1K9h3g2K6i4K6u0W2M7r3c8X3

2.这个其实就是作者的nduja说明文档,nduja就不用过多介绍了吧
35aK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6V1L8$3y4K6i4K6u0W2k6$3!0G2k6$3I4W2i4K6u0W2j5$3!0E0i4K6u0r3N6X3W2W2N6$3g2J5i4K6y4r3j5g2)9K6c8s2k6Q4x3U0k6S2L8i4m8Q4x3@1u0H3K9h3c8Q4x3@1c8K6K9i4c8W2M7#2)9J5y4X3q4E0M7q4)9K6b7Y4y4J5j5$3W2V1i4K6y4p5h3V1N6h3L8g2W2j5g2Y4y4V1c8#2u0$3j5W2N6r3M7r3u0F1P5o6m8K9g2K6f1H3h3g2N6z5N6X3u0s2z5e0u0S2g2K6W2K6h3g2S2^5L8X3g2p5L8K6q4y4g2r3N6&6e0#2c8Y4P5g2W2E0g2i4W2k6g2#2V1K6e0g2N6c8P5b7`.`.

3.同样是Rosario valotta的议题,但是我觉得这个提出的一些思路比较有意思
6d4K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6%4N6%4N6Q4x3X3g2K6P5i4y4U0j5h3^5K6y4U0m8Q4x3X3g2G2M7X3N6Q4x3V1k6K6L8r3W2V1k6i4y4Q4x3V1j5J5x3o6p5@1i4K6g2X3h3V1S2Q4y4h3k6n7M7X3!0%4M7$3g2J5c8Y4g2*7P5X3W2F1k6#2)9#2k6W2u0G2M7$3q4J5K9h3!0h3j5h3I4G2N6s2c8S2i4K6u0W2M7r3c8X3

4.绿盟大牛的一次演讲ppt,篇幅相当足
13cK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Z5K9i4c8U0L8$3&6Q4x3X3g2G2M7X3N6Q4x3V1j5J5x3o6p5@1i4K6u0r3k6r3!0%4L8X3I4G2j5h3c8K6i4K6u0r3f1o6q4Q4y4h3j5H3y4W2)9#2k6V1y4Z5k6h3&6Q4x3U0f1J5x3q4A6Z5j5h3&6Y4i4K6t1#2x3U0m8Q4x3X3c8Q4x3U0f1J5x3q4y4E0j5i4y4Z5K9h3&6Y4i4K6t1#2x3U0m8f1K9r3g2Q4x3U0f1J5x3p5u0J5L8%4N6K6k6i4u0Q4x3U0f1J5x3q4)9J5k6q4)9J5y4e0t1H3c8Y4u0G2L8g2)9J5y4e0t1H3g2Y4g2D9L8X3g2J5j5h3u0A6L8r3W2@1P5g2)9J5y4e0t1H3c8r3W2K6j5$3!0$3k6i4u0&6i4K6t1#2x3U0m8f1L8#2)9J5y4e0t1H3c8i4S2H3L8r3!0A6N6q4)9J5k6i4m8V1k6R3`.`.

5.说的比较基础,我怀疑ppt不全??
d92K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3I4W2K9i4m8Z5L8$3&6W2i4K6u0W2j5$3!0E0i4K6u0r3L8X3g2%4M7#2)9J5c8U0t1H3x3e0j5I4x3W2)9J5c8W2W2D9P5i4y4Y4K9%4k6Y4b7X3u0W2b7V1W2C8e0o6W2Q4x3X3g2Z5N6r3#2D9

Kite框架

好了我们来回归正题,我用过一些框架但是自己写还没有试过,所以这次来学习一下也是为自己动工做铺垫。
首先看一下作者的使用说明

1.run web_server.py in this new console window
2.using your browser which you want to fuzzing to open 3a4K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8U0p5J5y4#2)9J5k6e0m8Q4x3X3f1H3i4K6u0W2x3g2)9J5c8Y4k6W2j5%4c8G2M7R3`.`.
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官方给出了栗子


声明:该文观点仅代表作者本人,转载请注明来自看雪