ARTICLE DETAIL

资讯详情

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

HTB DarkZero靶机实战:从布尔盲注到SSH复用与sudo提权

HTB DarkZero靶机实战:从布尔盲注到SSH复用与sudo提权 1. 这台机器在考什么DarkZero 的整体思路HTB 这台 DarkZero我打完拿到两个 flag 之后在屏幕前坐了一会儿没急着开下一台。原因不是难度变态而是它把 Web 渗透里最让人难受的场景做到了极致接口正常返回、数据库却毫无回显所有线索都藏在“响应差异”里。写这篇 writeup一方面是把完整攻击链串一遍另一方面也是想聊聊当目标没有把查询结果直接渲染给你的时候你究竟该怎么一步步把数据抠出来。整个攻击链可以划分成四个阶段信息收集、Web 注入、凭据利用、本地提权。它没有复杂的 0day也没有需要硬猜的漏洞但每一个环节都要求你对“为什么这一步要做这件事”有清晰的认识。阶段关键动作核心目标侦察全端口扫描、Web 指纹、目录枚举找到入口和隐藏 APIWeb 利用无回显 SQL 注入、数据提取拿到数据库中的账号与密码哈希立足SSH 密码复用获得稳定的用户 Shell提权本地枚举、sudo 链分析从普通用户提升到 root这台机器适合两类人一类是刚刷完 HTB 入门机、想进阶中等难度的渗透学习者另一类是已经会跑工具但不太理解“为什么这样跑”的人。DarkZero 特别适合练手因为它没有把答案写在脸上却又给了你足够多可推理的线索。2. 侦察与端口画像先别急着找洞2.1 全端口扫描的正确姿势拿到靶机 IP 后我习惯先做一次全端口扫描再针对开放端口做服务版本识别。很多新手一上来喜欢只扫常见端口比如-p 80,443,22但这样非常容易错过藏在高端口上的管理界面或 API 服务。这一步我用的是nmap -p- --min-rate 5000 -T4 10.129.229.190结果是意料之中的简单PORT STATE SERVICE 22/tcp open ssh 80/tcp open http只有 22 和 80 两个端口说明攻击面非常集中。紧接着做服务版本和默认脚本扫描nmap -p 22,80 -sC -sV 10.129.229.190输出显示SSHOpenSSH 8.9p1Ubuntu 系HTTPnginx 1.18.0后面确认是 PHP 8.1这个组合本身没有直接可利用的漏洞但既然 80 是唯一的外部入口Web 应用必然是主战场。2.2 Web 指纹与目录枚举浏览器打开http://10.129.229.190跳转到一个叫 “DarkZero Security Operations Center” 的监控面板页面。页面长得像一套企业内部系统有登录框、状态卡片看起来相当唬人。我先用curl看了一眼响应头和页面结构curl -i http://10.129.229.190/没有明显框架指纹但网页源码里几个 JS 调用的接口路径很有价值。我没有急着爆破登录框而是先用 ffuf 做目录枚举ffuf -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt \ -u http://10.129.229.190/FUZZ -fc 403,404跑了一会儿出来的目录不算多其中三个引起了我的注意路径状态判断/api200可能存在业务接口/docs200可能有 API 文档/assets301静态资源目录/docs页面直接暴露了接口文档里面写着/api/status和参数id。这一步省了我很多盲目测试的时间。2.3 隐藏 API 与参数暴露访问/api/status?id1返回了一个 JSON 对象{status:online,service:monitor,node:edge-01,updated_at:2024-06-12 12:00:00}这个接口看起来只是查询监控节点的状态但参数id直接拼接进了数据库查询。为什么这么肯定因为实测中id1和id1后面加一个单引号返回头完全不一样——一个是正常 JSON一个是 500 空页面。这是很典型的“接口看起来人畜无害、实则裸奔”的场景。没有登录态、没有过滤参数直接进 SQL 语句。到这里我已经判断这台机器的 Web 入口大概率就是这里了。3. 从“无回显注入”里把数据抠出来3.1 确认注入点一条字符引发的回包差异/api/status?id1正常返回 JSON那我怎么确认是注入而不是普通报错方法很简单用布尔条件改变查询结果观察响应变化。curl -s http://10.129.229.190/api/status?id1%20AND%2011返回正常 JSON说明条件为真时查询有结果。curl -s http://10.129.229.190/api/status?id1%20AND%2012返回为空说明条件为假时查询没有结果。这种“真则正常、假则空白”的现象就是标准的布尔盲注。页面不会把查询结果直接显示出来也不会把 SQL 报错打在页面上你唯一能利用的就是响应里的“有无”差异。这里的经验是无回显注入首先要确认的是“差异信号”。你不需要立刻获得数据只需要找到一个稳定的、可区分的响应变化比如状态码、响应长度、JSON 字段值这些都能成为你的“眼睛”。3.2 布尔盲注手测思路确认注入存在后我没有立刻上 SQLMap而是先手工验证了一组查询。为什么要这么干因为自动化工具的 payload 有时候会被过滤规则卡住如果你连“手工能不能跑通”都不知道后面 SQLMap 出了问题会很难排查。常见的三种无回显注入手法对比如下手法判断依据适用场景布尔盲注真/假条件下响应不一致响应可区分本例主用时间盲注查询是否触发延时响应一致只能靠时间差报错注入报错信息被带回页面数据库报错未隐藏时布尔盲注的手工思路是逐字符猜解。比如判断当前数据库名的第一个字符curl -s http://10.129.229.190/api/status?id1%20AND%20ASCII(SUBSTRING(database(),1,1))100如果响应正常说明 ASCII 值大于 100继续二分如果响应为空就缩小范围。这种二分法虽然慢但思路清晰也最能帮助理解盲注的本质。3.3 SQLMap 加速与结果人工复盘手工确认注入点后再用 SQLMap 全速拖数据才是正确顺序。我用的是sqlmap -u http://10.129.229.190/api/status?id1 \ --batch --dbmsmysql --techniqueB --dbs--techniqueB是强制只用布尔盲注避免 SQLMap 浪费时间去尝试其他类型。很快跑出了数据库列表其中业务数据库叫darkzero。然后直接枚举表和字段sqlmap -u http://10.129.229.190/api/status?id1 \ --batch --dbmsmysql -D darkzero --tables表里有users、nodes、audit_log三张表。users表是最优先的目标。3.4 拖出账号密码并完成破解继续倒出 users 表内容sqlmap -u http://10.129.229.190/api/status?id1 \ --batch --dbmsmysql -D darkzero -T users --dump结果得到一组用户数据其中最有价值的是一个叫dahmed的用户角色是admin密码字段存的是加盐 MD5 哈希。这种哈希在 hashcat 里属于模式 500hashcat -m 500 hash.txt /usr/share/wordlists/rockyou.txt没跑多久就出来了密码是nevermind。这个密码看着普通但对这台机器来说它就是通往系统内部的那把钥匙。这里有一个很实用的心得数据库里的密码哈希不一定对应 Web 登录框它极可能对应系统账户、SSH 密码或内网服务密码。所以拿到哈希之后不要只盯着眼前这个登录页面优先尝试 SSH 和系统账号复用。4. 从 Web 到 ShellSSH 复用的那一步4.1 为什么先试 SSH 而不是继续打 Web拿到dahmed的密码后我第一反应就是试 SSH。理由很简单这台机器开放了 22 端口而我手头有一个看起来像运维人员的业务账号密码复用是内网渗透里极高概率成功的事。ssh dahmed10.129.229.190输入密码nevermind成功登录。这一步看起来平平无奇但实际意义很大Web 应用里拿到的凭据往往会被同一个人用在系统账号上尤其是这类企业内部监控系统开发者图省事复制粘贴密码太常见了。4.2 进入系统后的几个顺手操作登录后的第一件事是确认身份whoami id sudo -l当前用户是dahmed位于sudo组之外但sudo -l返回了一个非常显眼的条目User dahmed may run the following commands on darkzero: (root) NOPASSWD: /usr/bin/darkctl这意味着dahmed可以不用密码以 root 身份执行/usr/bin/darkctl。这显然是给提权留的口子。顺手还看了一下用户目录ls -la /home/dahmed cat /home/dahmed/user.txt拿到第一个 flaguser.txt。此时整个攻击链已经完成了三分之二外部入口打穿、任意数据读取、用户名密码复用、SSH 立足。剩下的就是本地提权。5. 提权到 rootSUDO 背后的脚本陷阱5.1 本地信息收集的顺序拿到低权限 Shell 后很多人的第一反应是直接跑 LinPEAS 找一堆输出然后盯着密密麻麻的日志发呆。我个人的习惯是先做目标明确的排查再上自动化工具补漏。提权的排查优先级我一般这么定sudo -l当前用户能免密执行什么SUID 文件有没有奇怪的带 suid 位程序定时任务root 是否有周期性执行的脚本写权限异常哪些文件/目录是当前用户可写却被 root 执行的能力位capabilities有没有 DACL 或 setuid 能力泄漏DarkZero 这台机器把第一个和第四个结合在了一起非常典型。5.2 定位 /usr/bin/darkctl 的执行链我先检查了/usr/bin/darkctl是什么file /usr/bin/darkctl ls -la /usr/bin/darkctl它是一个编译好的 ELF 可执行文件但运行时会调用/opt/darkzero/run_backup这个脚本。这里的关键点在于目录权限ls -la /opt/darkzero/结果非常有意思/opt/darkzero目录对other用户有写权限。也就是说dahmed可以向这个目录里写入文件而 root 通过darkctl执行run_backup时会直接去这个目录找。整个链条是sudo darkctl→ root 权限执行二进制 → 二进制调用/opt/darkzero/run_backup→ 目录对当前用户可写 → 可以放置同名恶意脚本。这类提权之所以叫“脚本陷阱”就是因为程序本身没有漏洞但它信任了不该信任的目录。现实中很多运维脚本也这样看着以 root 跑实际执行的文件路径却由低权限用户间接控制。5.3 构造提权脚本并拿到 root flag我写了一个最简单的 SUID Bash 提权脚本放到/opt/darkzero/run_backup#!/bin/bash cp /bin/bash /tmp/.rootbash chmod s /tmp/.rootbash给脚本加上执行权限后触发一次chmod x /opt/darkzero/run_backup sudo /usr/bin/darkctl脚本被执行/tmp/.rootbash生成并且带上了 SUID 位。然后/tmp/.rootbash -p直接获得 root Shell。随后读取cat /root/root.txt拿到第二个 flag整台机器完成。这里有一个提权后的习惯环境恢复。我在测试完成后把/tmp/.rootbash删除避免留下明显后门痕迹。虽然这是靶机练习但养成干净利落的习惯对真实项目审计很重要。6. 复盘这台机器值得带走的几件事DarkZero 打完之后我个人的体验是它不算难但非常适合拿来校准“渗透思路”。第一无回显注入的场景远比回显注入常见。很多真实业务系统的 API 都不会把数据库内容直接渲染给用户学会从响应差异中判断真假是一门必修课。测试时不妨把布尔盲注和时间盲注的 payload 都准备一套先手动确认差异信号再上工具。第二数据库中的凭据价值往往超过你的想象。拿到哈希后不要只盯着眼前的应用SSH 登录、邮箱、后台管理、数据库直连都值得顺手试一遍。密码复用是当前渗透测试中成功率最高的路径之一没有之一。第三提权时别跳过“目录写权限”这种不起眼的线索。sudo 条目有时候并不是直接让你执行某个命令读取 flag而是给你一个“可以在 root 执行链条中做手脚”的入口。检查/opt、/var/www、/usr/local下的权限异常经常比翻 SUID 列表更有收获。最后提醒一句这台机器的所有操作都发生在 HTB 提供的隔离靶场中。信息收集、注入、提权这些手法只应该在你有明确授权的实验环境里去练。任何未经授权的系统测试都可能触碰法律红线这个底线无论在什么领域都是共同的。
返回列表