网络安全技能大赛加固与溯源实战全解析

简介:面向职业院校网络安全竞赛选手与指导教师的2021年全国职业院校技能大赛网络安全赛项试题文档,聚焦服务器与Web环境的安全加固、流量保护、事件监控及应急响应等典型任务,可用于备赛训练、教学案例拆解与技能自查。压缩包内仅含1个docx文件,大小约119KB,以赛题文本和任务说明为主,便于直接阅读、打印或按任务拆分使用。该文档已有961人浏览学习,说明其在同类赛题资料中具有一定参考价值。内容按任务模块组织,覆盖Windows与Linux登录安全、密码与用户权限策略、MySQL安全运行与权限授予、IIS的HTTPS重定向、审核策略与事件监控、SSH与VSFTPD服务加固、防火墙端口封禁及ICMP限制,并延伸到网络安全事件响应、数字取证调查和应用安全,读者可据此梳理赛项考核范围、对照实验环境查漏补缺,并形成较完整的备赛任务清单。

1. 一套赛题拆成两层:加固和溯源谁先练

第一次拿到这类竞赛题,我建议先别急着照抄命令。这套题的项目 A 是“防守侧加固”,项目 B 是“攻击侧溯源”,看起来像两份独立的卷子,实际上是同一条链路上的两端:A 里配的每一条策略,都是 B 里黑客要么绕不过去、要么必须留下的痕迹。密码最短 16 位、禁用 445 和 23 端口、SSH 只放行指定源 IP,这些动作在加固里只是一行配置,在取证里却直接决定了你能不能从内存镜像和流量包中还原出攻击路径。这篇内容围绕网络安全技能大赛的这套真题,把 A、B 两个项目按“能复现、能对答案、能踩坑后自己爬出来”的方式过一遍,适合刚接触竞赛、准备照着练的新手,也适合带队的熟手拿来做检查清单。

2. 项目 A 加固:从登录到防火墙的六层落地

这一章我会按原题从任务一到任务六的顺序推进,但每一条都补上它为什么这样配、配完怎么验证,以及不同系统版本上常见的偏差。加固题的特点是没有唯一答案,但有明确的验收点:检查脚本读的是哪个文件、哪个参数、哪个界面,你就得落到那个位置上。

2.1 登录安全:密码长度与欢迎语的双平台配法

任务一里最容易丢分的是“改了但没生效”。Linux 侧要求最小密码长度不少于 16 位,落在/etc/login.defs的PASS_MIN_LEN;这里有个血泪经验,很多发行版实际生效的是 PAM 的pam_pwquality,光改login.defs在部分环境只对新建用户走一遍逻辑,检查脚本如果读的是login.defs就没事,如果读 PAM 配置你就得两边都改。稳妥做法是先把login.defs改到位,再顺手确认/etc/security/pwquality.conf里的minlen,两个位置保持同一个数值,避免验收时两边不一致。

# 修改最小密码长度,注意 PASS_MIN_LEN 可能被注释掉 sed -i 's/^PASS_MIN_LEN.*/PASS_MIN_LEN 16/' /etc/login.defs grep -n 'PASS_MIN_LEN' /etc/login.defs # 同步 PAM 侧,防止验收读另一处 grep -n 'minlen' /etc/security/pwquality.conf

Windows 侧走本地安全策略:管理工具 → 本地安全策略 → 账户策略 → 密码策略,把“密码长度最小值”设为 16。命令行更快,net accounts /minpwlen:16,但我一般会两条路都确认一遍,因为图形界面设置和命令行设置写的是同一处注册表,但检查组策略刷新需要gpupdate /force,不刷新生效时间不可控。

欢迎语这块分本地登录和远程登录两处。Linux 本地登录改/etc/issue,写 “For authorized users only”;远程 SSH 要单独配,在/etc/ssh/sshd_config里加Banner /etc/ssh/banner,然后新建/etc/ssh/banner文件写入同样内容。注意Banner指向的是绝对路径,文件权限别设成 600 以下导致 sshd 读不到,实际遇到过因为属主是普通用户、sshd 以 root 降权后读不到而静默不显示的情况。Windows 侧是“交互式登录:试图登录的用户的消息标题”和“消息文本”两项,都填上,只填一个在部分检查点算不通过。

2.2 会话超时与用户时间限制:别把参数名记混

远程非活动会话超时要求小于等于 5 分钟。Linux 用ClientAliveInterval和ClientAliveCountMax两个参数配合,实际断开时间约等于两者乘积,所以设成ClientAliveInterval 60加ClientAliveCountMax 5正好 300 秒;直接写 300 和 1 也行,但要注意部分检查脚本取的是ClientAliveInterval的值本身,写 60 反而被判失败,这种题我建议先看题目问的是“超时时间”还是“参数值”,对不上就按 300 和 1 配。

