一次测试的过程总会涉及到"密码"与"加解密"。在踩点的过程中,对弱口令的尝试是必不可少的过程,从xx抓鸡到内网哈希批量传递,从个人PC到网络设备/工控设施,只要依旧采用单因素模式的密码认证,密码扫描就不会被遗忘。以下笔者简单分享总结安全测试中密码扫描与破解的技巧,如有疏漏错误,还望 不吝赐教。
想破解密码,要求我们已经"拥有"别人的密码。字典在口令扫描尝试过程中的重要性不言而喻。要整理一份优秀的字典,不妨参考各大网站泄漏数据库,将密码(明文)字段收集后,依出现频率先后生成字典。
一个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]
欲善其事,须利其器。在密码枚举工具中,笔者比较推荐的工具List如下:
当然,根据特定需要(如加入各种伪装绕过检测),可能也需要我们自行编写相应脚本实现枚举账户的过程。
Web层有WAF,Service有IDS/IPS,很容易打草惊蛇。在测试前,先通过扫描等方式判断是否有相应的防护,并采取相应手段。Web层 可能有验证码,可能有每秒IP连接数限制,可能通过Cookie/Header等信息判断行为是Human or Robot。在通过一系列测试后,(如何测试还是要自己探索的),采用最合理的针对方式绕过或尽量避免被检测而导致的阻挡枚举账户密码的脚步。
Web账户枚举是平日遇到较多的情况
常见的绕过验证的可能:
在Web枚举中,使用BurpSuite基本可以解决所有常见问题。工具相关文档资料也比较丰富。
开启代理,打开Intercept,登陆网页,输入用户密码,数据包拦截下来,选择Send to Intruder,进入攻击模块。
其中四种模式:
参考链接:
http://www.digininja.org/blog/burp_intruder_types.php
选择好相应模式后,设置payload为runtime file,挂载字典文件.取消Payload Encoding.
如果发现网页有将用户的本地将密码计算MD5后提交,则需要在Payload Processing中添加计算MD5的过程
设置好后也可添加正则匹配结果等等.之后可以Start attack了.
这个过程中,如果担心IP地址暴露,可以选择写一个这样一个脚本:
脚本本地监听某端口,并为每次枚举随机抽取代理IP,Burp中设置Proxy为本地脚本所监听端口即可.
家用路由/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参数指定线程数.
密码枚举离不开服务,对常见服务如FTP/SSH/TELNET/POP3/1433等的破解枚举,资料已经很齐备,以下仅简要记录命令
hydra -L user.txt -P pass.txt -F ftp://127.0.0.1:21
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.'
hydra -L user.txt -P pass.txt -F smb://127.0.0.1
hydra -L user.txt -P pass.txt -F mssql://127.0.0.1:1433
密码碰撞出来的情况,大多为两种可能:以admin为代表的弱口令和以*19??0101为代表的社工密码.在弱口令尝试失败的情况下,如果对目标信息有较充分的掌握,则可尝试社工字典生成.
以cupp.py工具为例,创建新字典使用:
python cupp.py -i
在填写相关信息后生成字典,然后使用上述工具继续枚举吧 😉
win环境下wce等工具直接抓取内存密码,抓取hash后离线破解往往也是难以避免的,尤其是在微软最近几个漏洞补丁之后:(
普通哈希可以使用Ophcrack破解,官网给出了对应的彩虹表下载,当然,也可以直接查询.
http://www.objectif-securite.ch/en/ophcrack.php
如情非得已,需要破解其他不常见密码哈希(借助已有web破解服务无法解决),暂时便只有三个相对高效的方法:
而如果我们在密码的一定规则后,亦可按照规则破解密码.
如创建一个密码为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
最后补充一点对文件密码的破解,对于zip文件,由于加密方式没有rar强势,故被解密的可能性很大,一个kali下的破解工具命令如下:
fcrackzip -b -v -c a -l 1-4 -u 1.zip
其中,-b指定暴力破解,-v显示详细信息,-c a指定密码为纯字母,-l 1-4指定密码长度位1-4位,-u指使用可能的密码进行解压缩测试(加上,否则会出现很多干扰密码)
关于其他文件密码的破解,各位看官如有高效的工具,还望拿出来分享之。
【本文来源:Le4F'Blog SP胖编整理发布】