用户
搜索
  • TA的每日心情
    慵懒
    2017-7-14 21:11
  • 签到天数: 70 天

    连续签到: 1 天

    [LV.6]常住居民II

    i春秋签约作家

    Rank: 7Rank: 7Rank: 7

    17

    主题

    254

    帖子

    91

    魔法币
    收听
    0
    粉丝
    5
    注册时间
    2016-11-6

    i春秋签约作者

    发表于 2017-5-14 10:29:25 2114061
    本帖最后由 kaikaix 于 2017-5-19 19:12 编辑
    本文加入奖励计划未经许可不能转载

    0x01    前言
          要看这篇文章,首先要看一下https://bbs.ichunqiu.com/thread-21739-1-1.html(因为上一次讲得有些不怎么样,所以这里很多东西都会重新说一下)和https://bbs.ichunqiu.com/thread-18308-1-1.html有点基础先。我的操作环境是kali,安装好需要的库:
    [Python] 纯文本查看 复制代码
    apt-get install python-imaging
    apt-get install tesseract-ocr
    pip install pytesseract

    0x02    验证码识别
    code.jpg
          先来看看这个验证码,这种验证码就是可以识别的。废话不多说,来实现一下识别的代码,先导入库:
          
    [Python] 纯文本查看 复制代码
     from PIL import Image
          import pytesseract

          第一个Image,用来载入图片,第二个pytesseract用来识别图片中的文字,也就是识别验证码。
          
    [Python] 纯文本查看 复制代码
     image = Image.open('code.png')
          code = pytesseract.image_to_string(image)
          print code

    outputnumber.png
           成功输出验证码内容。
    0x03    安装jython的requests库

          https://bbs.ichunqiu.com/thread-21739-1-1.html,先看一下如何安装jython以及配置到burp里面的。
          进入jython的文件夹,我的是/root/jython2.7.0/,进入里面的bin:
    bin.png
           运行pip:
    pip.png

          安装完以后接下来就开始写插件吧。

    0x04    编写验证码识别插件

          这种东西一般都是intruder这个模块爆破用的,因为我不知道jython是怎么安装这几个库的,所以我的撸代码的思路就是用jython把验证码下载下来,在通过本地网络把验证码传给python脚本,用python脚本进行识别,然后把结果传回到jython,当然为了方便我就直接用jython把验证码保存成文件,在用调用python文件去读取验证码图片,在把结果保存成result.txt,然后jython去读取result.txt就行了。
          先来编写我们的代码,加载库文件:
          
    [Python] 纯文本查看 复制代码
    from burp import IBurpExtender
          from burp import IIntruderPayloadGeneratorFactory                 #这一个是和上面那一个是用来注册的,表示自己可以在intruder这个模块使用
          from burp import IIntruderPayloadGenerator                             #这个用来实现识别验证码的功能的代码
          import requests
          import os
          import re

         现在来实现基本的功能——注册。
         
    [Python] 纯文本查看 复制代码
       class BurpExtender(IBurpExtender,IIntruderPayloadGeneratorFactory):
               def registerExtenderCallbacks(self,callbacks):
                     callbacks.registerIntruderPayloadGeneratorFactory(self)
                     callbacks.setExtensionName("code")
    
              def getGeneratorName(self):
                     return "vcode"
    
             def createNewInstance(self,attack):
                    return DetectXss(attack)

           BurpExtender继承IBurpExtender和IIntruderPayloadGeneratorFactory,registerExtenderCallbacks属于IBurpExtender这个类的,callbacks这个参数是IBurpExtenderCallbacks这个类的,这个类就是用来注册各种玩意,callbacks.registerIntruderPayloadGeneratorFactory(self)用来注册到intruder模块,这样用户就可以在intruder里面使用他们了,callbacks.setExtensionName("code")是设置这个插件的名字:
    extensionname.png
           getGeneratorName也是用来返回名字的,只不过是显示在:
    intrudername.png

           createNewInstance返回一个实例,也就是识别验证码的核心功能用这个实例完成,这个实例属于IIntruderPayloadGenerator这个类,createNewInstance还会传入一个参数,也就是有关这次攻击的详细内容,比如攻击的原始请求,这个参数是IIntruderAttack这个类的,这个类有2个成员函数一个用来返回HTTP服务信息,比如使用的端口还有使用的协议(https还是http),另一个用来返回原始请求,比如:
    origin.png

          这个对等一下获取验证码有点作用,因为要获取cookie,再用当前的cookie去获取验证码。
          现在来看核心代码。ps: 有些比较简单的我就直接在源代码里面解释了,比较的复杂的我会在下面解释
       
    [Python] 纯文本查看 复制代码
      class DetectXss(IIntruderPayloadGenerator):
                def __init__(self,attack):
                       tem = "".join(chr(abs(x)) for x in attack.getRequestTemplate())
                       cookie = re.findall("Cookie: (.+?)\r\n",tem)[0]                #请看下文解释
                       self.target="验证码的链接"
                       self.cookie = cookie
                       self.max = 1
                       self.num = 0
                       self.attack = attack
    
               def hasMorePayloads(self):
                      if self.num == self.max:
                           return False                                                                    #当达到最大次数的时候就调用reset
                      else:
                           return True                                                                     #当没有达到最大次数的时候就调用getNextPayload
    
               def getNextPayload(self,payload):#这个函数请看下文解释
                      headers = {'Cookie':self.cookie}
                      r = requests.get(self.target,headers=headers)#访问验证码,用当前用户的会话获取验证码
                      f = open('/root/code.jpg','w')
                      f.write(r.content)#写入图片
                      f.close()
    
                      os.system('python /root/githubs/burp-plus/code.py')#请看下文解释
                      f = open('/root/result.txt','r')
                      code = f.read()                                                                           #读入结果
                      f.close()
    
                      self.num += 1
                      return code
    
               def reset(self):
                      print "reset"
                      self.num = 0                                                                               #清零
                      return
    

          tem = "".join(chr(abs(x)) for x in attack.getRequestTemplate()),这段代码用来获取原始请求,因为attack.getRequestTemplate()返回的是array('b','xxxx')不懂这段的请自行百度。chr(abs(x))abs取绝对值主要是因为返回的内容不知道为什么会有负数,负数放到chr(x)这个函数里面又会报错所以只能取绝对了。cookie = re.findall("Cookie: (.+?)\r\n",tem)[0],这段代码就是用来获取cookie。getNextPayload传入一个参数,也就是当前的payload,比如:
    payload.png

          就会传入2705进去。最后这个成员函数会返回一个全新的payload,然后intruder就会用这个变量去访问,到了最后就知道了。
          os.system('python /root/githubs/burp-plus/code.py'),这段就是去调用python脚本对验证码进行识别,这个路径可以自己改,改成那个识别验证码的脚本的位置。
          下面是code.py的实现。

       
    [Python] 纯文本查看 复制代码
      from PIL import Image
          import pytesseract
    
          image = Image.open('/root/code.jpg')
          code = pytesseract.image_to_string(image)#识别验证码
    
          f = open('/root/result.txt','w')
          f.write(code)#写入结果
          f.close()

          以上就是全部的实现代码了。

    0x05    使用插件进行爆破

          现在就来对这个后台进行爆破:
    login.png

           burp抓包,然后右键send to intruder:
    intruder.png
           设置这几个payload,选择这个:
       type.png
           进入payloads选择。
    1.png
            上图对应的就是name。
    2.png
            上图对应的就是password。然后改一下代码:
    target.png
            把这里修改成验证码的地址,去到extender:
    loadextender.png

            再加载插件,回到intruder:
    3.png

           对应的就是验证码,最后按下start attack就行了。

    0x06    结束语
          终于写完了,不过这个程序有一些小bug,你们就自己去debug了。      
          完整代码可以在本文的附件下载。














    code.jpg

    code.zip

    999 Bytes, 下载次数: 74, 下载积分: 魔法币 -3

    评分

    参与人数 2积分 +15 魔法币 +15 收起 理由
    大哥哥团长 + 5 + 5 good
    风在指尖 + 10 + 10 感谢你的分享,i春秋论坛有你更精彩!.

    查看全部评分

    本帖被以下淘专辑推荐:

    yyyxy 管理员 六国战旗移动展示平台! 秦 楚 燕 魏 齐 赵
    来自 8#
    发表于 2017-5-19 14:12:11

    文章奖励介绍及评分标准:http://bbs.ichunqiu.com/thread-7869-1-1.html,如有疑问请加QQ:286894635!
    奖金
    点评
    50
    不错,还自己实现了代码。

    欢迎加入i春秋QQ群大家庭,每人只能任选加入一个群哦!投稿请加我QQ:286894635。
    i春秋-楚:533191896
    i春秋-燕:129821314
    i春秋-齐:417360103
    i春秋-秦:262108018
    使用道具 举报 回复
    验证码不会循环显示怎么解决。
        def hasMorePayloads(self):
            if self.num == self.max:
                return False
            else:
                return True
    这个好像没执行啊
    使用道具 举报 回复
    发表于 2017-6-24 12:01:52
    本帖最后由 anttu 于 2017-6-24 12:04 编辑

    ocr这条路不通的,稍微加强点ocr就读不到了,举例的验证码没扭曲没变形,而且干扰色太少,所以ocr还有点用处,试试我做的几个验证码,我用java测试ocr是读不出来的。需要源码的同学可以去http://blog.csdn.net/anttu/article/details/72588265下载,非100%原创,只是利用了各种验证码技术沿着杜绝ocr的路发散了下

    静态混合

    静态混合

    常规静态

    常规静态

    静态中空

    静态中空

    中控动态

    中控动态

    混合动态

    混合动态

    常规动态

    常规动态
    使用道具 举报 回复
    厉害                                
    使用道具 举报 回复
    发表于 2017-5-19 20:29:03
    yyyxy 发表于 2017-5-19 14:12
    文章奖励介绍及评分标准:http://bbs.ichunqiu.com/thread-7869-1-1.html,如有疑问请加QQ:286894635!

    ...

    使用道具 举报 回复
    发表于 2017-5-19 20:29:40
    only丶阳 发表于 2017-5-18 17:00
    f.write(r.content)生成的图片的识别率太低了好像~~down下来的图片识别效果好,能优化下~ ...

    应该一样吧
    使用道具 举报 回复
    发表于 2017-5-14 16:26:59
    不想在kali玩,有没有window的教程
    使用道具 举报 回复
    发表于 2017-5-15 13:07:27
    不错~
    xss  交流群602221356  接收XSS爱好者
    使用道具 举报 回复
    发表于 2017-5-16 23:13:17
    pope想 发表于 2017-5-14 16:26
    不想在kali玩,有没有window的教程

    这个只是jython安装是kali其他跟Windows一样
    使用道具 举报 回复
    发表于 2017-5-18 17:00:37
    f.write(r.content)生成的图片的识别率太低了好像~~down下来的图片识别效果好,能优化下~
    举世皆醒我独醉,世情淡泊我如胶
    使用道具 举报 回复
    发表于 2017-5-19 12:48:52
    使用道具 举报 回复
    只能识别4位数的吗?试了一个5位数的,发现识别出来是错的C:\Users\Administrator\Desktop\1.gif
    1.gif
    使用道具 举报 回复
    发表于 2017-5-25 11:00:32
    好文,学习了
    使用道具 举报 回复
    发表于 2017-5-25 23:35:40
    那个插件怎么下载?
    使用道具 举报 回复
    发表于 2017-5-26 17:54:58
    很值得学习。
    使用道具 举报 回复
    12下一页
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册