0xROOTPLS/Jinx-C2
GitHub: 0xROOTPLS/Jinx-C2
Jinx 是一款用 Rust 编写的现代后渗透 C2 框架,提供高规避性 agent、多态基础设施和 Lua 脚本自动化能力,专为授权安全测试和红队演练设计。
Stars: 0 | Forks: 0
Jinx
一个用 Rust 从零开始构建的后渗透命令与控制框架。
## 什么是 Jinx? Jinx 是我个人长期以来独立开发的一款现代后渗透框架。其 agent、teamserver 和操作面板均为从零开始编写,没有分叉代码,没有对现有工具的包装(内部工具除外),也没有任何捷径。我打算将 Jinx 打造为我发布过的最完整的产品。 agent 使用 Rust 编写。teamserver 使用异步 Rust。操作面板是跨平台的 PyQt5。 我开发它的原因是我受够了所使用的几个框架都有各自的妥协。Jinx 就是我给出的答案。 ## Agent 功能 **Evasion 技术栈**: - 零导入表。其动态解析器本身也是零内存分配的。 - Indirect syscalls(包含 Halo's Gate 回退机制) - 每次 Win32 API 调用时的返回地址欺骗(Cuckoo) - 全面的字符串混淆(Obfstr)。 - Sleep 加密覆盖 .text、.rdata、.data 和堆区段,采用独特设计,在 sleep 期间零 agent 栈帧。(堆分配器在整个加密/sleep/解密窗口期间也会被冻结) - 受保护的 body 加密:sleep 加密密钥本身在 sleep 窗口期间会由单独轮换的密钥进行加密。 - Polymorphic:每次构建时随机化 config、区段名、入口点、HTTP 路径、headers 和 user-agent。 **自我防御**: Jinx 的防篡改系统不是“检查并分支”。agent 运行所需的 syscall gadget 是由 .text 哈希、一个 256 字节的 canary 和一个 4096 字节的分散 canary 页面进行异或(XOR)实时推导出来的。如果其中任何一个区域被修改,gadget 就会变成乱码,下一次 Nt* 调用就会导致 agent 崩溃。完整性检查本身就是执行路径。 - 内联(`#[inline(always)]`)在每个 syscall 调用点的 .text 完整性哈希。每次展开都会生成唯一的机器码。修补其中一个,其余的依然会触发 - 分布在 4 KiB 页面上的 16 个分散的堆 canary 区域,每个周期验证伪随机子集,并直接哈希到 syscall gadget 中 - 进程中每个线程上的硬件断点检测。Dr0-Dr3 必须全为零 - 三级失败响应:具体的篡改行为会触发向 teamserver 发送死亡信标(这会应用基于构建的策略:IP 封禁、子网封禁或构建烧毁),然后进行全面内存擦除并退出。模糊信号触发静默擦除,不产生任何网络工件。未处理的异常(AV、INT3、非法操作码)命中兜底过滤器以尽力擦除,无 WER 调度,无 minidump,无事件日志条目 - 在任何退出路径上进行全面的内存擦除:堆、.text、.rdata、PE header 以及擦除注册表中的每个区域。擦除存根最后进行自我销毁,因此擦除代码本身不会比擦除存活更久 **操作指令:** | 类别 | 指令 | |---|---| | 侦察(原生 API,无 cmd.exe) | `whoami` `hostname` `ipconfig` `netstat` `ps` `env` `pwd` `ls` `dir` `cd` `cat` `get_privs` `ping` `port_scan` `reg_read` `reg_enum` | | 文件操作 | `mkdir` `rm` `cp` `mv` `download` `upload` `timestomp` `reg_write` `reg_delete` | | 执行 | `shell` `shell_exec` `bof` `execute_assembly` `screenshot` `rev_shell` | | Tokens / 模拟 / 权限提升 | `steal_token` `make_token` `rev2self` `uac_elevate` | | 横向移动 | `lateral_psexec` `lateral_scshell` `lateral_failure_actions` `lateral_wmi` `lateral_wmi_event` `lateral_winrm` `lateral_dcom` | | 枢纽 / 网络 | `pivot_open` `rportfwd` `rportfwd_close` | | 服务控制 | `svc_enum` `svc_create` `svc_delete` `svc_start` `svc_stop` | | 生命周期 | `kill` `exit` | 所有七个横向向量均在进程内运行。这意味着没有 `PsExec.exe` 落地,没有 PowerShell 启动,也没有临时文件。每一个都以调用者的身份进行身份验证(如果持有模拟 token,则使用它;否则使用 agent 自身的主 token)。与 `steal_token` / `make_token` 配合使用可实现跨主体移动。 **OPSEC 控制:** - Kill date:在首次网络操作前检查的硬性纪元截止日期 - 执行保护:hostname、username 和 domain 白名单/黑名单 - 单实例 mutex 强制执行 - 由 MachineGUID + build ID 派生的永久 agent ID。(无重复 agent) - 分级指数退避 - 如果 HTTP 在操作中途失败,则回退至 TCP - Domain fronting,支持可配置的 CDN host header 覆盖 **构建输出:** EXE、DLL(反射式加载)、BIN(通过 [Fritter](https://github.com/0xROOTPLS/Fritter) 实现的 shellcode)、Windows Service exe(带后备机制)。 ## Teamserver **身份验证:** - 三因素操作员身份验证:mTLS 客户端证书(如果无效则静默丢弃)、API key(常数时间比较)和 TOTP - Session token 仅存于内存,8小时过期,在面板关闭或重启时擦除。重新验证会使该操作员之前的 token 失效 - 首次运行置备会自动生成 CA、证书、API key 和 TOTP 密钥。TOTP 仅显示一次 **基础设施防御:** Teamserver 的设计对任何不是已注册 agent 或已验证操作员的人都具有敌意。每一次验证失败都会导致立即且永久的 IP 封禁,并且返回的响应与掩护身份毫无二致。没有错误页面,没有状态码差异,也没有时序差异来表明请求是否“接近”有效。时序关联攻击也已得到防御。 - 每个响应上的掩护身份。可配置的 Web 服务器角色(默认 nginx/1.24.0)。不会随响应类型而改变。 - 跨任何接口的任何失败都会进行 IP 黑名单封禁。重启后依然保持。操作员 IP 受保护,免于封禁 - 子网封禁:支持 /24 封禁。当 agent 的自我防御检测到具体篡改(分析师断点、内存补丁)时,死亡信标会到达 teamserver 并触发基于构建的策略。该策略可以封禁源 IP、封禁整个 /24 子网、烧毁构建(注销其所有路由并封禁),或者烧毁并封禁子网。 - Anti-replay:带有时间戳验证的 session ID nonce 缓存,单一写锁。捕获的流量无法被重放 - Agent 防劫持:重新签入仅更新 last_seen、IP 和 PID。身份字段在首次注册后不可变 - 带有按 IP 滑动窗口的速率限制。超过限制即为封禁,而非限流 - 对结果、nonce 缓存和 IP 跟踪器设置资源上限,以防止状态耗尽 **Polymorphic 基础设施:** - 每个构建在 teamserver 上注册自己派生的路由。4 个签入 + 4 个信标 + 4 个结果路径模板,产生可变的 2-3 段名称,每个构建大约有 32,000 个 endpoint 组合。 - TLS 证书使用由共享密钥作为种子的数十亿组合的程序化语音名称生成器。构建继承此生成器来生成 API 路由名称和构建名称。如果你想要特定身份,可使用 `--cert-cn` 覆盖 - 任何地方都没有固定路径。注册构建路由之外的所有请求都会返回掩护页面 - 构建可以被标记、跟踪、烧毁(注销路由并终止该构建上的所有活动 agent)、清除或删除 **其他:** - Agent 构建器直接从面板编译并返回 polymorphic payload(EXE、DLL、BIN、Service) - 完整状态持久化:agent、listener、build 和黑名单在重启后依然存在 - 多操作员支持,每位操作员具有独立的 TOTP 身份验证 ## Hex(操作员脚本) 如果你用过 Cobalt Strike 的 Aggressor 脚本,Hex 就是我对同一理念的实现,专门为 Jinx 打造,并在设计上更加注重默认安全。 Hex 是嵌入在 teamserver 中的服务端 Lua 5.4 脚本层。每个 hex 都运行在各自独立的沙盒 VM 中,并带有基于能力门控的 API。共有十二种可用能力,全部默认拒绝: | 能力 | 作用 | |---|---| | `agents.read` | 获取每个活动 agent 及其身份字段的快照 | | `agents.tag` | 设置 agent 的标签字段(持久化) | | `agents.task` | 将 49 种任务类型中的任何一种排入目标队列 | | `agents.results` | 读取任务输出:`last_result(agent_id)` 和 `result(agent_id, task_id)` | | `events.subscribe` | 挂钩生命周期事件(session 连接、任务结果、构建烧毁、listener 启动/停止) | | `events.emit` | 推送自定义审计日志条目 | | `listeners.read` | 枚举活动 listener | | `cron` | 在特定时间按间隔或每日调度函数 | | `storage` | 按 hex 划分的键/值存储(1024 个键,总计约 1 MiB,JSON 支持,重启后依然存在) | | `bofs.read` | 列出 BOF 库(名称、SHA-256、大小) | | `bofs.run` | 在 agent 上运行库中的 BOF,带有完整的审计溯源 | | `network.http` | 受 SSRF 防护的 HTTPS POST(webhooks、chat ops、外部 IR 通知) | Hex 可以针对单个 agent、多选 agent 调用,或者根本没有 agent 目标(脚本在 `on_invoke(nil)` 中自行选择目标)。这使得群组操作和自动化响应工作流变得非常简单。 Lua 标准库被精简为 `table` / `string` / `math` / `utf8` — 没有 `os.*`,没有 `io.*`,没有 `load`/`loadstring`/`require`。 纯计算辅助函数(`util.base64_*`、`util.json_encode`、`time.now_unix`、`time.now_iso`、`time.format_iso`、`time.since`)无论能力授权如何,都会绑定到每个 hex 上,这样脚本就可以在没有任何 I/O 能力的情况下构建 webhook 主体和带有时间戳的审计条目。 脚本在被操作员明确启用之前是静止的。资源限制被硬编码(每个 VM 4 MiB 内存,每次调用 1 秒墙钟时间,由 debug-hook 截止时间强制执行,每个 hex 的订阅者和 cron 任务数量有上限)。所有内容均为仅追加的审计日志,并固定源 SHA-256。(*BOF 执行获得两层溯源:哪个 hex 运行了哪个二进制文件。*) 该仓库在 `/hexes/` 下附带了 **14 个示例 hex**,涵盖了计划摘要、带定期清理的结构化键存储、生命周期事件应急响应、休眠的按 agent 调用、BOF 执行模式以及 chat-ops webhook 投递。 ## Spellbook(BOF 库) Spellbook 是 Teamserver 上 `由一位厌倦了将 OPSEC 视为次要问题的开发者,倾注心血(<3)打造。
标签:C2框架, IP 地址批量处理, Rust, 可视化界面, 安全学习资源, 底层编程, 网络信息收集, 网络流量审计, 逆向工具