elreydetoda/container_registry
GitHub: elreydetoda/container_registry
Mythic C2 的第三方服务 payload,封装 skopeo 让红队在云原生安全评估中直接操作 OCI 容器镜像仓库。
Stars: 0 | Forks: 0
# 容器镜像仓库 - Mythic C2 第三方服务 Payload
这是一个 Mythic C2 集成,它通过封装 `skopeo` 二进制程序,允许用户通过 Mythic 的 Web UI 与 OCI 容器镜像仓库进行交互。此服务 payload 允许红队操作人员直接从 Mythic 执行容器镜像仓库操作,并特别支持将 [container_wrapper](https://github.com/elreydetoda/container_wrapper) payload 上传到镜像仓库。
## 概述
此 payload 类型是一个**服务 payload**(类似于 BloodHound payload),它会在 Mythic 中创建一个用于与容器镜像仓库交互的回调。它封装了 `skopeo` 二进制程序,以提供类似于 skopeo 在命令行上所提供的功能,但已被直接集成到了 Mythic 的 Web 界面中。
## 功能
- **通过 copy 命令将 container_wrapper payload 上传**到镜像仓库
- **检查容器镜像**以查看元数据和 manifest
- 从镜像仓库中**删除镜像**
- 使用 Docker Registry HTTP API V2 **列出仓库中的所有存储库**
- 列出存储库的**所有标签**
- 支持经过身份验证的和不安全的镜像仓库连接
- 自动回退到构建参数以获取凭据
- 已集成到 Mythic 的 Web UI 中
## 安装
### 使用 mythic-cli
```
# 从你的 Mythic 安装目录
./mythic-cli install github https://github.com/elreydetoda/container_registry
```
### 手动安装
1. 将此代码仓库克隆到您的 Mythic `InstalledServices` 目录中:
```
cd /opt/Mythic/InstalledServices
git clone https://github.com/elreydetoda/container_registry
```
2. 启动容器:
```
./mythic-cli payload start container_registry
```
## 前置条件
- 已安装 Mythic C2 Framework
- Docker(用于容器化部署)
- Skopeo 二进制程序(已包含在 Docker 容器中)
- [container_wrapper](https://github.com/elreydetoda/container_wrapper) payload 类型(用于上传功能)
## 用法
### 创建 Payload
1. 导航到 Mythic 的 Web UI
2. 进入 "Create Components" > "Create Payload"
3. 选择 "container_registry" 作为 payload 类型
4. 配置构建参数:
- **BASE_HOST**:默认容器镜像仓库 URL(例如 `localhost:5000`、`docker.io`、`ghcr.io`、`quay.io`)
- **USERNAME**:用于镜像仓库身份验证的可选默认用户名
- **PASSWORD**:用于镜像仓库身份验证的可选默认密码/token
- **INSECURE**:允许不安全的(HTTP)镜像仓库连接
5. 创建 payload - 这将在 Mythic 中建立一个回调
### 可用命令
#### copy
将一个 container_wrapper payload 上传到已配置的镜像仓库中。此命令专为与 [container_wrapper](https://github.com/elreydetoda/container_wrapper) payload 类型创建的容器镜像配合使用而设计。
**参数:**
- `source`(Payload):通过动态下拉菜单从可用的 container_wrapper payload 中选择
- `destination_name`:带标签的目标镜像名称(例如 `alpine:latest`、`myapp:v1.0`)
- `DEST_USERNAME`:目标镜像仓库用户名(可选,回退到构建参数)
- `DEST_PASSWORD`:目标镜像仓库密码/token(可选,回退到构建参数)
- `DEST_INSECURE`:允许不安全的目标连接(可选)
**示例:**
```
{
"source": "mycontainer.tar - My wrapped payload",
"destination_name": "malware/backdoor:latest",
"DEST_USERNAME": "myuser",
"DEST_PASSWORD": "mytoken"
}
```
**注意:**源 payload 会自动从 Mythic 的 payload 存储中以 OCI archive 的形式检索出来,并使用 `skopeo copy` 上传到镜像仓库。
#### inspect
检查已配置镜像仓库中的容器镜像。
**参数:**
- `image_name`:带标签的镜像名称(例如 `alpine:latest`、`library/alpine:3.18`)
- `USERNAME`:镜像仓库用户名(可选,回退到构建参数)
- `PASSWORD`:镜像仓库密码/token(可选,回退到构建参数)
- `INSECURE`:允许不安全的连接(可选,回退到构建参数)
- `raw`:返回原始的 manifest 而不是格式化的输出(可选)
**示例:**
```
{
"image_name": "alpine:latest"
}
```
**注意:**系统会自动使用 `BASE_HOST` 构建参数构造完整的镜像仓库 URL,因此您只需提供镜像名称即可。
#### delete
从已配置的镜像仓库中删除容器镜像。
**参数:**
- `image_name`:带标签的镜像名称(例如 `myrepo/myimage:tag`)
- `USERNAME`:镜像仓库用户名(可选,回退到构建参数)
- `PASSWORD`:镜像仓库密码/token(可选,回退到构建参数)
- `INSECURE`:允许不安全的连接(可选,回退到构建参数)
**示例:**
```
{
"image_name": "malware/backdoor:latest"
}
```
#### list_catalog
使用 Docker Registry HTTP API V2 的 `/v2/_catalog` endpoint 列出镜像仓库中的所有存储库。
**参数:**
- `BASE_HOST`:镜像仓库 URL(可选,回退到构建参数 - 例如 `registry-1.docker.io`、`ghcr.io`、`localhost:5000`)
- `USERNAME`:镜像仓库用户名(可选,回退到构建参数)
- `PASSWORD`:镜像仓库密码/token(可选,回退到构建参数)
- `INSECURE`:允许不安全的连接/跳过 TLS 验证(可选,回退到构建参数)
**示例:**
```
{
"BASE_HOST": "myregistry.com:5000",
"USERNAME": "myuser",
"PASSWORD": "mytoken"
}
```
**注意:**此命令使用 Python 的 `requests` 库直接向镜像仓库 API 发起 HTTP 调用,而不是使用 skopeo。
#### list_tags
列出已配置镜像仓库中某个存储库的所有标签。
**参数:**
- `image_name`:存储库镜像名称(例如 `alpine`、`library/alpine`、`myrepo/myimage`)
- `USERNAME`:镜像仓库用户名(可选,回退到构建参数)
- `PASSWORD`:镜像仓库密码/token(可选,回退到构建参数)
- `INSECURE`:允许不安全的连接(可选,回退到构建参数)
**示例:**
```
{
"image_name": "alpine"
}
```
## 架构
此 payload 遵循 Mythic 第三方服务 payload 模式:
```
container_registry/
├── Payload_Type/
│ └── container_registry/
│ ├── container_registry/
│ │ ├── agent_functions/
│ │ │ ├── __init__.py # Auto-loader for commands
│ │ │ ├── builder.py # Payload type definition
│ │ │ ├── shared.py # Shared helper functions
│ │ │ ├── copy.py # Upload container_wrapper payloads
│ │ │ ├── inspect.py # Inspect images
│ │ │ ├── delete.py # Delete images
│ │ │ ├── list_catalog.py # List all repositories
│ │ │ └── list_tags.py # List tags for repository
│ │ └── __init__.py
│ ├── main.py # Entry point
│ └── Dockerfile # Container definition
├── config.json # Mythic configuration
└── README.md # This file
```
### 共享辅助函数
`shared.py` 模块提供了通用的实用工具:
- `get_arg_or_build_value()`:检索参数值并自动回退到构建参数
- `get_registry_base_url()`:构造 HTTP/HTTPS 镜像仓库 URL
- `get_registry_proto_url()`:为 skopeo 构造 `docker://` 协议 URL
### 命令参数回退
所有命令都支持自动回退到构建参数。如果命令参数为空或未提供,系统会自动使用构建配置中的值。这允许您在创建 payload 时配置一次默认凭据,并可以根据需要针对特定命令进行覆盖。
## 开发历史
基于 git 提交历史:
1. **初始代码生成** - Claude AI 生成了基础的集成代码
2. **添加了 list_catalog 功能** - 直接通过 HTTP API 访问镜像仓库 catalog
3. **为简化访问进行手动修改** - 添加了共享辅助函数和参数回退逻辑
4. **适配 copy 功能** - 经修改可从 Mythic 的 payload 存储上传 container_wrapper payload
5. **重构** - 标准化了所有命令,以使用一致的模式和共享实用工具
6. **移除了 sync 命令** - 在进一步完成 QA 之前,已将其移至 `disabled_cmds`
## 参考
- [Mythic 官方文档](https://docs.mythic-c2.net/)
- [Skopeo 官方文档](https://github.com/containers/skopeo)
- [BloodHound Mythic 集成](https://github.com/MythicAgents/bloodhound/) - 服务 payload 模式的参考
- [Container Wrapper](https://github.com/elreydetoda/container_wrapper) - 从 payload 创建 OCI 镜像
- [Docker Registry HTTP API V2](https://distribution.github.io/distribution/spec/api/) - 镜像仓库 API 规范
## 作者
@elreydetoda
## 许可证
MIT 许可证 - 详情请参阅 LICENSE 文件
标签:C2框架, Mythic, Web截图, 安全学习资源, 容器安全, 数据展示, 红队, 请求拦截, 逆向工具