This commit is contained in:
hashbro
2026-08-04 05:00:42 +08:00
commit ea0be57180
304 changed files with 18921 additions and 0 deletions
+444
View File
@@ -0,0 +1,444 @@
# Coruna Reporting C2 API
Lab 实现见 `routes/c2.php`。字段形状主要来自:
- [`coruna-online/docs/CORUNA_COMPLETE_DATAFLOW_REPORT.md`](../../../coruna-online/docs/CORUNA_COMPLETE_DATAFLOW_REPORT.md) §7
- HAR 解密红acted 样本
[`c2_decrypted_redacted.json`](../../../coruna-online/evidence/cases/2026-08-02-coruna-har/c2_decrypted_redacted.json)
敏感值在证据里已打码;下文用「含义 + 类型」描述,不复述真实秘密。
---
## 1. 传输约定
### 1.1 JSON POST(除 `/api/user/check`、除 `GET /api/user/query`)
| 项 | 说明 |
|----|------|
| Header `timestamp` | 13 位毫秒时间戳 |
| Body | Base64(AES-256-ECB-PKCS7(key, `timestamp \|\| JSON`)) |
| key | `SHA256(session_key \|\| timestamp)`(session_key 为 16 ASCII) |
响应同样用自生成 `timestamp` 头 + 加密 body。常见明文为:
```json
null
```
或:
```json
{"code":0,"msg":"ok","data":null}
```
**Lab 默认回包**:加密 `{"code":0,"msg":"ok","data":null}`(与客户端不死循环的成功 ack 对齐)。真实战役响应字段可能更丰富,但客户端通常只认成功/可解密。
### 1.2 GET `/api/user/query`
- 无加密 body
- 响应明文:`OK`(`text/plain`)
### 1.3 POST `/api/user/check`
- `multipart/form-data`
- `file`:Coruna 头混淆的加密 7z;口令 `session_key || batchBase`(首批常见 `"0"`)
- `sig`:不透明二进制,**Lab 不校验**
### 1.4 通用身份字段(多接口复用)
| 字段 | 观察含义 |
|------|----------|
| `c` | 32 hex,会话/渠道类 ID |
| `d` / `f` | 16 hex,设备相关指纹(二者常相同) |
| `id` / `lhu` | UUID 形字符串(事件/本地句柄) |
| `pn` / `m` / `et` | 产品名 / 机型 / 事件类型文本 |
| `pv` | 系统版本(如 `15.8.4`) |
| `s` / `u` / `sbu` | 其它会话/用户侧短字段 |
| `v` | 插件或模块版本串 |
设备主键启发式:`id` → `d` → `f` → `c`(见 `IngestService::extractDeviceKey`)。
---
## 2. 接口一览
| 方法 | 路径 | 用途(战役观察) | Lab 行为 |
|------|------|------------------|----------|
| GET | `/api/user/query` | DGA/连通性探测,选 reporting C2 | 明文 `OK` |
| POST | `/api/user/avatar/set` | 首次设备 profile | 写 devices(+apps 若有) |
| POST | `/api/user/get` | 拉/登记状态;带已装 App 列表 | 登记设备;ack |
| POST | `/api/user/avatar/put` | 下载/注入/模块健康等遥测 | 登记设备;ack;落文件日志 |
| POST | `/api/user/avatar/status` | 钱包 keystore / identity JSON | 地址/密钥启发式入库 |
| POST | `/api/user/status` | 地址 → 资产/余额 | `wallet_addresses` |
| POST | `/api/user/set` | 明文助记词或私钥 | 加密入库 + 打码展示 |
| POST | `/api/user/check` | 相册命中图 7z 归档 | 修头解包 → photos |
| POST | `/api/user/avatar/pic` | Notes 批次(HAR 未见样本) | notes / raw log |
| POST | `/api/user/profile/{add,delete,remove}` | imagent 侧 profile 变更 | 仅日志 + ack |
| POST | `/link/config/list` | WebClip/链接配置轮询 | ack `data: []` |
| POST | `/link/config/icon` | WebClip 图标 | ack `data: null` |
**不做**:`/kill`、助记词/私钥自动划转。
---
## 3. 分接口说明
### 3.1 `GET /api/user/query`
**用途**:reporting 是否存活;DGA 用成功响应选定当前 C2。
**请求**:无 body;可无特殊头。
**响应(Lab / 战役一致观察)**:
```text
OK
```
---
### 3.2 `POST /api/user/avatar/set`
**用途**:植入后上报设备画像(机型、系统、区域、运营商、宿主 App 等)。
**请求明文(红acted 形状)**:
```jsonc
{
"c": "<32hex>",
"d": "<16hex>",
"f": "<16hex>",
"application": {
"applicationIdentifier": "<bundle>",
"bundleIdentifier": "<bundle>"
},
"deviceInfo": {
"productName": "iPhone OS",
"productType": "iPhone9,1",
"productVersion": "15.8.4",
"hardwareModel": "...",
"buildVersion": "..."
},
"deviceModel": "iPhone9,1",
"deviceName": "<name>",
"systemVersion": "15.8.4",
"machine": "...",
"kernVersion": "...",
"bootHash": "...",
"boottime": 0,
"carrierNames": [],
"language": "...",
"regionCode": "...",
"timezone": "...",
"totalGB": 0,
"jbsdk_version": "...",
"lhu": "<uuid>",
"s": "...",
"sbu": "...",
"u": "..."
}
```
**响应**:加密 ack(见 §1.1)。
---
### 3.3 `POST /api/user/get`
**用途**:初始状态/注册拉取;HAR 中携带已装应用简表 `al`。
**请求明文要点**:
```jsonc
{
"c": "<32hex>",
"d": "<16hex>",
"f": "<16hex>",
"al": [
{ "a": "<app name>", "b": "<bundle id>", "v": "<version>" }
],
"b": "...",
"i": "...",
"lhu": "<uuid>",
"m": "...",
"p": "...",
"s": "...",
"sbu": "...",
"u": "...",
"v": "..."
}
```
| 字段 | 含义 |
|------|------|
| `al[].a` | App 显示名 |
| `al[].b` | bundle id |
| `al[].v` | App 版本 |
**响应**:加密 `{"code":0,"msg":"ok","data":null}`(Lab)。战役侧可能带配置 `data`;未完全还原时以可解密成功 ack 为准。
---
### 3.4 `POST /api/user/avatar/put`
**用途**:通用遥测/事件总线。同路径多种 `ctx`:
| ctx 形态 | 含义 |
|----------|------|
| `url, sha256, size, downloadTimeMs, isFirstLoad` | 模块/资源下载 |
| `totalModules, abnormalModules, overallStatus, checkTimeMs` | 模块健康检查 |
| `bundleId, targetPid, injectionTimeMs` | 进程注入结果 |
| 空 `ctx` | 其它短事件(配合 `desc` / `et` / `ex`) |
**公共字段示例**:
```jsonc
{
"c": "<32hex>",
"d": "<16hex>",
"f": "<16hex>",
"id": "<uuid>",
"lhu": "<uuid>",
"pn": "iPhone OS",
"m": "iPhone9,1",
"pv": "15.8.4",
"desc": "<event description>",
"et": "<event type text>",
"ex": 0,
"exp": "",
"ctx": { /* 见上表 */ },
"s": "...",
"..."
}
```
WhatsApp 等插件也会复用此路径上报消息相关事件(静态/流量均有指认)。
**响应**:加密 ack。
---
### 3.5 `POST /api/user/avatar/status`
**用途**:上传仍加密的钱包/keystore/identity JSON(如 imToken `walletsV2` 解密前结构)。
**请求明文要点**:
```jsonc
{
"a": "<短标签>",
"c": "<32hex>",
"d": "<16hex>",
"d1": "<40hex>",
"d2": "<短串>",
"d3": "<40hex>",
"v": "<module version>",
"result": {
"crypto": {
"cipher": "aes-128-ctr",
"cipherparams": { "iv": "<hex>" },
"ciphertext": "<hex>",
"kdf": "pbkdf2",
"kdfparams": { "c": 0, "dklen": 0, "prf": "...", "salt": "<hex>" },
"mac": "<hex>"
},
"identity": { /* encAuthKey, encKey, ... */ },
"encOriginal": "...",
"imTokenMeta": { /* ... */ }
}
}
```
**响应**:加密 ack。
Lab:尝试从 `result`/地址类字段入库;完整 keystore 保留在日志/原始 JSON。
---
### 3.6 `POST /api/user/status`
**用途**:地址 → 链上资产/余额映射。
**请求明文要点**:
```jsonc
{
"a": "<短标签>",
"c": "<32hex>",
"d": "<16hex>",
"d1": "<40hex>",
"d2": "...",
"d3": "<40hex>",
"v": "...",
"ba": {
"<walletAddress>": [
{
"balance": "<string>",
"chainId": "<string>",
"chainType": "<string>",
"decimal": "<string>",
"name": "<token name>",
"symbol": "<symbol>"
}
]
}
}
```
`ba` 的 key 为地址;value 为该地址下资产数组。
**响应**:加密 ack。Lab 写入 `wallet_addresses`(并可能 Telegram 通知新地址/余额变化)。
---
### 3.7 `POST /api/user/set`
**用途**:上报**明文**助记词或私钥(HAR 已证实 12 词助记词在 `result`)。
**请求明文要点**:
```jsonc
{
"a": "<短标签>",
"c": "<32hex>",
"d": "<16hex>",
"d1": "<40hex>",
"d2": "...",
"d3": "<40hex>",
"v": "...",
"result": "<12/15/18/21/24 words mnemonic OR private key string>"
}
```
**响应**:加密 ack。Lab:`wallets.mnemonic_enc` / `privkey_enc`(Laravel crypt),后台仅打码展示。
---
### 3.8 `POST /api/user/check`
**用途**:相册 OCR/敏感命中后的图片归档上传(非 AES JSON)。
**Content-Type**:`multipart/form-data`
| Part | 观察 |
|------|------|
| `file` | Coruna 头混淆 7z;解压后为 JPEG 等 |
| `sig` | ~352–472 字节不透明数据,用途未证实 |
| `idx` | 解码后含 `process_index`, `upload_count` |
| `ftu` | 解码后含 `sensitive_text_count`, `barcode_count` |
| `x-hit` | 检测分数类短字段 |
| `rid` | ~36 字符请求/资源 id |
| `c`,`d`,`f`,`s`,`u`,`b`,`m`,`ts` | 设备/会话侧短字段(与 JSON 接口同族) |
7z 口令:`session_key || batchBase`;首批 `LastProcessedTimestamp` 为 `0` 时 batchBase=`"0"`。
**响应**:加密 ack(Lab)。战役侧亦为加密成功体,具体 JSON 未作为契约固定。
---
### 3.9 `POST /api/user/avatar/pic`
**用途**:静态绑定 Notes reader 批次上报。
**HAR**:未见真实 Notes 正文/DB 样本。
**请求**:预期为加密 JSON(字段未从流量钉死);可能含笔记列表或元数据。
**响应**:加密 ack。Lab:有结构则写 `notes`,否则只写 `public/log/c2/`。
---
### 3.10 `POST /api/user/profile/add|delete|remove`
**用途**:`imagent` 消息/profile 状态变更(静态接口表)。HAR 本批无样本。
**请求**:加密 JSON(形状未钉死)。
**响应**:加密 ack;Lab 仅日志。
---
### 3.11 `POST /link/config/list`
**用途**:WebClip / 链接配置轮询。
**请求明文(HAR)**:
```jsonc
{
"c": "<32hex>",
"channel": "<32hex>",
"d": "",
"f": "",
"s": "",
"u": ""
}
```
**响应**:
- Lab:加密 `{"code":0,"msg":"ok","data":[]}`
- 战役:可能返回链接列表;未完整还原时客户端以可解密为准
---
### 3.12 `POST /link/config/icon`
**用途**:拉取 WebClip 图标。
**HAR**:本批无独立解密样本。
**请求**:加密 JSON(预期含图标/链接标识)。
**响应(Lab)**:加密 `{"code":0,"msg":"ok","data":null}`。
---
## 4. Lab 响应统一格式
除 `query` 外,控制器经 `CorunaCrypto::encryptJson` 返回:
**HTTP**
- Status:`200`
- Header:`timestamp: <13-digit>`
- Body:Base64 AES 密文
**明文(Lab)**
```json
{
"code": 0,
"msg": "ok",
"data": null
}
```
`/link/config/list` 的 `data` 为 `[]`。
原始请求/响应落盘:`public/log/c2/Ymd.log`(`create_log`,不写 DB)。
- `dir: "in"`:请求明文(解密后 `payload`)
- `dir: "out"`:响应明文(有 `timestamp` 头则 AES 解密;`query` 等明文直接记)
---
## 5. 调用顺序(HAR 观察)
典型顺序(同一 reporting 域名):
```text
query → avatar/put(telemetry) → query → avatar/set → get
→ avatar/put* → check* → … → avatar/status → status → set
→ link/config/list …
```
相册命中(`check`)可早于或并行于钱包本地解密上报(`avatar/status` → `status` → `set`)。
---
## 6. 参考
| 文档/证据 | 内容 |
|-----------|------|
| `CORUNA_COMPLETE_DATAFLOW_REPORT.md` §7.2 | 接口职责总表 |
| `CORUNA_DOMAIN_DGA_REPORT.md` | `query` 与 DGA 选服 |
| `c2_decrypted_redacted.json` | 各路径请求字段形状 |
| `app/Services/CorunaCrypto.php` | 加解密实现 |
| `app/Http/Controllers/C2/C2Controller.php` | Lab 处理与回包 |