← Discover MCPs and Agents
g
MCPAI & MLGitHub

github-C2

网页控制台 + Rust Agent。Cloudflare Worker 主通道,GitHub Issue 备用。MCP接入AI,全自动渗透必备。

Links

README

From the repo.

GitHub C2

授权实验室使用的红队指挥平台。浏览器里管理目标机上的 Agent:发命令、交互 Shell、传文件、穿隧道、扫描、采集、编包、升级。通信默认走你自己的 Cloudflare Worker 中继,GitHub Issue 作为备用通道;主路断了自动切备用,备用稳定后再切回来。

仅限你拥有或已获书面授权的环境。未授权侵入他人系统违法。

英文文档(与本文一一对应):README_EN.md
手动部署 Worker 中继:WORKER.md


介绍

产品定位

GitHub C2 由三部分组成:

组件作用
Web 控制台Flask 网页后台。侧栏选 Agent,顶栏切换功能。自带中 / 英语言包。
AgentRust 编写,部署在目标机。轮询取令、加密回传、可持久化与伪装。
通道把指令和回显搬过去。主通道是 Cloudflare Worker + D1;备用是 GitHub Issue;也可只用 Notion 或只用其中一条。

控制台和 Agent 之间的载荷一律是 AES-256-GCM 信封。中继数据库里不存主机明文身份。一台机器若同时挂了 Worker 和 GitHub,侧栏合成一条,不会当成两台。

亮点

和其他「只把 GitHub 当信道」的工具比,这几条是真正不一样的:

  • 自己的中继,GitHub 只当备胎。 一键在 Cloudflare 上部署 Worker + D1;主路断了自动切 GitHub,好了自动切回,终端有 [Channel] 通知。双通道在侧栏仍是一台,不是两台 Agent。
  • 启动自动提权。 还不是 root 时按顺序试免密 sudo、已有 SUID 解释器、未打补丁的 pkexec、特权容器逃逸;成功则 exec 替换自身,不留双进程。无文件模式整条跳过,避免落盘。
  • 进程级隐藏,不装内核模块。 按发行版伪装成系统守护进程,藏路径、藏 /proc、对齐 SELinux/AppArmor,写文件还复原时间戳。
  • 持久化多路 + 自愈。 systemd / cron / rc.local / profile / 用户服务一起上;有人清掉一条,大约每 6 小时自己补回来。
  • 时间窗。 只在你规定的时段说话;窗外面板显示安静,不是掉线。边界每天抖动,整群不会同一秒苏醒。紧急停机在窗外照样生效。
  • 轮询全自动识别冷热。 编包只填一个基数。有人在操作就加快,闲着就自己放慢,省额度、也少指纹。
  • Token 失效不用重新编包。 填 Backup URL,Agent 自己去拉一份新 JSON 配置并热重启。
  • 目标机少落文件。 反弹 Shell、隧道节点都编在 Agent 里,纯内存;还可以 memfd 无文件上线。
  • 载荷全程加密,控制台自带 中 / 英语言包(右上角 EN / 中文)。

隐蔽、提权、性能与稳定性

自动提权

Linux 上线后若当前不是 root,会在守护化之前自动试(能提才提,提不了照常以当前权限跑):

  1. 免密 sudo:sudo -n 能过就直接以 root 再起自己;否则扫 sudo -l 里带 NOPASSWD 的解释器。
  2. 已有 SUID 解释器:目标机上已经是 root SUID 的常见解释器。
  3. 未打补丁的 pkexec(CVE-2021-4034,仅 x86_64)。
  4. 特权容器:检测到 privileged / CAP_SYS_ADMIN 时尝试 cgroup v1 逃到宿主机。

成功则 exec 替换当前进程,不会并排出两个 Agent。环境变量闸门防止提权成功后死循环。memfd 无文件模式整条跳过(再 exec 自己会破无文件约定,还会在日志里留下失败痕迹)。

隐蔽

