背景
Ahold Delhaize自称是全球最大的食品零售集团之一,每周服务6000万客户,拥有150年历史,员工超过41.4万人。该公司声称是超市和电子商务领域的领导者,并在2020年因支持网络安全透明度而获奖。他们鼓励人们分享安全见解,今天我们就来实践这一理念!
讨论
通常我会把讨论部分放在报告末尾,但今天情况特殊。这个CVSS 10分的严重漏洞在报告后超过3.5年仍未修复,我强烈怀疑该漏洞自2005年就已存在。这使得员工凭证面临泄露风险,考虑到人们经常重复使用密码,应该告知他们这一潜在泄露。
该漏洞于2020年4月23日发现,同日得到Ahold安全团队确认。我错误地认为确认后会立即修复,这是个惨痛教训:一定要在一个月后自行检查修复情况,并通过邮件跟踪所有报告的漏洞。
2023年11月2日(3.5年后),我收到邮件称漏洞已修复。但令人惊讶的是,2023年11月9日我发现漏洞依然存在。这次我完整利用了该漏洞,作为概念验证从服务器窃取了/etc/passwd文件。
由于任何人都可以在服务器上执行任意代码,且无需身份验证、易于发现,该服务器应被视为至少3.5年(甚至18年)完全沦陷。这个易受攻击的服务器作为中央身份提供商,允许用户登录和重置密码,支持不同的Ahold公司。
侦察
在攻击公司时,我们总是寻找最有趣和最薄弱的资产。对于Ahold Delhaize这样规模的公司,建立适当的身份管理系统是个巨大挑战。他们经常收购公司,可能需要与旧的遗留系统协作。
一个良好的起点是找出员工登录的位置。Google搜索显示https://ws1.aholdusa.com/用于美国员工登录。快速查看网页设计给人90年代的感觉,这对安全研究人员来说是好事,因为遗留代码往往存在安全问题。
进一步查找显示该服务器的另一个名称是:ldap-ws-vip.aholdusa.com。LDAP(轻量级目录访问协议)是用于访问和维护分布式目录信息服务的协议,通常是组织IT基础设施的核心部分。
使用TomNomNom开发的waybackurls工具,我们发现了包含cgi-bin的URL,这看起来像是Perl(过去用于创建网站的编程语言)。访问该页面显示一个可提交的表单,最后更改日期显示为2005年12月15日。
发现服务器端模板注入漏洞
下一步是在Burp Browser中打开此页面以捕获所有浏览器流量。提交表单时会发出请求。我通常寻找能改变响应输出的参数,这很容易导致XSS和其他类型的漏洞。
使用Burp Intruder,我们添加新的模拟参数到POST正文,选择参数名称作为注入点。我们看到值在源代码中反映,存在反射型XSS!
通过按长度排序响应列表,我们发现Version参数很有趣,在源代码中它将我们的12345a有效负载反映为HTML!我们可以设置XSS有效负载来接管任何访问特定URL的用户的浏览器会话。
但如果我们能利用这个反射漏洞做更多事情呢?每当遇到反射型XSS漏洞时,还应检查服务器端模板注入漏洞。这些漏洞的影响通常更大,因为它们允许在服务器上执行代码。
由于我们知道端点运行Perl,现在只扫描与Perl相关的代码注入。在Burp中创建新的实时任务,设置扫描配置仅检查Perl代码注入选项。
成功利用
BANG!Burp发现了Perl代码注入漏洞!我们有一个让服务器睡眠20秒的请求,通过注入有效负载{${sleep(lc(20))}}。
为了向非技术人员展示实际影响,我创建了泄露/etc/passwd文件的有效负载:
|
|
有效负载说明:
- Perl代码执行:${exec(’…’)}中的有效负载是Perl代码,经过URL编码确保通过HTTP正确传输
- LWP::UserAgent模块:允许代码发出HTTP请求
- 发出POST请求:$ua->post(…)函数向指定URL发送POST请求,包含/etc/passwd文件内容
请求向客户端返回错误,但代码已执行,/etc/passwd文件泄露到我们的服务器!
额外有效负载:
- 获取执行perl进程的当前Linux用户(’nobody’)
- 显示/etc/目录内容(长文件列表和备份文件)
结论
我们证明了可以完全攻陷ws1.aholdusa.com服务器,这是一个身份管理系统/LDAP服务器。我3.5年前发现了这个漏洞,但它很可能自2005年12月15日就已存在。
使用此服务器的所有用户/员工/客户/供应商数据应被视为已泄露,因为我们证明了完整的远程代码执行能力,并能建立到我们自己服务器的出站连接。
时间线
- 2020年4月23日 — 向Ahold安全团队报告漏洞
- 2020年4月23日 — Ahold确认漏洞,承诺保持通知
- 2023年11月2日 — Ahold请求确认漏洞修复并提供修复证明
- 2023年11月9日 — 确认漏洞仍然存在,创建完整RCE有效负载并撰写此博客
- 2023年11月13日 — Ahold奖励此漏洞300欧元
- 2023年11月15日 — Ahold告知端点已修复,但漏洞仍然存在
- 2023年11月20日 — Ahold告知漏洞已解决,我确认修复
- 2023年12月14日 — 披露上述报告