N0t3v3nSu5p1c10u5/N0tC2
GitHub: N0t3v3nSu5p1c10u5/N0tC2
一个基于 C++ 的跨平台命令与控制框架,提供加密通信、Agent 管理和任务编排功能,面向红队与安全研究场景。
Stars: 0 | Forks: 0
# N0t C2
这是一个使用 C++ 编写的跨平台(Windows + Linux)命令与控制(C2)框架。它实现了 `project.md` 中描述的完整架构:通过 HTTP 进行加密的 Ranger 通信、基于 Agent 的 X25519 密钥交换、Argon2id 密码哈希、RBAC(基于角色的访问控制)、存活状态管理、通信配置文件,以及一个模块化且各子系统明确分离的 Teamserver。
## 组件
| 二进制文件 | 角色 |
|------------------|-------------------------------------------------------------|
| `n0t` | 操作员客户端 — 仅包含 CLI 和 IPC,无 C2 逻辑 |
| `n0t-teamserver` | Teamserver — 负责编排、状态管理及所有子系统 |
| `n0t-ranger` | Ranger(agent) — 独立的二进制文件,通过 Outpost 进行通信 |
## 构建
要求安装 CMake (≥3.16)、C++17 编译器、SQLite3 和 libsodium(均通过
`pkg-config` 解析)。
```
cmake -B build && cmake --build build
```
编译生成的二进制文件会输出到 `build/bin/` 目录。
### OpSec 构建选项
不影响核心功能的可选构建时配置:
```
cmake -B build -DN0T_OPSEC_OBFUSCATE=ON -DN0T_OPSEC_ANTIDEBUG=ON -DN0T_OPSEC_STRING_ENCRYPT=ON
```
这些配置会在 Ranger 目标上暴露编译定义。相关集成点是存在的,但具体实现刻意未被包含在范围内。
## 快速开始
```
# 1. 启动 Teamserver(前台运行;打印已预设的 admin 凭证)
build/bin/n0t teamserver --data-dir ./n0t-data
# 2. 在另一个终端:进行身份验证
build/bin/n0t login --user admin --pass admin
# 3. 创建 HTTP Outpost(listener)
build/bin/n0t outpost create --name http-1 --host 127.0.0.1 --port 9000
# 4. 针对该 Outpost 运行 Ranger(密钥交换 + 注册)
build/bin/n0t-ranger --host 127.0.0.1 --port 9000 --id ranger-001 --cycles 1
# 5. 下发针对该 Ranger 的任务
build/bin/n0t task create --name whoami-mod --targets ranger-001 --def modules/whoami.coff
# 6. 让 Ranger 轮询并执行任务(加密)
build/bin/n0t-ranger --host 127.0.0.1 --port 9000 --id ranger-001 --cycles 1
# 7. 查看结果
build/bin/n0t jobs --task 1
```
### Daemon 模式
```
build/bin/n0t teamserver --data-dir ./n0t-data --daemon
```
在 Linux 上,`--daemon` 会创建子进程并与控制终端分离。在
Windows 上,调用者应使用带 `DETACHED_PROCESS` 参数的 `CreateProcess`。
## CLI 参考
### Teamserver
```
n0t teamserver [--data-dir DIR] [--host H] [--port P] [--daemon]
```
### 身份验证
```
n0t login [--user U] [--pass P] [--host H] [--port P] authenticate and store session
n0t whoami show current identity and role
n0t logout end session
```
### Outpost(监听器)管理
```
n0t outpost create --name N --host H --port P [--profile PR] [--protocol http|tcp]
n0t outpost list
n0t outpost stop --name N
```
### Ranger(agent)交互
```
n0t rangers list registered agents
```
### 任务与作业管理
```
n0t task create --name N --targets r1,r2 [--def file.coff]
n0t task list
n0t jobs --task ID
```
### 用户管理(仅限 Admin)
```
n0t user create --user U --pass P [--role admin|operator]
n0t user list
```
### Ranger CLI
```
n0t-ranger --host H --port P [--id ID] [--cycles N] [--delay MS] [--jitter MS] [--protocol http|tcp]
```
- `--cycles 0` 表示无限循环运行;默认值为 3,用于测试
- `--delay` 和 `--jitter` 用于控制轮询时间(发送至 Teamserver 用于存活状态计算)
- 默认协议为 HTTP;使用 `--protocol tcp` 可回退至原始 TCP
## 会话存储
客户端将其会话 token 存储在 `~/.n0t/session` 中。安全存储(OS
钥匙串 / DPAPI)是已记录在案的未来增强功能。
## 测试
```
ctest --test-dir build --output-on-failure # all tests
bash scripts/e2e.sh # full end-to-end flow
```
测试套件:
| 测试 | 类型 | 覆盖范围 |
|-------------------------|-------------|-----------------------------------------------------|
| `message` | Unit | 通信格式往返转换,字段转义 |
| `path_safety` | Unit | LFI 防护 — 目录遍历、绝对路径、NUL 拒绝 |
| `crypto` | Unit | 密钥交换,AEAD,密码哈希,base64 |
| `http` | Unit | 基于 TCP 的 HTTP 请求/响应封装 |
| `auth` | Integration | 身份验证系统 + SQLite:登录、RBAC、用户管理 |
| `protocol_robustness` | Security | 格式错误的输入、长字符串、特殊字符、NUL |
| `e2e.sh` | End-to-end | 完整的 Client→Teamserver→Outpost→Ranger 流程 |
## 故障排除
- **`cannot reach teamserver`** — 确保已运行 `n0t teamserver` 并且
`--host/--port` 参数与您登录时使用的一致(存储在会话文件中)
- **`not logged in`** — 请先运行 `n0t login`
- **`permission denied`** — 该操作需要您不具备的角色权限(例如
用户管理仅限 Admin)
- **`register failed`** — 确保 Outpost 正在运行,并且 Ranger 的
`--host/--port` 参数与 Outpost 的绑定地址匹配
- **`connection lost`** — Ranger 将尝试重新连接,持续时间最长为 5
分钟(可通过 `--reconnect` 配置)。请检查 Outpost 的可用性
- **`failed to initialize crypto`** — 未安装 libsodium,或者
pkg-config 未找到 libsodium
## 开发者指南
有关完整的架构参考,请参阅 `CLAUDE.md`:模块边界、
协议规范、数据模型,以及用于集成
范围外引擎(COFF 加载 / 命令执行)的开发者指南。
### 核心原则
- **持久化是 SQLite 的唯一使用者** — 在该模块添加查询,保持记录的简单性
- **传输层保持简单** — 将行为逻辑放在 `ClientGateway`/`RangerGateway` 之后
- **跨子系统通知** 通过 `EventBus` 进行处理;在 `Teamserver` 外观中进行直接的函数调用处理请求/响应路由也是可以的
- **`common/protocol.hpp`** 是网络传输字符串定义的唯一来源
- **每个 agent 的密钥** 在每次 REGISTER 时生成并存储在数据库中;它们
可以通过随时重新注册来更新
标签:Bash脚本, C++, C2框架, HTTP工具, IP 地址批量处理, PE 加载器, 安全学习资源, 密码学, 手动系统调用, 数据擦除