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 处理与回包 |
+112
View File
@@ -0,0 +1,112 @@
# 一级包与二级包
## 路径
**线上:同一相对目录。** Stage JS、一级包、二级包都从 campaign base 用文件名下载:
```text
{base}/70049138….js # Stage
{base}/6539c1e0….js # 一级包(wire 后缀 .js)
{base}/65704c07….min.js # 二级 type-0x01 包(wire 后缀 .min.js)
```
`base` = `/web/34f5121f572d6742703eb84ec2f866a6/`(lab 已摊平到同路径)。
### Wire 后缀(实测)
| 类型 | 客户端实际请求 | 说明 |
|------|----------------|------|
| Stage JS | `<40hex>.js` | 无 `.min.js` |
| **一级原生包** | **`<40hex>.js`** | 按机型/版本选 flags;**不是** `.min.js` |
| **二级 type-0x01** | **`<40hex>.min.js`** | type 0x07 元数据里的文件名带 `.min.js` |
Campaign / lab 目录里同一 stem 常同时存在 `.js` 与 `.min.js`,且**内容不同**(`.js` 通常更大)。链路只拉上表对应后缀;另一份是同 stem 的另一产物,不要当成重复别名删掉。
**`coruna-online` 落盘为分析拆目录,不是三条不同 URL:**
| 类型 | 线上相对路径(wire) | `coruna-online` 落盘 |
|------|----------------------|----------------------|
| Stage JS / 入口 | `{base}/<name>` | 仓库根目录(见 [`STAGE_JS.md`](./STAGE_JS.md)) |
| 一级原生包 | `{base}/<40hex>.js` | 历史多落在 `payloads/<40hex>.min.js`;**以线上 `.js` 为准**同步到 lab |
| 二级 type-0x01 | `{base}/<40hex>.min.js` | `c2_fetch/<40hex>.min.js`(部分副本带 `xxxxxxxx_` 前缀,lab 已归一) |
## 联系
```text
Stage3
→ 下载「一级包」.js(按机型/版本选 flags)
→ 解密 → F00DBEEF:0x08 / 0x09 / 0x0f / (0x0a) + **type 0x07 元数据**
→ type 0x07 给出二级文件名 + ChaCha key
→ 再下载「二级包」.min.js
→ 解密 → F00DBEEF type **0x01**(SpringBoard 管理器,含 Deployment DGA)
→ DGA → /sync/daily.html → sync/ 下 26 个模块
```
| 层级 | 线上看起来 | 解开后 | 作用 |
|------|------------|--------|------|
| **一级包** | ChaCha 加密 **`.js`** | F00DBEEF:利用/implant(0x08 powerd、0x09、0x0f 等)+ **0x07 指针** | 提权与落地;**0x07 点名二级包** |
| **二级包** | 另一 key 的 **`.min.js`**(key 在 0x07) | F00DBEEF:**仅 type 0x01** dylib | DGA、拉 `daily.html`、下模块、注入 |
一级 ≠ type-0x01;靠一级内的 **0x07** 才接到二级。一级失败则不会拉对应二级包。
---
## 一级包一览(`payloads/` → lab `web/…/`)
清单文件名按 **wire(`.js`)** 书写。lab 中同 stem 的 `.min.js` 为另一份线上产物,体积更小,链路默认不请求。
| lab / 线上文件名(wire) | flags | 内含类型 | `coruna-online` 来源(历史落盘名) |
|---|---|---|---|
| `054bcb73ce2a3023b3813f5be12d0b6ffd6e7611.js` | `0xf230` | 0x08, 0x09, 0x0f, 0x07, 0x07 | `payloads/054bcb73….min.js` |
| `e406714e92671b5218496fcb6666734411cb2320.js` | `0xf330` | 0x08, 0x09, 0x0f, 0x07, 0x07 | `payloads/e406714e….min.js` |
| `694c829e379e12085de6158b85f32509f54f4796.js` | `0xf240` | 0x08, 0x09, 0x0f, 0x07, 0x07 | `payloads/694c829e….min.js` |
| `3b0133801a3f844e7ebafa0363f2423a50005b72.js` | `0xf340` | 0x08, 0x09, 0x0f, 0x07, 0x07 | `payloads/3b013380….min.js` |
| `6f8a7a3bc74d9c65f5463a6a29d4e2c52feefcca.js` | `0xf270` | 0x08, 0x09, 0x0f, 0x07, 0x07 | `payloads/6f8a7a3b….min.js` |
| `eb3e81b54e8763bfe505e7a18be8f5fd828a76f6.js` | `0xf370` | 0x08, 0x09, 0x0f, 0x07, 0x05, 0x09, 0x07 | `payloads/eb3e81b5….min.js` |
| `6bbb364c8a423374d42a2cbc45c0dee84e7dc710.js` | `0xf280` | 0x08, 0x09, 0x0f, 0x07, 0x07 | `payloads/6bbb364c….min.js` |
| `99010a27e08b3312650c8d9f321958433e577a30.js` | `0xf380` | 0x08, 0x09, 0x0f, 0x07, 0x07 | `payloads/99010a27….min.js` |
| `6539c1e0dc731ea7c7011af236cc7c2871af7c40.js` | `0xf290` | 0x08, 0x09, 0x0f, 0x07, 0x07 | `payloads/6539c1e0….min.js` |
| `c9118a62558ed444a64c2dfe350c6c57fa277a3a.js` | `0xf390` | 0x08, 0x09, 0x0f, 0x07, 0x05, 0x09, 0x07 | `payloads/c9118a62….min.js` |
| `076de672aebfc78137aa863e51ff3d8980dcdd10.js` | `0xf373` | 0x08, 0x09, 0x0f, 0x07, 0x0a, 0x07 | `payloads/076de672….min.js` |
| `62415a3d105a8c40c41b19cf456e8474fe441359.js` | `0xf383` | 0x08, 0x09, 0x0f, 0x07, 0x0a, 0x07 | `payloads/62415a3d….min.js` |
| `a5847c3e2e439e2f7c4b1582932cf81a06100981.js` | `0xf275` | 0x08, 0x09, 0x0f, 0x07, 0x0a, 0x07 | `payloads/a5847c3e….min.js` |
| `f7994d47ee03dfb33e0fc7df94c8a215ff8fe66a.js` | `0xf375` | 0x08, 0x09, 0x0f, 0x07, 0x0a, 0x07 | `payloads/f7994d47….min.js` |
| `a13a74c0123f5a0c4acaf0586f035f8735bac0c8.js` | `0xa205` | 0x08, 0x0a | `payloads/a13a74c0….min.js` |
| `f10b572f33adf343a7398487c3f4cc71088b56ab.js` | `0xa305` | 0x08, 0x0a | `payloads/f10b572f….min.js` |
| `906a996fa11bcaa5347c6453e328f538d17d5dbf.js` | `0xa306` | 0x08, 0x0a | `payloads/906a996f….min.js` |
| `4614dd1cf7c0b41d0443e1a1a306706fb94a2bb6.js` | `0xa303` | 0x08, 0x0a, 0x0a | `payloads/4614dd1c….min.js` |
| `d1a39a282f3dc9d0e261c3df466093ee0f8d441d.js` | `0xa304` | 0x08, 0x0a, 0x0a | `payloads/d1a39a28….min.js` |
解出的中间 dylib:`coruna-online/payloads/*_type0xNN.dylib`(lab 未复制)。
---
## 二级包一览(`c2_fetch/` → lab `web/…/`)
均为 type **0x01** SpringBoard helper(含 DGA)。Wire 文件名为 **`.min.js`**。
**为何 10 个二级包、实质只有 2 份 dylib:**
| dylib SHA-256(前 16) | 体积 | stem 数 | 成员 |
|---|---:|---:|---|
| `8bef11cb6cdf18f9…` | 347472 | 5 | `039c68f0` / `34736715` / `65704c07` / `6bac8b93` / `743312ca` |
| `124f9b07b58c90c3…` | 362056 | 5 | `1d0df5a0` / `242a0afb` / `630c2b42` / `7cb20652` / `7f208248` |
差异在**投递包装**,不是两套 DGA:各一级包的 type **0x07** 点名不同 `<stem>.min.js` 并带不同 ChaCha key;两条构建内 Deployment/Reporting **seed 相同**。改 seed:改 2 个唯一 dylib → 用各自 type07 key 重加密要用到的二级 `.min.js`(要覆盖全部一级变体则 10 个都重打)。
| lab / 线上文件名 | `coruna-online` 来源 | 说明 |
|---|---|---|
| `039c68f0ca742a85e94516818385a9eca2e204d8.min.js` | `c2_fetch/039c68f0….min.js` | 二级 type-0x01 |
| `1d0df5a0a12a20aa8b0c8aeb660742268f311d19.min.js` | `c2_fetch/1d0df5a0….min.js` | 二级 type-0x01 |
| `242a0afb1d88b83e9a1a5b570fed6778def892fc.min.js` | `c2_fetch/242a0afb….min.js` | 二级 type-0x01 |
| `347367155da44f3efcc9053337913061079610b9.min.js` | `c2_fetch/34736715….min.js` | 二级 type-0x01 |
| `630c2b42300333d91588353d43afab9ec8325e09.min.js` | `c2_fetch/630c2b42….min.js` | 二级 type-0x01 |
| `65704c0722165a7bdedad3f3f61258b2f95470f6.min.js` | `c2_fetch/65704c07….min.js` | HAR 中出现过的二级包之一 |
| `6bac8b93b6f97ddd8a1f86fecfa6431b9ffeb9fb.min.js` | `c2_fetch/6bac8b93….min.js` | 二级 type-0x01 |
| `743312cafb58176af57b89098d94dca1c60f8d1e.min.js` | `c2_fetch/743312ca….min.js` | 二级 type-0x01 |
| `7cb20652ef7156e931f894dd3d99f24601b80368.min.js` | `c2_fetch/7cb20652….min.js` | 二级 type-0x01 |
| `7f208248c748f97956fe4a7cf246c91235852e67.min.js` | `c2_fetch/7f208248….min.js` | 二级 type-0x01 |
解出的 dylib:`coruna-online/c2_fetch/<stem>_type0x01.dylib`(lab 未复制)。
业务模块见 [`SYNC.md`](./SYNC.md)。
+8
View File
@@ -0,0 +1,8 @@
# coruna-lab 文档
| 文件 | 内容 |
|------|------|
| [`STAGE_JS.md`](STAGE_JS.md) | 入口 HTML、Stage1/2/3、beacon;对标 `coruna/` 可读名 |
| [`NATIVE_PACKS.md`](NATIVE_PACKS.md) | 一级包 / 二级 type-0x01:路径、联系、清单 |
| [`SYNC.md`](SYNC.md) | `/sync/daily.html` 与 26 个业务模块职责 |
| [`../tools/README.md`](../tools/README.md) | seed 替换、重建二级包/core、DGA 域名计算 |
+45
View File
@@ -0,0 +1,45 @@
# Stage JS 与入口
线上与 lab 均位于 campaign base:
```text
web/34f5121f572d6742703eb84ec2f866a6/
```
`coruna-online` 中哈希文件名在仓库根目录;下表「对标 `coruna/`」为同系列可读文件名(逻辑对应,**字节未必一致**:本批 dhxuhdbej888 与 `coruna/` 工具包是同源链的不同落盘/混淆版本)。
## 阶段职责
| 阶段 | 作用 |
|------|------|
| 入口 | `support.html` 选分支、设 module base、拉 Stage |
| Stage1 | WebKit/WASM 内存破坏与读写原语 |
| Stage2 | PAC / JIT cage |
| Stage3 | 原生 loader,再拉一级 `.js` 包(二级为 `.min.js`,见 [`NATIVE_PACKS.md`](./NATIVE_PACKS.md)) |
| helper | offsets wrapper、加密 manifest / beacon |
命名:`sha256(salt + id)[:40].js`,salt = `9eb2b99484c8f631`。
## 文件对照
| lab 文件 (`web/34f5121f…/`) | 阶段 | 对标 `coruna/` |
|---|---|---|
| `support.html` | 入口 HTML | `index.html` / `group.html`(入口角色对应;非同字节) |
| `98f0c8fb182309faa687aa849e92d0ac5f93af7d.js` | Stage1 | `Stage1_15.2_15.5_jacurutu.js` |
| `700491384cc59bd25c3aa4dd670c8660963bffe3.js` | Stage1 | `Stage1_15.6_16.1.2_bluebird.js` |
| `3c04ae31f9ba8f809b275be4b3fa93deb558902c.js` | Stage1 | `Stage1_16.2_16.5.1_terrorbird.js` |
| `1c5bd923f56ca7fcf2cfa695bc0d54b6a2c849bf.js` | Stage1 | `Stage1_16.6_17.2.1_cassowary.js` |
| `40a27e7916aa554e6d38d39beb6bb7ee095692ed.js` | Stage1 fallback | `other/Stage1_13.0_15.1.1_buffout.js` |
| `9075c25766e57019db4c86fac179b03ebf1b56e5.js` | Stage2 | `Stage2_13.0_14.x_breezy.js` |
| `b099ff22b5c8e65654744fd307d81ad208009103.js` | Stage2 | `Stage2_15.0_16.2_breezy15.js` |
| `651774047bf8d72258a5f04785c9dabf5e793670.js` | Stage2 pre/PAC | `Stage2_16.6_17.2.1_seedbell_pre.js` |
| `291b914c574e1196039313595217367c44cca436.js` | Stage2 | `Stage2_16.6_16.7.12_seedbell.js` |
| `0f2be2a4e0ab7e60b6ce550692996d079a5769a0.js` | Stage2 | `Stage2_17.0_17.2.1_seedbell.js`(特征偏 seedbell;对应置信低于上列) |
| `0c297489d8c9d5470bfce17b0d99da3338b44a18.js` | Stage3 VariantA | `Stage3_VariantA.js` |
| `9fd93b94a0a7c7ec2afcd1fa2e3f8dd10f64371f.js` | Stage3 VariantB | `Stage3_VariantB.js` |
| `ad970e88980634bcb2eda0c998a27881686dd29e.js` | offsets / qbrdr wrapper | (`coruna/` 无同名 Stage 文件) |
| `ad970e88980634bcb2eda0c998a27881686dd29e.min.js` | 加密 manifest / exploit beacon | (`coruna/` 无同名 Stage 文件) |
本批 dump 中未见与 `Stage2_16.3_16.5.1_seedbell.js` 明确对上的哈希文件。
下一步见 [`NATIVE_PACKS.md`](NATIVE_PACKS.md)(一级 / 二级包)。
+59
View File
@@ -0,0 +1,59 @@
# sync/ — Deployment 配置与业务模块
对应 lab 目录:`coruna-lab/sync/`(线上 Deployment host 的 `/sync/*`,HAR 中为 `www.zm7f7s0m9jf8wtrbd.info`)。
内容来自 `coruna-online` 抓包/离线恢复;职责摘自
[`CORUNA_COMPLETE_DATAFLOW_REPORT.md`](../../coruna-online/docs/CORUNA_COMPLETE_DATAFLOW_REPORT.md)
与 [`PAYLOAD_INVENTORY.md`](../../coruna-online/evidence/cases/2026-08-02-coruna-all-26/PAYLOAD_INVENTORY.md)。
扩展名 `.js/.css/.html/.ts` 只是 HTTP 伪装;`daily.html` 与各模块响应均为 **Coruna 混淆头 + 密码 7z**,解包后为 Mach-O dylib(或配置 JSON)。
拉取顺序:type-0x01 经 Deployment DGA 选中主机 → `GET /sync/daily.html` → 按配置再拉下列模块(本机按需,不一定 26 个全下)。
---
## 配置
| 文件 | 作用 | `coruna-online` 来源 |
|---|---|---|
| `daily.html` | 加密 netconfig:给出 26 项 URL(含 `[HOST_PLACEHOLDER]`)、size、sha256;客户端用当前 Deployment host rebase | `evidence/cases/2026-08-02-coruna-har/responses/har-36_6b5f8ad2….body` |
明文配置副本(未放本目录):
`coruna-online/evidence/cases/2026-08-02-coruna-all-26/configs/bae5299f….json`
---
## 26 个模块
| # | `/sync/` 文件 | 解包名 | 目标 | 作用 |
|---:|---|---|---|---|
| 1 | `erupt_flee.js` | `tmp.dylib` | **core** | 配置/DGA、下载校验、模块存储、选择性注入、热更新、心跳;扫描 Photos 与 Apple Notes |
| 2 | `swap-ritual.ts` | `webclip.dylib` | SpringBoard | `/link/config/list`、`/link/config/icon`,创建/更新 WebClip 与图标 |
| 3 | `short_thing.js` | `whatsapp_notnotify.dylib` | SpringBoard | WhatsApp 登录/账户类通知抑制辅助 |
| 4 | `aware_retreat.css` | `MarqueeLabel.dylib` | BitKeep `com.bitkeep.os` | 读 bitkeep.db / Flutter auth;提取助记词、私钥、地址与资产 |
| 5 | `wash_indicate.js` | `ReachabilitySwift.dylib` | Bitpie | 观察 BIP39 生成;读 `bcoins.sqlite`;上报助记词/地址/余额 |
| 6 | `entry-praise.htm` | `BranchDeepLinker.dylib` | Coin98 | 读 RN/MMKV `walletCacheRedux`;解析 chain/address/mnemonic/privateKey/balance |
| 7 | `card_alcohol.htm` | `IQKeyboardRetainer.dylib` | Coinbase Wallet | Hook 存助记词;读 SQLite `main.wallet` |
| 8 | `curious-tuna.ts` | `LottieAnimation.dylib` | Exodus | 读 RN AsyncStorage / bridge;解析 wallet/mnemonic/资产 |
| 9 | `valve-okay.htm` | `MasonryConstraint.dylib` | imToken | Hook 密码输入;解密 `walletsV2`;上报钱包/助记词(HAR 已证实) |
| 10 | `squirrel-chuckle.css` | `AmplitudeSession.dylib` | Krystal | 读 wallets / Keychain;资产 JSON |
| 11 | `range_hockey.ts` | `CocoaLumberjack.dylib` | MetaMask | Hook 密码;读 persistStore;AES 解 `data.mnemonic` |
| 12 | `exact_unveil.html` | `SAMKeychainStore.dylib` | MyTonWallet | WKWebView 截获 passcode;解 `mnemonicEncrypted` |
| 13 | `cradle-barely.html` | `RealmDatabase.dylib` | Phantom | 读 MMKV;观察 `mnemonicFromEntropy:`;账户/余额 |
| 14 | `enough_lend.ts` | `MixpanelAnalytics.dylib` | Ronin | 观察 wallet/portfolio;上报地址/余额 |
| 15 | `page_human.css` | `AdjustEventTracker.dylib` | Solflare | 读 Flutter vault;passcode / seedPhrase / accounts |
| 16 | `mouse_announce.js` | `ChameleonFramework.dylib` | Global Wallet | Hook JSON;捕获 mnemonic/privateKey 等(HAR 已证实私钥) |
| 17 | `canal_sugar.htm` | `SwiftyJSONParser.dylib` | Tonhub | 解密 secret/mnemonic;取地址/余额 |
| 18 | `left-case.css` | `PINRemoteImage.dylib` | Tonkeeper | 读 `mnemonics_vault_` 等;解助记词 |
| 19 | `diagram-ship.css` | `YYImageDecoder.dylib` | TronLink | Hook 密码;读 keystore/SQLite;解地址/余额 |
| 20 | `shrimp-artefact.htm` | `AppsFlyerConversion.dylib` | Trust Wallet | Realm/keystore;提取助记词与资产 |
| 21 | `fresh_sausage.js` | `TPKeyboardAvoiding.dylib` | Uniswap | 读 mnemonic keychain / portfolio |
| 22 | `win_wife.css` | `MBProgressOverlay.dylib` | OKX | Hook backup seed VM;读 wallet SQL(配置中常 `active:false`) |
| 23 | `future-destroy.htm` | `libCoreSymbolicationHelper.dylib` | SpringBoard | 注入代理 / Helion IPC;与 core 协作 |
| 24 | `chunk_hen.ts` | `libAggregateDictionaryClient.dylib` | WhatsApp | 截获消息/媒体元数据并上报 |
| 25 | `candy_ketchup.html` | `WeChat.dylib` | 微信 | 本地 OCR/QR/敏感词/BIP39;命中后经 C2 上传 |
| 26 | `horror-monster.ts` | `libDataAccessServices.dylib` | `imagent` | Hook SMS/iMessage;profile 与事件上报 |
原始 wire 文件来源目录:
`coruna-online/evidence/cases/2026-08-02-coruna-all-26/downloads/raw/`
解包 dylib:
`…/downloads/extracted/<sha256>/`