CISCN2024决赛 build_wp
字数 1567 2025-08-24 16:48:16

CISCN2024决赛build_wp教学文档

1. 新手任务

1.1 基础操作流程

  1. 模拟工程师登录流程

    • /root/2024buildup/instance/monitor/center目录下找到user.list文件
    • 使用用户zhao登录(后续题目大多使用此用户)
    • 执行命令:sh users_login.sh engineer_login.msg
  2. 模拟逻辑代码上传

    • 填写正确的上传代码信息,logic_filename后跟文件名
    • 直接上传thermostat_logic.c
    • 示例消息格式:
      {
        "type":"PLC_ENGINEER",
        "subtype":"LOGIC_UPLOAD",
        "mode":"INT"
      }
      {
        "plc_devname":"thermostat",
        "logic_filename":"thermostat_logic.c",
        "type":"FILE_CODE",
        "author":"zhao",
        "uploader":""
      }
      
  3. 模拟二进制逻辑上传

    • 上传.so链接库文件libthermostat_logic.so
    • 填写上传用户为zhao
    • 修改sh脚本直接上传
  4. 模拟PLC逻辑启动

    • 打开注释运行sh脚本
    • logic_send.log文件中查找登录信息
    • 补全用户名和口令
  5. 模拟操作员登录行为

    • 打开注释直接运行sh operator_login.msg
  6. 模拟操作员PLC操作

    • 打开PLC温度调节开关
    • 监控当前温度环境
    • 设置PLC恒温温度为39度(3900)

1.2 重放攻击

  • 替换为login_hacker plugin_config.cfg.task_1_2
  • 编写engineer_login_nopass.msg
  • 密码在/root/2024buildup/src/security/login_hacker/login_hacker.c

1.3 挑战-应答机制

  • 用户端登录处理模块login_user.c支持挑战-应答机制
  • 修改plugin_config.cfg.task_1_3
  • aspect_policy.cfg内容写入aspect_policy.cfg.task_1_3,调整type缩进

2. 攻击模拟任务

2.1 越权访问

  1. user.list找到监控员:
    {
      "user_name":"sun",
      "role":"PLC_MONITOR",
      "passwd":"123"
    }
    
  2. 使用操作员登录:
    {
      "user_name":"qian",
      "role":"PLC_OPERATOR",
      "passwd":"456"
    }
    
  3. 编写攻击消息文件:
    • attack_login1.msgattack_cmd1.msg
    • attack_login2.msgattack_cmd2.msg
    • 管理员攻击消息同理
  4. 运行task_2_1.sh

2.2 恶意逻辑

  1. 文件替换代码:
    system("cp -f /root/2024buildup/src/logic/hack_logic/libthermostat_logic.so /root/2024buildup/src/logic/thermostat_logic");
    sleep(2);
    
  2. bin_file_replace函数中添加上述代码
  3. plugin_config.cfg.task_2_2只需添加file_replace模块

2.3 Modbus监听与篡改

  1. 读取寄存器温度
  2. 当温度高于43度(4300)时进行篡改:
    if(Buf[7] == 0x04) // read input register
    {
        UINT16 value;
        value = Buf[10]*256+Buf[9];
        if(value >4300)
        {
            value = 4100 + value%200;
            Memcpy(Buf+9,&value,sizeof(value));
        }
    }
    

3. 访问控制模拟任务

3.1 角色验证

  1. role_verify.c中添加角色验证逻辑:
    db_record=memdb_find_first(TYPE_PAIR(USER_DEFINE,SERVER_STATE),"user_name",user_login->user_name);
    if(db_record !=NULL)
    {
        user_state=db_record->record;
        if(user_state->role == PLC_ENGINEER)
        {
            if(Strcmp(user_login->proc_name,"engineer_station")!=0)
                illegal_user=1;
        }
        else if(user_state->role == PLC_OPERATOR)
        {
            if(Strcmp(user_login->proc_name,"operator_station")!=0)
                illegal_user=1;
        }
        else if(user_state->role == PLC_MONITOR)
        {
            if(Strcmp(user_login->proc_name,"monitor_term")!=0)
                illegal_user=1;
        }
    }
    
  2. plugin_config.cfg.task_3_1中添加role_verify模块
  3. aspect_policy.cfg.task_3_1中添加路由信息

3.2 角色权限限制

  1. role_access.c中添加权限检查:
    db_record=memdb_find_first(TYPE_PAIR(USER_DEFINE,SERVER_STATE),"user_name",code_upload->author);
    if(db_record !=NULL)
    {
        user_state=db_record->record;
        if(user_state->role != PLC_ENGINEER)
        {
            illegal_user=1;
        }
    }
    
    db_record=memdb_find_first(TYPE_PAIR(USER_DEFINE,SERVER_STATE),"user_name",plc_cmd->plc_operator);
    if(db_record !=NULL)
    {
        user_state=db_record->record;
        if(user_state->role != PLC_MONITOR)
        {
            if(plc_cmd->action == ACTION_ADJUST)
                illegal_user=1;
        }
    }
    
  2. 配置路由信息

3.3 自动逻辑屏蔽

  1. operator_shield.c中添加:
    char *sender = message_get_sender(recv_msg);
    if (strcmp(sender, operator_sender) == 0)
    {
        subtype = message_get_subtype(recv_msg);
        if (subtype == SUBTYPE(MODBUS_CMD, WRITE_SINGLE_REGISTER) || 
            subtype == SUBTYPE(MODBUS_CMD, WRITE_MULTIPLE_REGISTERS))
        {
            mode = 1;
        }
    }
    else if (strcmp(sender, plc_sender) == 0)
    {
        illegal_cmd = mode ? 1 : 0;
    }
    
  2. monitor_shield.c中添加:
    if (strcmp(monitor_route, msg_head->route) == 0)
    {
        if (plc_cmd->action == ACTION_ADJUST)
        {
            illegal_cmd = 0;
            mode = 1;
        }
    }
    else if (strcmp(operator_route, msg_head->route) == 0)
    {
        illegal_cmd = (mode == 1) ? 1 : (mode == 0) ? 0 : illegal_cmd;
    }
    
  3. 配置路由信息

