原文 by Web攻防之暴力破解

0x00 序

攻防之初,大多为绕过既有逻辑和认证,以Getshell为节点,不管是SQL注入获得管理员数据还是XSS 获得后台cookie,大多数是为了后台的登录权限,假若我们获得一枚口令,都是柳暗花明。不管口令复杂与否,只要在构造的字典内都是爆破之结晶。
Web形态及业务之错综,我们暂可将能够自定义字典的请求归类到爆破,以便信息的提炼和知识的逻辑推理。
本文主要收集了常用的一些爆破相关的零碎点和技巧点。

0x01 账户探测

探测存在与否
第一梯队:Top500用户名、手机号
第二梯队:邮箱、员工编号

0x02 指定口令爆破用户名

  1. 指定类123456口令爆破用户名

  2. 正常的top500,top10000帐号;

  3. 单个字母、两个字母、三个字母、四个字母随机组合的帐号;
    a) 小工具pydictor值得推荐 python pydictor.py -base L --len 2 3
    b) Burp也可以

  4. 一位数字、二位数字、三位数字、四位数字的随机组合

    for n in xrange(10000):
     print str(n).zfill(4)
  5. 厂商名相关帐号 a) 如:facebook、fb_steven …
    b) 页面联系邮箱的规则学习及自创建

0x03 密码爆破

  1. top500, top3000,top10000,自定义密码 a) Top 系列,几乎安全从业都有自己的弱口令字典,常规就好,太大的字典跑起来也费劲,关键是定制
    b) 定制字典,pydictor值得推荐:https://github.com/LandGrey/pydictor
    c) 社工库的使用,指定用户的历史密码,是一种尝试
  2. 厂商特色口令生成,如baidu@123
    a) 适用于应用管理员类人员以及主机协议类密码
    b) 更多定制类字典也可以pydicor
    c) 使用简单密码和厂商邮箱后缀组合
#coding=utf-8
import sys
key = sys.argv[1]
f = open("%s.txt"%key,"a")
list1 = [123,321,1234,4321,123456,654321,12345678,123456789,1234567890,888,8888,666,6666,163,521,1314,1,11,111,1111,2,222,3,333,5,555,9,999]
list2 = ['#123','#1234','#123456','@123','@1234','@123456','@qq.com','qq.com','@123.com','123.com','@163.com','163.com','126.com','!@#','!@#$','!@#$%^','098']
for j1 in list1:
    pwd1 =  key + str(j1) + '\n'
    f.write(pwd1)
for j2 in list2:
    pwd2 =  key+str(j2)+'\n'
    f.write(pwd2)

for i in range(1980,2016):
    #pwd1 = key + str(i) + '\n'
    pwd3 = '{}{}{}'.format(key,i,'\n')
    f.write(pwd3)


f.close()
print key+' password combination ok!!!'
  1. 加密密码暴力破解 a) 普通编码类,如base64
    b) 自定义加密算法(目标系统使用了可猜测的加密算法去加密口令)
    可参考浮萍写的基于RSA算法加密口令后爆破脚本:
    https://github.com/fupinglee/MyPython/blob/master/web/RSADemo.py
    c) Selenium 自动浏览器提交模块(可适用与不明加密算法,模拟正常操作流)
  2. 弱文件后的后台爆破 a) 弱文件爆破获得后台
    b) 后台密码爆破
    i. 各大中间件及CMS的口令破解,如weblogic 、tomcat
    ii. 自定义后台的密码破解
  3. Webshell 密码爆破 a) Shell 发现(弱文件以及蛛丝马迹)
    b) Shell 爆破(有专用工具,也可用burp完成)
  4. 辅助信息
    a) Web 源码、JS 以及注释信息中是否包含用户名以及口令指定规则
    b) 技术运维人员的桌子上面的便签信息(若能接触到目标内部)…

0x04 登录验证码爆破

  1. 验证码绕过 a) 验证码非必须参数,可省略
    b) 验证码不失效,可多次使用
    c) 验证码问题集合答案有限,可以遍历后破解
    d) 非空逻辑校验,验证码置空 或 去掉校验参数的请求
    e.g. ecshop后台暴力破解验证码绕过
  2. 简单验证码识别 https://github.com/fupinglee/CrackCaptcahLogin/releases
    类似工具很多,看使用习惯。
  3. 高模糊度验证码识别 a) 一般的识别流程都是二值化、去干扰、区域选择、OCR识别
    b) 可用云打码平台 (不打广告)

