文章总结: 本文对BYOBC2框架进行源码架构分析,指出其存在两套并行实现导致的代码重复与维护债务、四端口架构中辅助服务缺乏认证、加密实现存在多处硬伤(如XXTEA误标为XOR-128、手写AES-CBC无MAC且使用null-byte填充)等工程缺陷。同时分析了其分层加载链、远程导入机制等设计亮点。结论是该项目适合教学研究,但存在安全风险,不建议用于生产环境。 综合评分: 85 文章分类: 红队,安全工具,安全建设,代码审计,安全开发
,写进 StringIO,再 :349-350 对已是 str 但含畸形 repr 的数据 encode('utf-8')——PNG 输出损坏。screenshot.run 依赖此路径。
handler.py Py2 专属(string.lowercase,handler.py:49),Py3 崩。AttributeError/TypeError:Method.__init__ 调 util.__logger__.warn(...) 但 util 无此属性;_add_scheduled_task 调不存在的 util.variable(...);_remove_crontab_job 对 list 做 lines.pop(line, None)(list.pop 取整数索引不取字符串值)。packetsniffer 声明 platforms=['linux2','darwin'] 却用 Linux 专属的 socket.PF_PACKET(packetsniffer.py:22,149),macOS 上必崩;_run 体错误处理整段被注释(:148-168)。keylogger 导入 pyHook(keylogger.py)——pyHook 仅 Python 2 且无人维护,Py3 无 pyHook。键盘记录器实为 Windows+Py2 专属,尽管声明支持 win32/linux2/darwin。serve_resources(server.py:868-878)既坏又死:每 3 秒在无限循环里 kill 并重启 package_handler,会切断每个在途远程导入;它从不被 run() 调用,纯地雷。imp loader 在 Python 3.12 已移除——整套远程导入在新 Python 上失效。execute 的 info.dwFlags = subprocess.STARTF_USESHOWWINDOW, subprocess.CREATE_NEW_ps_GROUP(payloads.py:679)——小写 ps_GROUP 是笔误,且元组赋给 dwFlags 错误;Windows 隐藏进程路径坏的。11.3 设计与可维护性
server.py1100 行上帝对象。C2(server.py:144-924)同时拥有:socket 生命周期、四个子进程句柄、命令分派表、控制台 UI(颜色/样式/提示符/banner/tab 补全)、SQL 直通、任务广播、session 簿记、显示格式化。应拆成transport/session/console_ui/commands/lifecycle。Payload~960 行上帝类,混 transport(send/recv)、任务循环、约 25 个无关命令(cd/ls/keylogger/outlook/escalate/persistence/packetsniffer…)。globals()当服务注册表。Payload伸手进globals()取diffiehellman/encrypt_aes/decrypt_aes/post/geolocation/public_ip等(payloads.py:143,170,221,569,614…),硬耦合到from x import *成功,重构/测试/静态分析痛苦。- 控制台与 Web 代码 ~140KB 复制粘贴且已分叉(
block_cipher等安全相关差异)。 - 裸
except:/except: pass泛滥(payloads.py:265,387,497,500,621,734,785;outlook.py:38,57;util.py:172,229,366;process.py:135)。 - Python 2/3 双兼容债遍布:
xrange/range、StringIO/io、urllib2/urllib、raw_input/input、string.lowercase、imp;security.py:31-48还在 import 时按sys.version_info猴补丁。 - 模块并非真正 drop-in:每个新模块需要一个
Payloadwrapper(见 §6.1)。 - Web GUI:C2 在 import 时实例化(见 §7.1)。
- Web GUI 与自身 HTTP 耦合:C2 线程在同进程里用
app.test_client().post('/api/session/new', ...)跟 Flask 说话(server.py:157,239),古怪且慢。 datetime.utcnow()在类定义时求值(models.py:22,36,79,101,121,default=datetime.utcnow()应为default=datetime.utcnow可调用),每行都拿导入时间戳。- 遗留/死代码:
_get_session_by_id(server.py:403-411)立即把参数覆写成None;_get_session_by_connection(:413-425)调不存在的self.get_sessions();handler.py重复/api/file/add且仍引用 Py2string.lowercase;server.py:955注释掉的self.rsa = None # security.Crypto.PublicKey.RSA.generate(2048)死愿望。
12. 解读结论
BYOB 是一个紧凑、教学向的 C2,用几个真正漂亮的想法(分层 dropper、内存远程导入、DH/AES 信道、任务审计日志)裹在一层脆弱的单文件上帝对象里。它最值得拆出来复用的是 loader.py(远程导入钩子)、帧化(长度前缀)与任务-DB 模式;server.py 单体与 database.py DAO 应当视作待重写的草稿,而非照搬。
最大的正确性风险是:SQLite 跨线程无序列化、accept 循环被每连接握手阻塞、handle_session 列名 SQL 注入、以及 process.kill/outlook.run/util.png 这类主线 bug。最大的安全风险是四个监听服务全部无认证、远程导入的未认证 RCE、Web 端 CSRF 关闭导致的登录用户全机器 RCE,以及控制台 shell=True 直通。整套抗分析子系统(反 VM、反 AV、”UAC bypass”)宣传远大于实质——反 VM 出厂被注释关闭,escalate 既假又会在非管理员环境崩。
对蓝队/取证/EDR 而言,BYOB 是低难度但高教学价值的样本:
- 网络层:1337–1340 四个连续明文端口、
0.0.0.0绑定、python -m http.server的目录索引可枚举模块与 payload、POST handler 无认证无大小上限——任一都是低成本的 NDR/出口检测点。 - 静态层:
exec(eval(marshal.loads(zlib.decompress(base64.b64decode(...)))))自解压一行流、urlopen(...).read()+exec的 stager、delta = 0x9e3779b9的 XXTEA 常量、os.popen('taskkill /pid %s /f')的 shell 注入式进程操作——都是稳定的 YARA/规则特征。 - 行为层:反向 TCP 每 30 秒重试、DH 公值裸传、模块源码明文 HTTP 拉取后
exec、向 port+3 base64 POST 截图/pcap/键盘记录——主机侧 EDR 可在导入与上传两条路径上做高质量 telemetry。 - 代码审计层:这是研究”如何不写一个 C2″的反面教材——跨线程 SQLite、不循环的
recv、把客户端 dict keys 拼进 SQL 列名、eval+marshal.loads解攻击者字节、CSRF 默认关、import 即起监听——每一条都是可移植到任意 Python 服务端审计的检查项。
一句话:BYOB 的远程导入钩子值得学,它的服务器与数据库值得作为反面教材重写一遍。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:赛博生存指南 GLM-5.2 GLM-5.2《工具 | BYOB C2 框架源码架构分析》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论