☰
HTB Data靶机实战:从salt哈希爆破到特权容器逃逸
2026/10/7 3:36:17 网站建设 项目流程

打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输出为普通文本格式,方便后续翻看。如果是在实际授权测试里,建议把速率调低一些,避免对生产设备造成压力。

全端口扫完,结果非常干净,靶机对外只开放了两个端口:22(SSH)和80(HTTP)。这个端口组合很典型,说明这台机器不是靠大量外部服务堆攻击面的类型,核心玩法一定在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或者简单看一下格式就能确认这是模式1800(sha512crypt)。爆破之前要先准备字典。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环境下识别不到设备,可以退而求其次用John:

john --wordlist=rockyou.txt hash.txt

John会自动识别哈希类型并选择合适的算法。不过我用Hashcat跑了几分钟后,已经能看到爆破结果了。这类以“单词+年份”或“简单大小写组合”为主的密码,在rockyou里真的是一抓一大把。最终密码解出来是一个很常见的人名加年份组合。

这里有个实操心得:爆破拿到密码后,第一时间试试SSH登录。HTB靶机里用户的SSH密码和Web配置文件里放着的哈希往往就是同一个,设计者图省事,我们也就跟着图省事。登录成功之后,低权限阶段就此开始。

3. 获取初始Shell与用户Flag

3.1 SSH登录与环境确认

拿到密码后,直接用SSH登录目标机器。命令很简单:

ssh username@10.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里放了我们的公钥,免密登录直接成功。看到root@hostname:~#出现在终端上的那一刻,整台机器的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-drop=ALL,只开放业务所需的最小能力集合。如果业务确实需要挂载设备或访问磁盘,也要通过设备限制和路径白名单严格约束,而不是一给就是全量特权。

大多数线上事故和靶机的利用路径,本质都是权限宽松叠加配置失误的结果。靶机模拟的是攻击链路,但背后给防守方提出的问题同样值得深思:如果业务容器里任何一个点被攻破,攻击者能接触到的敏感面到底有多大?这个问题的答案,往往决定了真实系统的安全下限。

5.3 给新手的实践建议

如果你打算拿Data这台机器练手,我的建议是先独立尝试至少两个小时,期间不要直接看他人的writeup,尽量靠自己的力量完成信息收集和哈希爆破。这个过程中卡住是很正常的,卡住的地方记得记录下来,然后再回头对照别人的思路,往往会发现自己离答案只有一步之遥。

我自己在打这台机器时最受震撼的瞬间,不是密码被爆破出来的那一刻,而是在容器里敲下挂载命令后,看到宿主机完整的/root目录出现在眼前的那一刻。这种直观的视觉冲击让我对“容器边界”这个概念产生了非常深刻的认知。这也正是HTB这类平台存在的意义——它不仅仅是刷分的地方,更是让安全理念从书本文字变成肌肉记忆的训练场。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询