
先交代一下背景这是HTB靶场writeup系列的第4篇这次目标拿下了Popcorn。熟悉Hack The Box的朋友都知道Popcorn是一台典型的入门到中等难度的Linux靶机它的价值不在某个高深漏洞而在于把“Web信息泄露→SQL注入→文件上传→内核提权”这条链路完整串起来。如果你做完前面几台基础靶机之后想练“综合应用”Popcorn很合适。这篇writeup会按我当时的真实操作顺序复现包括卡住的地方和绕过的思路也会把每个关键判断背后的理由讲清楚。整个过程只发生在HTB授权训练环境中请放心阅读。1. 先把靶机扫清楚端口与服务的第一次握手1.1 为什么全端口扫描不是浪费时间拿到目标IP是10.10.10.6。多数人习惯直接nmap -sV去扫默认的1000个端口但靶机环境被刻意设计过偶尔会有服务藏在高端口上所以我的第一件事永远是全端口扫描nmap -T4 -p- --min-rate 3000 10.10.10.6这个命令很快几分钟就能出结果。全端口列表出来之后再对开放端口做服务版本识别避免一上来用-A把所有脚本跑一遍导致太慢。结果很干净80/tcp开着HTTP22/tcp开着SSH没有其他奇怪的端口冒出来。看到只有两个端口时我心里基本有数了SSH多半是最后拿到root权限之后用来确认身份的标配通道真正的主舞台在80端口。也就是说这台机器的全部入口都集中在那一个Web站点上。接下来的所有思路都要围绕这个Web应用展开。1.2 把目标写进hosts并看一眼站点的真实面目很多人在浏览器里直接访问IP其实更好的做法是先确认站点有没有绑定域名。因为有些Web应用会根据Host头决定显示不同内容直接打IP可能看到的是默认页或者跳转页。HTB这类平台的环境基本都会在题目描述里给一个可以放到/etc/hosts的域名记录我把IP和域名写进hosts再访问站点。首页打开是一个电影动画字幕类的种子分享站点页面主题跟“Popcorn”这个名字对得上。这类站点在CTF和靶场里很常见有用户系统、有上传功能、有资源列表。我第一反应不是去点功能按钮而是先看响应头、源码注释和前端静态资源路径判断Web中间件和PHP版本。响应头显示是Apache PHP版本不算新。源码里没有明显的注释泄露倒是静态资源路径都写得很规整说明这是一个“小作坊式”的手写PHP应用。接着我用gobuster做了一轮目录扫描词表选择中等长度的地址簿词表同时加上php和txt后缀扩展名扫描gobuster dir -u http://10.10.10.6 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x php,txt,bak扫出来的内容里有几个路径特别扎眼tlogin.php、torrents.php、thumbs.php、upload.php。这套命名方式一眼就能看出是小应用自建路由没有套框架。这种手写PHP站点漏洞概率通常非常高。我把扫描结果整理成一张表方便后面逐个核对路径功能推测是否值得重点测试/tlogin.php登录入口常规关注/torrents.php种子资源列表页关注URL中的参数/thumbs.php缩略图动态生成脚本高度关注/upload.php文件上传点高度关注/users.php用户相关页面关注越权可能这一轮信息收集的核心产出是手写PHP MySQL类后端 Apache存在登录、上传、动态请求三类攻击面。接下来就是逐个页面去看先从不要求登录的入手。2. 摸清Web应用的攻击面从“缩略图”里找突破口2.1 逐个点开动态页面的过程先看主站的几个页面大部分功能都需要登录。单看浏览器表现登录、注册、搜索都正常没有明显报错。手工翻过一遍之后我把注意力放在thumbs.php上。缩略图脚本通常是从URL参数里拿一个id然后去数据库查询对应资源再以图片流的形式输出。这类接口一旦参数没处理就是典型的注入点。我直接在浏览器访问/thumbs.php?id1页面正常返回了一张图片。紧接着试/thumbs.php?id1响应就不是正常图片流了而是返回了一串SQL报错信息里面能直接看到数据库类型。有报错说明参数被拼进了SQL查询而且没有过滤。这已经是一个值得深入的口子。为什么先从这种不起眼的接口下手因为动态页面越简单开发者越容易忽略过滤。主站页面功能多参数往往经过几层封装反而难测而thumbs.php这种工具脚本通常就是套一个查询模板id传进去能查出就出图查不出就报错。它是最不设防的那类代码。2.2 报错信息、响应特征与后端类型的交叉验证回到Burp Suite把请求抓下来看。GET请求带了一个干净的id参数响应头里没有额外信息。SQL报错内容泄露了后端是MySQL而且可以继续触发错误看能不能通过报错内容带出数据。这里我先做了一组手工测试单引号明显触发SQL语法错误注释符--恢复正常图片order by逐列猜测能猜出查询列表的列数union select配随机值尝试联合查询其中order by和union的测试结果暗示查询结果被直接用于生成图片流就算让数据以可读文本形式落回浏览器多半也会被图片渲染干扰。于是我不再手工硬磕直接交给sqlmap跑。这里说下为什么不用Burp的重放功能硬试thumbs.php这类带报错的注入点盲注虽然可行但每一步都要靠响应长度或者时间差判断效率低。sqlmap对经典GET注入的检测和利用非常成熟把手工劳动换成可靠的自动化验证这是工具的正确用法。2.3 第一轮自动化扫描结果sqlmap命令我写的是sqlmap -u http://10.10.10.6/thumbs.php?id1 --batch --dbs--dbs参数直接让它枚举库名。跑完之后可用数据库不多除了系统自带的information_schema和mysql之外看到一个名为popcorn的业务库。库名和靶机主题一致目标明确。继续拖表内容sqlmap -u http://10.10.10.6/thumbs.php?id1 -D popcorn --tables列表里有一张users表字段包括常见的账号信息。接着把users表内容拖出来最关键的两个字段username和password都在。username是一个叫george的账号password字段是一段明显做过哈希处理的字符串。看到这里这台机器的前半段剧本已经清晰先通过SQL注入偷到后台账号口令再登录后台靠近上传功能。信息收集阶段到此告一段落接下来进入真正的利用环节。3. 数据库里走一遭从注入点到后台管理员3.1 哈希识别的细节拿到哈希之后第一步不是急着丢破解工具而是先判断它是什么类型。哈希格式直接决定选什么破解模式、用什么词表。我把那段字符串的长度和字符集仔细看了一遍确认不是明文也排除了一些常见格式更像是一个带Salt的散列。我的处理流程是先在本地用工具识别哈希类型再按识别结果选择破解模式最后用合适的字典跑本地破解。这台机器的口令强度不高跑了一会儿就出来了。口令本身是一个常见英语词具体内容我就不贴出来了留给还没打靶的朋友一个练习体验。顺便补充一个经验很多人在这步容易卡住是因为拿到哈希就无脑跑rockyou.txt却忘了某些哈希格式必须把Salt字段一起带上。模式和参数不对跑再久也解不出来。所以顺序要固定先识别再选模式再破解。3.2 登录后台后看到的完整功能拿着george的账号登录tlogin.php页面跳转到用户后台。后台比未登录时多了几个功能模块核心是“上传种子”以及“为种子添加封面图片”。上传种子本身是个上传动作封面图功能又是一个上传动作。一个Web应用里出现两个文件上传点这是最高优先级的检查对象尤其是我现在已经有合法账号不需要再猜权限。后台浏览时有个细节要注意页面很多链接直接把用户名拼在查询串里比如/torrents.php?usrgeorge。这种把用户名直接暴露在URL里的写法后续如果遇到越权或者注入都是一个潜在考点。不过这台机器的下一个突破口不是SQL越权而是上传功能本身。到了这一步前面攒下的信息全部串了起来SQL注入拿到后台账号后台账号靠近上传功能上传功能用来丢一个能执行代码的shell。这就是这台机器前半段的完整逻辑。4. torrent上传背后的伪装游戏让后端把PHP当成图收下4.1 上传点校验逻辑的试探顺序上传种子文件后系统提示需要上传一个封面图片。我登录后台随便选了一个torrent文件提交进入“上传封面”的步骤。这里我准备了几个测试样本一个正常的jpg图片确认上传链路本身通不通一个纯文本文件改成.jpg后缀看后端是不是校验文件内容一个包含PHP代码的文件直接命名为.php看会不会被拒绝同一个.php文件把Content-Type改成image/jpeg再看会不会被拒绝测试结果很典型正常的jpg可以传上去纯文本改后缀也能被接受说明后端没有对文件内容做严格检测.php后缀被拒绝但把Content-Type改为image/jpeg之后php文件居然被接受了。这说明判断依据主要落在扩展名黑名单和MIME类型上而MIME类型是客户端可控的。所以绕过思路就变成了让服务端认为这个文件是图片同时文件内容里藏着PHP代码。这里我想强调一个原则做上传测试时一定要先传一个正常样本确认基线再逐项改内容、改后缀、改Content-Type。很多人上来就改一堆参数结果因为基线没闭环根本判断不出是哪一步起了关键作用。4.2 构造“合法图片”里的PHP内容既然文件内容不检查那经典做法就是把PHP代码塞进一个合法图片的末尾。我用命令拼接在一张正常jpg末尾追加一段?php echo shell; system($_GET[cmd]); ?文件整体依然能以图片身份通过上传因为图片头部和数据区是完整的如果服务端只检查文件开头或者MIME嗅探会发现这是“图片”。上传之后再访问上传目录里的文件就能在URL后面带cmd参数执行命令。为了骗过一些更细的检查开头也可以加上GIF89a这类图片头魔数。我命名的上传文件用了类似shell.php的名字但绕过了后缀黑名单。不同靶机的过滤策略不一样有的会做双扩展名限制有的会把.php替换成空字符实际操作时多准备几个变体一次性试。关键思路是先摸清过滤规则而不是猜一个绕过方式死磕到底。4.3 拿到唯一真实权限www-data的shell能够通过URL执行命令之后我试着用cmdid确认当前的权限发现能正常返回输出。确认执行链可靠后我选择反弹一个完整的交互式shell回来方便后面逐步枚举。常用的方式是用nc监听本地端口再在webshell上执行bash反弹命令。这里必须提醒一句反弹shell的行为在任何环境里都要在授权范围内操作。HTB这类平台的靶机本身就是用来做安全训练的可以放心操作但不要把这套手法搬到没有授权的机器上。shell稳定之后执行whoami和id确认身份当前是www-data。到这一步Web层的突破正式完成。但www-data在Linux系统里权限很低离拿flag还差关键一步找一个能提升到root的方式。4.4 顺手看的用户与敏感信息拿到shell后我先做了几个快速动作查看当前目录、查看站点配置文件、翻一下Apache的站点目录。这些动作的意图不是乱翻是找数据库连接口令、备份文件或者明文账号。站点配置文件里偶尔会出现MySQL的root密码如果运气好这一步直接就能拿到系统权限。这台机器上配置信息没有直接给我系统密码但让我确认了站点是常规PHP应用结构上传目录就在Web根目录下可以被直接访问。这个信息很重要说明我上传的webshell路径是可控的、可达的后续命令执行链路没有断。5. 从www-data到root内核版本里的老账本5.1 枚举系统关键信息拿到一个低权限shell之后就要系统地收集当前系统的信息。我用了一组命令id uname -a cat /etc/os-release看到内核和发行版信息后我基本有数了Ubuntu 16.04.4 LTS内核版本4.4.0-116-generic。这个组合在公开漏洞库里能命中多个已知提权漏洞。再看一下发行时间属于2017年底到2018年前后的版本那个阶段的Ubuntu内核有几个非常出名的本地提权漏洞。这里多说一句系统枚举不一定要用脚本套件先手工确认内核版本、系统版本、当前用户、可写目录基本就能定位方向。脚本套件适合在内核和工具信息已经确认之后再跑否则输出信息太多反而干扰判断。整理出来的系统信息如下项目结果发行版Ubuntu 16.04.4 LTS内核4.4.0-116-generic当前用户www-data可写目录/tmp、上传目录等5.2 选哪个提权点与原理判断我在本地的exploit索引里搜了4.4.0内核相关的提权项最直接命中CVE-2017-16995。这个漏洞出现在内核的BPF子系统简单说就是加载eBPF程序时缺少足够的边界检查本地用户可以构造特殊程序让内核把越界数据当作指针使用之后在内核态读取进程凭证等信息达到当前用户直接变root的效果。选择这个提权点的原因很简单目标内核版本明确命中社区里有多个可用版本打法成熟。我下载了一份适配源码传到靶机的/tmp目录下编译执行。为什么放/tmp因为/tmp通常对用户可写执行时不受家目录配额或权限设置限制这也是测试环境里的常用做法。执行后exp返回了root权限whoami的输出是root。到这里提权链路打通目标机器的root flag可以读取了。5.3 读flag之后的收尾动作拿到root之后我按平台规则找到root.txt读取内容确认这台机器的完整通关。同时看了一眼其他系统路径确认没有明显残留后从系统里清掉了自己在/tmp留下的工具文件。这里也想补一句负责任的提醒整个测试过程是HTB授权范围内的靶场训练。这类操作一旦脱离授权环境性质完全不同。所以我在练习时给自己定了一条纪律靶场内随便研究靶场外一次也不要越界。这条纪律比任何技术都重要。6. 复盘与避坑重打一遍会更快的几个地方6.1 这次卡住我的三个坑第一次打这台机器我在文件上传环节浪费了不少时间。当时我先入为主地认为“上传图片”这里是纯图片功能肯定有严格的类型校验所以绕了半天边界。实际上只要先传一个正常样本再快速验证扩展名和Content-Type的宽松程度就能立刻定位过滤规则。经验是上传点不要猜用几个精心设计的样本去问程序。第二个坑是开始忽略了thumbs.php这个不起眼的脚本。很多人在首页浏览时眼睛只盯着登录框和上传框像缩略图这种功能很容易扫一眼就略过。但这类工具脚本经常是攻击面最不设防的地方。以后遇到任何一个带id参数的动态页面都值得试一个单引号。第三个坑是哈希破解阶段。我一开始按常见格式去跑跑了一会儿没结果回头仔细看了长度和字符才发现需要带Salt参数。这种细节在思路顺畅时特别容易被无视却直接影响结果。6.2 对新手练习的顺序建议如果你想开始打HTB这类Linux靶机我建议不要一上来就追求刷高分而是把每个靶机的完整链路拆开理解每一步为什么能成立。Popcorn是一台适合练“信息收集→Web注入→上传绕过→内核提权”全流程的机器每一步都有明确的前置条件和后续目的。打完以后可以自己画一个链路图把漏洞之间的衔接关系写下来。一个小习惯很值得推广打靶全程开录屏或者至少每过一个关键步骤就截图记录命令和输出。写writeup的时候回头看这些记录能补回大量细节很多坑就是在回看时发现的。我这个系列能持续写下来靠的就是这个习惯。最后再分享一个实在的操作心得渗透过程里命令和输出一定分门别类记好哪怕只是记在一个临时文本文件里。等到回头复盘时你才会知道当时一句看似不经意的uname -a可能就是整台机器的胜负手。