ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

CTFshow信息收集11-15题实战:从HTTP细节到备份文件挖掘

CTFshow信息收集11-15题实战:从HTTP细节到备份文件挖掘 最近又把ctfshow平台Web入门系列里的信息收集部分从第11题到第15题从头到尾刷了一遍。说实话这五道题在整套信息收集题目里是一组很容易被忽略的“分水岭”题目本身难度不算高但设计得相当有心机。如果你已经能轻松搞定前面那些靠“肉眼找flag”的题目那么从第11题开始考察的重心会逐渐从“看页面”转向“动手查、翻文件、抓细节”。我打完这几题之后最大的感受是信息收集不是靠运气碰而是一套可以训练、可以标准化、甚至可以写进工作流里的技能。这篇文章就把我在做题过程中的拆解思路、常用命令、工具选择和踩过的坑整理出来希望能帮到正在卡关的朋友。1. 这五道题到底在考什么题型特征与难度曲线1.1 11-15在整套信息收集系列里的位置先说说信息收集系列的整体布局。CTFshow的Web入门模块信息收集部分题目序号从前往后其实是有梯度设计的。开头几道题基本是让你学会“看”——查看网页源代码、按F12打开开发者工具、看看有没有注释、看看响应头。这些属于“送到嘴边”的题目只要知道方法就能做出来。但到了第11题到第15题情况就不太一样了。题目不会再把flag摆在页面上等你拿而是会把它藏在一些“你不主动去找就不会发现”的地方比如备份文件、临时文件、配置信息、HTTP协议细节、甚至是你对某个目录的访问习惯里。换句话说这一段的题目开始考察你“会不会主动探索”而不是“会不会看”。这种探索能力实际上就是信息收集的核心能力。我在刷这几题时明显感觉到的节奏变化是前面题目可能几分钟就过一道但第11到15题每一步都需要停下来思考“刚才拿到的信息能往哪个方向继续推导”。比如某个响应头字段可能指向一个后台路径某个奇怪的注释可能暗示了备份文件的存在某个目录结构可能暴露了框架类型。信息收集到这一步就不再是单纯地“找到flag”而是“从零到一还原目标的全貌”。1.2 flag常见的五种藏身方式结合我自己刷题以及平时带新人时的经验第11到15题这一段的flag藏身方式大致可以归成下面五类。每类我都用“为什么这么藏”的角度解释一下藏在HTTP协议细节里。比如响应头某个自定义字段、Set-Cookie里的附加参数、状态码对应的提示页面。设计者想让你明白Web应用的交互不只是页面上的文字所有客户端和服务端之间的通信内容都值得看一遍。藏在robots.txt和约定俗成的文件里。robots.txt是搜索引擎爬虫访问网站时第一个看的文件里面经常写着Disallow规则而Disallow的路径往往就是开发者不想让搜索引擎收录的敏感入口。这种题目的意思是你至少要知道Web标准里有哪些约定文件。藏在备份文件和临时文件里。开发者写完代码习惯性地留一份.bak、.zip、.swp或者把源码压缩包扔在网站根目录下。这种问题在真实环境里太常见了所以CTF题目里自然会有一席之地。藏在源码注释和前端JS文件里。多页面站点会把部分逻辑写在外链的JS里还有一些注释掉的功能模块没有删除直接留在源代码中。这类题目需要你点开每一个JS、看每一行注释不能只盯着div里的文字。藏在需要特定访问条件的路径里。比如User-Agent头、Referer头、特定Cookie、特定请求方法只有满足条件后服务器才会返回真实内容。这种设计是模拟真实场景中的访问控制逻辑。1.3 这些题设计套路背后的逻辑刷完这五道题我觉得出题人的思路其实很清晰信息收集是Web渗透的第一步如果这一步做不好后面所有高深的技术都无从谈起。所以第11到15题看起来是在考“找东西”本质上是在训练你的一种习惯——对所有输入输出保持敏感。举个例子很多新手看到题目第一反应是“我用浏览器打开能看到什么”然后就结束了。但一个信息收集习惯好的人会按照一个固定的节奏走一遍先看页面源码再看响应头再看robots.txt再跑一遍目录扫描再检查是否存在常见敏感文件。这套流程走完题目的线索基本就浮出水面了。我后面会详细拆解这套流程。2. 把“看页面”这件事做到极致开发者工具、curl与HTTP协议细节2.1 开发者工具的四个关键面板很多新手做信息收集题只习惯用浏览器的“查看网页源代码”功能也就是右键菜单里的那个。说实话这个习惯在CTF里会吃大亏。正确的姿势是把开发者工具当成主战场而且不是只看Elements面板至少要关注四个地方Elements看完整的HTML结构重点观察被注释掉的代码、隐藏的input标签、异常的内联事件、script标签引用的外部文件。Network看页面加载过程中发出的所有请求。有时候flag不会直接出现在首屏的HTML里但是会出现在某个CSS、JS、图片文件的响应内容中。只要在Network面板里把一个一个响应点开看总能发现线索。Application/Local Storage看Cookie、Session、LocalStorage、IndexedDB。有些题目会把flag拆开放进Cookie的某个字段或者写进LocalStorage里。这个位置非常容易被忽略。Console有些题目会在控制台输出一段提示信息甚至直接把flag打印出来。这种属于最简单的一种打开控制台就能看到。专门提一下Network面板的使用技巧打开页面后勾选Preserve log保留日志然后重新刷新页面这样所有请求都会保留下来。按类型过滤只看JS、Fetch/XHR、Doc这三种逐个查看响应内容。我曾经遇到一题线索藏在一个命名为common.min.js的混淆文件里表面看是库文件其实里面有一整段字符串就是flag的一部分这种如果不逐个点开看光靠“看源码”是发现不了的。2.2 用curl完整还原请求不放过任何响应头浏览器的开发者工具虽然直观但有些细节还是得用命令行工具才能看得彻底尤其是HTTP响应头。浏览器会隐藏一部分Header还会自动处理重定向、缓存等问题导致你看到的信息不够“原始”。所以我做题时的习惯是浏览器看结构curl看协议。这里提供一个基础命令模板适配CTFshow这类靶机环境# 查看响应头 curl -I http://目标地址 # 查看完整请求和响应过程 curl -v http://目标地址 # 跟随重定向并保存响应体 curl -L http://目标地址 -o response.html # 只显示响应头中的特定字段 curl -sI http://目标地址 | grep -i flag\|admin\|server\|x-powered-v参数会输出整个请求的过程包括DNS解析、TCP连接、发送的Header、接收的Header。很多信息收集题的关键线索就在某个自定义响应头里比如X-Flag: ctflag{...}或者Admin-Token: ...。这种响应头在浏览器开发者工具里也能看到但用curl看起来更直观也更容易用脚本去批量处理。还有一个细节curl -I发的是HEAD请求而有些服务器对HEAD和GET的处理结果不同。如果HEAD请求没有返回你想要的信息记得换成curl -s http://地址 -D - -o /dev/null用GET请求把响应头单独打出来。2.3 robots.txt、sitemap.xml与常见约定讲到“约定文件”的时候我自己带过的新人里至少有三分之一不知道要去访问/robots.txt。这个文件在本意上是告诉搜索引擎哪些路径不能爬但反过来说它正好暴露了哪些路径是开发者不希望被公开访问的。在CTF题里robots.txt里的Disallow路径经常就是后台登录页、上传目录、备份目录等敏感位置。访问格式很简单curl http://目标地址/robots.txt有时候robots.txt本身没有直接给出路径而是给了一个正则或者一个命名不规则的目录这时候就需要配合后面的目录扫描。除了robots.txt下面几个约定文件也值得在信息收集阶段顺手试一下路径作用备注/robots.txt搜索引擎爬虫规则必查/sitemap.xml站点地图可能列出所有页面顺藤摸瓜/crossdomain.xmlFlash跨域策略老题目可能会出现/favicon.ico图标文件有时字段是线索/.well-known/标准约定目录安全文本、密钥交换等/README.md项目说明文件经常泄露框架版本有个小技巧是不要只访问一次就完事。可以先访问无斜杠版本再看带斜杠版本有时候两个路径对应的页面不同因为这些题目会模拟真实的备份目录结构大小写、尾部斜杠、文件扩展名都会影响服务器的路由。2.4 一个容易被忽略的细节Cookie与本地存储Cookie这关也是信息收集题里的常客。有些题目会在你第一次访问时下发一个Cookie字段名看起来像是admin0或者roleuser这时候如果直接修改为admin1或roleadmin再访问页面可能会暴露新的内容。这种属于逻辑上的信息利用不算高深但它正好出现在信息收集的考察范围里因为你得先知道“有这个Cookie”才会想到去改。另外还有一种情况flag被存在Cookie的另一个字段里比如Set-Cookie: flagctflag{vip}这种直接用浏览器访问页面看不出来得看响应头。我在前面说过curl是看响应头的神器这里再补充一句不要只把注意力放在单个请求上页面里的JS可能发起的后续Ajax请求它们的响应里也会带Set-Cookie。使用curl整理请求流程时可以加一个Cookie文件参数# 保存本次请求的Cookie到文件 curl -c cookies.txt http://目标地址 # 携带Cookie文件访问后续路径 curl -b cookies.txt http://目标地址/下一个路径这样就能把一次会话完整串起来Cookie变化一一对照很实用。3. 当flag不在页面上就得去翻“历史垃圾”备份文件、临时文件与版本控制3.1 备份文件命名规律到了信息收集11-15这一段备份文件相关知识点几乎是必考的。真实世界里工程师写代码时喜欢本地调试完顺手存一份备份比如把index.php复制一份叫index.php.bak或者把整个项目压缩成www.zip、web.rar、site.tar.gz放在网站根目录下。这些文件本意是给自己用的结果常常被搜索引擎收录或者被别人直接猜出文件名下载。CTF出题人会按照真实场景来设计所以备份文件的命名也遵循常见的几种规律原文件名加扩展名flag.php.bak、index.html.save、config.php.old网站名/目录名压缩包www.zip、web.zip、html.zip、site.rar时间戳或日期backup_20240101.zip、2019.zip开发工具临时文件.index.php.swpvim编辑时产生的交换文件、index.php~编辑器自动保存文件数据库导出文件database.sql、db.sql、data.sql如果你做题时在源码注释里看到一个提示比如“项目已完成备份”“有问题请恢复备份文件”那基本就是在暗示你某个备份文件存在。接下来要做的就是猜文件名。我的策略是先根据已知的文件名猜比如题目页面上有index.php那我会依次尝试index.php.bak、index.php.swp、index.php~、index.php.txt同时再试常见的压缩包名比如www.zip、web.zip、site.zip。3.2 目录扫描工具与字典选择的实操思路手工猜文件名虽然直接但效率太低了而且容易漏。所以信息收集题做到后半段一定要会用目录扫描工具。我习惯用的工具是dirsearch跨平台、速度快、输出清晰。一个标准的扫描命令大概是这样的python3 dirsearch.py -u http://目标地址 -e php,html,txt,bak,zip -t 20参数含义-e指定扩展名列表-t指定线程数。如果不想按扩展名扫也可以直接使用默认字典。还有一款工具是dirmap它的特色是支持多线程、多种字典配合还能自动识别动态页面和静态页面的差异减少误报。遇到题目时两者可以交叉验证。不过这里有个很容易踩的坑新手往往以为字典越大越好上来就加载一个几百万条的超大字典结果扫了半小时还没出结果或者扫出一堆无关紧要的200响应。我的建议是CTF信息收集题不用一开始就用大字典。先用中小型字典几百到几千条即可比如常见的CTF字典、备份文件专项字典把这些跑完之后再考虑更大范围的补充扫描。题目的坑位是固定的重点考察的是“你知不知道这个路径”不是“你的字典够不够大”。3.3 找到备份文件后怎么处理如果幸运地扫到了一个.bak文件或者.zip压缩包下一步不是急着打开看有没有flag.text而是先判断文件类型。用file命令最方便file index.php.bak然后根据类型处理文本文件.bak、.old、.txt直接cat查看内容。有时候备份文件就是整个源码flag就藏在某一行注释里。压缩包.zip、.tar.gz、.rar先unzip -l查看压缩包内的文件列表不要急着全部解压。如果压缩包里有.php文件却没看到flag说明flag可能藏在源码的某个逻辑里需要进一步分析。数据库文件.sql搜索flag关键字直接grep -i flag db.sql。编辑器交换文件.swp用vim -r恢复内容再查看这是一个冷门但很实用的技巧。比如拿到index.php.swp后把它放到本地执行vim -r index.php.swp就能恢复出vim中断编辑时缓存的内容。CTF里真出现过这种考点很多人拿到.swp文件后不知道怎么看白白丢分。我强调一下压缩包的解密场景有些题目中的备份压缩包是加密的压缩包注释里可能会写密码或者密码就是目录名、题目名。遇到这种情况先试试常见的弱密码再试试跟题目相关的字符串比如题目ID、admin、123456。实在不行可以尝试zip2john方式进行本地破解不过大部分CTF题不会搞这么难通常密码就藏在容易发现的地方。4. 一套可复制的信息收集标准流程从输入URL到锁定flag4.1 先定优先级手工优先于工具刷这几道题最大的收获是我总结出了一套可复制的标准操作流程。这套流程我后来带人刷题时也一直用基本没有失效过。核心原则是手工验证优先工具扫描兜底逐层递进。打开目标URL后的第1分钟我不会动任何扫描器而是手动完成以下动作用浏览器打开页面粗略看一遍页面内容注意有没有跳转、警告、异常文字。查看网页源代码重点搜注释!--和--之间的内容。这里有个小技巧很多浏览器支持在源码视图里直接CtrlF搜索flag、key、ctf等关键字可以快速定位。打开开发者工具的Network面板刷新页面逐个查看请求和响应头。访问/robots.txt和/sitemap.xml。尝试在URL后面拼接常见路径比如/admin、/login、/flag、/backup。如果你按这个顺序做完其实80%的信息收集题都已经有眉目了。剩下20%比较顽固的才需要上扫描器。4.2 目录扫描的正确姿势和结果解读当手工路径猜不到或者发现题目线索指向某个未知目录时就应该上目录扫描器了。但扫描不是把工具跑起来就完事你需要会看结果。以dirsearch为例扫描结果里每一个HTTP状态码都有意义状态码含义下一步动作200文件/目录存在且可访问访问并查看内容301/302路径存在发生重定向跟随重定向看目标位置401/403路径存在但被限制访问考虑认证绕过、改请求头、尝试备份文件404路径不存在忽略500服务器内部错误路径存在且触发了异常可以重点关注我遇到过不少情况是扫描结果里有一堆403很多新手觉得403就是“访问不了放弃吧”但实际上403反而说明这个路径是存在的只是入口被保护了。比如后台页面返回403你可以试试改X-Forwarded-For头、加X-Real-IP头、或者尝试用..;/这样的路径绕过这些技巧在后期的Web题里也会用到。另外扫描时要学会看响应长度不只是看状态码。dirsearch的扫描结果会输出Content-Length如果一堆结果都是同样长度很可能都是同一个错误页面如果某个路径的响应长度和别的不同即使状态码是200也值得单独打开看看。这一条非常实用。4.3 敏感目录拿不到东西时怎么办还有一种情况你确实找到了敏感目录比如/admin、/backup但访问后页面空白源码里也没有线索。这时别急着放弃试试下面几个操作在目录后面拼接常见文件。比如访问/admin/是空白那就试试/admin/index.php、/admin/login.php、/admin/config.php、/admin/.htaccess。查看目录的响应头。有时候目录虽然返回200但响应头里会带X-Powered-By: PHP/5.x或Server: nginx这些信息有助于判断后端语言和中间件版本。尝试目录的备份文件。既然目录是敏感的那目录里的文件可能也有备份。试试/admin/index.php.bak、/admin/www.zip这种方式。检查是否存在.git或.svn目录。这个在真实环境中也极其常见如果存在.git目录可以直接利用工具提取历史版本代码里面可能藏着被删除的flag文件。CTF题里虽然不会让每个题目都涉及git但一旦遇到那就是一道“附加题”用githack这类工具可以直接把源码拉下来。# 快速检查常见版本控制目录是否存在 curl -s http://目标地址/.git/HEAD -I curl -s http://目标地址/.svn/entries -I如果回显200说明存在版本控制目录接下来就可以拉源码了。5. 信息收集不止为拿flag它还是后边Web题的重要基本功5.1 泄露源码带来的下一阶段利用思路很多人刷信息收集题时只盯着flag一拿到flag就跑了其实这是很浪费的。信息收集题里拿到的源码、后台路径、目录结构拿到WEB题后期都是进攻的基础。举个例子你在题目里扫描到了/index.php.bak下载后打开发现整个项目的数据库密码写死在配置里同时还暴露了后台管理路径。这时候就算你flag已经找到了也应该顺手把这个后台登录页尝试一下常见的弱口令因为以后遇到同类的Web题这个入口就是进一步利用的跳板。我在做CTFshow更后面的Web题目时经常需要回想信息收集阶段学到的东西看到一个后台页面第一反应就是找备份文件看到一段JS第一反应就是搜索隐藏接口看到一个登录框第一反应是查看响应头有没有版本信息。这些反应都是靠信息收集题练出来的肌肉记忆。5.2 从服务器信息推断可能的漏洞面HTTP响应头里暴露的服务器信息不只是用来答题的它们直接决定了后续可以打哪些漏洞。比如响应头显示Server: nginx/1.15.0同时X-Powered-By: PHP/7.2那么你可以猜测目标可能存在PHP相关漏洞、nginx版本漏洞等。如果后面遇到一个上传点或命令执行点这些信息就成了判断利用链的依据。CTF是一个循序渐进的过程信息收集题目虽然看起来简单但它给你建立的是“侦察—分析—行动”的完整习惯。比如后面会做到的一些题目你在第一步信息收集时发现了登录后台第二步抓包发现了请求参数第三步发现参数存在命令注入整个链条才能串起来。没有第一步那个耐心收集信息的过程后面根本无从谈起。5.3 网络层信息收集子域名、真实IP与指纹识别作为第15题时会用到的思路说到第15题以及一些进阶的信息收集题可能会涉及网络层的信息收集比如子域名枚举、IP反查、服务器指纹识别等。做题时如果遇到一个域名而不是IP地址那就不妨多走一步用nslookup或dig查询DNS记录看看A记录、CNAME、TXT记录里有没有有趣的信息。TXT记录偶尔会被人放一些测试字符串CTF考点里出现过这种隐藏方式。子域名枚举尝试常见的子域名前缀比如admin.xxx.com、backup.xxx.com、dev.xxx.com。CTF环境下有时会把flag放在子域名对应的站点上。使用工具时可以配合字典快速测试。TTL判断主机指纹Ping一下目标看TTL值。Windows系统一般TTL是128Linux系统一般是64。这个细节在信息收集阶段可以帮你判断主机操作系统虽然不能说绝对准确但作为参考足够。端口扫描CTF的信息收集题里不一定用得上但是如果你发现某个目录指向内网IP或特殊端口多留意一下。我不建议一开始就把这些网络层手段全部用上因为第11到15题大概率还是以Web层面为主网络层属于加分项。但如果你卡住了多收集一层信息总比干等着强。6. 我踩过的坑和想送给后来者的话6.1 因为大小写和路径问题浪费的时间刷题过程中最容易让人崩溃的问题之一就是文件路径的大小写、末尾斜杠、URL编码这些细节。有一次我在一个题目里明明扫描出了/FLAG.txt但我访问的是/flag.txt结果一直404排查半天浪费了二十分钟最后才发现Linux路径大小写敏感而Windows大小写不敏感。这个教训很深刻访问任何路径之前先确认你看到的那一串字符的原始大小写不要想当然地“小写化”。另外URL编码的问题也很常见。有些题目里的路径包含空格、中文或特殊字符直接粘贴到浏览器会被自动编码看起来没问题但用curl访问时可能没有自动编码导致请求失败。遇到这种情况可以先用--path-as-is告诉curl不要重写路径或者手动进行URL编码。6.2 工具报错的真实原因要会分析目录扫描工具偶尔会报错或者扫不到任何东西。新手这时候通常会觉得“工具是不是坏了”其实大概率是以下几个原因目标有WAF或请求频率限制扫描器发的包被拦了返回的全是403或者超时。目标不支持你用的HTTP版本可以尝试把扫描器切换到HTTP/1.1模式。字典太小专门针对这道题的路径没有覆盖到。换个CTF专用字典很可能就能扫出来。目标路径需要特定的Header比如必须带某个Cookie或某个X-Forwarded-For头。这种情况下可以在扫描工具里手动指定Header参数。工具是死的思路是活的。遇到扫描器不出结果我不会无限地换工具而是回过头来重新审视这道题标题里的提示、页面源码里的注释、响应头里的字段有没有哪一条被我漏掉了。绝大多数信息收集题的线索都隐藏在“看得见但容易忽略”的位置而不是藏在“需要暴力工具才能挖出来”的深矿里。6.3 做题记录的巨大力量——信息收集的复利效应最后想认真说一个习惯做题一定要做记录。我刷CTFshow信息收集第11到15题时专门建了一个笔记文件里面记录每道题的访问路径、看到的响应头、扫描的命令、踩过的错误。后来继续往后的Web题刷的时候我经常翻这个笔记很多套路的复现率超高。比如某类题目的备份文件命名习惯某类框架的默认后台路径都是可以从信息收集笔记里直接查到的。做记录不仅仅是备忘还能帮你构建自己的“信息收集字典”。每次刷完一道题就把题目中出现的敏感路径、备份文件名、隐藏参数加到你的字典里日积月累你的字典会越来越贴合实际出题风格。这个过程其实就是信息收集能力的复利效应前期投入的时间后期会成倍地拿回来。如果让我给正在刷这段题目的人一个最直接的建议那就是不要只盯着答案看把每道题都当成一次侦察演练。你收集到的每一条信息都有可能成为打通整个题目链条的关键点。信息收集不是CTF里最炫酷的技术但它是所有后续操作的地基地基打得牢后面的楼才能盖得高。希望这篇分享能帮你少走一些弯路也祝你在刷题路上越战越顺手。
返回列表