原文 by Web攻防之暴力破解
攻防之初,大多为绕过既有逻辑和认证,以Getshell为节点,不管是SQL注入获得管理员数据还是XSS 获得后台cookie,大多数是为了后台的登录权限,假若我们获得一枚口令,都是柳暗花明。不管口令复杂与否,只要在构造的字典内都是爆破之结晶。
Web形态及业务之错综,我们暂可将能够自定义字典的请求归类到爆破,以便信息的提炼和知识的逻辑推理。
本文主要收集了常用的一些爆破相关的零碎点和技巧点。
探测存在与否
第一梯队:Top500用户名、手机号
第二梯队:邮箱、员工编号
-
指定类123456口令爆破用户名
-
正常的top500,top10000帐号;
-
单个字母、两个字母、三个字母、四个字母随机组合的帐号;
a) 小工具pydictor值得推荐python pydictor.py -base L --len 2 3
b) Burp也可以 -
一位数字、二位数字、三位数字、四位数字的随机组合
for n in xrange(10000):
print str(n).zfill(4)
- 厂商名相关帐号
a) 如:facebook、fb_steven …
b) 页面联系邮箱的规则学习及自创建
- top500, top3000,top10000,自定义密码
a) Top 系列,几乎安全从业都有自己的弱口令字典,常规就好,太大的字典跑起来也费劲,关键是定制
b) 定制字典,pydictor值得推荐:https://github.com/LandGrey/pydictor
c) 社工库的使用,指定用户的历史密码,是一种尝试 - 厂商特色口令生成,如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!!!'
- 加密密码暴力破解
a) 普通编码类,如base64
b) 自定义加密算法(目标系统使用了可猜测的加密算法去加密口令)
可参考浮萍写的基于RSA算法加密口令后爆破脚本:
https://github.com/fupinglee/MyPython/blob/master/web/RSADemo.py
c) Selenium 自动浏览器提交模块(可适用与不明加密算法,模拟正常操作流) - 弱文件后的后台爆破
a) 弱文件爆破获得后台
b) 后台密码爆破
i. 各大中间件及CMS的口令破解,如weblogic 、tomcat
ii. 自定义后台的密码破解 - Webshell 密码爆破
a) Shell 发现(弱文件以及蛛丝马迹)
b) Shell 爆破(有专用工具,也可用burp完成) - 辅助信息
a) Web 源码、JS 以及注释信息中是否包含用户名以及口令指定规则
b) 技术运维人员的桌子上面的便签信息(若能接触到目标内部)…
- 验证码绕过
a) 验证码非必须参数,可省略
b) 验证码不失效,可多次使用
c) 验证码问题集合答案有限,可以遍历后破解
d) 非空逻辑校验,验证码置空 或 去掉校验参数的请求
e.g. ecshop后台暴力破解验证码绕过 - 简单验证码识别
https://github.com/fupinglee/CrackCaptcahLogin/releases
类似工具很多,看使用习惯。 - 高模糊度验证码识别
a) 一般的识别流程都是二值化、去干扰、区域选择、OCR识别
b) 可用云打码平台 (不打广告)
- 部分登录验证码的分类也可适用于此
- 验证码的本身绕过
a) 返回包回显(包括返回包、输出在cookie等)
b) JS控制
c) 返回包控制:True&false控制(0&1),修改返回包可绕过 - 4位数字,验证码爆破,很快
- 6位数字,验证码爆破;可根据多线程的前提进行多进程处理,0-199999一波;200000-399999一波…(依次类推);也可以看频率,哪块区间分布的概率较高可重点关注;也可以指定前一位或两位进行爆破。
- 弱token
a) 例:奇虎360任意用户密码修改漏洞,发送给邮箱的验证链接里面的vc值为时间戳的md5加密;作为一种检验参数可被猜测。
b) 基于密码找回的手机号、UID、邮箱等遍历,结合客户端源码可能的些蛛丝马迹
c) 不完全属于爆破逻辑,但可互补增值
-
关键参数的的信息遍历(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) … -
批量注册(insert)
a) 逻辑不严谨或校验不严格,实现多帐号的薅羊毛 -
一套组合拳(也可关联到爬虫):
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数据,从一个数据威胁角度来分析,那可以实现精准营销。带来的场景就是另一片天地。
- 数据重放-短信炸弹
a) 无任何限制的短信炸弹
b) 单独手机号存在短信阈值限制,有可能通过间隔符绕过,18888888888,,,与18888888888效果一样;
c) 针对单独手机号有阈值限制,但可随意轮询其他手机号,同样有危害
d) 会导致短信网关的资源浪费和流失 - 数据重放-邮箱炸弹
a) 相对短信炸弹成本较低,但其逻辑同短信炸弹 - 子域名爆破
a) 根据自己平台和习惯选择即可:subDomainsBrute、Layer、FuzzDomain - 子目录、弱文件爆破
a) 弱文件爆破,对比过老御剑、weakfilescan、dirfuzz、cansian.py 仍然觉得一款基于python3的dirsearch 值得拥有(可自定义字典)
https://github.com/maurosoria/dirsearch
b) 也可以自己写,就是基本的web请求,以及返回包的长度或特征匹配。 - Fuzzing 测试
a) SQL、XSS
b) 拒绝服务漏洞,例如SPIKE对表单测试特殊字符的异常处理
- SSH RDP FTP MySQL MSSQL …
a) Fenghuangscan值得推荐,Hydra (Kali自带)值得拥有;
b) Nmap 也可完成部分破解工作,本身是一个基础工具,但script下的脚本能让你做出不基础的事情
c) 毕竟直接拿到远控权限事半功倍,可直接获取数据,对于测试来讲还可获取源码,以半审计的方法进行挖掘。
d) 且有人以此为生(全网抓鸡) - SMTP、VPN协议类
a) 第一点提到的一些协议,初具成熟均不公开于互联网(当然意识和测试情况也有),但SMTP 和 VPN 类,大部分都有,也是入侵的概率很大的入口点
i. brut3k1t(github有)
ii. 也有自定义的PY脚本
iii. 小技巧点:部分对同一用户有密码失败次数限制,可把循环颠倒过来,用同密码刷一遍用户,在用下一个口令刷一遍用户…
b) 翻到邮箱,根据信息检索,信息很精准,很有可能获得认证信息
c) 获得VPN认证,在内网搞事,一不小心就干掉了一个大家伙。 - 特殊服务类未授权访问或者弱认证
a) Redis未授权访问
b) Jenkins未授权访问
c) MongoDB未授权访问
d) ZooKeeper未授权访问
e) Elasticsearch未授权访问
f) Memcache未授权访问
g) Hadoop未授权访问
h) CouchDB未授权访问
i) Docker未授权访问
j) 毕竟这些未授权可以直接getshell或直接获得数据
-
登录界面暴力破解,哪些加固方法?
a) 阈值的设立
i. 单位时间内超过额定请求次数,封帐号&封IP段时间
ii. 支持逆向思路
b) 密码输入错误次数达到3次后增设验证码
i. 验证码自身的安全性参考下一个问题
c) 自身应用系统的健壮性
i. 强制要求用户注册时满足口令复杂度要求
ii. 定期检索数据库弱口令帐号的存在,可比对top500的密文值 -
图形验证码自身常见的加固方法?
字体扭曲
字体粘连
字体镂空
字体混用 主体干扰线 背景色干扰 背景字母干扰
公式验证码
加减法验证码
逻辑验证码 -
安全登录流程设计?
系统设置一个固定的盐值,该盐值最好足够复杂,如:1qaz2wsx3edc4rfv!@#$%^&**qqtrtRTWDFHAJBFHAGFUAHKJFHAJHFJHAJWRFA
用户注册、修改密码时,将用户的原始密码与我们的固定盐值拼接,然后做md5运算。
传递至后端,保存进数据库(数据库中保存的密码是用户的原始密码拼接固定盐值后,md5运算后的结果)。
登录时,将用户的原始密码与我们的固定盐值进行拼接,然后做md5运算,运算后的结果再拼接上我们的随机码,再次md5运算,然后提交。
后端接收到登录请求后,将从数据库中查询出的密码与session中的随机码拼接后,md5运算,然后与前端传递的结果进行比较。
PS:这种登录流程对于数据包重放来讲的确有效,但对于正常的selenium浏览器输入爆破仍需要结合阈值和验证码来防御。 -
Modsecurity类防御暴力破解类?
a) 若代码变更成本大,可以使用Modsecurity (当然直接买硬WAF也可以)
b) https://www.trustwave.com/Resources/SpiderLabs-Blog/Defending-WordPress-Logins-from-Brute-Force-Attacks/ -
针对验证码可多次重用的加固方法?
-
主机类暴力破解的防御方法?
a) 自身的帐号口令体系满足复杂度要求
b) 若非必须的服务,直接禁止对外的开放,包括22、3389
c) 限定指定IP访问(网络的访问控制)
d) 不使用口令方式,使用私钥类登录
e) 意识类:不在标签写密码;运维管理类也不直接统记录到一个txt