0x05 短信/邮箱验证码爆破

  1. 部分登录验证码的分类也可适用于此
  2. 验证码的本身绕过 a) 返回包回显(包括返回包、输出在cookie等)
    b) JS控制
    c) 返回包控制:True&false控制(0&1),修改返回包可绕过
  3. 4位数字,验证码爆破,很快
  4. 6位数字,验证码爆破;可根据多线程的前提进行多进程处理,0-199999一波;200000-399999一波…(依次类推);也可以看频率,哪块区间分布的概率较高可重点关注;也可以指定前一位或两位进行爆破。
  5. 弱token a) 例:奇虎360任意用户密码修改漏洞,发送给邮箱的验证链接里面的vc值为时间戳的md5加密;作为一种检验参数可被猜测。
    b) 基于密码找回的手机号、UID、邮箱等遍历,结合客户端源码可能的些蛛丝马迹
    c) 不完全属于爆破逻辑,但可互补增值

0x06 数据信息爆破(遍历)

  1. 关键参数的的信息遍历(select) a) 包括用户名
    b) ID号
    c) 手机号
    d) 邮箱
    e) 身份证号
    f) 订单号
    g) 银行卡
    h) 信用卡(e.g 携程乌云漏洞)
    i. PAN+信用卡到期时间(即:最小的身份验证模块);
    ii. PAN+信用卡到期时间+CVV;
    iii. PAN+信用卡到期时间+CVV+持卡人地址;
    iv. From http://t.cn/Rfrsdki
    i) …

  2. 批量注册(insert)
    a) 逻辑不严谨或校验不严格,实现多帐号的薅羊毛

  3. 一套组合拳(也可关联到爬虫):
    a) 两个常见的功能:密码找回、网站论坛 b) 切入点一:从密码找回功能分析,有相当一部分网站,提供账号检测功能,且提示存在与否,根据友情提示以及次数限定情况,可以通过返回包匹配存在的帐号,包括用户名、甚至手机号(其实主要是手机号)。
    c) 切入点二:密码找回功能,输入手机号后会提示…正在找回XXX的密码信息…,这个就是用户名,(若输入用户名,有可能提示正在找回某手机号的密码信息(部分打码))
    d) 切入点三:网站论坛,为了交流,以及用户的活跃度,部分网站存在bbs、club等论坛信息,一般二次开发的Discuz 。 上面会存在关于个人的一些数据,比如用户名(论坛网名)、性别、粉丝情况、帖子情况、联系方式、住址(部分需要登录权限)、还有一些倾向数据,比如购物平台关注的商品;
    e) 从这三个切入点来讲,单独哪个可能都影响不足够大,没有达到影响的最大化。从一个数据利用者角度分析,最希望得到与平台性质相关的属性,比如交友网站的性别和联系方式信息,房产网站的倾向房产和联系方式等属性。 那把三个切入点的数据整合起来能得到什么呢?
    i. 通过用户检测 获得手机号用户个人信息;
    ii. 通过手机号检测,获得用户名信息; iii. 通过论坛遍历,获得ID和用户名信息;
    iv. 通过关联以上数据,可以对应手机号------>用户名 ------> 论坛ID,同样也就意味着获得了某手机号的用户关注了什么的信息。 Demo 说明
    用户:188xxxx8888 用户名:HelloWorld 关注:某别墅
    用户:138xxxx9999 用户名:52BMW 关注:宝马X6
    用户:159xxxx6666 用户名:HelloKitty 就职某金融企业
    用户:186xxxx5555 用户名:独孤求败 购买了大疆无人机
    针对Demo数据,从一个数据威胁角度来分析,那可以实现精准营销。带来的场景就是另一片天地。

0x07 爆破关联

  1. 数据重放-短信炸弹 a) 无任何限制的短信炸弹
    b) 单独手机号存在短信阈值限制,有可能通过间隔符绕过,18888888888,,,与18888888888效果一样;
    c) 针对单独手机号有阈值限制,但可随意轮询其他手机号,同样有危害
    d) 会导致短信网关的资源浪费和流失
  2. 数据重放-邮箱炸弹 a) 相对短信炸弹成本较低,但其逻辑同短信炸弹
  3. 子域名爆破 a) 根据自己平台和习惯选择即可:subDomainsBrute、Layer、FuzzDomain
  4. 子目录、弱文件爆破 a) 弱文件爆破,对比过老御剑、weakfilescan、dirfuzz、cansian.py 仍然觉得一款基于python3的dirsearch 值得拥有(可自定义字典)
    https://github.com/maurosoria/dirsearch
    b) 也可以自己写,就是基本的web请求,以及返回包的长度或特征匹配。
  5. Fuzzing 测试 a) SQL、XSS
    b) 拒绝服务漏洞,例如SPIKE对表单测试特殊字符的异常处理

