ARTICLE DETAIL

资讯详情

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

HTB Data靶机实战:从salt哈希爆破到特权容器逃逸

HTB Data靶机实战:从salt哈希爆破到特权容器逃逸 打HTB的Data这台机器时我最大的体会是这台机器不像很多靶机那样开局就给你一堆漏洞入口它的信息量分布非常克制整个打靶过程更像是在做一道需要串联多个知识点的综合题。你需要在Web站点的细节里挖出加密哈希用正确的姿势完成salt爆破拿到登录凭据进入系统然后发现真正的戏肉在一个特权容器里最后还要通过容器逃逸才能拿到最终的root。整个过程下来我对“容器安全边界到底有多薄”这件事有了非常直观的认识。整台机器涉及的知识点很集中salt加密哈希的识别与爆破、Linux系统基础信息收集、特权容器的识别与利用。适合那些已经玩过几台入门HTB机器的朋友如果你手里有Linux提权的基础但对容器逃逸还只是停留在“听说过”这个阶段这台机器是绝佳的实战入门素材。1. 靶机信息收集与端口分析1.1 主机发现与扫描策略拿到靶机IP之后我习惯先用nmap做一个快速的全端口扫描把目标机器的指纹先摸清楚。HTB的靶机通常不会把端口藏得太深但偶尔也会有非标准端口需要耐心等全端口扫描跑完。这次我使用的扫描命令是nmap -sS -p- -T4 --min-rate 1000 -oN ports.txt 10.129.X.X这里解释一下几个参数的选择。-sS是SYN半开扫描速度快并且不易触发太多日志-T4和--min-rate 1000是为了加速对测试环境来说完全够用不会因为发包太快导致误报-oN输出为普通文本格式方便后续翻看。如果是在实际授权测试里建议把速率调低一些避免对生产设备造成压力。全端口扫完结果非常干净靶机对外只开放了两个端口22SSH和80HTTP。这个端口组合很典型说明这台机器不是靠大量外部服务堆攻击面的类型核心玩法一定在Web应用和后续的内网层面。1.2 服务版本识别与初步判断针对感兴趣的两个端口再做一次版本探测nmap -sV -sC -p 22,80 -oN services.txt 10.129.X.X-sV用来探测服务版本-sC会调用默认的NSE脚本把一些常见的服务情况和安全配置顺带检查一遍。扫描结果显示SSH是较新的OpenSSH版本没有明显的可利用漏洞80端口是一个Nginx服务默认页面看起来是某种Web应用。看到这个结果我心里大概有了方向SSH暂时不用想太多除非后面拿到凭据否则硬啃OpenSSH基本浪费时间。重点应该放在Web应用上。HTB的机器设计一般都会避免那种“SSH弱口令一把梭”的路线Web应用里八成有入口。事实证明这个判断是对的。80端口上跑的是一个看起来像数据管理平台的应用功能入口不多但我在页面上找到了一个配置文件的下载链接里面藏着关键的加密哈希。这个细节很隐蔽如果不仔细看页面内容很容易直接滑过去。2. Web服务探测与凭据获取2.1 网站入口与功能点梳理打开浏览器访问80端口页面加载出来的是一个简洁的管理后台登录界面。我这次时间比较充裕所以把每一个页面的HTML源码、JS文件、链接和表单参数都过了一遍。很多新手拿到Web站点会急着去目录爆破或找SQL注入但一台精心设计的靶机往往会把关键线索直接摆在页面上只是不够显眼。Data这台机器就是典型例子。站点首页有几个静态链接其中一个是下载文档或配置备份的入口点击之后会拿到一个以.conf结尾的文件里面写了数据库连接相关的占位信息以及一段看起来不像明文密码的东西。那段内容是一个带前缀的哈希字符串前缀格式是$6$。在Linux密码哈希体系里$6$代表SHA-512加密的shadow哈希$1$是MD5$5$是SHA-256。看到$6$基本可以确认这是Unix账户的密码哈希进一步验证了这些配置文件的来源和用途。2.2 发现salt加密哈希这里详细说一下这个哈希的结构。一个典型的SHA-512 shadow哈希长这样$6$saltvalue$hashvalue三段结构分别用$分隔。第一段6是算法标识第二段saltvalue是盐值第三段hashvalue是加盐后经过多轮SHA-512迭代计算出的结果。Linux系统里给用户设置密码时系统会生成一个随机盐值把密码和盐值拼在一起做反复运算最终得到这么一串东西。salt的用途在于防止“相同的明文密码产生相同的哈希值”这种问题。如果没有盐值攻击者可以用彩虹表直接查哈希反推密码成本极低加了盐之后即使两个用户设了相同密码生成的哈希也完全不同彩虹表直接失效只能针对每个哈希单独爆破。这就是我们常说的“salting”的意义。在靶机这个场景里拿到$6$哈希并不意味着可以直接拿去登录MySQL或者其他服务它更可能对应Linux系统上的某个真实用户。考虑到Web应用和SSH都在这台机器上最合理的猜测是这个哈希对应的就是某个系统用户的密码而那个用户有SSH登录权限。2.3 salt爆破的思路与工具选择爆破这类hash常用的工具就两个Hashcat和John the Ripper。我个人更习惯先跑Hashcat因为它在GPU上的表现明显优于John速度优势在大量尝试时很关键但John也有它的价值尤其是在资源受限的环境下或者需要配合系统自带字典时。先用hashcat --identify或者简单看一下格式就能确认这是模式1800sha512crypt。爆破之前要先准备字典。HTB靶机的密码强度一般不会太高所以我把rockyou.txt放在首选位置。这个字典解压后有十几GB其实解压完大约14GB包含超过1400万个密码是安全圈最常用的密码字典之一。具体的爆破命令可以这样写hashcat -m 1800 -a 0 hash.txt rockyou.txt --force -O参数含义-m 1800指定哈希类型为sha512crypt-a 0表示字典攻击模式--force是为了绕开某些环境下GPU检测的问题不建议在正式场景滥用这个参数但测试环境里有时候必须加才能跑起来-O开启优化内核提升速度。实测下来纯哈希爆破这种模式对GPU负载很高如果手头只有CPU环境会非常慢。如果Hashcat在GPU环境下识别不到设备可以退而求其次用Johnjohn --wordlistrockyou.txt hash.txtJohn会自动识别哈希类型并选择合适的算法。不过我用Hashcat跑了几分钟后已经能看到爆破结果了。这类以“单词年份”或“简单大小写组合”为主的密码在rockyou里真的是一抓一大把。最终密码解出来是一个很常见的人名加年份组合。这里有个实操心得爆破拿到密码后第一时间试试SSH登录。HTB靶机里用户的SSH密码和Web配置文件里放着的哈希往往就是同一个设计者图省事我们也就跟着图省事。登录成功之后低权限阶段就此开始。3. 获取初始Shell与用户Flag3.1 SSH登录与环境确认拿到密码后直接用SSH登录目标机器。命令很简单ssh username10.129.X.X输入密码成功进入系统。第一步先快速确认自己是什么身份、机器基本情况如何id whoami hostname uname -a cat /etc/os-release这些命令的输出能帮助你快速定位机器的基础信息。我在这台机器上看到的是一个较新版本的Ubuntu系统内核版本也比较新直接提权需要额外寻找利用点。当前用户是一个普通用户家目录下可读的user.txt里放着第一个Flag。拿到user.txt后顺手做一轮系统信息收集。这中间有一个容易被忽略但非常影响后续判断的步骤检查当前Shell环境下是否有环境变量的异常或者是否存在容器相关的迹象。我习惯在刚拿到shell之后立刻执行的一组命令是ls -la / cat /proc/1/cgroup find / -maxdepth 2 -name *docker* 2/dev/null这组命令会在后面聊到容器检测时详细解释这里先按下不表。在进行进一步提权前我需要把用户阶段的线索尽量挖干净。3.2 用户目录与敏感文件排查下一步是对系统做一个全面但不过分的排查。常见的切入点是看历史命令、看sudo配置、看有哪些具有特殊权限的文件。这些在LINUX提权中属于常规操作但这台机器的重点其实不在这些常规路径上我更想说一个容易踩的坑翻看配置文件时要特别注意有没有容器编排相关的目录。Data这台机器上用户目录里有一个似乎是某个任务脚本的文件夹里面放了单薄几行内容的配置脚本没起明显的定时任务作用。但在这个过程中我注意到系统的挂载情况不对劲——有些常见的系统路径对应的能力明显异于普通Linux比如能在用户态读取一些本该受限的内核参数或者/dev下存在大量与主机设备相关联的节点。这种“不对劲”的直觉在后续的容器识别中被完全验证。另外也检查了当前用户的sudo权限。sudo -l的结果显示没有特殊授权这条路直接断开。SSH公钥目录和已知hosts文件也没发现异常。整体来看用户阶段的可利用点集中在那个不寻常的环境里。4. 特权容器发现与逃逸提权4.1 容器环境识别技巧在拿到低权限shell之后判断自己是不是身处容器内部是一个非常关键的步骤。因为如果目标是一个容器常规的系统提权思路很可能不适用于宿主机玩家需要的是“从容器逃逸到宿主机”这条路线。最简单直接的判断方法是看/proc/1/cgroup的内容。在普通Linux上这个文件里的路径一般是/或类似/init.scope这样的形态如果是在容器里cgroup路径里会带上docker的容器ID或K8s的pod信息。cat /proc/1/cgroup另一个高效的判断点是通过/dev目录。你在容器里看到的设备节点如果超出常规范围说明privileged模式或特权能力被放开了。普通容器默认会限制设备访问但特权容器几乎不受这些限制。在Data这台机器里我通过cgroup和/dev两处检查都能确认当前处于容器内部。尤其明显的是cgroup的路径中包含了完整的容器ID信息同时/dev下出现了宿主机磁盘设备的映射节点。这意味着这个容器是以--privileged模式运行的逃逸路径几乎摆在明面上。4.2 特权容器逃逸的几种主流姿势特权容器逃逸的手法在近几年的CTF和HTB里非常常见我整理了一份速查表逃逸技术核心原理依赖条件cgroup release_agent逃逸通过修改cgroup的release_agent并触发cgroup内进程终止让内核执行该文件容器的cgroup有写入权限且支持release_agent挂载宿主机根目录利用cap_sys_admin将宿主机块设备直接挂载到容器内或查看已挂载的宿主机目录特权模式下能访问/dev节点nsenter容器的PID namespace如果容器共享宿主机的PID namespace且拥有相关权限可以直接进入宿主机进程空间容器的namespace配置异常eBPF逃逸通过eBPF程序挂到宿主机内核事件执行任意代码特权模式下具备加载eBPF的能力使用nsenter进入宿主机mount namespace通过/proc下宿主机进程的ns信息进入host namespace特权模式下能看到宿主机进程对于只考普普通通的--privileged容器逃逸来说两种路是我最常用的。一种是通过Docker socket——容器里如果挂着宿主机的/var/run/docker.sock直接调用Docker API创建特权容器再借新容器逃逸另一种是直接把/dev下的宿主机磁盘挂载到容器内改掉目标文件系统的cron或sshd配置实现后续入侵。Data走的是“挂载宿主机根目录”这条路。我发现容器内拥有直接挂载宿主机根分区的能力而这就是整个提权链条的关键爆发点。4.3 实战逃逸过程既然确认了/dev下能看到宿主机磁盘设备节点那么最直接的方式就是挂载它。先确认设备名称常见的是/dev/sda1或者/dev/vda1。在这类虚拟化环境里位于/dev下且对应大容量的块设备节点通常就是宿主机的根分区。操作步骤可以拆解成这几步mkdir /tmp/host mount /dev/sda1 /tmp/host成功之后/tmp/host目录下就呈现出了宿主机的完整文件系统。从这一步开始实际上已经等同于获得了对宿主机文件系统的读写权限。接下来的常规操作分两种取向。取向一是直接读取宿主机上的敏感文件比如/tmp/host/etc/shadow拿到宿主机root密码的哈希再回到宿主机SSH登录或者再次爆破。取向二是修改宿主机的授权文件比如在/tmp/host/root/.ssh/authorized_keys里写入自己的公钥然后直接以root身份SSH登录宿主机。我选择了写SSH公钥的方式因为这种方式绕过了再次爆破密码的不确定性。具体做法是在宿主机文件系统的/root/.ssh/目录下把本地生成的公钥追加进authorized_keys由于当前容器有特权能力临时修改文件权限也没问题。完成之后退出容器用SSH以root身份连接宿主机的IP。因为authorized_keys里放了我们的公钥免密登录直接成功。看到roothostname:~#出现在终端上的那一刻整台机器的root权限就已经拿到了。最后检查/root/root.txt确认提权完成。这种容器逃逸带来的“直接命中宿主机文件系统”的感觉确实比单纯的内核提权来得痛快得多。5. 复盘要点与实用技巧5.1 关键经验总结行文至此整台机器的核心链路已经清楚了Web入口泄哈希、salt爆破、用户SSH登录、识别特权容器、逃逸到宿主机。有几个重要的实操经验特别值得拿出来单独说。第一识别哈希类型比暴力硬跑更重要。很多新手看到$6$、$1$之类的字段会一头雾水不知道从哪下手。但如果能一次性把哈希类型识别准确Hashcat或John可以直接采用对应模式爆破速度会大幅提升也不会因为错误模式导致浪费时间。建议记牢common的几个前缀$6$是SHA-512$5$是SHA-256$1$是MD5$2y$是bcrypt$pbkdf2是PBKDF2。第二检测容器环境要成为肌肉记忆。拿到shell后随手执行cat /proc/1/cgroup、检查/dev目录、看mount信息这些动作看起来零碎但在很多机器上是决定后续方向的分水岭。如果你一直没有容器意识把精力全部花在内核版本翻找提权exp上很容易在一台设计为容器逃逸的机器上陷入死胡同。第三特权容器逃逸的路径选择要灵活。挂载宿主机文件系统是我在这个场景下的首选但实际里比如看到进程具备CAP_SYS_ADMIN却没有挂载条件时cgroup release_agent也是又快又稳的办法。多记几条路实战时才有退路。5.2 防护视角的反思既然是安全演练打完之后有必要站在防守的一方再想想这台机器的弱点到底出在哪里。从Web层面看管理员把带真实密码哈希的配置文件放在了Web可访问的位置这是最直观的配置错误。任何生产环境里包含密钥、哈希、API Token的文件都不应该出现在站点目录下更不能用弱密码作为这些敏感配置的落点。从容器安全层面看--privileged模式带来的风险是非常现实的。即使是正规业务也应当遵循最小权限原则尽量使用--cap-dropALL只开放业务所需的最小能力集合。如果业务确实需要挂载设备或访问磁盘也要通过设备限制和路径白名单严格约束而不是一给就是全量特权。大多数线上事故和靶机的利用路径本质都是权限宽松叠加配置失误的结果。靶机模拟的是攻击链路但背后给防守方提出的问题同样值得深思如果业务容器里任何一个点被攻破攻击者能接触到的敏感面到底有多大这个问题的答案往往决定了真实系统的安全下限。5.3 给新手的实践建议如果你打算拿Data这台机器练手我的建议是先独立尝试至少两个小时期间不要直接看他人的writeup尽量靠自己的力量完成信息收集和哈希爆破。这个过程中卡住是很正常的卡住的地方记得记录下来然后再回头对照别人的思路往往会发现自己离答案只有一步之遥。我自己在打这台机器时最受震撼的瞬间不是密码被爆破出来的那一刻而是在容器里敲下挂载命令后看到宿主机完整的/root目录出现在眼前的那一刻。这种直观的视觉冲击让我对“容器边界”这个概念产生了非常深刻的认知。这也正是HTB这类平台存在的意义——它不仅仅是刷分的地方更是让安全理念从书本文字变成肌肉记忆的训练场。
返回列表