
1. 从CH4INRULZ_v1.0.1的入口点说起为什么信息收集决定了后续所有攻击路径CH4INRULZ_v1.0.1这个靶机在圈子里被讨论得不少但大多数人把注意力放在了后面的提权和横向移动上反而忽略了最开始的信息收集阶段。我前后完整打了三遍这台机器第一遍卡在Web入口第二遍卡在权限提升第三遍才真正把整条链路走通。回过头来看前两遍之所以卡住根本原因不是技术不够而是信息收集做得太粗糙——扫到端口就急着去试漏洞看到目录就急着去找利用脚本结果漏掉了最关键的一些线索。这台靶机的设计思路很有意思它不像有些靶机那样把入口藏得特别深而是把线索分散在多个看似不相关的服务里。你需要把这些碎片拼起来才能看到完整的攻击面。这也是为什么我把它称为“信息收集的试金石”——如果你能在这台机器上把信息收集做扎实后面遇到更复杂的靶机时思路会清晰很多。这篇文章主要面向已经有一定渗透测试基础、但经常在信息收集阶段卡住的朋友。我会从最开始的端口扫描讲起一步步拆解每个服务背后可能隐藏的线索以及这些线索如何串联成一条完整的攻击路径。文章里提到的所有工具和命令都是通用型的你可以直接在自己的实验环境里复现。需要提前说明的是我使用的实验环境是完全隔离的本地虚拟网络所有操作都在合法授权的靶机上进行。提示渗透测试的核心不是“拿到shell”而是“理解为什么能拿到shell”。每一条命令背后都要有明确的意图否则你只是在碰运气。2. 端口扫描与服务识别别让“全端口扫描”变成走过场2.1 第一次扫描就漏掉了关键端口问题出在参数上我第一遍打这台机器的时候用的是最常规的nmap -sV -sC 目标IP扫出来的结果看起来挺正常22端口开着SSH80端口跑着Web服务还有一个不常见的端口。当时我觉得信息够了直接去Web目录爆破结果折腾了两个小时一无所获。后来换了一台机器重新扫用了-p-参数做全端口扫描才发现之前漏掉了一个高位端口上跑着的服务——那个服务才是真正的入口。这里要说的第一个经验是默认的nmap扫描只覆盖最常见的1000个端口很多靶机作者会故意把关键服务放在高位端口上。如果你不做全端口扫描很可能从一开始就偏离了方向。正确的做法是先用-p-做一次快速的全端口发现然后再针对开放的端口做详细的服务识别。# 第一步全端口快速扫描只关注哪些端口是开放的 nmap -p- --min-rate 5000 -T4 目标IP -oN all_ports.txt # 第二步针对开放端口做详细的服务版本和默认脚本扫描 nmap -sV -sC -p 22,80,其他开放端口 目标IP -oN detailed_scan.txt--min-rate 5000这个参数的意思是每秒至少发送5000个探测包在本地实验环境里可以大幅缩短扫描时间。-T4是时间模板表示比较激进的扫描速度。这两个参数配合使用全端口扫描通常在一两分钟内就能完成。2.2 服务版本信息里藏着作者留下的“彩蛋”拿到详细扫描结果后不要只看端口号和服务名称要仔细读版本信息。CH4INRULZ_v1.0.1的Web服务版本号里有一个很细微的线索——具体的版本字符串我在这里不展开但你要养成一个习惯把版本号复制出来去搜索引擎里查一下这个特定版本有没有已知的公开漏洞。很多时候靶机作者就是故意选用了一个有已知漏洞的旧版本等着你去发现。除了版本号还要注意扫描结果里的HTTP标题、SSL证书信息、SSH的banner信息。这些地方经常会出现一些看起来像用户名、路径或者提示词的字符串。我在这台机器上就从一个服务的banner里提取到了一个疑似用户名的字符串后来在爆破SSH的时候直接用上了省了很多时间。2.3 用表格整理扫描结果避免信息混乱当你扫了多个端口、跑了多个脚本之后输出会非常长。我的习惯是整理成一张表格把关键信息提取出来端口服务版本信息值得注意的细节22SSH某版本banner里有一个疑似用户名80HTTP某版本首页源码里有注释掉的路径高位端口自定义服务未知响应里包含一串编码后的字符串这张表格看起来简单但它能帮你在后续分析时快速定位到关键信息不用反复去翻扫描日志。尤其是当你同时打多台靶机的时候这种整理习惯能节省大量时间。3. Web服务的目录爆破与源码分析从“找不到”到“找到了但看不懂”3.1 目录爆破字典的选择比工具本身更重要Web入口是这台靶机最直接的攻击面但也是最容易让人受挫的地方。我第一遍用dirb的默认字典跑了一遍只发现了几个常规目录没有任何有价值的发现。第二遍换了gobuster字典换成了directory-list-2.3-medium.txt结果多发现了两个目录其中一个目录里有一个文件上传点。这里的关键不是工具而是字典。不同的字典覆盖的路径范围不一样有些字典偏重常见CMS的路径有些字典包含更多自定义的备份文件后缀。我的建议是至少准备三套字典分别覆盖常见目录、备份文件后缀、以及API接口路径。在本地实验环境里你可以把几套字典合并起来用虽然扫描时间会长一些但覆盖率会高很多。# 用gobuster做目录爆破指定扩展名和线程数 gobuster dir -u http://目标IP/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x php,html,txt,bak -t 50 -o gobuster_result.txt-x参数指定了要尝试的文件扩展名-t 50表示50个并发线程。在本地环境里这个速度是可以接受的但如果靶机性能有限建议把线程数降到20左右避免把服务打挂。3.2 源码里的注释和JS文件往往比目录更重要找到目录之后下一步是分析源码。很多人只看页面上的可见内容忽略了HTML注释、JavaScript文件、CSS文件里的信息。CH4INRULZ_v1.0.1的首页源码里有一段被注释掉的代码里面包含了一个路径和一个参数名。这个路径后来被证明是后台登录入口参数名则是一个潜在的注入点。分析源码的时候我通常会做这几件事查看页面源代码搜索!--、TODO、FIXME、admin、password等关键词下载所有JavaScript文件用工具格式化后搜索API端点、密钥、硬编码的凭证检查robots.txt和sitemap.xml虽然这两个文件经常被忽略但有时候会直接列出敏感路径用浏览器开发者工具查看网络请求看看有没有隐藏的AJAX接口注意分析源码时不要只看首页要把所有能访问到的页面都过一遍。有些线索藏在“关于我们”或者“联系我们”这种不起眼的页面里。3.3 从文件上传点到命令执行的完整链路在这台靶机上我最终找到的入口是一个文件上传功能。但上传功能本身并不直接导致命令执行中间还需要几步操作。具体来说上传的文件被存储在一个可以通过Web访问的目录下而且服务端没有对文件内容做严格检查。我上传了一个包含特定代码的文件然后通过访问该文件触发了代码执行。这个过程听起来简单但实际操作中有几个坑第一个坑是文件扩展名过滤。服务端可能只允许上传图片格式你需要尝试不同的扩展名绕过方式比如大小写混合、双扩展名、特殊字符截断等。第二个坑是文件内容检查。有些服务端会检查文件头你需要在上传的文件开头加上合法的图片文件头再把代码附在后面。第三个坑是上传目录的访问权限。上传成功后你需要知道文件被存到了哪个路径下这个信息可能来自源码、错误信息或者目录爆破结果。我在这台机器上用的是双扩展名加文件头伪造的方式具体命令这里不展开但思路你可以参考先上传一个合法的图片文件确认上传路径和访问方式然后再尝试构造包含代码的混合文件。4. 权限提升的排查链路从普通用户到root的完整过程4.1 拿到初始shell后的第一件事不是提权而是信息收集很多人拿到低权限shell之后第一反应是去找提权脚本跑一遍。这个做法本身没错但如果你对目标系统一无所知脚本的输出你也不知道哪些是重点。我的习惯是先手动做一轮基础信息收集再用脚本做补充。基础信息收集包括# 当前用户和权限 id whoami sudo -l # 系统版本和内核版本 uname -a cat /etc/os-release # 网络信息 ip addr netstat -antup # 定时任务 crontab -l ls -la /etc/cron* # SUID文件 find / -perm -4000 -type f 2/dev/null # 可写目录和文件 find / -writable -type d 2/dev/null这些命令跑完你基本就能对目标系统有一个整体认识。CH4INRULZ_v1.0.1在这方面的设计比较典型sudo -l的输出里有一条看起来不起眼但实际可以利用的配置/etc/cron*目录下有一个可写的脚本文件。4.2 sudo配置里的“小漏洞”往往是大问题的入口sudo -l的输出需要仔细看。有些配置看起来只是允许你以某个用户身份运行一个普通命令但如果那个命令本身可以调用其他程序或者读取任意文件就可能被用来提权。我在这台机器上看到的是一个允许以特定用户身份运行某个文本处理命令的配置。这个命令本身功能有限但它支持一个参数可以执行外部程序这就给了我可乘之机。具体利用方式是这样的我构造了一个特殊的输入文件让那个文本处理命令在处理过程中调用了我指定的程序从而获得了一个更高权限的shell。这个思路在提权里很常见核心就是找到sudo允许的命令然后查这个命令的文档看它有没有执行外部程序或者读写任意文件的功能。提示GTFOBins是一个很好的参考资源里面列出了大量可以被用来提权的常见命令。但不要死记硬背要理解每个命令为什么能被利用。4.3 定时任务提权的时机把握除了sudo配置定时任务也是这台靶机的一个提权点。我在/etc/cron*目录下发现了一个脚本文件这个文件被root用户定期执行但文件权限设置有问题普通用户也可以写入。这意味着我可以修改这个脚本的内容等它下一次被root执行的时候就会以root权限运行我插入的命令。这个提权方式的关键在于时机。你需要知道定时任务的执行周期然后在两次执行之间完成脚本修改。如果周期很短你可能需要快速操作如果周期很长你可以从容地修改脚本然后等待。我在这台机器上遇到的是每分钟执行一次的定时任务所以修改完脚本后不到一分钟就拿到了root shell。这里有一个细节需要注意修改脚本之前最好先备份原文件以免操作失误导致系统异常。另外插入的命令要尽量简单直接比如直接复制一个shell或者添加一个root权限的用户不要写太复杂的逻辑减少出错概率。4.4 提权后的收尾工作清理痕迹与验证权限拿到root shell之后不要急着关机或者截图。先做几件事验证权限id确认是rootcat /etc/shadow确认能读取敏感文件查找flag通常靶机作者会在/root目录下放一个flag文件读取它作为完成凭证清理痕迹删除你上传的工具、修改过的脚本要恢复原样、清理命令历史记录记录过程把整个攻击链路的每一步都记下来包括使用的命令、遇到的报错、解决的方法清理痕迹这一步在真实环境中非常重要但在靶机练习中很多人会忽略。我的建议是养成习惯即使在靶机上练习也认真做一遍这样到了真实项目里才不会手忙脚乱。5. 整条攻击链的复盘哪些环节最容易卡住怎么避免5.1 信息收集阶段的常见误区回顾整台靶机的攻击过程我发现最容易卡住的地方不是技术难点而是信息收集的完整性。具体来说有这几个误区第一个误区是只扫常见端口。前面已经说过全端口扫描是必须的不要偷懒。第二个误区是只看服务名称不看版本。版本信息里往往藏着关键线索尤其是当版本号比较旧的时候。第三个误区是忽略非HTTP服务。这台靶机上有一个非Web服务它的banner信息里包含了一个用户名这个用户名后来在SSH爆破中派上了用场。5.2 Web渗透阶段的思路调整Web渗透阶段最容易犯的错误是“一条路走到黑”。当你发现一个目录或者一个功能点之后不要立刻投入大量时间去深入利用而是先快速评估这个点有没有可能通向命令执行或者文件读取。如果没有就暂时记下来继续找其他入口。我在这台机器上的做法是先把所有能访问的页面和目录列出来然后按照“可能的上传点 可能的注入点 可能的信息泄露点”的优先级逐个排查。文件上传点排在第一优先级因为它最有可能直接导致代码执行。注入点排在第二因为利用起来需要更多步骤。信息泄露点排在第三因为它通常只是提供线索不能直接利用。5.3 提权阶段的排查顺序提权阶段的排查顺序也很重要。我的建议是先看sudo -l这是最快能出结果的地方再看SUID文件找那些不常见的SUID程序然后看定时任务尤其是root执行的定时任务最后看内核版本考虑内核漏洞提权这个顺序的逻辑是从“配置问题”到“权限问题”再到“系统问题”。配置问题最容易利用系统问题最复杂也最不稳定。CH4INRULZ_v1.0.1的提权点在前两类里都有所以不需要走到内核漏洞那一步。5.4 工具的选择与组合使用在整个过程中我用到的工具并不多但每个都用了不止一次工具用途使用阶段nmap端口扫描和服务识别信息收集gobuster目录爆破Web渗透netcat反弹shell和端口监听初始访问和提权linpeas自动化提权信息收集提权阶段GTFOBins查询可提权命令提权阶段工具不在多在于用熟。我见过很多人装了一堆工具但每个都只会用最基础的参数。我的建议是把常用的几个工具的参数手册过一遍知道每个参数是干什么的。比如nmap的--script参数可以调用大量现成的脚本gobuster的-x参数可以指定多个扩展名这些细节在关键时刻能帮你省很多时间。6. 从这台靶机延伸出去同类靶机的通用打法CH4INRULZ_v1.0.1虽然只是一台靶机但它涉及的攻击手法在同类靶机里很常见。如果你能把这台机器打透再遇到类似的靶机时思路会清晰很多。同类靶机的通用打法可以总结为一条链路信息收集 → Web入口 → 初始shell → 提权 → 横向移动如果有。每个阶段都有一些通用的检查清单信息收集阶段全端口扫描、服务版本识别、目录爆破、源码分析、banner信息提取。Web入口阶段文件上传、SQL注入、命令注入、文件包含、反序列化。按照从简单到复杂的顺序逐个尝试。初始shell阶段反弹shell的构造、shell的稳定化处理、基础信息收集。提权阶段sudo配置、SUID文件、定时任务、内核漏洞、环境变量劫持。横向移动阶段凭证复用、SSH密钥、内网扫描、代理转发。这条链路看起来简单但每一步都有很多细节。我的经验是不要追求一次成功而是追求每次失败都能获得新的信息。第一遍打不通没关系把卡住的地方记下来查资料、问朋友、重新分析第二遍往往就能突破。最后说一个我自己的习惯每打完一台靶机我都会写一份简短的复盘笔记记录三个东西——卡住的地方、解决的方法、下次可以改进的地方。这个习惯坚持了几年之后我发现自己遇到新靶机时卡住的时间越来越短因为大部分坑都已经踩过了。