1. 项目概述与背景
最近在整理自己的学习笔记,翻到了几年前一次对某个教育机构内部测试站点的完整渗透记录。当时这个项目给我留下了很深的印象,因为它几乎涵盖了从外部信息收集到内网横向移动的完整链条,而且目标环境具有一定的代表性——很多中小型教育机构的技术栈和运维水平与之类似。今天我就把这个过程完整地复盘出来,一方面是对自己技术成长的一个记录,另一方面,也希望其中的思路、工具和踩过的坑,能给正在学习安全测试的朋友们一些实实在在的参考。请注意,整个过程均在合法授权的测试环境中进行,所有涉及的信息均已脱敏处理,核心目的是分享技术方法论与防御思路。
教育类站点往往有一些共同特点:它们可能承载了在线教学、教务管理、师生信息等多种业务,开发时更注重功能实现而非安全性,并且由于预算或技术能力限制,运维防护可能相对薄弱。这就使得它们常常成为安全演练的典型场景。我这次遇到的目标,正是一个典型的LAMP(Linux + Apache + MySQL + PHP)架构的Web应用,对外提供课程查询和资料下载服务。我们的任务就是模拟攻击者的视角,尝试发现并利用其安全漏洞,最终评估其风险等级。
2. 前期信息收集与资产探测
渗透测试的第一步,永远是尽可能多地收集目标信息。信息收集的广度与深度,直接决定了后续攻击面的宽度。对于这个教育站点,我没有急于直接访问其首页,而是从外围开始“画地图”。
2.1 域名与子域名发现
首先,我通过一些公开的查询工具和搜索引擎语法,收集了与目标主域名相关的所有信息。比如,利用site:语法在搜索引擎中查找被收录的页面,可以初步了解网站结构。更重要的是子域名枚举,很多管理后台、测试环境、 forgotten 的旧版应用都部署在子域名上。我使用了subfinder、amass这类工具,并结合证书透明度日志(CT Log)查询,一下子发现了几个有趣的子域名:一个是admin.xxx.edu,另一个是dev.xxx.edu,还有一个old.xxx.edu。admin和dev这类子域名往往是突破口。
注意:子域名枚举时,可以尝试组合不同的字典,并将结果与端口扫描结合。有时候,一个子域名可能解析到同一个IP的不同端口,提供非常规服务。
2.2 端口扫描与服务识别
拿到一批域名和对应的IP地址后,接下来就是对开放端口进行探测。我使用了nmap进行全端口扫描(-p-),但为了效率,通常会先快速扫描常见端口(-sS -sV -O)。扫描结果显示,主站(80/443端口)运行着Apache 2.4.29和PHP 7.2。除此之外,还发现了几个关键端口:
- 21端口:运行着ProFTPD 1.3.5。FTP服务如果配置不当,常常是入口点。
- 22端口:开放着SSH服务(OpenSSH 7.9p1)。这是尝试暴力破解或密钥泄露攻击的潜在目标。
- 3306端口:MySQL数据库端口直接暴露在公网!这是一个非常危险的信号,意味着可能允许远程连接。
- 8080端口:运行着一个Tomcat 9.0.27服务。Java应用往往有自己的一套漏洞体系。
端口扫描不仅仅是看“开没开”,更要关注“跑着什么”以及“什么版本”。版本信息是后续搜索漏洞利用代码(Exploit)的关键。
2.3 Web应用指纹识别与目录扫描
针对80和443端口的Web服务,我使用了Wappalyzer浏览器插件和whatweb命令行工具进行指纹识别,确认了CMS是某个开源的教学管理系统,版本号似乎被隐藏了,但通过一些特定文件(如readme.txt、CHANGELOG)的蛛丝马迹,可以推断其大版本。
接下来是目录和文件枚举。我使用了gobuster和dirsearch,搭配一个强大的字典文件。这个过程需要耐心,并且要关注返回的状态码(200, 301, 302, 403, 500)。很快,几个有价值的路径出现了:
/admin/: 管理后台登录入口,返回302重定向到登录页。/phpinfo.php: 存在!这是一个巨大的信息泄露点,不仅暴露了PHP配置、Web绝对路径,还可能包含环境变量。/backup/: 目录列表被开启,里面有一个database.sql.bak文件,可能是数据库备份。/uploads/: 文件上传目录,通常权限设置可能有问题。
phpinfo.php的存在几乎可以断定运维人员的安全意识不足,这让我对后续的测试充满了“期待”。
3. 漏洞扫描与手动验证
有了前面的信息铺垫,就可以开始寻找具体的漏洞了。我通常采用“工具自动化扫描 + 手动重点验证”相结合的方式。
3.1 自动化工具初筛
我使用Nessus和nikto对Web应用进行了漏洞扫描。Nessus报告了几个中危漏洞,包括Apache和PHP组件的某些版本存在已知漏洞,以及SSL/TLS的弱加密套件。nikto则直接提示了/phpinfo.php的信息泄露和/admin/目录的存在。
然而,自动化工具的报告只能作为线索。真正的漏洞往往需要手动去挖掘和验证。我决定先从最明显的几个点入手。
3.2 信息泄露漏洞利用
首先就是那个database.sql.bak文件。直接下载下来,用文本编辑器打开。果然,里面是完整的数据库表结构创建语句和部分测试数据。我从中找到了管理员表(wp_users)的结构,并且幸运地发现,插入的测试数据密码竟然是明文存储!虽然生产数据大概率是加密的,但这给了我两个重要信息:1)数据库表前缀是wp_;2)存在一个默认用户admin,密码是admin@123。
我立刻用这组凭证去尝试登录/admin/后台,以及FTP和SSH。结果后台登录成功了!但FTP和SSH失败。这说明密码可能被复用,但权限或认证方式不同。
3.3 SQL注入漏洞挖掘
进入后台后,我并没有急于进行下一步操作,因为后台本身可能功能有限。我回过头来测试主站的前端功能点。在课程查询页面,有一个根据ID查询课程详情的功能,参数是?id=1。
我尝试了最基本的注入测试:?id=1'。页面返回了数据库错误信息,暴露出后端是MySQL,并且错误信息被直接打印到了页面上——这是一个极佳的“报错注入”场景。通过一系列报错注入语句,如?id=1' and updatexml(1,concat(0x7e,(user()),0x7e),1)-- -,我成功地逐步获取了当前数据库用户(root@localhost)、数据库名、以及所有表名。
实操心得:在测试注入时,如果遇到有WAF(Web应用防火墙)的情况,简单的单引号可能会被拦截。这时需要尝试绕过的技巧,比如使用URL编码、注释符混淆、等价函数替换等。本例中没有WAF,所以过程比较顺利。获取到表名后,我重点查看了
wp_users表,通过报错注入的updatexml函数,将密码字段(user_pass)的值逐位提取出来。发现密码是WordPress经典的哈希格式($P$B...),这是经过phpass加密的。虽然无法直接破解,但结合之前备份文件里的明文密码,我推测运维可能使用了弱密码或统一密码。
3.4 文件上传与Webshell获取
在后台浏览时,我发现了“教学资料上传”功能。它允许教师上传PDF、Word等文档。我尝试上传一个带有PHP代码的图片文件(shell.jpg.php),但被前端校验拦截了。通过Burp Suite拦截修改请求,将文件名改为shell.jpg,内容却是一段PHP代码,并且将Content-Type改为image/jpeg,这次上传成功了!
但是,访问上传后的文件路径(/uploads/shell.jpg)时,Apache并没有把它当作PHP文件来解析,而是直接返回了图片的二进制内容或404。这是因为服务器可能没有配置对.jpg文件进行PHP解析。我需要找一个能解析的位置。
这时我想到了phpinfo.php泄露的绝对路径:/var/www/html/。结合之前FTP的发现,我决定尝试利用FTP服务。我用后台获取到的密码(以及其他常见弱密码)对FTP进行暴力破解,工具是hydra。命令如下:
hydra -l admin -P /usr/share/wordlists/rockyou.txt ftp://target.ip -t 4 -V运气不错,密码admin@123竟然对FTP也有效!我成功以admin用户登录了FTP。
登录FTP后,我直接尝试向Web根目录/var/www/html写入文件。由于FTP用户权限可能受限,我先尝试列目录,发现可以。然后尝试上传一个简单的PHP Webshell文件test.php,内容为<?php system($_GET['cmd']);?>。上传成功!
通过浏览器访问http://target.ip/test.php?cmd=id,页面返回了uid=33(www-data) gid=33(www-data) groups=33(www-data)。这意味着我成功获得了在Web服务器上的命令执行权限,并且当前进程运行在www-data用户权限下。
4. 权限提升与内网横向移动
获得一个www-data权限的Webshell只是第一步,它通常权限很低。我们的目标是获取最高权限(root),并探索内网。
4.1 从 www-data 到普通用户
在Webshell里,我首先运行sudo -l命令,查看当前用户可以用sudo以哪些用户的权限执行哪些命令。结果显示,www-data用户被允许以teacher用户的身份,无需密码运行/usr/bin/vi编辑器。
这是一个经典的权限提升向量。Vi编辑器可以在编辑文件时执行系统命令。具体操作如下:
- 在Webshell中执行:
sudo -u teacher /usr/bin/vi /tmp/test - 进入Vi后,输入
:! /bin/bash然后回车。 - 这样,我们就启动了一个新的bash shell,并且它的有效用户ID(EUID)变成了
teacher。输入whoami确认,已经是teacher用户了。
现在,我拥有了一个teacher用户的交互式shell。接下来查看teacher用户的家目录,发现了一个.ssh文件夹,里面有id_rsa私钥文件。这意味着我可以使用这把私钥通过SSH登录到teacher账户,获得一个更稳定的反向Shell。
4.2 从普通用户到Root
登录到teacher账户后,再次运行sudo -l。这次有了重大发现:teacher用户被允许以root身份,无需密码运行所有命令!配置大概是teacher ALL=(ALL) NOPASSWD: ALL。这简直是管理员配置的噩梦。
那么,权限提升就简单得不能再简单了:直接sudo su或sudo bash,输入当前用户密码(或者直接回车,因为配置了NOPASSWD),就获得了root权限。whoami返回root,目标达成。
注意事项:在实际测试中,这种
NOPASSWD: ALL的配置非常危险,但确实在一些内部管理不规范的机器上存在。更常见的情况是需要寻找具有SUID位的特殊程序、利用内核漏洞(如Dirty Cow)、或者查找包含密码的配置文件。拿到root后,第一件事就是查看/etc/shadow文件,获取所有用户的密码哈希,为后续可能的横向移动做准备。
4.3 内网信息收集
拿到root权限后,这台服务器就成了我在内网的“桥头堡”。我开始了内网信息收集:
- 网络接口:
ifconfig或ip addr显示,除了公网IP的网卡(eth0),还有一个内网网卡(eth1),IP是192.168.10.101。 - 路由信息:
route -n显示内网网段是192.168.10.0/24。 - ARP缓存:
arp -a可以看到当前与该主机通信过的内网其他主机IP和MAC地址。 - 查看历史与计划任务: 检查
~/.bash_history,crontab -l, 看看是否有其他服务器或服务的连接信息。 - 查看进程和连接:
netstat -antp发现该主机与192.168.10.20的3306端口有频繁的MySQL连接。这很可能是一台独立的数据库服务器。
4.4 横向移动到数据库服务器
既然发现了内网的数据库服务器(192.168.10.20:3306),并且当前机器作为Web服务器很可能配置了连接它的密码,那么密码很可能存储在Web应用的配置文件中。我回到/var/www/html目录,寻找config.php、wp-config.php、.env等文件。
果然,在网站根目录找到了config.inc.php,里面明文写着:
$db_host = '192.168.10.20'; $db_user = 'edu_db_user'; $db_pass = 'Edu@2024Secure!';现在,我有了内网数据库服务器的地址和凭据。由于我已经在Web服务器上有了root权限,我可以直接使用MySQL客户端连接过去:
mysql -h 192.168.10.20 -u edu_db_user -p'Edu@2024Secure!'连接成功!我可以查看、修改甚至删除整个教育站点的核心业务数据。至此,从外网Web渗透到内网数据库的横向移动已经完成。
5. 后渗透清理与痕迹清除
在授权的渗透测试中,清理痕迹是必要步骤,以模拟高级攻击者(APT)的行为,并评估防守方的检测能力。主要操作包括:
- 清除命令历史: 清除当前用户(root, teacher)的
.bash_history文件,并设置HISTSIZE=0临时禁用历史记录。echo "" > ~/.bash_history && history -c export HISTSIZE=0 - 清除Web日志: 删除或修改Apache的访问日志和错误日志(
/var/log/apache2/access.log,error.log)中与攻击相关的条目。更隐蔽的做法是只修改特定IP和时间的记录。 - 清除文件: 删除上传的Webshell(
/var/www/html/test.php)和通过FTP上传的其他工具。 - 清除进程与网络连接: 检查是否有异常进程或网络连接,并结束它们。使用
netstat和ps aux查看。 - 清除时间线: 使用
touch命令修改所创建或修改文件的时间戳,使其与系统其他文件时间保持一致。
重要提示:在真实的非法入侵中,这些行为是犯罪证据。本文仅从技术角度描述在授权测试环境中的操作流程。对于防御方来说,应该部署集中的日志审计系统(如ELK Stack),将日志实时传输到独立的、高权限访问的日志服务器,避免攻击者轻易篡改。
6. 漏洞根源分析与安全加固建议
整个渗透过程暴露了该教育站点从外到内、从应用到系统的多层安全缺陷。以下是核心问题与加固建议:
| 漏洞环节 | 具体问题 | 风险等级 | 加固建议 |
|---|---|---|---|
| 信息泄露 | 1.phpinfo.php文件可访问。2. 数据库备份文件 ( .bak) 存放在Web目录。3. 目录列表未禁用。 | 中 | 1. 删除或限制访问phpinfo.php等测试文件。2. 禁止将备份文件、源代码、配置文件存放在Web可访问目录。 3. 在Web服务器配置中关闭目录浏览功能。 |
| 访问控制 | 1. 后台使用默认/弱密码 (admin@123)。2. FTP服务与Web后台密码复用。 3. MySQL端口暴露公网。 | 高 | 1. 强制实施强密码策略,启用多因素认证(MFA)。 2. 禁止密码跨系统复用。 3. 数据库服务只允许内网IP访问,或通过SSH隧道连接。 |
| 输入验证 | 1. 课程查询功能存在报错型SQL注入。 2. 文件上传功能仅前端校验,可被绕过。 | 高危 | 1. 使用参数化查询(Prepared Statements)或ORM框架,彻底杜绝SQL注入。 2. 文件上传需在后端进行严格校验:检查文件扩展名、MIME类型、文件头,并重命名文件。将上传目录设置为不可执行脚本。 |
| 权限配置 | 1. FTP用户权限过高,可写Web目录。 2. sudo配置错误 (NOPASSWD: ALL)。3. 服务以高权限运行(如MySQL以root运行)。 | 高危 | 1. 遵循最小权限原则。FTP用户权限应严格限制,与Web用户分离。 2. 审计并收紧 sudoers配置,禁止无密码的ALL权限,按需分配具体命令。3. 为MySQL等服务创建专属的低权限系统用户运行。 |
| 内网安全 | 1. 数据库凭据明文存储在配置文件中。 2. 内网缺乏分段隔离,Web服务器被攻破后可直接访问数据库。 | 高 | 1. 使用环境变量或密钥管理服务(如HashiCorp Vault)存储敏感凭据。 2. 实施网络微隔离,将Web服务器、数据库服务器置于不同子网,通过防火墙严格控制东西向流量,仅开放必要的端口和协议。 |
7. 渗透测试中的常见问题与排查技巧
在实际操作中,很少有一帆风顺的渗透。以下是我在这次及以往测试中遇到的一些典型问题及解决思路:
工具扫描无结果或误报多怎么办?
- 问题:自动化扫描器(如Nessus, AWVS)可能因为WAF、流量整形或网站结构复杂而漏报,或者产生大量误报。
- 技巧:不要依赖单一工具。结合多种扫描器(如
nikto与gobuster互补),并始终以手动验证为准。对于WAF,可以尝试调整扫描速率,使用代理池,或利用WAF指纹识别后寻找规则盲区。
遇到登录框,没有凭据如何突破?
- 思路:a)暴力破解:使用
hydra,medusa等工具,但要注意账号锁定策略。b)查找默认凭据:搜索目标系统/框架的默认账号密码。c)密码重置漏洞:测试“忘记密码”功能是否存在逻辑漏洞,如可爆破重置验证码、可篡改重置邮箱等。d)SQL注入绕过登录:尝试在登录表单的用户名或密码字段进行注入,使用' or '1'='1这类Payload。
- 思路:a)暴力破解:使用
上传了Webshell但无法访问或执行?
- 排查:a)路径错误:确认上传后的完整URL路径。b)解析问题:服务器可能未配置对该后缀的解析。尝试
.php,.php5,.phtml等,或利用文件包含漏洞包含图片马。c)权限问题:Webshell文件是否有可读权限 (r)。d)被杀软拦截:内容可能被服务器端的WAF或杀毒软件静态查杀。尝试编码、混淆Webshell代码。
- 排查:a)路径错误:确认上传后的完整URL路径。b)解析问题:服务器可能未配置对该后缀的解析。尝试
反弹Shell连接不稳定或立即断开?
- 技巧:a)升级为完全交互式Shell:使用Python、Perl、Ruby等语言生成一个PTY。例如:
python -c 'import pty; pty.spawn("/bin/bash")'。b)使用稳定的反向Shell工具:如socat。c)后台运行与保活:在目标机器上使用nohup结合&让命令在后台运行,或者写入计划任务 (crontab)。
- 技巧:a)升级为完全交互式Shell:使用Python、Perl、Ruby等语言生成一个PTY。例如:
内网不出网,如何建立代理通道?
- 场景:拿下的内网服务器无法直接访问外网,但你需要将内网流量代理出来进行进一步探测。
- 方案:a)反向代理:如果内网机可以连到你的公网服务器,常用工具如
frp,ngrok,ew(EarthWorm)。b)正向代理:如果内网机不能出网,但你能连接到它,可以在它上面部署一个代理服务(如reGeorg的HTTP隧道),然后你的攻击机通过这个代理去访问内网其他资源。
这次对教育站点的渗透测试,像一次完整的“外科手术”,清晰地展示了一个看似普通的外部应用,如何因为层层叠加的安全疏忽,最终导致整个内网沦陷。技术本身并无善恶,关键在于使用它的人。对于企业或机构而言,安全建设绝非一劳永逸,而是需要持续投入、不断评估和改进的体系工程。定期进行渗透测试和安全评估,正是发现并修复这些“裂缝”最有效的手段之一。而对于我们安全从业者来说,每一次这样的实战复盘,都是对自身知识体系的一次巩固和升华。保持好奇心,深入理解每一行代码、每一个配置背后的含义,才能在攻防的博弈中走得更远。