0x00 前言
一次测试的过程总会涉及到"密码"与"加解密".在踩点的过程中,对弱口令的尝试是必不可少的过程,从xx抓鸡到内网哈希批量传递,从个人PC到网络设备/工控设施,只要依旧采用单因素模式的密码认证,密码扫描就不会被遗忘.以下笔者简单分享总结安全测试中密码扫描与破解的技巧,如有疏漏错误,还望不吝赐教.
0x01 整理一份优秀的字典
想破解密码,要求我们已经"拥有"别人的密码.字典在口令扫描尝试过程中的重要性不言而喻.要整理一份优秀的字典,不妨参考各大网站泄漏数据库,将密码(明文)字段收集后,依出现频率先后生成字典.
一个demo脚本:
#!/bin/bash/python
import sys
from collections import Counter
file = open(sys.argv[1], 'r')
readlist = []
count_times = []
for line in file.readlines():
line = line.strip('\r\n ')
readlist.append(line)
sortlist = Counter(readlist).most_common()
for line in sortlist:
print line[0]
0x02 一手称心如意的工具集
欲善其事,须利其器.在密码枚举工具中,笔者比较推荐的工具List如下:
- Hydra :在线各种服务账户密码猜解
- Medusa : 类似Hydra
- Patator : Python多协议破解工具
- John the ripper : 离线破解哈希
- Hashcat : GPU离线哈希破解
- Burp Suite : 在线密码枚举
- Rcracki : 离线彩虹表哈希破解
- Ophcrack : 离线LMHash/NTHash破解
- Hashid/HashTag : 哈希算法分析
- Fcrackzip/Truecrack等特定文件密码破解工具
- Metasploit : 各种辅助测试脚本
- Cupp.py : 社工字典生成
- ...
当然,根据特定需要(如加入各种伪装绕过检测),可能也需要我们自行编写相应脚本实现枚举账户的过程.
0x03 绕过检测
Web层有WAF,Service有IDS/IPS,很容易打草惊蛇.在测试前,先通过扫描等方式判断是否有相应的防护,并采取相应手段.Web层可能有验证码,可能有每秒IP连接数限制,可能通过Cookie/Header等信息判断行为是Human or Robot.在通过一系列测试后,(如何测试还是要自己探索的),采用最合理的针对方式绕过或尽量避免被检测而导致的阻挡枚举账户密码的脚步.
0x04 Web账户枚举
Web账户枚举是平日遇到较多的情况
- EXP无果,某处又没有做严谨的验证码等防护,为枚举账户密码制造了可能性.
- 发现前人留下的backdoor,苦于没有密码.
- 撞库扫号.
常见的绕过验证的可能:
- 页面无需刷新验证码无限次使用
- 密码输入错误数次弹出验证码,但更换账号不会出现验证码
- 修改Cookie或UA伪装逃避验证码
- 可批量轮询使用代理枚举绕过
在Web枚举中,使用BurpSuite基本可以解决所有常见问题.工具相关文档资料也比较丰富.
开启代理,打开Intercept,登陆网页,输入用户密码,数据包拦截下来,选择Send to Intruder,进入攻击模块.
其中四种模式:
-
Sniper:只有一个payload,会将payload分别放在每个Fuzz点测试,默认选项,这也是新手发现Payload只能选择1的原因.
-
Battering Ram:只有一个payload,会将payload同时放在多个Fuzz点测试.
-
Pitchfork:多个payload,会将多个payload同一行同时放到相应Fuzz点测试.(适用扫号)
-
Cluster Bomb:多个payload,payload在其Fuzz点循环测试,直到尝试所有可能.(适用多账户枚举密码)
参考链接:
选择好相应模式后,设置payload为runtime file,挂载字典文件.取消Payload Encoding.
如果发现网页有将用户的本地将密码计算MD5后提交,则需要在Payload Processing中添加计算MD5的过程
设置好后也可添加正则匹配结果等等.之后可以Start attack了.
这个过程中,如果担心IP地址暴露,可以选择写一个这样一个脚本:
脚本本地监听某端口,并为每次枚举随机抽取代理IP,Burp中设置Proxy为本地脚本所监听端口即可.
0x05 HTTP基础认证
家用路由/Jboss等往往采用HTTP基础认证,认证过程中,用户名密码加密.若无正确的用户名密码则会返回
HTTP/1.1 401 Authorization Required
抓包可以看到,以默认用户名admin,默认密码admin登陆路由,HTTP Header多的部分像是这样
Authorization: Basic YWRtaW46YWRtaW4=
Base64解密即为admin:admin.针对基础认证密码破解,依旧可以使用,但需要对用户名密码先做处理,一个demo脚本如下:
#!/usr/bin/python
import os.path,sys,base64
userfile = raw_input("input usr file:")
passfile = raw_input("input pwd file:")
outputfile = raw_input("input out file:")
outputfile = open(outputfile, "w")
userInfile = open(userfile)
passInfile = open(passfile)
userLines = userInfile.readlines()
passLines = passInfile.readlines()
for userLine in userLines:
for passLine in passLines:
combinedLine = userLine.strip() + ':' + passLine.strip()
print combinedLine
outputfile.write(base64.b64encode(combinedLine) + '\n')
userInfile.close()
passInfile.close()
outputfile.close()
生成字典后以Burp爆破即可
当然,Hydra给了更简易的解决方式
hydra -L user.txt -P pass.txt -F http://demourl:2048/auth
其中-L和-P大写均为挂载字典,-F表示全局一旦发现合法用户密码即停止破解,亦可加入-t参数指定线程数.
0x06 服务密码破解
密码枚举离不开服务,对常见服务如FTP/SSH/TELNET/POP3/1433等的破解枚举,资料已经很齐备,以下仅简要记录命令
FTP
hydra -L user.txt -P pass.txt -F ftp://127.0.0.1:21
SSH
hydra -L user.txt -P pass.txt -F ssh://127.0.0.1:22
patator ssh_login host=127.0.0.1 user=root password=FILE0 0=pass.txt -x ignore:mesg='Authentication failed.'
SMB
hydra -L user.txt -P pass.txt -F smb://127.0.0.1
MSSQL
hydra -L user.txt -P pass.txt -F mssql://127.0.0.1:1433
0x07 社工字典生成
密码碰撞出来的情况,大多为两种可能:以admin为代表的弱口令和以*19??0101为代表的社工密码.在弱口令尝试失败的情况下,如果对目标信息有较充分的掌握,则可尝试社工字典生成.以cupp.py工具为例,创建新字典使用:
python cupp.py -i
在填写相关信息后生成字典,然后使用上述工具继续枚举吧 ;-)
0x08 哈希破解
win环境下wce等工具直接抓取内存密码,抓取hash后离线破解往往也是难以避免的,尤其是在微软最近几个漏洞补丁之后:(普通哈希可以使用Ophcrack破解,官网给出了对应的彩虹表下载,当然,也可以直接查询.
如情非得已,需要破解其他不常见密码哈希(借助已有web破解服务无法解决),暂时便只有三个相对高效的方法:
- 分布式 (如今已经有越来越多的工具开始尝试分布式破解,也可说是,云计算?)
- GPU (或DSP/FPGA搞的专业密码破解硬件)
- 彩虹表 (没硬盘的就别想了)
而如果我们在密码的一定规则后,亦可按照规则破解密码.如创建一个密码为hahaharoot的账户,用John暴力模式密码,普通计算机一天时间是很难跑出来的,但假设发现管理员其他密码如web/sql等均为hahaha开头,则可考虑定义密码规则,如
hashcat -m1800 -a3 hashdumpedfile --pw-min=7 --pw-max=11 "hahaha?l?l?l?l"
几秒钟的时间,得到了密码明文
其中-m指定哈希算法,-a3指定暴力破解方式.亦可通过脚本生成指定前缀的密码字典使用工具挂载字典加以破解
john -w:gen_wordlist.txt hash
0x09 文件密码
最后补充一点对文件密码的破解,对于zip文件,由于加密方式没有rar强势,故被解密的可能性很大,一个kali下的破解工具命令如下:
fcrackzip -b -v -c a -l 1-4 -u 1.zip
其中,-b指定暴力破解,-v显示详细信息,-c a指定密码为纯字母,-l 1-4指定密码长度位1-4位,-u指使用可能的密码进行解压缩测试(加上,否则会出现很多干扰密码)