# SSH 会话超时,乘积约等于 300 秒 grep -nE 'ClientAlive' /etc/ssh/sshd_config printf 'ClientAliveInterval 300\nClientAliveCountMax 1\n' >> /etc/ssh/sshd_config sshd -t && systemctl restart sshd

Windows 侧在远程桌面会话主机设置里改 RDP-Tcp 属性的会话空闲超时,图形路径是管理工具 → 远程桌面服务 → 远程桌面会话主机设置。这里常见的翻车点是只改了“活动但空闲的会话”没改“活动会话限制”,检查脚本可能读后者。

用户登录时间限制是任务一里唯一带具体业务语义的:user1只能在周一至周五 9:00 到 18:00 登录。命令行用net user "user1" /time:M-F,9:00-18:00,域环境走用户属性里的“登录时间”对话框,注意域环境最小单位是小时,所以 9:00-18:00 在域里会被取整,题目要的是能截图的配置界面,做的时候把图形界面打开截好,别只留命令行记录。

“只允许管理员账号从网络访问本机”落在组策略的“从网络访问此计算机”用户权限分配上,把 Users、Everyone 之类删掉,只保留 Administrators。这条我一般会顺手确认“拒绝从网络访问这台计算机”里没有误加管理员组,两个策略叠加时拒绝优先,加错了会把自己锁在外面。

2.3 数据库加固:以普通用户跑服务是第一步

任务二的六条里,第 4 条最容易被忽略:让 mysql 以普通账户运行。改/etc/my.cnf的user参数为普通用户,同时要确保数据目录属主也改成该用户,否则服务起不来。改完必须重启并确认进程属主,光改配置不重启是自欺欺人。

# my.cnf 的 [mysqld] 段下增加普通用户运行 grep -n '^user' /etc/my.cnf sed -i '/^\[mysqld\]/a user = mysqluser' /etc/my.cnf chown -R mysqluser:mysqluser /var/lib/mysql systemctl restart mysqld ps -o user,cmd -C mysqld

第 5 条删默认库test用drop database test;,注意原题正文里写成了drop databases test;,多了一个 s,照抄会报语法错,这个细节在赛场上真有人栽过。第 6 条把管理员用户名改成SuperRoot,用update user set user='SuperRoot' where user='root';,改完必须flush privileges;,不然当前会话还认旧名。

第 7 条密码加密这条要特别注意版本差异。原题给的是update user set password=md5(password) where user="user1";,这是老版本 MySQL 的写法,5.7 之后password字段已经改成authentication_string,直接执行会报未知列。做法是先select version();看版本,5.7 及以上用:

-- 5.7+ 的写法,password 字段已改为 authentication_string update mysql.user set authentication_string = md5('P@ssw0rd1!') where user = 'user1' and host = 'localhost'; flush privileges;

第 8 条授权只有增删改查四个权限,不带grant option也不带drop,语句是grant select,insert,delete,update on testdb.* to 'user1'@'localhost';。这里容易错的是库名,题目正文写的是testdb,而第 5 条删的是test,是两个不同的库,别顺手写成同一个。

2.4 流量完整性与事件监控:IIS 的两处配置

任务三要求 HTTP 全量重定向到 HTTPS,证书颁发给test.com并通过https://www.test.com访问。IIS 里用 URL 重写模块配规则,匹配所有 HTTP 请求,动作选重定向到https://{HTTP_HOST}/{R:1},重定向类型 301 或 302 都行,但要把“仅针对非 HTTPS 请求”这个条件加上,否则会自己重定向自己形成死循环。证书绑定要在站点绑定里同时保留 80 和 443,80 只用来接重定向,不要直接停掉,停了就没有重定向这回事了。

任务四的审核策略在组策略里配:登录事件成功/失败、特权使用成功、策略更改成功/失败、进程跟踪成功/失败。配完用auditpol /get /category:*能看到当前生效状态,比翻界面快。注意“进程跟踪”默认可能是“无审核”,要显式改成成功和失败,这项在部分系统版本上叫“详细跟踪”,名字不同但对应同一个子类别。

2.5 服务加固:SSH、VSFTPD、IIS 三件套

SSH 改端口 2222 并禁止 root 远程登录,两处都在/etc/ssh/sshd_config。Port那行前面有注释符,去注释再改值;PermitRootLogin改成 no。改端口后有三件事必须同步做:防火墙放行 2222、SELinux 环境下给新端口打标签semanage port -a -t ssh_port_t -p tcp 2222,以及别把自己当前会话断掉。我一般先开一个新窗口用 2222 登录验证成功,再关旧窗口。