全部是进程级,不加载内核模块,不跟发行版内核版本绑死:

  • 进程名 / 线程名:comm 按发行版自动扮 polkitd / accounts-daemon / systemd-udevd 等;工作线程扮 kworker。编包也可手填伪装名。
  • 落地路径:root 优先藏进 /usr/lib/systemd/… 这类看起来像系统守护进程的位置;普通用户走 ~/.local/bin/。写之前用 access(2) 探权限,不先建再删、少触发文件监控。
  • 藏 /proc:把 /proc/<pid> bind-mount 成 PID 1 的视图,常规 ps / 看 cwd、fd 不容易对上。
  • SELinux / AppArmor:chcon 对齐 bin_t / 单元文件上下文,减少「来历不明文件」刷审计。
  • 时间戳:二进制和状态文件的 mtime 对齐系统文件;每次写入后把目录 mtime 复原(stealth_write)。
  • 流量外形:启动抖动、轮询 ±20% 抖动、时间窗边界按 Agent/按天错开;访问 GitHub 时轮换常见客户端 User-Agent。
  • 崩溃不吐密:关掉 coredump,避免 Token / Secret 落到磁盘。
  • Guards:主机名、用户、标记文件、最低内存对不上就静默退出,少在沙箱 / 蜜罐里暴露行为。

性能

  • Agent 是 Rust,推荐 x86_64-unknown-linux-musl 静态链接,目标机不用装运行库。
  • 主通道走自己的 Worker HTTPS,不跟 GitHub 评论抢限额、也不等 Issue 刷新;GitHub 只在主路挂了才上场。
  • 反弹 Shell 是真 PTY + WebSocket,不走 30 秒命令轮询。
  • 轮询全自动冷热:操作时最快 15 秒,闲置最长 5 分钟,省 API、也少固定节拍指纹。
  • 大文件走 sendit 中转,上传按块切,不把评论通道撑爆。
  • 控制台本机已带隧道服务端、反弹 Shell 服务端,不必再下一堆配套马。

稳定性

  • 双通道:切备用失败会回滚,避免控制台和 Agent 各听一边。
  • 中继 D1 被重建、自增 id 归零时,水位自动复位,不会整群变聋。
  • 同一条命令写到兄弟通道,Agent 去重,切通道不丢令。
  • 持久化多策略;大约 每 6 小时自检修补,被清一条还能长回来。
  • 守护化用 spawn + exec,不用 fork():老 CentOS 上 Tokio 多线程 fork 会锁死。
  • 错误按类型退避(鉴权 / 限流 / 网络),再加抖动,不会固定间隔砸接口。
  • 热升级保留 agent id 和通道身份;失败则旧进程继续跑。
  • 设置页空字段不覆盖已有密钥;GET 不回明文 Secret。

痛点对照

常见痛点这里怎么处理
只用 GitHub:慢、限额紧、Issue 评论很脏Worker 做主通道,GitHub 只当备胎
双通道一上线变成两台马,对不上侧栏合成一台,两个徽章
Token 一过期,整群作废,只能重编重下Backup URL 拉新 JSON,热重启换票
到点不说话,面板一片「离线」,分不清死没死窗外显示 安静,不是掉线
中继库一重建,命令水位错位,整群收不到令水位失效自动复位
切通道时控制和马各听一边[Channel] 通知失败则 回滚
蓝队清掉一个开机项就没了多策略持久化 + 每 6 小时自愈
普通用户权限不够,很多功能施展不开启动自动提权(环境允许才成功)
还要另下 Shell / 隧道二进制,目标机一堆文件编进 Agent,内存跑;还可 memfd 无文件
保存设置时空字段把密钥冲掉空不覆盖;浏览器拿不到全文 Secret
整群同一秒上线,流量像心跳启动抖动 + 时间窗按天按台错开 + 轮询抖动
大文件走评论通道传不了 / 传爆sendit 中转 + 分片上传

架构

