Laravel调试模式漏洞导致管理员凭证泄露及敏感报告曝光

本文详细分析了Zouikwatzeggen.nl网站因Laravel调试模式未关闭导致的安全漏洞,包括管理员凭证泄露、敏感行为报告曝光和邮件伪造风险,涉及APK流量拦截、PHP调试栏暴露等技术细节。

Laravel调试模式未关闭导致管理员凭证泄露及阿姆斯特丹大学医疗中心不当行为报告可能曝光

背景

11年前,Benjamin与我在BMJ Careers发表了《有一款医疗应用适合那个》的文章。当时我们关注的是患者安全,而今天我们将关注医疗工作者自身的安全。

让我们仔细看看这款允许报告工作场所不当行为的应用——#zouikwatzeggen-app(直译:"#我会说些什么-应用")。这款应用使用安全吗?

该应用提高了对不当行为的认识,并展示了如何使其可讨论。还有一个报告按钮,可以轻松地(匿名)直接向正确的人报告不良行为。该应用是关于预防不良行为和该主题研讨会的更大电子学习包的一部分。

工作场所的不良行为以多种方式出现:八卦、欺凌、排斥、恐吓、言语和身体攻击、歧视、冲突以及性言论或行为。

最终,我认为每个人都同意减少不良行为是件好事。应用可能会有帮助,但我们需要确保应用本身在处理高度敏感数据时尽可能安全。

侦察:应用究竟如何工作?

作为安全研究人员,我们对"使用应用发送报告"的功能很感兴趣。这是如何工作的?某种将数据中继到电子邮件的表单?什么参数?支持此功能的代码托管在哪里?这台服务器是否适当安全?

让我们从安卓应用开始,因为我们可以轻松下载应用并修补代码以便能够拦截应用产生的流量。

如今所有应用都使用HTTPS进行通信,通过修补我们禁用那些安全检查。修补后,我们可以通过Burp Suite路由应用的流量并检查/操纵它。

有多种方法可以获取应用的APK安装文件。

方法1 — 从Google Play商店在安卓手机上安装应用,并使用此处描述的方法:https://stackoverflow.com/questions/4032960/how-do-i-get-an-apk-file-from-an-android-device

方法2 — 信任第三方下载网站并下载APK;参见https://apkpure.com/上的此深层链接

拦截应用流量

获得APK后,我们使用APK-MITM修补我们的APK,使其不再检查HTTPS证书;它需要接受我们Burp强制的HTTPS证书。

安装apk-mitm后,我们可以运行

1
apk-mitm #Zouikwatzeggen_2.2.2_Apkpure.apk

来修补它。

之后,我们可以使用ADB将应用安装到手机上(参见此页面获取说明)。专业提示:使用scrcpy在桌面上捕获手机的屏幕,如果您想同时捕获两个屏幕,如下面的视频所示,这非常方便。

准备您的手机以便它可以与Burp Suite协同工作。例如,参见本教程。使用Burp拦截流量仍有问题?您可以使用此命令直接将Burp Suite证书注入到修补的APK中:apk-mitm #Zouikwatzeggen_2.2.2_Apkpure.apk --certificate cacert.pem。cacert.pem文件通过运行此命令创建:

1
curl --proxy http://127.0.0.1:8080 -o cacert.der http://burp/cert && openssl x509 -inform DER -in cacert.der -out cacert.pem

我们现在能够拦截应用与其后端系统之间的流量。例如,当我们提交新报告时,我们能够拦截发出的请求:

堆栈跟踪错误消息?

这很奇怪。提交报告的功能被破坏,应用返回错误。快速查看请求,我们看到:“recipient”: “null”。开发者在发送表单时忘记设置电子邮件…

此外,我们返回的错误极其详细。它反映了触发错误的确源代码文件和代码行。这闻起来像有人在应用发布前忘记正确测试所有功能,并忘记关闭调试消息。