# 改端口并禁 root 登录,先验证再重启 sed -i 's/^#\?Port .*/Port 2222/' /etc/ssh/sshd_config sed -i 's/^#\?PermitRootLogin .*/PermitRootLogin no/' /etc/ssh/sshd_config sshd -t semanage port -a -t ssh_port_t -p tcp 2222 2>/dev/null systemctl restart sshd

VSFTPD 禁止匿名上传用anonymous_enable=NO,这一条同时把匿名登录也关了,题目只问上传但关登录不算错。超时那组参数要注意原题正文里的数值和注释对不上:注释写“无命令操作超时时长 600 秒”,可题目要求 5 分钟,也就是 300 秒。这种自相矛盾的地方以题目要求为准,idle_session_timeout=300、data_connection_timeout=300,另外两个主动、被动连接超时可以保持 600,但如果你要稳妥,四个都设 300 也不会被判错,因为要求是“无任何操作超时 5 分钟”,从严配不会超限。

IIS 加固两条:日志格式选 W3C,字段只勾日期、时间、客户端 IP、用户名、方法这五项,多勾了在严格检查下算不符合;最大并发连接数在站点高级设置里改成 1000。

2.6 防火墙:这些端口禁得对不对,看的是链的位置

任务六的六条里,Windows 禁 445 和 23 走高级防火墙入站规则,新建规则选端口,TCP,特定本地端口填 445 或 23,动作阻止,配置文件三个都勾上。只勾“域”不勾“专用/公用”是典型翻车点,靶机网络位置一变规则就不生效。

Linux 侧禁 23 用iptables -A INPUT -p tcp --dport 23 -j DROP,禁 ping 有三种做法:临时改/proc/sys/net/ipv4/icmp_echo_ignore_all、永久写/etc/sysctl.conf加net.ipv4.icmp_echo_ignore_all=1并sysctl -p、以及用 iptables 丢 ICMP type 8。三种里我建议至少做永久那一种,因为临时值重启就没了,而sysctl.conf是检查脚本最爱读的位置。

“禁止所有人通过 SSH 连接除了 172.16.1.1”这条最容易写反。正确顺序是先放行指定源,再拒绝其余:

# 顺序不能反:先 ACCEPT 指定源,再 DROP 其余 22 端口 iptables -A INPUT -s 172.16.1.1 -p tcp --dport 22 -j ACCEPT iptables -A INPUT -p tcp --dport 22 -j DROP iptables -L INPUT -n --line-numbers

iptables 规则是从上往下匹配,先 DROP 后 ACCEPT 的话,指定 IP 也进不来,这条每年都有人写反。规则写完记得用iptables-save持久化,不然重启全丢。

3. 项目 B 取证与应急:内存、流量、渗透三条线

项目 B 给的是一个企业被攻击后的场景,你要做的是查清攻击方式、找到后门、交报告。这一章按任务一到任务三拆,每类题我都给出“从哪下手、用什么命令、看到什么算对”的路径,Flag 形式在题里有明确规定,提交时只填括号内内容。

3.1 内存取证:从镜像里捞出密码、IP、矿池和服务名

内存取证的前提是拿到镜像文件,题里只给 Server1 的 IP,镜像在本地桌面或指定目录。工具用 Volatility,先识别镜像类型再选 profile,这一步错了后面全错。

# 先识别镜像信息,确定 profile volatility -f memory.dmp imageinfo # 提取用户 hash,用于破解 admin 密码 volatility -f memory.dmp --profile=Win7SP1x64 hashdump

拿到 hash 后用 hashcat 或 john 跑字典,题里说明密码是 6 位,字典里大概率有,跑不出来就上掩码爆破六位纯数字或小写字母,时间可控。IP 和主机名用netscan或connections配合volshell里的环境变量看,主机名在注册表键ControlSet001\Control\ComputerName\ComputerName里,用printkey直接读。浏览器搜索关键词从iehistory或 Chrome、Firefox 的历史记录结构里翻,Volatility 有对应插件。

挖矿进程的矿池地址是这类题的固定套路:先pslist或pstree找可疑进程名,常见是随机字符串或伪装成系统进程,再netscan看该进程的外连,矿池地址形如ip:端口。恶意进程注册的服务名用svcscan列服务,找 ImagePath 指向可疑可执行文件的那一条,服务名就是答案。

提示:内存取证题的 Flag 对格式敏感,IP 和主机名之间的冒号、矿池 IP 和端口的冒号都用英文半角,中文冒号一定判错。

3.2 流量分析:FTP 五连问的过滤顺序

流量分析题给了capture.pcapng,五个问题都围绕一次 FTP 入侵。Wireshark 里按顺序过滤最省时间:

问题过滤表达式看什么
账号密码ftp找 USER 和 PASS 两条请求
登录时间ftp看 PASS 返回 230 的那一帧时间
第一条命令ftp.request.command登录成功后的第一条请求
下载文件名ftp找 RETR 请求里的路径
下载文件内容跟踪 TCP 流在 RETR 对应的数据流里看明文