flowchart LR
  OP[操作员浏览器] --> CTRL[Web 控制台]
  AI[MCP / AI 客户端] --> CTRL
  CTRL -->|主通道 HTTPS| WR[Cloudflare Worker + D1]
  CTRL -->|备用 Issue 评论| GH[GitHub]
  CTRL -.->|可选| NT[Notion]
  WR --> AG[目标机 Agent]
  GH --> AG
  NT -.-> AG
  AG -->|内置节点| SOCKS[本机 SOCKS5 隧道]
  AG -->|内置 wspty| PTY[本机交互 Shell]
mindmap
  root((GitHub C2))
    通道
      Worker 主
      GitHub 备
      Notion 可选
      故障自动切换
    控制台功能
      终端
      定时
      反弹 Shell
      文件
      隧道
      扫描
      系统信息
      资料库
      报告
      升级
      生成器
      MCP
      设置
    Agent
      自动提权
      进程级隐藏
      多策略持久化
      时间窗
      无文件执行
      热升级 / 卸载

界面

侧栏列出已上线的 Agent,顶部切换业务页。终端、反弹 Shell、文件、隧道、扫描、系统信息、资料库、报告、升级在同一工作区。

控制台内置语言包(static/js/lang/zh.js、en.js)。右上角 EN / 中文 一键切换,选择会记在浏览器里;未选过则按系统语言默认。下面截图是中文界面,切到 EN 后同一套页面为英文。

控制台终端

生成器在网页里选通道、填凭据、编译,完成后直接下载二进制。双通道为 Worker 主 + GitHub 备。

Agent 生成器

凭据与权限

两种 Token 用途完全不同,不要共用、不要给多余权限。

Token用在哪会不会进 Agent干什么
Cloudflare API Token只在控制台「设置 → 一键部署 Worker」不会。 只留在控制台服务器部署中继:建 D1、上传 Worker、绑密钥
GitHub Token生成器编包 / 设置里的扫描列表会。 写进二进制,目标机上能被抠出来Agent 上线:读 Issue 命令、回评论

Cloudflare API Token(只用于部署中继)

打开 Cloudflare API Tokens → Create Token → Create Custom Token。Cloudflare 控制台中英文下权限名称不一样,请按下表对照勾选(资源选 所有帐户 / All accounts,或只包含你的那一个帐户)。

中文控制台English dashboard级别
帐户 · D1 · 编辑Account · D1 · Edit建库、建表
帐户 · Workers 脚本 · 编辑Account · Workers Scripts · Edit上传 Worker、绑 Secret、挂 cron
帐户 · 帐户设置 · 读取Account · Account Settings · Read自动定位帐户(GET /accounts)

列表页上会缩成「帐户.D1、帐户.Workers 脚本、+1」;点进摘要应能看到上面三条:

Cloudflare Token 列表

Cloudflare Token 权限摘要

这个 Token 只给控制台用来部署中继,不要编进 Agent,部署完成后可在 Cloudflare 面板删掉或收紧。若 Token 看不到帐户列表,把 Dashboard 右侧的 帐户 ID / Account ID 填进部署表单即可。

GitHub Token(编进 Agent,用于上线)

GitHub Token 会随二进制落到目标机。权限过大等于把仓库钥匙交给任何拿到样本的人。请用 Fine-grained personal access token,只开一个私有仓库:

  1. 只选你建好的隐私仓库(Only select repositories)。
  2. Repository permissions:
    • Issues → Read and write(读命令、写回显评论)
    • Metadata → Read-only(系统必选,不要再加 Contents / Administration / Actions)

GitHub Token 最小权限

图中红字标注即:选择你事先建好的隐私仓库。

不要给 repo 经典全仓库权限,不要给组织管理员、不要给多个仓库。控制台设置里用于扫描的 Token 也按同一最小权限配置。


控制台功能

