简介这份资源是2022年全国职业院校技能大赛中职组网络安全竞赛试题1套的A、B模块答案解析面向备战全国职业院校技能大赛的中职选手、指导教师以及需要系统梳理网络安全实操要点的学习者。内容围绕基础设施设置与安全加固、网络安全事件响应、数字取证调查和应用安全两大模块展开涵盖登录安全加固、数据库安全策略、流量完整性、事件监控、防火墙策略、IP协议安全配置以及主机发现与信息收集等典型任务逐项给出操作思路与参考答案便于对照赛题复盘关键配置与验证方法。资源包为1个docx文档约2.74MB结构紧凑适合按模块检索学习。目前已有3936人学习下载可作为赛前查漏补缺、理解评分要点与规范答题格式的实用参考。1. 从一套中职组赛题说起AB 模块到底在考什么2022 年全国职业院校技能大赛中职组网络安全竞赛的 AB 模块是很多刚接触网络安全赛事的人第一次系统性地面对「加固 渗透」双线任务。A 模块通常给一台有漏洞的靶机或一段有缺陷的配置要求你完成安全加固B 模块则反过来给你一个目标环境要求你找到入口、拿到 flag。这套题的解析价值不在于答案本身而在于它把 Nmap 扫描、iptables 规则、MySQL 权限、CTF 夺旗思路这几件事串成了一条完整的链路。如果你正在准备网络安全相关赛事或者刚入门想找一个能跑通全流程的练手场景这套 AB 模块的拆解思路可以直接复用。它不依赖特定平台你在本地用虚拟机搭两台机器就能复现大部分操作。下面我按「先看清考什么、再动手复现、最后说坑在哪」的顺序把这套题的解析逻辑讲透。2. A 模块加固线从 Nmap 扫描结果反推 iptables 规则2.1 先用 Nmap 把靶机暴露面摸清楚A 模块的加固任务第一步永远是信息收集。很多新手拿到题目直接改配置文件结果改了半天发现漏了端口。我一般会先用 Nmap 做一次全端口扫描把靶机当前开放的服务列出来再对照题目要求逐条封堵。# 对目标 172.16.100.10 做全端口 SYN 扫描-sS 半开扫描速度快-v 显示过程-n 不做 DNS 解析-T4 提速 nmap -sS -v -n -T4 -p- 172.16.100.10 # 如果只想看常见端口加版本探测用这条 nmap -sV -sC -p 1-10000 172.16.100.10第一条命令的-p-表示扫描 1 到 65535 全部端口-sS是 SYN 半开扫描不会完成三次握手速度快且不容易被日志记录。-T4是时序模板在局域网里用 T4 比较合适T5 容易丢包。第二条命令的-sV做版本探测-sC跑默认脚本能直接看出 MySQL 版本、SSH 版本这些关键信息。扫描结果里如果看到 3306 开放说明 MySQL 对外暴露了看到 22 开放说明 SSH 可访问。A 模块的加固要求通常就是把这些不必要的对外端口关掉或者限制来源 IP。2.2 iptables 规则怎么写才不会被自己锁死知道要封哪些端口之后下一步是写 iptables 规则。这里有个血泪经验千万不要在远程 SSH 会话里直接iptables -A INPUT -j DROP一旦执行你当前的连接也会被切断只能去机房或者用 VNC 救回来。正确做法是先放行已建立的连接再追加拒绝规则。# 先放行已建立的连接和本地回环避免把自己锁死 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -i lo -j ACCEPT # 放行 SSH 22 端口只允许管理网段 192.168.1.0/24 访问 iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT # 禁止特定 IP 202.98.7.148 访问任何端口 iptables -A INPUT -s 202.98.7.148 -j DROP # 拒绝 3306 MySQL 端口对外只允许本机访问 iptables -A INPUT -p tcp --dport 3306 -s 127.0.0.1 -j ACCEPT iptables -A INPUT -p tcp --dport 3306 -j DROP # 最后设置默认策略为 DROP iptables -P INPUT DROP这几条规则的顺序很关键。iptables 是从上往下匹配的一旦匹配到就执行动作并停止后续匹配。所以放行规则必须写在拒绝规则前面。-m state --state ESTABLISHED,RELATED这一条是保命用的它让已经建立的 SSH 连接继续通行不会因为你后面加了 DROP 就断掉。-s 202.98.7.148 -j DROP这条就是热词里提到的「iptables 禁止 202.98.7.148 命令」的标准写法。注意用 DROP 而不是 REJECTDROP 是直接丢包不回应REJECT 会返回一个错误信息暴露你的规则存在。改完规则后很多人会问「iptables 配置后需要重启程序吗」。答案是iptables 规则是即时生效的不需要重启任何服务。但如果你重启了机器规则会丢失所以要用iptables-save持久化。# 保存当前规则到文件 iptables-save /etc/iptables/rules.v4 # 开机自动恢复在 /etc/rc.local 里加一行 iptables-restore /etc/iptables/rules.v4iptables-save把当前内存中的规则导出成文本iptables-restore从文件读回来。不同发行版持久化的路径不一样Debian/Ubuntu 常用/etc/iptables/rules.v4CentOS 7 用service iptables save。如果你不确定用iptables-save手动导出再写进启动脚本是最稳的。2.3 MySQL 侧的安全加固不能只靠防火墙A 模块里 MySQL 的加固通常有两层网络层用 iptables 限制 3306 访问应用层还要检查 MySQL 自身的用户权限。很多参赛者只做了 iptables 就以为完事了结果题目里要求「删除匿名用户」「禁止 root 远程登录」这些是 iptables 管不到的。-- 查看当前所有用户和允许登录的主机 SELECT user, host FROM mysql.user; -- 删除匿名用户 DELETE FROM mysql.user WHERE user; -- 禁止 root 从非本机登录只保留 localhost DELETE FROM mysql.user WHERE userroot AND host NOT IN (localhost, 127.0.0.1, ::1); -- 如果题目要求设置某个字段默认值为 0用 ALTER TABLE ALTER TABLE 表名 ALTER COLUMN 字段名 SET DEFAULT 0; -- 刷新权限 FLUSH PRIVILEGES;SELECT user, host FROM mysql.user是排查 MySQL 用户配置的第一步。如果看到user为空的行那就是匿名用户必须删掉。host字段为%表示允许从任何主机登录root 用户如果 host 是%那等于把数据库完全暴露了。ALTER TABLE ... ALTER COLUMN ... SET DEFAULT 0对应热词里「mysql 设置默认值为 0」的需求。注意 MySQL 8.0 和 5.7 的语法略有差异8.0 推荐用ALTER TABLE 表名 ALTER COLUMN 字段名 SET DEFAULT 05.7 可能需要用MODIFY COLUMN重写整个列定义。FLUSH PRIVILEGES在直接操作mysql.user表之后必须执行否则权限变更不会立即生效。如果你用的是GRANT和REVOKE语句那不需要手动 flush因为 MySQL 会自动刷新。3. B 模块渗透线从 CTF 夺旗思路到 flag 定位3.1 CTF Web 题的一般入口在哪B 模块的渗透任务本质上就是一道 CTF Web 题。中职组赛题里常见的入口有三类命令执行、文件包含、SQL 注入。热词里提到的「ctf 命令执行 passthru」就是其中一种典型场景。?php // 假设靶机上有这样一个存在漏洞的 PHP 文件 $cmd $_GET[cmd]; passthru($cmd); ?passthru函数会直接执行传入的命令并把输出原样返回。如果题目里给了你一个 URL 参数?cmd那基本可以确定是命令执行漏洞。你可以先试?cmdwhoami看当前权限再试?cmdls看目录结构。# 通过 URL 参数执行命令查找 flag 文件 curl http://target.com/vuln.php?cmdfind / -name flag* 2/dev/null # 如果 find 被禁用用 ls 逐层翻 curl http://target.com/vuln.php?cmdls -la /var/www/html/find / -name flag*是从根目录搜索文件名包含 flag 的文件2/dev/null把权限不足的报错丢掉避免输出太乱。如果 find 被禁用就用ls一层层翻先看 web 目录再看/tmp、/home、/root这些常见位置。3.2 拿到 shell 之后怎么找 flag命令执行只能一条条执行命令效率低。如果能反弹一个 shell 回来操作会方便很多。但中职组赛题通常不允许反弹到外网所以你只能在靶机本地找 flag。# 在命令执行里用 base64 编码绕过一些字符过滤 echo Y2F0IC9mbGFn | base64 -d | bash # 上面这行解码后是 cat /flagbase64 -d解码后再用bash执行可以绕过一些对关键字cat、flag的过滤。这是 CTF 里很常见的绕过手法。如果题目过滤了空格可以用${IFS}代替空格比如cat${IFS}/flag。flag 的常见位置包括/flag、/root/flag.txt、/var/www/html/flag.php、数据库里的某个表。如果 web 目录下有flag.php直接访问可能不显示需要配合文件包含或者 SQL 注入读出来。3.3 用 Nmap 做内网横向时的注意事项有些 B 模块题目会给你一台已经拿下的机器要求你以它为跳板扫描内网其他主机。这时候 Nmap 的用法和 A 模块不一样要注意扫描速度和隐蔽性。# 扫描内网 192.168.184.0/24 网段只做 ping 扫描看哪些主机存活 nmap -sP 192.168.184.1/24 # 对存活主机做端口扫描-Pn 跳过 ping 检测适合禁 ping 的主机 nmap -Pn -sS -p 22,80,3306,8080 192.168.184.1/24-sP是 ping 扫描只判断主机是否存活不扫端口速度快。-Pn是跳过主机存活检测直接扫端口适合目标禁 ping 的情况。-p 22,80,3306,8080指定只扫这几个常见端口减少扫描时间和流量。内网横向时不要用-T5虽然快但容易触发 IDS 告警而且丢包率高反而更慢。-T3或-T4是比较稳妥的选择。如果题目环境里有流量监控扫描间隔可以加--scan-delay 1s降低频率。4. 避坑与排查这套题最容易翻车的五个地方4.1 iptables 规则顺序写反导致 SSH 断连现象执行完 iptables 规则后当前 SSH 会话卡死重新连接提示超时。原因默认策略设为 DROP 之后没有放行已建立连接的规则或者放行规则写在了 DROP 后面。解决永远把-m state --state ESTABLISHED,RELATED -j ACCEPT放在第一条。如果已经断连通过 VNC 或物理终端登录执行iptables -F清空规则再重新按正确顺序配置。4.2 Nmap 扫描结果和实际开放端口不一致现象Nmap 显示 3306 开放但用 mysql 客户端连不上。原因Nmap 的 SYN 扫描只判断端口是否响应 SYN不判断应用层是否正常。有可能 MySQL 服务挂了但端口还被占用或者 iptables 只放行了特定源 IP。解决用nmap -sV -p 3306做版本探测如果显示tcpwrapped说明被防火墙拦截了。再检查 iptables 规则里 3306 的放行条件确认扫描主机的 IP 在允许范围内。4.3 MySQL 8.0 修改默认值语法报错现象执行ALTER TABLE 表名 ALTER COLUMN 字段名 SET DEFAULT 0提示语法错误。原因MySQL 8.0 之前版本不支持ALTER COLUMN ... SET DEFAULT这种写法需要用MODIFY COLUMN重写列定义。解决先SHOW CREATE TABLE 表名看当前列定义然后用ALTER TABLE 表名 MODIFY COLUMN 字段名 类型 DEFAULT 0修改。注意 MODIFY 要写全列的类型和属性否则会丢失原有约束。4.4 CTF 命令执行被过滤了关键字现象?cmdcat /flag返回空白或者提示 forbidden。原因靶机对cat、flag、空格等关键字做了黑名单过滤。解决用base64编码绕过或者用tac、head、tail替代cat用${IFS}替代空格用通配符fla?替代完整文件名。如果passthru被禁用试试system、exec、shell_exec这些函数。4.5 flag 文件找到了但读不出内容现象find找到了/flag但cat /flag提示权限不足。原因当前 shell 权限是 www-dataflag 文件权限是 root 600。解决先看有没有 SUID 文件可以提权find / -perm -4000 -type f 2/dev/null。或者检查 sudo 配置sudo -l看当前用户能执行哪些命令。如果题目只要求读 flag也可以试试通过 MySQL 的LOAD_FILE(/flag)读取前提是 MySQL 有 FILE 权限且 secure_file_priv 允许。5. 进阶技巧用一条命令完成端口扫描到规则生成的半自动化这套 AB 模块的题目做多了之后你会发现 A 模块的加固流程其实可以半自动化。我的习惯是先用 Nmap 输出 XML 格式的扫描结果再用一个 Python 脚本解析出开放端口自动生成 iptables 规则草稿最后人工审核一遍再执行。import xml.etree.ElementTree as ET # 解析 Nmap XML 输出提取开放端口 tree ET.parse(scan.xml) root tree.getroot() open_ports [] for host in root.findall(host): for port in host.findall(.//port): state port.find(state) if state is not None and state.get(state) open: port_id port.get(portid) service port.find(service) service_name service.get(name) if service is not None else unknown open_ports.append((port_id, service_name)) # 生成 iptables 规则草稿默认拒绝所有入站只放行必要端口 print(# 自动生成的 iptables 规则草稿请人工审核后执行) print(iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT) print(iptables -A INPUT -i lo -j ACCEPT) for port_id, service_name in open_ports: if service_name in (ssh, http, https): print(f# 放行 {service_name} 端口 {port_id}请确认来源 IP 范围) print(f# iptables -A INPUT -p tcp --dport {port_id} -s 你的管理网段 -j ACCEPT) else: print(f# 建议封堵 {service_name} 端口 {port_id}) print(fiptables -A INPUT -p tcp --dport {port_id} -j DROP) print(iptables -P INPUT DROP)这段脚本先用xml.etree.ElementTree解析 Nmap 的 XML 输出提取所有状态为 open 的端口和服务名。然后根据服务名判断SSH、HTTP、HTTPS 这类管理端口生成放行注释提醒你手动填来源网段其他端口直接生成 DROP 规则。最后输出默认策略为 DROP。注意脚本里放行规则是注释掉的因为来源网段需要根据实际环境填不能写死。这是自动化脚本的安全边界可以自动生成草稿但放行规则必须人工确认。我见过有人直接跑脚本把 3306 也放行了结果加固题反而被扣分。生成草稿后我会把规则写到一个临时文件里用iptables-restore --test先做语法检查确认没问题再正式加载。# 先测试规则文件语法是否正确 iptables-restore --test rules.v4 # 测试通过后再正式加载 iptables-restore rules.v4--test参数只做语法解析不实际修改内核规则表。这个习惯救过我很多次尤其是规则多的时候一条写错可能导致整个文件加载失败用--test可以先排掉语法错误。最后说一个我自己的教训做 A 模块加固时不要一上来就追求「全部封死」。先把题目要求的必封端口列出来逐条加规则每加一条就验证一次 SSH 是否还通。我早期比赛时图快一次性把规则全贴进去结果 SSH 断了重启靶机又回到初始状态白白浪费二十分钟。后来我养成的习惯是改 iptables 之前先开两个 SSH 会话一个用来操作一个用来兜底万一操作会话断了兜底会话还能进去清规则。这个习惯比任何技巧都管用。希望帮到你。本文还有配套的精品资源点击获取