然而,首先让我们深入挖掘,尝试通过注入我们自己的电子邮件地址作为收件人来修复请求。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
POST /formData HTTP/1.1
Host: api.zouikwatzeggen.nl
Cookie: XSRF-TOKEN=eyJpdiI6Ijh6ODVJYTZrQ1lsOHlpbXVCWm51dkE9PSIsInZhbHVlIjoiRnBabGd6U0pCSGw0Y0hyYXlPa1IzcGVoS1BLZkYyeVR6WEtoZlV5N2xUVERpbnd2eGdVSVdPUzQxdjJtTFlLcm9ZNy9pVWR0Rk1CWFlwSlAvQjNmcVdNKzc4czBwZXJSa016YnpJdlVnMjhkTEtSS0c5M1hjOGxYSzdSQ3YvMUUiLCJtYWMiOiI4MzVjZmU1MDVmOTQ1MTliNmY5YTMyOGI4NzliYjM4NWQwMmJkOTFjNGVlN2JlODViY2MzOTQ1NWFkNWI3ZGQ2In0%3D; zouikwatzeggen_fritz_api_v2_session=eyJpdiI6IkMya3ZIcEozV2RpdUg0NkRqUU14V2c9PSIsInZhbHVlIjoiVGo2eGJFaElHek5jREhXL3RGM093R0xZRXlZbm41UldvT3hsMXRRRWV3VktIMVZBL215NTV2TExUQmlGT3Irc1dkT0lEYmFJNWYrQU1KaU9aUmJ6TGt5cVhnSFFPUDhRVkFER1oyTzRnaC83a2x3WUNsbVhKV2s4MmJkTkJRcFIiLCJtYWMiOiI0YWUyZmVlZjk1ZTA1NmVkMjU1MTljMDE0MWYxMDM5Njk0M2I2YjljOWU1ODUzMTRlNmIyNDQ0ODUzOTM0OWVlIn0%3D
Accept: application/json, text/plain, */*
Content-Type: application/json;charset=utf-8
Content-Length: 112
Accept-Encoding: gzip, deflate
User-Agent: okhttp/3.14.9
Connection: close

{"message":"https://test.nl <h1>test</h1>","type":"ContactViaAnonymousEmail","recipient":"pentest@protozoan.nl"}

几秒钟后,我们收到这封电子邮件:

漏洞1:能够从#zouikwatzeggen-app向任何人发送电子邮件

我们发现了第一个漏洞:电子邮件欺骗。

尽管影响有限;但可以使用应用向任何人发送带有自定义文本的电子邮件。对于网络钓鱼活动很方便,或者只是在互联网上向用户发送垃圾邮件。

现在让我们仔细查看提交电子邮件表单时返回的头部:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
HTTP/1.1 200 OK
Date: Mon, 12 Sep 2022 17:50:06 GMT
Server: Apache/2.4.41 (Ubuntu)
Cache-Control: no-cache, private
phpdebugbar-id: X87122f399eb1db5364428a9111273a8b
Set-Cookie: XSRF-TOKEN=eyJpdiI6Ik9ROW14ckUrbU0xVjdXQzZWMko0R2c9PSIsInZhbHVlIjoiUnFIQW1YZlBSbXVmaEhkREpjeHUyYTRXbUZhY3pyK1JLbmhKaFU0QXQvOUR4YXF1MUJMallOUUZyR05NOVV4S2wyYTZDc2lERTJZU0IxL2RyTzcrZVFhd25ndFpRWXd4WVJtNHFLUVVWdEZ2OTd2MWJBTURGd1Z2VjJIUStHZmIiLCJtYWMiOiI1ZDE3Y2IxZDEyODFkZGRlNWEwMjBkODJjZWUyN2M1ODkxZThjM2Q5OTQ1YTcyNzk2MWEwZmVmNGZmOWYwMmE1In0%3D; expires=Mon, 12-Sep-2022 19:50:06 GMT; Max-Age=7200; path=/; samesite=lax
Set-Cookie: zouikwatzeggen_fritz_api_v2_session=eyJpdiI6Im1hMWpreFZ6VjIwRSsySmtjcjBCbUE9PSIsInZhbHVlIjoiVzRiSy9nZ1F6c0pTZDNLUjE1bUNqR0FTSUM4UDFweG4rVjNsRUVzTGtSdFpSeXFrUnZSOHJUZnhzQU0yalZWMzJKQmhkK2ZSRHVaVjBmNGFzemVXSWNYak9FdHRYa0tmYnlpdnpxTlhOZlZsaVpSd0hwNDVJWVVSRzBBeXpkalkiLCJtYWMiOiI3OGU0Yzk1NTQ1NTRkZDNiYjJlMzQ4ZjkyYWMwNTI3OGVhZTQwNTFlMmJlMDZkMGIyOTY3ODZhOGI5NjI2NDVkIn0%3D; expires=Mon, 12-Sep-2022 19:50:06 GMT; Max-Age=7200; path=/; httponly; samesite=lax
Content-Length: 17
Connection: close
Content-Type: application/json

{"status":"sent"}

PHP调试栏

如果仔细看,您会注意到phpdebugbar-id;一个被PHP开发者使用的工具(2),用于轻松调试已部署应用上的问题。这可能解释了为什么我们得到那些广泛的错误消息。应用的调试模式被留为开启,并且它包括一个php调试栏。

让我们看看是否能在我们的桌面上触发调试栏的用户界面。一个简单的方法是访问应用使用的其中一个端点来触发错误。

我们从Burp历史记录中随机选择一个URL并在浏览器中打开它。

https://api.zouikwatzeggen.nl/getToKnowYou?domain=1&model=App%5CCms%5CModels%5CAfterIntroBeforeQuestionsHolxder(注意Holxder部分是一个触发错误的拼写错误)。

漏洞2:php调试栏暴露

这里是第二个漏洞:php调试栏暴露。请参阅https://github.com/barryvdh/laravel-debugbar以了解其所有功能。

这个漏洞让我们洞察应用背后的代码、其设置和活动用户会话及其数据。正如我们所有人理解的那样,这是一个问题。但我们需要一个组织内每个人都能理解的概念证明,对阿姆斯特丹UMC的15,000名员工有什么影响?他们如何受到影响?如果我告诉董事会"PHP调试栏被留为开启!",他们会耸耸肩。

只要可能,我们应该提供一个每个人都能理解的概念证明,同时限制这样做造成的损害。例如:我们现在能使用这个调试栏泄露我们自己提交的关于不当行为的报告之一吗?

好的。这很严重;我们可以泄露提交的报告。

调试栏允许列出服务器所有访问者的最新请求。这包括不当行为报告的提交。在调试栏UI中,它不反映这些报告的确切细节。然而,当有人拦截调试栏流量(使用Burp浏览器)时,它将反映所有报告细节。

上面的概念证明视频可能有点快,所以让我们仔细看看。

步骤1:打开请求模态框。

步骤2:打开来自应用的传入POST请求。

步骤3:拦截PHP调试栏关于此请求发出的请求,在Burp中检查响应,并搜索字符串Serieuze以查看是否能找到我们报告的一部分(并确认泄漏)。

换句话说,可以监视此端点https://api.zouikwatzeggen.nl/_debugbar/open?op=get,无需认证,每几秒钟存储输出。这允许近乎实时地捕获员工发送的所有报告。

我们现在证明了漏洞泄露报告细节,但是否还有更多?

在深入挖掘一点之后,我们发现过去调试栏可能被滥用以实现远程代码执行(RCE),参见此漏洞。幸运的是,这个Laravel被适当修补,我找不到绕过此修复的方法。

我们还能做些什么来使用此调试栏实现RCE?

泄露管理员密码

如果系统管理员使用相同的Web应用访问管理面板怎么办?我们能够泄露密码吗?

让我们监视此服务器上的传入请求几个小时,看看是否幸运地监视到管理员登录:

万岁!正如我们所见,路径/cm/login被另一个用户请求。让我们看看用于此登录的凭据。

我们现在证明了这个漏洞给了我们访问管理员仪表板所需的凭据。

是时候停止我们的研究并与CERT分享我们所有的见解了。

讨论,不伤害——Primum non nocere

现代(和古老)医学的基本原则之一是,我们需要确保我们的干预真正有助于解决问题,而不是实际上使其更糟。

如果提交者的高度敏感数据被泄露,或者关于不知情潜在不当行为对象的报告细节被泄露怎么办?它会对我们对系统的整体信任产生什么影响?

一个有趣的观点是,尤其是这条"不伤害"规则使我们在医学上创建了适当(透明)的程序,然后我们才能甚至研究对人类进行的医疗干预。当您想研究新的干预措施时,您需要获得研究伦理委员会的批准。出错的风险是什么?如果出错,影响是什么?它可能造成伤害吗?此外,您被强制报告不良事件,因此研究可以关闭或可以提前告知新参与者。

一如既往,我尝试分享当我们试图使数字世界更安全时,我们可以从医学中学到什么,反之亦然。

实施威胁建模

在发布这样的应用之前需要做什么?这是一个难题,让我分享我的想法。然而,我很高兴向您学习,所以改变我的想法并在下方留下您的评论!

我的建议是提前执行适当的渗透测试,修复发现的漏洞,然后执行系统化的威胁建模,如includesnodirt.com(邀请黑客、开发者、隐私官、最终用户和CERT成员)。

完成此操作后,将结果提交给一个小委员会,就像我们在医学中称为研究伦理委员会的委员会一样(如果可能,包括伦理学家),并决定风险是否值得潜在收益。对于一个"简单的应用"来说,这听起来很麻烦。然而,员工/客户信任处于危险之中,一个错误可能会严重影响其他(正常工作的)应用的信任。所以"不伤害"并尝试证明您的应用是否真正解决了问题,如果没有,关闭它(我喜欢在医疗保健中看到更多基于证据的政策)。

可能的改进

如果认为有必要发布这样的应用,我建议做一些事情来限制如果出现问题的影响范围。一个好的开始是对最敏感的数据实施客户端加密。

我们可以使用OpenPGP,这是一个开源的、经过战斗考验的加密协议,允许在消息离开设备之前对其进行加密。参见OpenPGP文档以获取在客户端工作的示例。

目前,应用中的消息被发送到外部供应商的Web服务器,从Web服务器到外部供应商的内部邮件服务器,并中继到AmsterdamUMC(或使用该应用的其他医院之一)的电子邮件服务器。由于电子邮件默认不加密,如果任何涉及的服务器被入侵,这可能会产生风险。

每当实施OpenPGP加密时,影响将是"泄露的加密电子邮件",与当前情况相比,影响较小。电子邮件的接收者需要实施OpenPGP以便使用秘密私钥解密内容(只有那些应该能够查看报告的人知道)。

剩下的风险是供应链攻击(某人替换应用的代码并嗅探报告)、网络钓鱼(某人发布模仿原始应用的恶意应用并嗅探报告)或当接收者的电子邮件箱被入侵时。最后但并非最不重要的是,当接收者的电子邮件箱因任何原因失败并且电子邮件被发送回实际发件人,即webmaster@<应用开发者名称>.nl(参见漏洞1的截图),内容将泄露给有权访问webmaster@<应用开发者名称>.nl帐户的人(不太可能发生,但需要考虑)。

透明就是信任

我能够毫无问题地发布此博客的事实非常重要。感谢协调漏洞披露(CVD)政策。

对这样的漏洞保持沉默不是前进的方向。就像在医学中一样,我们都从别人犯的错误中学习。这不是关于羞辱犯这个错误的人,而是关于从中学习并为每个人创造一个更安全的环境。

一个正常工作的CVD的好例子

在我按下错误报告的发送按钮后,只用了10分钟就收到了相关CERT的回复。当时是当地时间20:30,但他们确认了漏洞并采取行动通知供应商。

在提供关于额外影响(泄露的管理员凭据)的更多信息后,我有相同的体验;快速回复并采取适当行动。

该应用由外部供应商托管,此报告展示了当并非所有基础设施都在您控制之下时您面临的挑战。供应商是否具有与您自托管应用相同级别的安全性?更重要的是,他们也支持CVD吗?

然而,此报告是CVD如何帮助您的组织使一切更安全的一个很好的例子。快速行动并消灭漏洞!

免责声明

正如你们中的一些人所知,我自己在受影响的医院工作,但这项研究是在我的业余时间完成的。作为SCIRT(SURF社区事件响应团队)的一部分,我很高兴分享我的见解并在需要时提高认识。

时间线

  • 2021年6月17日 — 首次宣布应用可用性;仅限学生
  • 2022年9月7日 — 宣布应用可用性;所有15,000名员工
  • 2022年9月12日 — 发现电子邮件欺骗漏洞,向CERT报告
  • 2022年9月12日 — 发现PHP调试栏漏洞,向CERT报告
  • 2022年9月12日 — CERT在10分钟内回复确认漏洞
  • 2022年9月13日 — 发现管理员凭据,向CERT报告
  • 2022年9月13日 — CERT确认入侵并命令供应商关闭服务器。CERT报告数据泄露。
  • 2023年3月23日 — 获得邀请在SURF安全与隐私会议上分享漏洞细节
  • 2023年5月29日 — 撰写此博客的第一稿并与AmsterdamUMC CISO共享以协调披露。
  • 2023年6月20日 — AmsterdamUMC允许披露漏洞
  • 2023年6月29日 — 展示上述研究,发布博客
  • 2023年6月29日 — 从AmsterdamUMC获得"谢谢!“钥匙扣奖
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计