侧栏

  • 显示 Agent 总数、在线数;按主机名 / 用户 / 系统 / 备注搜索。
  • 每条卡片展示主机、用户、权限、系统、通道徽章(Worker / GitHub / Notion)、最近回显时间。
  • 双通道同一台机器只显示一行,点进去两条通道都能用。
  • 可给 Agent 写备注(保存在控制台本地库,切换通道不丢)。
  • 刷新列表:主动向已配置的通道拉一次注册信息。
  • 清理通道消息:按设置里的条数 / 过期天数裁剪 GitHub 侧旧评论(中继侧也可清缓冲)。
  • 退出登录。

终端

网页命令行,不是假日志窗。

  • 输入命令下发到当前选中的 Agent,回显按块显示。
  • Interactive:勾选后命令以交互会话方式执行(前缀 interactive:)。
  • 过滤条:按关键字筛行;cmd / resp / sys 三类可单独开关并计数。
  • Live 滚动可暂停,避免长输出把视线带走。
  • 上 / 下键翻本机输入历史;历史下拉可重发。
  • 清空历史:清掉该 Agent 在控制台里的会话记录(通道里的旧评论需用侧栏「清理通道消息」)。
  • 缓冲上限 500 块,防止超长输出撑爆页面。

定时

Agent 内置调度,不在目标机写 crontab。顶栏 ⏱ 定时(以前只能在终端手打命令,所以控制台里找不到单独入口)。

  • 选中 Agent → 填间隔和命令 → 添加周期任务。间隔 10 秒~7 天。
  • 列出任务 / 删除 / 清空 会向 Agent 发 schedule ls / rm / clear,回显在本页,也进终端。
  • 到期后命令在 Agent 上执行,结果走正常回包。重启后任务仍在(memfd 无文件模式只在本次进程有效)。
  • 终端里也可以手打:schedule add 3600 id、schedule ls、schedule rm 1、schedule clear。

反弹 Shell

真交互 PTY,走 WebSocket,不靠 30 秒轮询。

  • 服务端:控制台本机自带的 cliws,默认监听 7337。点「启动服务端」即可,不必另下软件。
  • 目标端:Agent 内置 wspty。点「启动目标端反弹」下发回连,目标机不落额外文件。
  • 连上后页面就是 xterm 终端,可直接敲。
  • 可改控制端 IP / 端口(Agent 回连地址,防火墙需放行)。
  • 历史会话可回看,再切回直播。
  • 换选 Agent 时会断开旧会话,避免串台。
  • 收工:先停目标端反弹,再停本机服务端。

文件

远程目录浏览器。

  • 路径栏、面包屑、快捷目录(/、/tmp、/etc、/var/log、/home、/root、/dev/shm)。
  • 进目录、回上级、刷新。
  • 点文件名按魔数预览:文本、图片、PDF、其余显示十六进制。
  • 下载到资料库:把目标机文件取回控制台本机。
  • 上传:从浏览器传到目标机当前目录(分片下发)。
  • sendit:大文件经临时中转取回,避免走评论通道的体积限制。

隧道

内网 SOCKS5,基于 Stowaway。

  • 服务端:控制台本机自带 stowaway_admin。配置监听端口(默认 9998)和 SOCKS5 端口(默认 1080),点「启动服务端」。
  • 目标端:Agent 内置隧道节点,纯内存,不落文件。填回连 IP / 端口 / Secret,点「启动目标端隧道」。
  • 浏览器或代理工具连 127.0.0.1:SOCKS端口,即以目标机为跳板进其内网。
  • Secret 与设置页隧道密钥一致,页面不回显全文。
  • SOCKS 账密可在隧道管理里改(出厂默认仅适合本机 / 内网)。
  • 收工:停目标端(停止即清理)+ 停服务端。

扫描

在目标机上下发并运行 fscan。

  • 填写二进制下载 URL,保存后可重复用。
  • 参数框写完整 fscan 参数;右侧有常用示例,一点即可填入。
  • 下发并运行:下载到 /tmp/.san 后立刻扫。
  • 运行:已有二进制则直接跑。
  • 停止:杀掉扫描进程。
  • 清理痕迹:停进程并删除 /tmp/.san。
  • 读取结果:默认 cat /tmp/r.txt,输出显示在右侧。

