这次翻出来一台比较老的练习靶机VulnOS 2。这台靶机在这个系列的第17篇里出现我自己在本地虚拟机里反复跑了好几遍每次都会重新梳理一遍攻击链才发现之前漏掉过不少细节。它的特点是模拟了一台对外暴露Web服务的Linux主机从信息收集、CMS漏洞利用到系统提权链路完整、难度适中非常适合新手当作渗透测试的第一台完整靶机来打。这篇笔记把我实际操作中踩过的坑、用过的工具以及每一步的判断依据全部记录下来希望能让第一次接触的人少走弯路。事先强调一句所有操作都在本地虚拟化环境中完成请只对你拥有授权的目标使用同类方法。1. 靶机整体分析与方案选型思路1.1 这台靶机练的是什么VulnOS 2不是什么复杂的漏洞集合它的核心价值在于“最像真实的Web服务器”。它默认开放了SSH和HTTP服务Web层跑的是一个开源CMS系统。攻击者无法靠单一漏洞直达root而是要走完“开放端口识别 - Web目录扫描 - 敏感信息泄露 - 凭据获取 - 后台功能滥用 - 低权限Shell - 本地枚举 - 内核提权”这一整条链路。对学习者来说每一个阶段都是独立的技能点组合起来就是一次完整的渗透测试。我比较欣赏这台靶机的一点是它没有把答案写在脸上。第一次打的时候首页打开是个Apache默认页会让人误以为目标没什么内容。这种“伪装”恰恰是真实环境里的常态很多业务站点都藏在子目录、备用域名或者某个不起眼的重定向后面。能耐心从默认页里找到真实入口比单纯学习某个CVE更有价值。另一个值得强调的点是它的漏洞形态比较典型不是靠一天到晚的0day而是CMS版本过旧、配置不当、口令太弱几个老问题叠加在一起。现在很多内网系统出问题原因也基本都是这几个所以练习价值很高。不管你是刚入行的新手还是想复盘基础功的老手这台靶机都能带来一些收获。1.2 进攻链路设计与工具准备实操之前我会先把攻击链路在脑子里画一遍信息收集阶段用netdiscover和nmap目录扫描阶段用gobuster或dirsearchCMS指纹识别用whatweb加浏览器手工确认口令恢复用john最后提权阶段需要准备编译好的提权程序。这样整条线路清晰了动手的时候就不会东一榔头西一棒子。工具准备方面攻击机我用的Kali靶机放在VMware里。这里有一个容易被忽略的细节网络模式最好固定成NAT或者仅主机。NAT模式下攻击机和靶机都挂在同一个虚拟交换机上IP分配稳定流量也只在虚拟网络内部走不会影响宿主机网络。使用桥接模式有时候会拿不到IP或者IP和宿主机局域网里其他设备冲突白白浪费排查时间。字典方面目录爆破我会准备两套一套是dirsearch自带的普通字典另一套是常见的web目录大字典。口令恢复用的字典是Kali自带的rockyou.txt首次使用前需要先解压。建议把字典都放到同一个目录下后面写命令方便很多。还有一个小建议每次打靶前先给攻击机和靶机各做一次快照。打的过程中如果搞乱了某个服务或者提权把系统搞崩了恢复快照比重新安装镜像快得多。这个习惯在后续练习复杂靶场时非常有用。2. 信息收集与CMS漏洞识别2.1 主机发现与端口指纹靶机开机后第一件事是把它的IP找出来。本地虚拟网络里我习惯用netdiscover扫描整个网段netdiscover -r 192.168.1.0/24运行十秒左右就能看到一个陌生的IP出现在列表里那就是靶机。这一步看似简单但很多人会在桥接模式下扫描半天扫不到原因往往就是攻击机和靶机不在同一个虚拟网段调整网络模式后立刻解决。确定目标IP后用nmap做一次全端口服务识别nmap -sS -T4 -sV -p- 192.168.1.x从扫描结果看开放端口集中在22和8022端口是OpenSSH80端口是Apache HTTP服务。这个结果基本说明了两件事一是Web是主要入口应该优先投入精力二是SSH端口虽然开着但不到万不得已不要急着爆破否则既浪费时间又容易暴露攻击意图。有个细节值得注意很多人习惯只扫默认的1000个常用端口或者看到80、22就停止扫描。对于靶机练习来说问题不大但真实环境中高危服务经常跑在高位端口上所以养成-p-全端口扫描的好习惯对你以后打真实环境会有很大帮助。2.2 目录扫描与敏感信息定位打开浏览器访问目标80端口第一眼看到的是Apache默认页面不是CMS首页。这个现象说明站点根目录可能只是个占位页真正的应用安装在子目录下。我用gobuster跑了一遍默认字典gobuster dir -u http://192.168.1.x -w /usr/share/wordlists/dirb/common.txt -x php,html,txt跑完发现一个类似/opencms/的子目录继续访问后终于看到CMS站点。到这里入口才真正出现。紧接着对CMS子目录做第二轮深度扫描扫描到了一些敏感路径。其中一个路径返回的信息量非常大应用部署路径、数据库连接配置、admin用户的密码哈希全部暴露在一起。这个环节最容易踩的坑是“只看状态码不看内容”。目录扫描工具会返回大量403和404有些人看到403就觉得没戏其实403有时候是权限限制但可以通过路径变异绕过404也可能是服务器对不存在资源返回的默认响应。更稳妥的做法是过滤出200和302状态码再逐个访问确认内容。第二轮扫描的时候建议单独跑一个更丰富的字典比如/usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt同时加上-t线程参数控制速度避免给目标带来过大压力。2.3 OpenCMS版本指纹与弱点的根源通过页面底部的copyright信息和页面源码中的generator标签可以确定CMS版本是OpenCMS 8.x。这类开源源码在信息泄露方面非常“慷慨”通常会在静态资源路径、模块加载路径里带上版本号这正是指纹识别的首选依据。这个版本存在的典型问题并不是SQL注入那种需要复杂构造的漏洞而是“路径映射过度宽松”带来的敏感信息泄露。用生活化的类比来说正常情况下的站点后台像一间办公室前门是前台、后门是仓库仓库门平时应该锁好但这个版本的CMS把所有房间的门都装上了透明玻璃路过的人能直接看到墙上的密码便签纸。攻击者可以通过构造特殊路径绕过Web容器的权限检查直接读取站点内部的配置文件和资源列表。缺陷根源在于两点一是Web容器层面的访问白名单配置不严格没有拒绝指向内部路径的直接请求二是CMS自身把敏感资源放在了可被直接访问的目录下两相叠加就酿成了泄露。这里放一张我当时记录的目录信息价值对照表扫描路径返回内容对攻击链路的价值CMS根目录站点首页与框架信息确认CMS类型与版本静态资源目录部分资源可直接访问发现目录结构线索配置相关路径数据库配置与账号哈希打开后台入口关键后台管理入口登录页面下一阶段利用目标3. 从后台到Shell的完整实操记录3.1 哈希识别与口令恢复从泄露文件里拿到了一串类似用户名:密码哈希的内容admin用户的密码哈希是典型的MD5格式。我用hash-identifier做了一次哈希类型识别确认是传统MD5口令哈希。将哈希内容写入本地文件后用john配合rockyou.txt字典进行离线爆破john --formatraw-md5 --wordlist/usr/share/wordlists/rockyou.txt hash.txt爆破过程非常顺畅几秒内就恢复了明文密码。这里多说一句不要新手一看到哈希就依赖在线彩虹表网站一方面目标网络可能不允许外联另一方面本地字典配合john更可控也更方便你观察爆破过程和结果。如果默认字典爆破失败还可以尝试john的规则组合john --formatraw-md5 --wordlist/usr/share/wordlists/rockyou.txt --rulesAll hash.txt这个操作会对字典里的每个词做大小写、数字替换、尾部追加等变形覆盖口令规律比单纯词典要广得多。我在其他靶场里靠这个规则救回过很多次。3.2 登录后台并上传WebShell拿到后台口令后直接访问CMS的管理入口输入admin和爆破出的密码成功登录。OpenCMS后台提供了模板管理、模块上传、文件管理等功能其中模板管理是最关键的突破口。我选择的方式是编辑现有模板文件在模板尾部插入一段调用系统命令的脚本保存后访问该模板对应的URL触发解析。这一步成功之后就拿到了Web层到操作系统的桥梁。经验之谈很多人拿到后台会习惯性盯着“文件上传”一个点猛挖这其实是很多新手的思维盲区。CMS后台的功能功能非常多不同CMS的突破口也完全不同。比如OpenCMS更偏向模板和模块管理WordPress是插件和主题编辑而某些Java CMS则容易在计划任务里做文章。正确做法是先花五分钟梳理后台所有功能点再决定从哪里入手。执行命令的WebShell不好操作界面刷新慢、输出也不完整所以下一步是把会话升级为反弹Shell。3.3 反弹Shell与交互终端优化攻击机先开启本地监听nc -lvnp 4444然后在WebShell处让目标机发起连接很快就能拿到一个低权限的交互Shell。刚拿到的Shell通常不支持终端控制按CtrlC甚至会直接断开连接非常影响后续操作。这时候需要做一个pty升级。常用的方式是通过Python调用标准库python3 -c import pty; pty.spawn(/bin/bash)然后执行CtrlZ把进程放到后台再配置终端原始模式最后用fg切回会话。这一段操作对新手来说比较绕但效果立竿见影升级后的Shell支持Tab补全、历史命令和终端清屏体验和SSH终端基本一致。我建议把这段流程记在笔记里后面打绝大多数靶机都会用到。在升级终端这个细节上还有备选方案如果目标系统有socat可以传一个socat静态二进制上去起一个完全交互的会话如果目标有Perl也可以用perl -e use POSIX;...的方式。脚本语言缺失时最实用的还是Python。4. 本地枚举与提权全流程4.1 低权限下的系统枚举进入系统后我的标准操作顺序是确认当前身份、确认内核版本、确认发行版、检查sudo权限、寻找SUID文件、查看系统服务和计划任务。整组命令大概是这样的id uname -a cat /etc/os-release sudo -l find / -perm -4000 -type f 2/dev/null cat /etc/crontab当前低权限用户是www-data这是Web服务进程的默认账户权限很低。sudo -l没有任何可用条目说明这台机器上没有配置普通用户的sudo白名单。SUID文件列表里也没有明显可利用的自定义程序。这样一来提权方向就自然集中到了内核漏洞上。这里的枚举过程有很强的复现价值真实环境里提权路径多种多样可能是某个服务以root运行、某个计划任务写权限配置不当、某个备份脚本可被篡改。不要一进系统就开始搜索提权脚本而是先花几分钟把基础信息收集完整再判断哪条路最靠谱。4.2 内核漏洞特征与提权思路从uname输出可以看到目标内核版本比较旧这样的老内核在十年前曾曝出多个本地提权漏洞。判断方向时我考虑了几点内核版本是否在受影响范围内、发行版是否已经通过补丁修复、目标架构是x86还是x64。确定存在利用条件后还需要解决一个很现实的问题目标系统上没有安装编译器。解决思路是提前在攻击机上准备好与目标架构匹配的静态编译提权程序再通过当前Shell上传过去执行。这提醒我们在做渗透测试或靶机练习时准备一套基本的编译环境是很有必要的否则真到了用exp的时候会发现目标连gcc都没有。提权程序执行成功后运行id确认uid已经变为0uid0(root) gid0(root) groups0(root)看到这个输出的时候整条攻击链正式走通。这一步的要点在于确认漏洞特征要谨慎不要拿着一个exp盲目乱试否则很容易导致目标系统崩溃重启、前功尽弃。4.3 拿到root后的验证拿到root之后我习惯进入/root目录读取flag文件作为靶机完成的标志。做完整套测试后还需要再快速扫描一遍系统检查是否有新增的SUID文件、计划任务是否被篡改、临时目录有没有异常脚本。这个习惯来自实际工作中的应急响应经验能让你在复盘时理清每一步做了什么改动也方便直接对照日志去还原攻击链。5. 常见问题排查与防御复盘5.1 环境与实际操作问题速查表打靶过程中容易遇到的问题我整理成了一个速查表对应原因和解决办法都列在下面现象可能原因解决方法netdiscover扫描不到靶机网卡模式与网段不匹配检查NAT/仅主机模式确认两个虚拟机同网段访问80端口出现403目录索引被关闭或权限限制配合目录扫描工具继续探测不轻易放弃目录扫描结果太少字典太小或只看了默认端口切换大字典对子目录做二次扫描哈希爆破无结果哈希类型识别错误用hash-identifier二次确认加--rules规则重试Shell动不动就断开没有做pty升级使用Python或socat完成交互终端升级提权exp编译失败目标缺少gcc或内核头文件改在攻击机交叉编译上传静态二进制靶机系统崩溃随意尝试多个提权exp打快照后逐个验证避免盲目执行这些坑大多我自己都踩过。印象最深的是第一次打的时候目录扫描工具默认字典跑完一片空白我差点以为思路有问题后来换了个大字典才发现是字典太小导致漏报。工具不是越高级越好关键是要理解它的边界和限制。5.2 站在管理员视角的加固建议打完整套VulnOS 2之后再从管理员视角看这台机器会发现被攻破的原因其实很“常规”CMS长期不更新、Web容器没有限制敏感目录的访问、后台口令使用简单哈希保护且口令强度不足、系统没有及时更新内核、Web服务进程权限过高。对应的加固措施也很清晰。CMS层面要做的就是升级到最新版本并持续关注官方安全通告Web容器层面要在反向代理或Apache配置中显式拒绝内部路径和配置目录的直接访问口令安全方面后台应该强制高强度口令并启用双因素认证系统层面需要自动化补丁更新机制至少保证重要安全更新及时落地。从更大的视角看VulnOS 2其实是一个浓缩版的企业内网失陷案例攻击者不是靠多高深的技术而是通过信息泄露拿到后台密码再通过老漏洞完成提权。安全建设的重点始终是基础工作这一点无论过了多少年都适用。最后分享一点个人体会。这台靶机我前前后后打过好几遍第一遍卡在最开始的信息收集上总觉得“看不到入口”后来才发现不是没有入口而是自己扫描太粗糙漏掉了子目录。打靶给我最大的收获不是记住某个漏洞的利用方式而是养成一套“逐步收敛攻击面”的思维习惯。建议新手每一遍都对着自己的命令记录做复盘把每一步的判断依据写下来这样做比照着别人的教程敲一遍有用得多。
阅读完成 · 觉得有帮助?