标注的博客| 安全研究| 渗透测试| APT

首页

@杰克逊

作者 weah 时间 2020-02-24
all

嘿,这是2020年Metasploit CTF中Repository Manager前端web应用程序的一篇文章。虽然这让一个忙碌的周末把它和生活中的其他事情混在一起,但这是一个和朋友一起建立团队的好方法。最重要的是我们最终获得了第三名!恭喜佩佩加,并为赢得第一和第二名向世界自然基金会致歉,并为Metasploit团队在挑战和基础设施方面所做的所有努力而欢呼。

这篇文章的结构经过了思考过程,但如果你想切入主题,这里是(剧透警告…):前端是Nexus的一个版本,很容易被命令执行。在更新功能时,可以在“notes”参数中使用JSON注入来利用它。

侦察

挑战从880端口的目标框开始,我们展示了一个Ruby on Rails应用程序,它允许我们查看/编辑repo和管理功能。

在粗略浏览存储库页面的同时,我希望我们可以加载一个未列出的repo,可能是一个包含标志的repo,然后能够通过应用程序访问其内容。唉,由于没有读取文件数据的方法,这并没有什么成效。

功能页面表面上允许用户阅读和更新注释。在更新百胜功能的说明时,我们只会收到一条状态消息,而其他功能在更新时会返回一个空白状态。

退一步,我们绘制出web应用允许我们操作的可见攻击面,假设接下来的步骤将在这个抽象层:

发现

在创建repo时,我的队友h4ccinnja在处理可供选择的提供者列表时发现,将提供者从rubygems托管改为rubygems代理将返回一个转义的HTML页面,并引发500个错误。

rubygems-hosted rubygems-proxy

这个响应使得在后端使用Sonatype Nexus来管理存储库变得更加明显。这很有意思,因为也许有潜在的SSRF。。。如果我们可以在nexushost:8081上查询任意api或与其他容器通信呢?

nexushost:8081

另一个有趣的是,版本2.14.14-01正在被使用。通过一些搜索,我们发现此版本易受通过操作系统命令注入验证的RCE的攻击。通过使用恶意命令更新Yum功能的createrepoPath或modifyrepoPath属性,可以利用注入向量。更新后,这些属性值将使用--version参数执行。例如,如果calc.exe作为“恶意”命令提供,则将执行calc.exe--version。我在这里简化了一点,但是在两份HackerOne报告中都有更多的细节:#654888。

createrepoPath modifyrepoPath --version calc.exe calc.exe --version

剥削

当涉及到攻击时,我们不必担心身份验证部分,因为这是在前端与后端通信时假设的。能够修改这些特性被证明是更具挑战性的。我们最初假设可以将这些属性添加到update_capa请求(如下所示)中,期望响应中的状态消息将随着命令的输出而更新。

update_capa

当我们尝试上述请求的许多不同变体时,它已经进入了深夜,但它只是不起作用。

随着我们的进步,人们开始明白为什么利用大规模分配漏洞的想法行不通。如果这确实是一个大规模分配漏洞,我们应该能够使用上面的请求修改capability对象。进一步研究Nexus API,发现id属性用于引用功能,并且没有capa_id属性。因此,我们可能仍在与前端(它忽略了我们的额外输入)而不是后端交互。

id capa_id

出于想法和充足的睡眠,我开始在update note字段中粉碎键,并看到一些有趣的东西。以下是不光彩的再现:

什么?错误信息?意外字符“35;”?在那之前。。。双引号?它期待着后面会有一个逗号。。。用大写字母“O”分隔对象条目,比如JSON对象?等等,JSON对象。。。它们是否将用户输入连接到字符串化JSON并将其发送到后端?为什么会有人这么做??在现实世界的现代网络应用中,这种情况多久出现一次?哦,这是CTF。

在实现之后,很明显需要将有效负载放入notes参数中。下面您可以看到使用字符串连接的预期和意外行为的场景:

notes

最小的测试负载如下所示:MyNote1,“properties”:[{“key”:“createrepoPath”,“value”:“/bin/sh-c id | |/createrepo”}],“notes”:“MyNote2”}。以前的尝试没有“}后缀,这仍然会导致注释被更新为“MyNote2”,但不会设置或执行新的createrepoPath值。我们知道Nexus版本是2.14.14-01,我们知道仅仅提供命令是行不通的,因为这个实例是为CVE-2019-5475而不是为CVE-2019-15588打补丁的。

MyNote1", "properties": [{"key": "createrepoPath", "value": "/bin/sh -c id || /createrepo"}], "notes": "MyNote2"} "}

接下来,我们将基线有效载荷替换为一个用于反向shell的有效载荷,在系统周围搜索该标志,并得到其MD5。

这是钻石王牌的旗牌:

这就是全部!谢谢你的阅读,如果你写得这么好,我希望你喜欢。

格瑞兹向小组出口和中央特勤队全体人员问好。