系统信息

  • 采集系统信息:主机、内核、网卡、权限等,带历史快照,可来回看。
  • 采集敏感数据:按目标环境搜集常见敏感路径与凭据痕迹,同样有历史。
  • 卸载 Agent:向当前 Agent 下发卸载(见「卸载」一节)。

资料库

控制台本机上、按 Agent 分开的笔记与文件柜,不经过目标机。

  • 新建笔记、新建文件、上传、树状浏览。
  • 文本可编辑保存;Markdown 可预览。
  • 二进制只能下载,不能在浏览器里改。
  • 路径显示在页顶,方便对照磁盘位置。

报告

把该 Agent 的备注、命令历史、回显、系统信息等汇总成一份报告。

  • 页内搜索。
  • 刷新重新生成。
  • 下载 Markdown,便于归档或交接。

升级

给已上线的 Linux Agent 换新二进制,身份(agent id / 通道身份)保留。

  1. 在生成器编好新版本,复制下载地址。
  2. 填「新二进制 URL」和目标机临时路径(默认 /tmp/.agent_upg)。
  3. 点 Download & Upgrade:Agent 自行下载、校验、替换隐藏路径上的文件、重装持久化、清掉旧 hook,然后重启。
  4. 约 30–60 秒后重新出现在侧栏。

也可在目标机已有文件时,直接发 upgrade <路径>。升级失败则旧进程继续跑。Windows Agent 请改用手动替换。本页也可下发卸载。

生成器

在控制台本机用 Rust 交叉编译 Agent,编完可下载。

通道四档

档位行为
GitHub 单通道只走 GitHub Issue 评论。
Notion 单通道只走 Notion 数据库页。
Worker 单通道只走 Cloudflare Worker。
双通道Worker 为主,GitHub 为备。 Worker 连续失败达到阈值后切 GitHub;备用连续成功后再探主路。