4. 密码保护模拟任务

4.1 工程师签名上传

  1. SM2签名实现:
    int sm2sign_init(void * sub_proc,void * para)
    {
        int ret;
        struct init_struct * init_para=para;
        if(para==NULL) return -EINVAL;
        mode=init_para->mode;
        if(mode==0)
        {
            ret=GM_GenSM2keypair(prikey,&prilen,pubkey_XY);
            if(ret!=0) return -EINVAL;
        }
        return 0;
    }
    
  2. plugin_config.cfg.task_4_1中添加sm2sign模块
  3. 编写二进制文件上传配置

4.2 Modbus数据加密

  1. 加密算法:
    print_cubeerr("crypt:%x\n",key[0]);
    zuc_generate_keystream(&zuc_state,segment_size/4,key_buf);
    gmssl_memxor(zuc_buf,modbus_datagram->data,key_buf, modbus_datagram->datasize);
    Memcpy(modbus_datagram->data,zuc_buf,modbus_datagram->datasize);
    
  2. 解密算法:
    print_cubeerr("decrypt:%x\n", key[0]);
    zuc_generate_keystream(&zuc_state, segment_size / 4, key_buf);
    gmssl_memxor(zuc_buf, modbus_datagram->data, key_buf, modbus_datagram->datasize);
    memcpy(modbus_datagram->data, zuc_buf, modbus_datagram->datasize);
    
  3. 配置加密模块:
    {
        "name":"modbus_zuc_crypt",
        "libname":"modbus_zuc_crypt",
        "init_para":{
            "mode":1
        }
    }
    
  4. 配置解密模块:
    {
        "name":"modbus_zuc_crypt",
        "libname":"modbus_zuc_crypt",
        "init_para":{
            "mode":0
        }
    }
    

总结

  1. Build部分占决赛总分的10%,是拉开差距的关键
  2. 合理使用git回滚功能可以大大提高效率
  3. 各任务关键点:
    • 新手任务:熟悉基本操作流程
    • 攻击模拟:掌握重放攻击、恶意逻辑植入和数据篡改
    • 访问控制:实现角色验证和权限限制
    • 密码保护:掌握SM2签名和ZUC流加密
CISCN2024决赛build_ wp教学文档 1. 新手任务 1.1 基础操作流程 模拟工程师登录流程 在 /root/2024buildup/instance/monitor/center 目录下找到 user.list 文件 使用用户 zhao 登录(后续题目大多使用此用户) 执行命令: sh users_login.sh engineer_login.msg 模拟逻辑代码上传 填写正确的上传代码信息, logic_filename 后跟文件名 直接上传 thermostat_logic.c 示例消息格式: 模拟二进制逻辑上传 上传 .so 链接库文件 libthermostat_logic.so 填写上传用户为 zhao 修改 sh 脚本直接上传 模拟PLC逻辑启动 打开注释运行 sh 脚本 在 logic_send.log 文件中查找登录信息 补全用户名和口令 模拟操作员登录行为 打开注释直接运行 sh operator_login.msg 模拟操作员PLC操作 打开PLC温度调节开关 监控当前温度环境 设置PLC恒温温度为39度(3900) 1.2 重放攻击 替换为 login_hacker plugin_config.cfg.task_1_2 编写 engineer_login_nopass.msg 密码在 /root/2024buildup/src/security/login_hacker/login_hacker.c 中 1.3 挑战-应答机制 用户端登录处理模块 login_user.c 支持挑战-应答机制 修改 plugin_config.cfg.task_1_3 将 aspect_policy.cfg 内容写入 aspect_policy.cfg.task_1_3 ,调整 type 缩进 2. 攻击模拟任务 2.1 越权访问 从 user.list 找到监控员: 使用操作员登录: 编写攻击消息文件: attack_login1.msg 、 attack_cmd1.msg attack_login2.msg 、 attack_cmd2.msg 管理员攻击消息同理 运行 task_2_1.sh 2.2 恶意逻辑 文件替换代码: 在 bin_file_replace 函数中添加上述代码 plugin_config.cfg.task_2_2 只需添加 file_replace 模块 2.3 Modbus监听与篡改 读取寄存器温度 当温度高于43度(4300)时进行篡改: 3. 访问控制模拟任务 3.1 角色验证 在 role_verify.c 中添加角色验证逻辑: 在 plugin_config.cfg.task_3_1 中添加 role_verify 模块 在 aspect_policy.cfg.task_3_1 中添加路由信息 3.2 角色权限限制 在 role_access.c 中添加权限检查: 配置路由信息 3.3 自动逻辑屏蔽 operator_shield.c 中添加: monitor_shield.c 中添加: 配置路由信息 4. 密码保护模拟任务 4.1 工程师签名上传 SM2签名实现: 在 plugin_config.cfg.task_4_1 中添加 sm2sign 模块 编写二进制文件上传配置 4.2 Modbus数据加密 加密算法: 解密算法: 配置加密模块: 配置解密模块: 总结 Build部分占决赛总分的10%,是拉开差距的关键 合理使用git回滚功能可以大大提高效率 各任务关键点: 新手任务:熟悉基本操作流程 攻击模拟:掌握重放攻击、恶意逻辑植入和数据篡改 访问控制:实现角色验证和权限限制 密码保护:掌握SM2签名和ZUC流加密