密码破解
1.密码破解概论
·人工猜解
垃圾桶工程,被动信息收集
·基于字典暴力破解(主流)
·键盘空间字符爆破
·字典
保存有用户名和密码的文本文件(kali自带的字典)
-/usr/share/wordlist
-/usr/share/wfuzz/wordlist
-/usr/share/seclists
2.字典生成
(1)crunch
面对猜解密码的难题,我们可以使用字典来破解密码。除了kali自带的密码,我们还可以根据规则自己编写密码。
kali中的crunch命令可以让我们自己编写需要的字典:
crunch <min-len> <max-len> [<charset string>] [options]
其中charset string默认是小写的字符,参数分别是:最小长度,最大长度,使用的字符集,以及选择的配置参数。举个例子就是:
crunch 6 6 0123456 -o START -d 2 -b 1mb / -c 100
-b 按大小分割字典文件 (kb mb gb)
因为在某些情况下字典文件可能过于庞大,我们需要将其拆分成小一点的文件,这个时候就使用-b参数
-c 字典行数 设置每个字典文件多少行
(以上两个参数必须与-o START结合使用)
-d 同一个字符连贯出现的数量,-d 2 就是两次比如a
-s 指定起始字符串
crunch 4 4 01234567890 -s 9900
这样排序开始就是从9900开始到9999
字符集
每次在生成字典的时候,并不是都需要手动输入一些特殊的字符集。比如我需要a-z的字符集,A-Z的字符集,0-9的字符集,都可以使用cruch自带的字符集:
crunch 4 4 -f /usr/share/crunch/charset.lst lalpha-sv -o 1.txt
其中,4代表只需要四个字符的组合(最小长度为4,最大长度也为4),-f是在指定路径的文件里去找字符集,lalpha是小写字母,-sv是瑞典字母,-o为输出,1.txt为文件名
无重复
-p参数可以生成我们输入字符串的全排列:
crunch 1 1 -p 1234567890
最大最小密码长度存在但不生效,且-p参数必须放在最后一个
读取文件内容
-q参数可以读取文件中每行内容作为基本字符生成字典
crunch 1 1 -filename
这样就会得到各个元素排列组合的字典文件
编写特殊规则的字典
如果密码符合特殊的结构,比如多少位数字加上多少位小写字母,就需要我们自己构造相应规则的字典,使用-t参数:
crunch 6 6 -t @,%%^^ | more
含义 | 符号 | 英文名称 |
---|---|---|
小写字母 | @ | lalpha |
大写字母 | , | ualpha |
数字 | % | numeric |
符号 | ^ | symbols |
如果只想取其中几位的话,则可以进一步使用-t参数:
crunch 5 5 abc DEF 123 \!@# -t ,@^%,
这就满足取五位字符,且小写字符为abc中选出,大写字符为DEF中选出,特殊字符从!@#中选出(\表示转义符号,使得特殊字符可以输入,并非是特殊符号有\)按照给定的规则来生成字典。如果某一位没有特殊的需求,比如数字栏可以选择不填,默认0-9;小写字母栏也可以选择不填,默认a-z,只要使用+占位即可:
crunch 5 5 + DEF + \!@# -t ,@^%,
压缩
如果输出的文件过大,我们可以选择将其压缩:
crunch 4 4 -t @,%^ -o 1.txt -z 7z
压缩为7z格式的压缩文件,同时还可以使用gzip、bzip2、lzma这种格式,但是7z的压缩比率最高。
crunch的组合应用
可以设定基本字符来生成字典,还是使用-p参数:
crunch 4 5 -p dog cat bird
以-p后的参数为基本字符,无视长度,排列组合基本字符生成字典。同样,-p命令还可以与-t命令一起使用,将基本字符与特殊规则的字符结合在一起:
crunch 5 5 -t aaa%% -p dog cat bird | more
这样生成的字典前面由三个基本字符串组成,后面由两个数字组成。其中,aaa表示是由三个基本字符串组成了密码的前三个部分,仅起到占位的作用,换成bbb或ccc也可以。
若是要防止重复的话还可以使用之前说到的-d参数:
crunch 5 5 -d 2@ -t @@@%%
这就可以防止@@@中出现两个以上的重复。
(2)cewl
除了crunch外,cewl也是一个不错的字典生成软件,更重要的是它可以爬取网站内容生成关键字字典,更加的准确高效。命令如下:
cewl 1.1.1.1 -m 3 -d 3 -e -c -v -w a.txt (1.1.1.1可以是目标网站的ip地址,也可以是网址)
-m:最小单词长度
-d:爬网深度
-e:收集包含emali地址信息
-c:每个单词出现的次数
a.txt是生成的字典密码文件
支持基本,摘要,身份验证
支持代理;
输入下面的命令来爬行给定的url,指定爬行深度,并且输出单词列表,这个列表可以用作破解密码的字典:
cewl http://www.ignitetechnologies.in/
为了进行记录维持,可读性更好和作为未来参考,我们通常将输出的单词列表保存到txt文件中,我们可以使用-w参数来保存输出结果到txt文件中,命令如下:
cewl http://www.ignitetechnologies.in/ -w dict.txt
如果你想生成指定单词长度的字典,你可以使用-m参数,这个参数的意思是指定最小的单词长度:
cewl http://www.ignitetechnologies.in/ -m 9
可以使用-e参数来启用邮件参数,配合-n参数使用,-n参数是在爬行给定网站时隐藏生成的单词列表:
cewl http://www.ignitetechnologies.in/ -n -e
如果你想统计网站中重复出现好几次的单词的数量,你可以使用-c参数来计数:
cewl http://www.ignitetechnologies.in/ -c
如果你想增加爬行等级,来遍历网站中更多的单词来生成更大的字典,你可以使用-d参数,并指定一个爬行深度等级来进行更加深入的爬行,默认等级是2:
cewl http://www.ignitetechnologies.in/ -d 3
3.在线密码破解
在线密码破解这种破解方式一般要求待破解的对象对我们来说是可以正常提供服务的,通俗来讲就是能够让我们通过一定的途径去尝试登录,或者是验证用户密码的正确性
(1)hydra
九头蛇,功能强大的在线密码破解工具,可以针对Windows和Linux展开破解,也可以对vnc等其他服务进行破解,使用-h参数可以看见支持的大量协议,代理,应用破解。基本语法格式如下:
语法:Hydra 参数 IP 服务
参数如下:
参数:
-l user 小写,指定用户名进行破解,在确定用户名的情况下用
-L filename 大写,指定用户的用户名字典文件
-p pass 小写,用于指定密码破解,很少使用,一般采用密码字典
-P file 大写,用于指定密码字典
-e ns 额外的选项,n:空密码试探,s:使用指定账户和密码试探
-M file 指定目标ip列表文件,批量破解
-o file 指定结果输出文件
-f 找到第一对登录名或者密码的时候中止破解
-t tasks 同时运行的线程数,默认是16
-w time 设置最大超时时间,单位
-v / -V 显示详细过程
-R 恢复爆破(如果破解中断了,下次执行 hydra -R /path/to/hydra.restore 就可以继续任务。)
-x 自定义密码
-s 非默认的服务端口
FTP协议破解
hydra -L 用户名字典 -P 密码字典 -t 6 -e ns IP地址 -v
http协议破解
get方式提交,破解web登录:
hydra -L 用户名字典 -P 密码字典 -t 线程 -v -e ns IP地址 http-get /admin/
hydra -L 用户名字典 -P 密码字典 -t 线程 -v -e ns -f IP地址 http-get /admin/index.php
post方式提交,破解web登录:
hydra -f -l 用户名 -P 密码字典 -V -s 9900 IP地址 http-post-form "/admin/index.php?action=login:user=USER&pw=PASS:"
#/index.php …这个是登录的 url
#后门是POST的数据 其中的用户名密码使用 USER PASS 来代替
#然后是如果登录出错 会出现的字符 。。。然后开始破解
https协议破解
hydra -m /index.php -l 用户名 -P 密码字典.txt IP地址 https
路由器破解
hydra -l admin -x 6:10:1a.~!@#$%^&()-= -t 8 192.168.1.1 http-get /
-l admin 为尝试破解的用户名。
# -x 6:10:1a. 表示枚举的密码由 数字、小写字母和单字符’.'等等组成,长度为 6 - 10 位。-t 8 表示分 8 个并行任务进行爆破尝试。192.168.1.1 为 Router 地址。http-get 为破解方式(协议)
smb破解
hydra -l 用户名字典 -P 密码字典 IP地址 smb
windows远程桌面
hydra ip地址 rdp -l administrator -P 密码字典.txt -V
邮箱pop3
hydra -l 用户名 -P 密码字典.txt my.pop3.mail pop3
如果是Linux密码破解,一般使用ssh协议去登录,xhydra命令是打开图形化界面,相对于命令行来说对初学者较为友好。
需要注意的是,多线程的去在线破解密码可能会触发某些协议的保护机制:在单位时间内对账户进行超过次数的登录限制则会将请求暂时挂起,导致无法再次尝试登录。所以需要合理的设置hydra的线程。
(2)pw-inspector
如果字典较为复杂且有较多的不需要的、不符合要求的密码,就可以使用pw-inspector来过滤字典:
pw -inspector -i 输入文件 -o 输出文件 -m 有效密码的最小长度 -M 有效密码的最大长度 -l 小写字母 -u 大写字母 -p 可打印的字符 -s 特殊字符 -n 数字
例如只需要小写字母:
pw-inspector -i pass.lst -o up.lst -l //筛选pass.lst字典小写字符输出为lp.lst
若是需要限定长度则加入参数-m 3 -M 5 最小为3最大为5
(3)medusa
相比于hydra的缺点:1.稳定性差,时常崩溃 2.速度控制不会,容易触发服务屏蔽或锁死机制 3.每主机新建进程,每服务新建实例,浪费资源 4.大量目标破解时性能差。 medusa稳定性好,速度控制得当且基于线程,不会过多占用资源,但是缺点是不支持太多的服务类型。
-h 设定目标地址
-H 从文件中获取目标地址
-u 设定破解的用户名
-U 从文件中获取用户名
-p 设定用于破解的密码
-P 从字典中获取密码
-C 组合文件信息
-O 日志信息文件
-e[n/s/ns] n表示空密码,s表示密码与用户名相同
-n 使用非默认tpc端口
-M 模块执行
-s 启用ssl
-r 重试时间,默认三秒
-t 设定线程数量
-d 查看模块的信息
-F 在任意一个服务中扫到第一个正确的密码就停止
-f 扫到一个正确的密码就停止
-V 显示模式(显示破解的过程)
-v num 显示过程的复杂程度(1-6)
-q 查看参数(类似show options)
基本操作
指定用户名与密码来破解
medusa -M ssh -u root -p qwaspbwa -h 192.168.72.153
创建密码文件并进行指定
medusea -M ssh -u root -P passlist.txt -h 192.168.72.142
同时我们需要更改线程数量
medusea -M ssh -U userlist.txt -P passlist.txt -h 192.168.72.142 -t 5
4.离线密码破解
服务器传输数据时已经很少使用明文,因为考虑到安全因素,现在逐渐开始使用加密传输,主要特点有:每次认证使用hash算法加密(易加密,难解密),将发送到服务器的数据进行了加密。在身份认证的时候一般使用非对称加密算法,而不是对称加密算法。
对称加密算法,简单来说就是一个秘钥负责解密与加密,不发生改变。好处是比较方便,坏处是一旦秘钥被获取,那么信息将全部被获取。举个例子,如果字母a在一组密码里对应1,那么则每条密文中a都对应1。
而非对称算法则是单向加密,输入一段长度不固定的字符永远会得到一串长度固定的随机密文,难以反推密文,而服务器端保留有一段正确的哈希值,只需要对比哈希值,哈希值正确,那么密码必定正确。
用户还可以使用加盐的方法去混淆视听:密码加盐里包含随机值
和加密方式
。随机值是电脑随机产生的,并且以随机的方式
混在原始密码里面,然后按照加密方式生成一串字符串保存在服务器。换言之,这个是单向的,电脑也不知道客户的原始密码,即使知道加密方式,反向推出的加密前的字符串也是真正密码与随机值混合后的结果,从而无法解析用户的真正密码。加盐,实际上就是给密码加一个随机串,再进行散列,这样使得根据散列反推出密码的可能性降低。
之所以称为离线密码破解是因为我们获取了被哈希算法加密的数据包,我们需要计算明文哈希值,并且与获取的哈希值进行比较。如果哈希值正确,那么就意味着破解成功,说到底还是依靠字典。但是相对于在线破解来说,不会触发报警机制。
(1)HASH识别工具
离线密码破解首先需要了解是哪种加密方式,一般使用工具(可能识别错误或无法识别):
·hash-identifier
在kali的终端输入hash identifier 即可调用此工具,将哈希值输入,就会显示可能的加密方式。
·hashid
在kali终端界面输入 hashid + hash值,即可得出hash加密类型
(2)离线密码破解工具——hashcat
·开源多线程密码破解工具
·支持80多种加密算法破解
·基于CPU的计算能力破解
·六种模式:
模式 | 代号 |
---|---|
0 | 字典破解 |
1 | 将字典中密码进行排列组合 |
2 | 尝试字典中所有密码的大小写字母组合 |
3 | 指定字符集的所有组合 |
4 | 字典中密码全部字符置换组合 |
5 | 程序为字典中所有密码自动生成掩码 |
设置的参数为:
-m 指定哈希类型
-a 指定破解模式
-V 查看版本信息
-o 将输出结果储存到指定文件
--force 忽略警告
--show 仅显示破解的hash密码和对应的明文
--remove 从源文件中删除破解成功的hash
--username 忽略hash表中的用户名
-b 测试计算机破解速度和相关硬件信息
-O 限制密码长度
-T 设置线程数
-r 使用规则文件
-1 自定义字符集 -1 0123asd
-2 自定义字符集 -2 0123asd
-3 自定义字符集 -3 0123asd
-i 启用增量破解模式
--increment-min 设置密码最小长度
--increment-max 设置密码最大长度
集成的字符集:
?l 代表小写字母
?u 代表大写字母
?d 代表数字
?s 代表特殊字符
?a 代表大小写字母、数字以及特殊字符
?b 0x00-0xff
在破解的命令后添加字符集,缩小破解的范围。
实例:
先使用md5加密
得到密文827ccb0eea8a706c4c34a16891f84e7b,打开hashcat进行破解,输入以下命令:
hashcat -m 0 -a 3 827ccb0eea8a706c4c34a16891f84e7b ?d?d?d?d?d
对于加密字符串进行破解
破解成功,得到明文为12345
(3)更强大的hash破解工具——oclhashcat
同为hashcat团队开发,更加的强大,以至于虚拟机无法安装。可以调动GPU与CPU一起进行大量的运算,号称是世界最快基于通用图形处理器的破解软件(GPGPU)。最大支持55位的密码,反正咱也搞不来,摸了。
(4)RainbowCrack
在破解hash值时,软件会先将字典文件里的密码转义为hash值,再与要解密的hash进行比对,若需要多次进行破解则会重复这个过程。所以我们可以事先将字典的密码进行hash化,将其化为hash值,以便破解时进行比对,节省了每次转化的时间。这种预计算产生的表叫做彩虹表
kali中包含的RainbowCrack工具:
-rtgen:预计算,生成彩虹表,耗时的阶段
-rtsort:对rtgen生成的彩虹表进行排序
-rcrack:查找彩虹表破解密码
-以上命令命令必须顺序使用
彩虹表的格式:
rtgen 哈希类型 字符范围 最小位数 最大位数 表索引 链长度 链数量 索引块
哈希类型主要有:LM,NTLM,MD5,SHA1,SHA256、
字符类型主要有:
【数字】numeric
【字母】alpha
【字母+数字】alpha-numeric
【小写字母】loweralpha
【小写字母+数字】loweralpha-numeric
【小写+大写字母】mixalpha
【小写+大写+数字】mixalpha-numeric
例如生成一个解密md5且位数为四位的纯数字彩虹表,则使用命令:
rtgen md5 numeric 4 4 0 3000 400000 0
会生成一个对应的**.rt**格式文件,使用rtsort命令则可以开始排序
rtsort 生成文件
之后使用整理过的文件进行破解
rtcrack 表名 -f hash.txt //hash.txt是待破解文件名
rtcrack 表名 -h hash //直接跟hash值
rtcrack 表名 -l 文件名(无后缀)