0x08 协议口令爆破

  1. SSH RDP FTP MySQL MSSQL … a) Fenghuangscan值得推荐,Hydra (Kali自带)值得拥有;
    b) Nmap 也可完成部分破解工作,本身是一个基础工具,但script下的脚本能让你做出不基础的事情
    c) 毕竟直接拿到远控权限事半功倍,可直接获取数据,对于测试来讲还可获取源码,以半审计的方法进行挖掘。
    d) 且有人以此为生(全网抓鸡)
  2. SMTP、VPN协议类 a) 第一点提到的一些协议,初具成熟均不公开于互联网(当然意识和测试情况也有),但SMTP 和 VPN 类,大部分都有,也是入侵的概率很大的入口点
    i. brut3k1t(github有)
    ii. 也有自定义的PY脚本
    iii. 小技巧点:部分对同一用户有密码失败次数限制,可把循环颠倒过来,用同密码刷一遍用户,在用下一个口令刷一遍用户…
    b) 翻到邮箱,根据信息检索,信息很精准,很有可能获得认证信息
    c) 获得VPN认证,在内网搞事,一不小心就干掉了一个大家伙。
  3. 特殊服务类未授权访问或者弱认证
    a) Redis未授权访问
    b) Jenkins未授权访问
    c) MongoDB未授权访问
    d) ZooKeeper未授权访问
    e) Elasticsearch未授权访问
    f) Memcache未授权访问
    g) Hadoop未授权访问
    h) CouchDB未授权访问
    i) Docker未授权访问
    j) 毕竟这些未授权可以直接getshell或直接获得数据

0x09 攻击防御

  1. 登录界面暴力破解,哪些加固方法? a) 阈值的设立 i. 单位时间内超过额定请求次数,封帐号&封IP段时间
    ii. 支持逆向思路
    b) 密码输入错误次数达到3次后增设验证码 i. 验证码自身的安全性参考下一个问题
    c) 自身应用系统的健壮性 i. 强制要求用户注册时满足口令复杂度要求
    ii. 定期检索数据库弱口令帐号的存在,可比对top500的密文值

  2. 图形验证码自身常见的加固方法? 字体扭曲
    字体粘连
    字体镂空
    字体混用 主体干扰线 背景色干扰 背景字母干扰
    公式验证码
    加减法验证码
    逻辑验证码

  3. 安全登录流程设计? 系统设置一个固定的盐值,该盐值最好足够复杂,如:1qaz2wsx3edc4rfv!@#$%^&**qqtrtRTWDFHAJBFHAGFUAHKJFHAJHFJHAJWRFA
    用户注册、修改密码时,将用户的原始密码与我们的固定盐值拼接,然后做md5运算。
    传递至后端,保存进数据库(数据库中保存的密码是用户的原始密码拼接固定盐值后,md5运算后的结果)。
    登录时,将用户的原始密码与我们的固定盐值进行拼接,然后做md5运算,运算后的结果再拼接上我们的随机码,再次md5运算,然后提交。
    后端接收到登录请求后,将从数据库中查询出的密码与session中的随机码拼接后,md5运算,然后与前端传递的结果进行比较。
    PS:这种登录流程对于数据包重放来讲的确有效,但对于正常的selenium浏览器输入爆破仍需要结合阈值和验证码来防御。

  4. Modsecurity类防御暴力破解类? a) 若代码变更成本大,可以使用Modsecurity (当然直接买硬WAF也可以)
    b) https://www.trustwave.com/Resources/SpiderLabs-Blog/Defending-WordPress-Logins-from-Brute-Force-Attacks/

  5. 针对验证码可多次重用的加固方法?

  6. 主机类暴力破解的防御方法? a) 自身的帐号口令体系满足复杂度要求
    b) 若非必须的服务,直接禁止对外的开放,包括22、3389
    c) 限定指定IP访问(网络的访问控制)
    d) 不使用口令方式,使用私钥类登录
    e) 意识类:不在标签写密码;运维管理类也不直接统记录到一个txt