账号密码在USER xxx和PASS xxx两条里,注意可能有多次尝试,取返回 230 成功的那一组。登录时间取成功响应帧的Time列,格式HH:MM:SS,别带日期。第一条命令是登录成功后客户端发的第一条请求,通常是SYST或PWD,按时间排序看第一条。下载文件名在RETR后面,文件内容要右键该帧“追踪 TCP 流”,FTP 数据通道是明文,内容直接可读,遇到二进制内容就以题目给的 Flag 格式为准取可读部分。

3.3 渗透测试:Nmap 到 MSF 的五步命令链

任务三的五问其实是一条完整工作流的五个节点,背下来就是一套模板。第一问考 Nmap 输出 XML 的参数,答案是-oX;第二问初始化 MSF 数据库是msfdb init;第三问导入后查看主机用hosts;第四问search cve-2019-0708的回显里有公开时间,格式YYYY-MM-DD;第五问调用模块检测漏洞,回显最后一个单词通常是Vulnerable或The,以实际回显为准。

# Nmap 扫描并输出 XML,-oX 是题目第一问的答案 nmap -sV -oX scan_result.xml 192.168.1.10 # 初始化数据库、启动 MSF、导入扫描结果 msfdb init msfconsole -q db_import /root/scan_result.xml hosts search cve-2019-0708

CVE-2019-0708 的利用模块是exploit/windows/rdp/cve_2019_0708_bluekeep_rce,检测时设置 RHOSTS 后check,回显最后一行会给出目标是否受影响。这类题的关键不是打进去,而是把每个命令的输出对到 Flag 上,所以每一步都留好截图或文本记录。

4. 避坑清单:这五处我曾经栽过

加固和取证两类题的错误分布很不一样:加固错在“改了没生效”,取证错在“找错对象”。下面五条是复盘时出现频率最高的。

第一条,改完sshd_config不跑sshd -t直接重启,配置有语法错服务起不来,人就被锁在门外了。现象是 SSH 连接拒绝,原因是配置文件里参数写错或重复行冲突,解决是先sshd -t验证,报错行号直接指出来,改完再重启,并且永远保留一个已登录会话做后路。

第二条,iptables 规则顺序写反。现象是放行的 IP 也连不上,原因是 DROP 规则排在了 ACCEPT 前面,包在第一条就被丢了,解决是用iptables -L INPUT -n --line-numbers看序号,-I插到正确位置,或者清空重来按先放行后拒绝的顺序写。

第三条,MySQL 密码加密语句照抄老版本写法。现象是执行报未知列password,原因是 5.7 之后字段改名为authentication_string,解决是先查版本再选语句,老版本用password,新版本用authentication_string,改完都flush privileges。

第四条,Wireshark 里直接搜关键字找 FTP 密码。现象是搜出一堆无关内容,原因是明文流量里关键字出现多次,解决是按协议字段过滤ftp再看USER、PASS字段,取成功登录那一组,不要凭关键字猜。

第五条,内存取证 profile 选错。现象是插件全部报错或输出为空,原因是镜像版本和 profile 不匹配,解决是先imageinfo看建议的 profile,取第一个候选,实在不确定就逐个试kdbgscan的结果。

5. 最后落到一条可复用的检查习惯

这套题做完,我最大的感受是:加固题的分不在“会不会配”,而在“配完有没有验证”。我现在的固定动作是每改一处配置,立刻跑一条对应的读取命令,把生效值打出来,比如改完密码策略grep PASS_MIN_LEN /etc/login.defs,改完 SSHsshd -T | grep -E 'port|permitrootlogin|clientalive',改完防火墙iptables -L INPUT -n。这条习惯来自一次模拟赛:当时六条防火墙规则我全写了,自测 ping 不通就交卷,结果检查脚本读的是sysctl.conf而不是运行时值,临时改的那条重启后失效,白丢一题。

取证侧对应的习惯是“先定对象再动手”。拿到内存镜像先imageinfo定 profile,拿到流量包先看协议分布再决定过滤条件,拿到靶机先nmap -sV再进 MSF。跳过这一步直接上工具,大概率是在错误的对象上跑正确的命令,输出看着正常,答案全错。

把这套题当练习时,我建议按“加固 → 自己攻自己 → 取证复盘”的顺序走一遍:先在虚拟机上把项目 A 的六类加固做完,然后用项目 B 的思路去查自己这台机器,看看改过的配置在内存和流量里留下什么痕迹,最后对着 Flag 格式核对一遍。这么走一轮,A 和 B 就不再是两份卷子,而是一条你能自己闭环的链路。希望帮到你。

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