编包字段

  • 通信 Secret:与控制台解密密码相同。部署时写过一次,编包可留空沿用。改了则旧 Agent 全部解不开。

  • GitHub Token / 仓库:单 GitHub 或双通道备用时必填。此 Token 会编进 Agent,只开 Issues 读写,见「凭据与权限」。

  • Worker 三件套(Worker / 双通道必填)。Path 不是密码,不要和 Secret 填反。 完整对照和手动部署见 WORKER.md。

    栏是什么填错
    Worker URL中继主机,如 https://c2relay.xxx.workers.dev,不要带后面的路径连不上
    Worker Path(PATH_SECRET)URL 第一段,像目录名,例如 a3f9k2-status。不进 HTTP 头中继回 404
    Worker Secret(C2_AUTH)请求头 X-C2-Auth,这才是中继口令401
    通信 SecretAES 信封密钥,不在 Cloudflare 上能连上但解不开回包

    真正访问的是 https://<URL>/<Path>/reg,头里带 Secret。Path 留空会打到 /reg,中继强制要前缀,所以 404。

  • 切换阈值 / 主探测间隔:仅双通道,默认 3 轮切备、5 轮探主。

  • 轮询间隔(全自动识别): 你只填基数,默认 30 秒。Agent 自己判断有没有人在操作,不用手调快慢:

    • 热(近 2 分钟有过命令)→ 加快,最快 15 秒
    • 温(1 小时内有过命令)→ 按你填的基数
    • 冷(超过 1 小时没命令)→ 放慢到基数 × 4,最长 5 分钟
  • 时间窗(加重): 按北京时间判断,时钟会用网络校准,不单信目标机系统钟。两种写法:

    • 区间:09:00-18:00(也支持跨夜,如 22:00-06:00)
    • 小时列表:9,10,11,14
    • 留空 = 全天在线
    • 每台 Agent、每一天的开关边界都会抖:日抖动约 ±20 分钟,再加约 ±5 分钟噪声,整群不会同一秒苏醒、同一秒消失。
    • 窗外不走 C2 通信,随机睡 5–20 分钟;侧栏显示 安静,不是掉线。
    • 紧急停机在窗外照样检查,不会因为「下班窗口」停不下来。
  • 架构:推荐 x86_64-unknown-linux-musl(静态、不依赖 glibc);另有 aarch64、gnu。

  • Release:自定义版本标签,空则用构建时的 git 短号。

  • Debug:生产保持关,避免在目标机落日志指纹。

  • Backup URL(远程换票,可选): 给一个 HTTPS 地址。GitHub Token 返回 401,或连续失败约 5 轮时,Agent 会 GET 这份 JSON,校验后写入新凭据并重启。留空 = 不启用。 同一地址 1 小时内最多拉一次;拉下来的内容和当前一样则不重启。

    这个地址上必须是一份 JSON(Content-Type 随意,正文能被解析即可),字段如下:

    {
      "channel": "github",
      "github_token": "github_pat_替换成新的Fine-grainedToken",
      "github_repo": "owner/private-repo",
      "password": "和当前通信Secret相同或你准备同时改掉的新Secret",
      "hmac_sig": ""
    }
    
    字段必填含义
    channel否,默认 githubgithub 或 notion。Notion 时:github_token 填 Integration Token(ntn_),github_repo 填 Database ID。
    github_token是新的上线 Token。同样会落到目标机,权限仍按「凭据与权限」收紧。
    github_repo是GitHub 填 owner/repo;Notion 填数据库 ID。
    password是通信 Secret。若改了,控制台解密密码必须一起改,否则解不开回包。
    hmac_sig视情况网页生成器默认不校验签名,可留空。只有你编译时设置了环境变量 BACKUP_SECRET,Agent 才强制校验:对 channel|github_token|github_repo|password 做 HMAC-SHA256,值写成小写 hex。

    地址必须是 https://。JSON 里是新 Token,不要放在能被猜到或被搜索引擎扫到的公开路径(公开 Gist 等于把新钥匙贴网上)。可用你控制的站点、带随机长路径的对象存储,或自建 Worker。Backup URL 本身不会被这份 JSON 改掉。

  • Guards: 可限定主机名、用户、标记文件、最低内存;不满足则静默退出(防沙箱 / 蜜罐)。

  • 进程伪装名 / 落地路径: 空则按发行版自动扮系统守护进程。

  • Compress:strip 去符号;勾选后再用 UPX 压缩(需本机已装 upx)。

无文件模式(Linux)

  • A · memfd 部署(无文件): 生成一条可粘贴到目标机的命令,Agent 在内存里跑,不落盘、不装持久化,重启即无。需要目标机 Python 3.8+。
  • B · 原生 shellcode:粘贴 hex / \xNN / base64,生成 mmap RWX 跳转执行命令。

MCP 接入

把控制台交给支持 MCP 的 AI 客户端(stdio)。

  • 页面按当前登录态生成说明、能力 JSON、客户端注册 JSON,可一键复制。
  • 可下载 mcp_server.py。
  • 工具分三档(环境变量 GITHUB_C2_MCP_TOOLS):
    • handoff(默认):只列出 Agent。
    • core:发命令、读回显、系统信息、统计、列目录、审计、看隧道状态。
    • full:再加上传文件、采敏感数据、紧急停机(停机必须确认串 YES-DESTROY-ALL)。

页面杀开关已从设置里拿掉,避免误触全灭;需要时走 MCP full 档。

