news 2026/9/24 22:26:03

中职网络安全赛AB模块解析:Nmap扫描与iptables加固实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
中职网络安全赛AB模块解析:Nmap扫描与iptables加固实战

简介:这份资源是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 而不是 REJECT,DROP 是直接丢包不回应,REJECT 会返回一个错误信息,暴露你的规则存在。

改完规则后很多人会问「iptables 配置后需要重启程序吗」。答案是:iptables 规则是即时生效的,不需要重启任何服务。但如果你重启了机器,规则会丢失,所以要用iptables-save持久化。

# 保存当前规则到文件 iptables-save > /etc/iptables/rules.v4 # 开机自动恢复,在 /etc/rc.local 里加一行 iptables-restore < /etc/iptables/rules.v4

iptables-save把当前内存中的规则导出成文本,iptables-restore从文件读回来。不同发行版持久化的路径不一样,Debian/Ubuntu 常用/etc/iptables/rules.v4,CentOS 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 user='root' 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 0,5.7 可能需要用MODIFY COLUMN重写整个列定义。

FLUSH PRIVILEGES在直接操作mysql.user表之后必须执行,否则权限变更不会立即生效。如果你用的是GRANTREVOKE语句,那不需要手动 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=,那基本可以确定是命令执行漏洞。你可以先试?cmd=whoami看当前权限,再试?cmd=ls看目录结构。

# 通过 URL 参数执行命令,查找 flag 文件 curl "http://target.com/vuln.php?cmd=find / -name 'flag*' 2>/dev/null" # 如果 find 被禁用,用 ls 逐层翻 curl "http://target.com/vuln.php?cmd=ls -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 /flag

base64 -d解码后再用bash执行,可以绕过一些对关键字catflag的过滤。这是 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 命令执行被过滤了关键字

现象?cmd=cat /flag返回空白或者提示 forbidden。

原因:靶机对catflag、空格等关键字做了黑名单过滤。

解决:用base64编码绕过,或者用tacheadtail替代cat,用${IFS}替代空格,用通配符fla?替代完整文件名。如果passthru被禁用,试试systemexecshell_exec这些函数。

4.5 flag 文件找到了但读不出内容

现象find找到了/flag,但cat /flag提示权限不足。

原因:当前 shell 权限是 www-data,flag 文件权限是 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(f"iptables -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 会话,一个用来操作,一个用来兜底,万一操作会话断了,兜底会话还能进去清规则。这个习惯比任何技巧都管用。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/24 22:25:08

打造AI安全审计技能:SKILL.md设计与落地实践

最近我把团队内部用了两个月的security-audit-skill整理成了独立仓库。起因很直接&#xff1a;团队里几个主力开发都开始用 Claude Code 和 Codex 写业务代码&#xff0c;AI 产出速度确实快&#xff0c;但安全上总是漏风。更尴尬的是&#xff0c;你让模型直接做代码审计&#x…

作者头像 李华
网站建设 2026/9/24 22:24:09

构建可复用的AI安全审计Skill:设计思路与实践

如果你最近在折腾AI编程助手&#xff0c;一定绕不开一个词&#xff1a;skill。GitHub上各类skill仓库一夜之间多了起来&#xff0c;有人做会议纪要&#xff0c;有人做PPT生成&#xff0c;有人把论文检索流程也塞进去。但真正面向安全审计场景的skill&#xff0c;翻来覆去就那么…

作者头像 李华
网站建设 2026/9/24 22:22:57

基于SSM的社区食堂供餐系统:Java毕设项目设计与实现解析

每年毕业季前后&#xff0c;技术社区里问“毕设做什么”“SSM到底怎么跑起来”的人一下子就多起来了。“ssmjava2026年毕设社区食堂供餐”这个题目标题&#xff0c;实际上代表了一类非常典型的Java毕业设计项目&#xff1a;用SSM框架做一个面向社区食堂的业务管理供餐系统&…

作者头像 李华
网站建设 2026/9/24 22:22:56

告别内耗:5个顶级思维模型让你活得更通透

前几天和老王喝酒&#xff0c;他跟我讲了这么一句话&#xff1a;“人这辈子所有的痛苦&#xff0c;都来自于想不通。想通了&#xff0c;快乐是随时可以启动的事。”老王是我朋友圈里公认活得最通透的一个人。按世俗标准看&#xff0c;他不算大富大贵&#xff0c;开一辆开了八年…

作者头像 李华
网站建设 2026/9/24 22:21:54

国产旗舰芯片真相:3nm不是终点,系统协同才是体验核心

1. 这不是芯片参数表&#xff0c;而是一份国产旗舰的“技术进化路线图”最近刷到一条热搜&#xff1a;“5款还在用3nm芯片&#xff01;十二款国产旗舰新机&#xff0c;分别搭载哪款芯片&#xff1f;”——第一眼我就笑了。不是笑标题夸张&#xff0c;而是笑它精准戳中了当下消费…

作者头像 李华
网站建设 2026/9/24 22:21:47

零基础AI漫剧制作全流程:ComfyUI+minimaxH3从剧本到成片

做AI漫剧这件事&#xff0c;我从最早只会用现成工具拼素材&#xff0c;到后来把ComfyUI和minimaxH3串成一条完整流水线&#xff0c;中间踩过的坑比想象中多得多。很多人第一次看到AI漫剧会觉得门槛很高——要写剧本、画分镜、生成静帧、让画面动起来、配音、剪辑&#xff0c;听…

作者头像 李华