0x00 前言
一次渗透测试的过程总会涉及到”密码”与”加解密”.在测试的过程中,对弱口令的尝试是必不可少的过程。
0x01 整理一份优秀的字典
想破解密码,要求我们已经”拥有”别人的密码.要整理一份优秀的字典,可以参考各大网站泄漏数据库,将密码(明文)字段收集后,依出现频率先后生成字典.
这里使用一个对已知的字典文件根据使用频率排序并输出的python脚本:
#!/bin/bash/python
#+------------------------------+
#@Author:Joy_nick
#@Blog:http://byd.dropsec.xyz/
#+------------------------------+
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 一手称心如意的工具集
欲善其事,须利其器.密码枚举工具举一些例子:
- Hydra :各种服务账户密码猜解
- Medusa : 类似Hydra
- Patator : Python多协议,全能暴力破解,模块化设计测试工具
- Hashcat : GPU哈希破解
- BurpSuite : 多线程密码枚举
- Rcracki : 彩虹表哈希破解
- Ophcrack : 离线LMHash/NTHash破解
- Fcrackzip/Truecrack等特定文件密码破解工具
- Metasploit : 各种辅助测试脚本
- Cupp.py : 社工字典生成
- …
0x03 绕过检测
Web层有WAF,Service有IDS/IPS,在测试的时候很容易被发现。在测试前,先通过扫描等方式判断是否有相应的防护,并采取相应手段.Web层可能有验证码,可能有每秒IP连接数限制,可能通过Cookie/Header等信息判断行为.在通过一系列测试后,(如何测试还是要自己探索的),采用最合理的针对方式绕过或尽量避免被检测而拦截枚举账户密码。
0x04 Web账户枚举
Web账户枚举是平日遇到较多的情况
- 没有做严谨的验证码等防护.
- 发现别人留下的backdoor.
- 撞库扫号.
常见的绕过验证的可能:
- 页面无需刷新验证码无限次使用
- 密码输入错误数次弹出验证码,但更换账号不会出现验证码
- 修改Cookie或User-Agent伪装逃避验证码
- 可批量轮询使用代理ip枚举绕过
在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地址暴露,可以选择加入一个client-ip这个payload来代理ip。
0x05 HTTP基础认证
抓包可以看到,以默认用户名admin,默认密码admin登陆路由,HTTP Header多的部分像是这样:
Authorization: Basic YWRtaW46YWRtaW4=
Base64解密即为admin:admin.针对基础认证密码破解,依旧可以使用,但需要对用户名密码先做处理即先base64编码下,一个demo脚本如下:
#!/usr/bin/python
#+------------------------------+
#@Author:Joy_nick
#@Blog:http://byd.dropsec.xyz/
#+------------------------------+
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 社工字典生成
以cupp.py工具为例,创建新字典使用:
python cupp.py -i
用法: cupp.py [选项]
h 帮助
i 交互式填写用户密码等相关信息
w 配置现有的字典文件
l 从库中下载
a 直接使用Alecto数据库的默认用户名和密码
v 版本信息
在填写相关信息后生成字典,然后就可以枚举了。
0x08 哈希破解
普通哈希可以使用Ophcrack破解,官网给出了对应的彩虹表下载,当然,也可以直接查询.
http://www.objectif-securite.ch/en/ophcrack.php
需要破解其他不常见密码哈希(借助已有web破解服务无法解决),暂时便只有三个相对高效的方法:
- 分布式
- GPU
- 彩虹表 (没硬盘的就别想了)
而如果我们在知道密码的一定规则后,亦可按照规则破解密码.
hashcat -m1800 -a3 hashdumpedfile --pw-min=7 --pw-max=11 "hahaha?l?l?l?l"
具体的hashcat密码破解详情请参考:HashCat使用手册
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指使用可能的密码进行解压缩测试(加上,否则会出现很多干扰密码)
具体的其他语法请参考:fcrackzip语法示例