设置

  • GitHub Token:可加多枚,只显示末四位,轮流使用以减轻限额。编包用的那枚会进 Agent,权限必须按「凭据与权限」收紧。
  • 控制器解密密码:加解密指令与回包,与生成器通信 Secret 同步。
  • 仓库列表:控制台扫描 / 发令用的 owner/repo。双通道备用仓库会并进扫描列表。
  • Notion:Token、数据库 ID;可一键给库补齐所需列。
  • Worker 三件套: URL(可多个、逗号分隔,只写到域名)、Worker Secret(C2_AUTH,请求头口令)、Worker Path(PATH_SECRET,URL 第一段,不是密码)。空字段保存不覆盖;填单独一个 - 才清空。对照见 WORKER.md。
  • 轮询间隔 / 评论保留条数 / 过期天数:控制后台扫描节奏和自动清理。
  • Web 用户名 / 密码:改控制台登录;改完重启后仍有效。
  • 一键部署 Worker:填 Cloudflare API Token(只用于部署中继,不会进 Agent)。自动建 D1、建表、上传 Worker、写入 C2_AUTH + PATH_SECRET、挂每小时清理、打开 workers.dev,并写回设置 / 生成器的三件套(第一次会把空的 GitHub 单通道提升为双通道,之后不再擅自改档)。权限见「凭据与权限」。不想把 Token 交给控制台时,按 WORKER.md 手动搭。
  • 审计日志:谁在何时对哪台 Agent 做了什么。
  • 一键备份下载:打包控制台数据库(Agent / 备注 / 消息 / 设置 / 生成器 / 审计)、资料库笔记与文件、以及 .runtime.env(若有),浏览器弹出下载。压缩包含密钥,离线保存,不要提交仓库。

空 Token、空密码保存时不会把已有机密覆盖掉。设置页的 GET 接口不把 Secret 全文回给浏览器。

通道与可靠性

  • 双通道运行时,命令按最近活跃通道走;同一条命令会同时写到兄弟通道,Agent 去重,避免切通道时丢令。
  • Worker 连败达到阈值 → 自动切 GitHub,终端可见 [Channel] 通知;通知失败则回滚,避免控制台和 Agent 各听一边。
  • GitHub 备用上稳定后探 Worker,注册成功再自动切回,同样发通知。
  • 中继 D1 被重建、自增 id 从头计数时,Agent 与控制台会识别水位失效并复位,不会一直收不到新命令。
  • 紧急停机(Kill)在时间窗外也会检查,避免「下班窗口」里停不下来。

安装

环境

项目要求
控制台主机Linux(Debian / Ubuntu 最省事),Python 3,公网或实验室可达
生成 Agent同机需 Rust(deploy.sh 可代装 rustup + x86_64-unknown-linux-musl)
可选gcc / binutils(链接与 strip)、upx(压缩)、Cloudflare 账号(Worker 中继)
目标机按编包架构:Linux musl / gnu,x86_64 或 aarch64

随包已带隧道服务端 stowaway_admin 和反弹 Shell 服务端 cliws,一般不必再下。

标准安装

git clone https://github.com/Kxiandaoyan/github-C2.git
cd github-C2
bash deploy.sh

脚本会:

  1. 识别源码目录 c2/(或旁路的压缩包)。
  2. 创建 Python 虚拟环境并安装依赖。
  3. 询问(或用参数传入)网页账号、通信 Secret、端口、绑定地址。
  4. 把凭据写入 c2/.runtime.env(权限 0600)和数据库。
  5. 检查隧道 / Shell 二进制;按需安装 Rust 与 musl 目标。
  6. 用 systemd 单元 c2-controller 拉起控制台(无 systemd 则 5 秒自动拉起)。
  7. 做登录 + 接口健康检查;升级失败会回滚上一份快照。

完成后终端会打印访问地址,形如:

http://<服务器IP>:<端口>/?login=<用户名>&pass=<密码>

用地址参数登录,页面本身不放登录表单。首次打开后把地址栏里的密码清掉即可。

命令行参数

bash deploy.sh --user admin --pass '你的密码' --c2-secret '通信密钥' --port 8080 --bind 0.0.0.0
参数含义
--user / --pass控制台登录。重装时回车沿用旧值。
--c2-secret通信加密 Secret,编包与解密共用。
--port / --bind监听端口与网卡。默认 8080、0.0.0.0。
--noninteractive无人值守。密码可用环境变量 C2_WEB_PASS。
--skip-toolchain不装 Rust。生成器将无法编译。
--skip-always-poll浏览器闲置约 90 秒后停止后台扫描(默认一直扫)。
--no-systemd不用 systemd,改用脚本循环拉起。

