# 攻击供应链

### **存储库管理软件**

在企业环境中，我们常常遇见存储库管理软件，例如 **JFog Artifactory**, **Nexus Sonatype** 等。这些软件存储了企业内在用的软件包、项目文件、二进制文件等。

[![image.png](https://raven-medicine.com/uploads/images/gallery/2022-11/scaled-1680-/ply5uYjSfnbmaJAa-image.png)](https://raven-medicine.com/uploads/images/gallery/2022-11/ply5uYjSfnbmaJAa-image.png)

[![image.png](https://raven-medicine.com/uploads/images/gallery/2022-11/scaled-1680-/FfEf8UreLH3mXAhO-image.png)](https://raven-medicine.com/uploads/images/gallery/2022-11/FfEf8UreLH3mXAhO-image.png)

Sonatype Nexus 或 JFrog Artifactory 等**工件存储库管理器软件**的沦陷会产生严重后果，并导致通常所说的**供应链攻击**或**供应链污染**。这是由于这些系统在软件开发和交付过程中发挥的关键作用。 原因如下：

**集中信任**：这些系统是组织内信任的中央来源。开发人员、CI/CD 系统和部署流程都从这些系统中提取工件，并期望这些工件是绝对可信的。如果攻击者可以破坏系统并将合法工件替换为恶意文件，恶意软件便会最终传播到多个系统。

**广泛影响**：根据组织的规模和工件存储库的使用范围，单个恶意文件最终可能会出现在大量系统上。这可能会导致终端系统遭到大规模破坏。

**持久性和版本控制**：因为工件存储库保留旧版本的工件，所以恶意文件在受损后很长时间内仍可供下载，除非及时发现并删除攻击者上传的恶意文件，否则系统可能会在工件存储库最初遭到破坏后很长时间内受到危害。

**自动化**：在 DevOps 环境中，新软件的构建和部署经常发生，而且通常是自动化的。这意味着攻击者分发的恶意文件可以快速分布到整个组织，并且很难追踪和删除工件的所有实例。

**访问机密**：通常，这些系统可以访问部署应用程序所需的机密，例如数据库凭证、API 密钥等。如果遭到沦陷，攻击者可以访问这些敏感信息。

由于这些原因，工件存储库的安全性至关重要。

### **匿名访问**

例如 Artifactory 和 Sonatype，是允许**匿名访问**的，即攻击者不需要凭证也可以访问存储库中的文件，甚至具有一定权限，例如更改文件或项目的属性。并且，如果存在更严重的配置失误，匿名状态下甚至可以部署文件，这种情况对于攻击者无疑是快捷的胜利。即便在匿名状态下没有任何写权限，我们应该枚举匿名访问的所有权限。除此之外，因为存储库管理软件同样可能存储了内部应用的源代码以及其他敏感文件，我们可以从中提取敏感信息，例如 **API Key**，**明文帐号密码**等。

### **供应链污染**

不管是**具有写权限的匿名访问**，还是获得了**存储库管理软件的有效凭证**，如果我们具备**写权限**，便可以**上传**、**替换**、**更改**文件。从攻击者的角度，将经常被下载或自动化安装的文件替换为植入了木马的程序，可以从而污染众多主机与用户。

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-06/scaled-1680-/VVrT4t59ooxrbLLV-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-06/VVrT4t59ooxrbLLV-image.png)

如上图所示，该二进制文件已经被下载了 **73** 次了，说明无论是终端用户下载，还是服务器上的计划任务自动拉取文件并执行，只要该文件在供应链中被污染了，后果严重。但即便在授权的渗透或者红队行动中，对于此类攻击依旧要极为谨慎，因为要彻底清除污染十分麻烦。

### **案例：污染供应链实现在 Dev01 的提权**

能被污染的当然不止工件存储库管理软件。在 Dev01 的 **/opt** 目录下，我们发现了一个有意思的文本文件 **status\_report.txt**。查看其内容，看起来是一些用于搜集主机信息的命令的执行输出。根据文件权限，我们猜测是 root 用户在执行某个脚本后将输出保存在了这个文件里。

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-06/scaled-1680-/6H5zX5qMUO1ZTmC7-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-06/6H5zX5qMUO1ZTmC7-image.png)

观察到这个文件在不断更改，意味着脚本可能在背景中以特定时间间隔执行，即有着类似于计划任务的活动在驱动着。

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-06/scaled-1680-/E6v1Bcs3cxlDdz32-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-06/E6v1Bcs3cxlDdz32-image.png)

使用 pspy ([https://github.com/DominicBreuker/pspy](https://github.com/DominicBreuker/pspy)) 观察背景中的进程，我们发现了这些相关的内容：

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-06/scaled-1680-/1eo3a7X980jO2urq-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-06/1eo3a7X980jO2urq-image.png)

简单地说，有一个在 root 目录下的脚本 **status.sh** 在负责从仓库 [https://github.com/raven-medicine/Automation](https://github.com/raven-medicine/Automation) 克隆最新的项目到 /root/Automation 目录中，目录里的脚本 **cron.sh** 被执行。

回顾一下我们在课程早期的时候，在 **Web01** 的 **FTP 服务器**中发现了一个文本文件，包含了一对有效的 **Github 帐号**。

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-06/scaled-1680-/e7FUjT5EZIxqcJYB-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-06/e7FUjT5EZIxqcJYB-image.png)

用该凭证得以成功登陆。

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-06/scaled-1680-/MUc5dKaT3NDW5Rit-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-06/MUc5dKaT3NDW5Rit-image.png)

如我们所料，这个脚本被克隆到了 Dev01 的本地然后被 root 用户执行。

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-06/scaled-1680-/3fVT6klaQPocnTch-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-06/3fVT6klaQPocnTch-image.png)

既然我们有了Github 凭证，那么可以更新该脚本，**插入恶意命令**，实现对这个简单供应链的污染。就 Dev01 上而言，因为是 **root** 用户执行的，如果我们尚未找到提权路径，我们可以用此方法来实现**本地特权提升**。

在拿到 root 权限后，观察一下自动化的脚本，跟我们猜想的一样。

[![image.png](https://raven-medicine.com/uploads/images/gallery/2023-06/scaled-1680-/B0RZuLA1qkS3mmmF-image.png)](https://raven-medicine.com/uploads/images/gallery/2023-06/B0RZuLA1qkS3mmmF-image.png)