CISCN2024决赛 build_wp
字数 1567 2025-08-24 16:48:16
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 - 示例消息格式:
{ "type":"PLC_ENGINEER", "subtype":"LOGIC_UPLOAD", "mode":"INT" } { "plc_devname":"thermostat", "logic_filename":"thermostat_logic.c", "type":"FILE_CODE", "author":"zhao", "uploader":"" }
- 填写正确的上传代码信息,
-
模拟二进制逻辑上传
- 上传
.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找到监控员:{ "user_name":"sun", "role":"PLC_MONITOR", "passwd":"123" } - 使用操作员登录:
{ "user_name":"qian", "role":"PLC_OPERATOR", "passwd":"456" } - 编写攻击消息文件:
attack_login1.msg、attack_cmd1.msgattack_login2.msg、attack_cmd2.msg- 管理员攻击消息同理
- 运行
task_2_1.sh
2.2 恶意逻辑
- 文件替换代码:
system("cp -f /root/2024buildup/src/logic/hack_logic/libthermostat_logic.so /root/2024buildup/src/logic/thermostat_logic"); sleep(2); - 在
bin_file_replace函数中添加上述代码 plugin_config.cfg.task_2_2只需添加file_replace模块
2.3 Modbus监听与篡改
- 读取寄存器温度
- 当温度高于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 角色验证
- 在
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; } } - 在
plugin_config.cfg.task_3_1中添加role_verify模块 - 在
aspect_policy.cfg.task_3_1中添加路由信息
3.2 角色权限限制
- 在
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; } } - 配置路由信息
3.3 自动逻辑屏蔽
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; }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; }- 配置路由信息
4. 密码保护模拟任务
4.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; } - 在
plugin_config.cfg.task_4_1中添加sm2sign模块 - 编写二进制文件上传配置
4.2 Modbus数据加密
- 加密算法:
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); - 解密算法:
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); - 配置加密模块:
{ "name":"modbus_zuc_crypt", "libname":"modbus_zuc_crypt", "init_para":{ "mode":1 } } - 配置解密模块:
{ "name":"modbus_zuc_crypt", "libname":"modbus_zuc_crypt", "init_para":{ "mode":0 } }
总结
- Build部分占决赛总分的10%,是拉开差距的关键
- 合理使用git回滚功能可以大大提高效率
- 各任务关键点:
- 新手任务:熟悉基本操作流程
- 攻击模拟:掌握重放攻击、恶意逻辑植入和数据篡改
- 访问控制:实现角色验证和权限限制
- 密码保护:掌握SM2签名和ZUC流加密