无人值守若要顺便装编译链:C2_INSTALL_TOOLCHAIN=1 bash deploy.sh --noninteractive ...

安装之后

  1. 浏览器打开脚本打印的地址,进入控制台。需要英文界面时点右上角 EN / 中文。
  2. 设置 → Cloudflare Worker 中转:用「凭据与权限」里的 Cloudflare Token 一键部署中继(只用于部署,不会写进 Agent)。不想用一键:按 WORKER.md 在网页或 wrangler 手动搭,再手填 URL / Secret / Path(Path 是 URL 第一段,不是密码)。
  3. 生成器选「双通道」,确认 Worker 三件套(URL、Secret、Path 和设置页一致),再填最小权限的 GitHub 备用 Token / 仓库(此 Token 会编进 Agent)。点编译,下载二进制。
  4. 在授权目标机运行 Agent。侧栏出现一条记录,通道徽章为 Worker + GitHub。
  5. 先在终端发一条无害命令确认回显,再使用 Shell / 文件 / 隧道等页。

也可以只编 GitHub、只编 Worker 或只编 Notion,与生成器档位一致即可。

升级控制台

在已部署的机器上再次执行 bash deploy.sh。回车沿用账号和 Secret。健康检查失败时自动回到升级前的代码和数据库快照。


卸载

分两层:卸掉控制台(你的服务器),以及卸掉目标机上的 Agent。

卸载控制台

以 root 安装为例:

# 1. 停服务
systemctl stop c2-controller
systemctl disable c2-controller
rm -f /etc/systemd/system/c2-controller.service
systemctl daemon-reload

# 若当时是普通用户安装:
# systemctl --user stop c2-controller
# systemctl --user disable c2-controller
# rm -f ~/.config/systemd/user/c2-controller.service

# 2. 若没用 systemd
pkill -f 'run-controller.sh --respawn' || true

# 3. 可选:日志轮转
rm -f /etc/logrotate.d/c2-controller

# 4. 删目录(含数据库、虚拟环境、运行时凭据)
# 仓库若在 /opt/github-C2:
rm -rf /opt/github-C2

隧道服务端、cliws 随目录一起删除。Cloudflare 上的 Worker / D1 需到 Cloudflare Dashboard 里单独删,脚本不会动你的云账号。

卸载 Agent

在控制台打开该 Agent → 系统信息 或 升级 → 卸载 Agent。下发 uninstall 后,Agent 会:

  1. 拆除持久化(systemd、cron、bashrc、rc.local、用户服务等,视安装时用了哪些)。
  2. 拆除已装的隐藏模块(若有)。
  3. 删除状态目录里的身份与水位文件。
  4. 约 5 秒后删除自身进程文件并退出。

无文件(memfd)模式本来就没有落地文件和持久化,目标机重启即无;仍可下发卸载以结束当前进程。

时间窗外的 Agent 也会检查紧急停机信号。需要一次清掉所有 Agent 时,使用 MCP full 档的 killswitch,并传入确认串 YES-DESTROY-ALL。

Collected info

  • ★ 55 stars
  • ⎇ 17 forks
  • Language: Rust
  • Source updated: 9/23/2026

Config for your environment

Replace {MCP_ENDPOINT_URL} with this MCP’s endpoint URL (from its repo or docs above). No API key — you connect directly.

Tool

OS

Config file: ~/.cursor/mcp.json

{
  "mcpServers": {
    "mcp-server": {
      "url": "{MCP_ENDPOINT_URL}"
    }
  }
}

Paste into mcpServers in the config file. Restart Cursor after saving.

If this MCP is also published on mcpchannel.ai, you can subscribe from Browse and use the gateway config there instead.