☰
maskcrafter-1.1靶机渗透复盘:信息收集到权限提升全链路
2026/11/3 11:45:14 网站建设 项目流程

打靶机这件事,我坚持了挺长时间,最初是为了练手,后来更多是为了对抗“手感退化”。真实项目里不可能天天遇到各种刁钻场景,但靶机会逼着你在一个封闭、可控的环境里,把信息收集、服务枚举、入口判断、权限提升这一整条链路走完,而且每一步都得自己找路。maskcrafter-1.1 就是我在这个系列里印象比较深的一台,名字直译过来是“面具工匠”,光看名字就能猜到出题人想干什么——伪装、图层、藏东西,藏得不深但藏得很碎。这篇就按我当时的实际推进顺序完整复盘一遍:从环境搭建、信息收集,到 Web 入口判断、立足点建立,再到本地枚举和提权思路,中间穿插我自己踩过的坑和卡住的地方。适合刚接触靶机渗透、已经会敲几行命令但不知道下一步该干吗的朋友,也适合打了十几台之后开始觉得“套路化”想找点细节的人。

1. 开打之前:环境、心态与题路预判

1.1 靶机环境怎么搭才不折腾

环境这块我一向主张“一次搭好,长期复用”。我的习惯是用虚拟机宿主做隔离,攻击机(我常用 Kali 系发行版)和靶机都挂在同一块仅主机网络上,网段固定成 192.168.56.0/24 这种内网私有段。这样做的好处很直接:一是靶机和外界完全隔离,扫端口、跑字典、发数据包都不会意外打到真实网络上;二是网段固定,写笔记、回看、复现的时候 IP 不会变来变去,省掉大量“上次是哪台机器来着”的追忆成本。

具体操作上,我会在虚拟化软件里新建一个仅主机模式的虚拟网络,关掉 DHCP 里那个“自动分配”的选项(或者至少记下 DHCP 地址池范围),然后让靶机以桥接该虚拟网络的方式启动。靶机第一次导入时通常不知道自己是 DHCP 还是静态,所以先让它跑起来,再去攻击机上扫一遍网段,反查它拿到了哪个地址。这一步别嫌土,比你在靶机控制台里翻网络配置文件快得多。

注意:开打第一件事是给靶机做快照,命名成“初始状态”。很多靶机的服务被你改乱、文件被你删掉、口令被你改掉之后是没法回滚的,只能重新导入,来一遍又要等好几分钟。养成开打前拍快照的习惯,能省掉大量重复劳动。

还有个小细节:靶机内存给够一点。我给攻击机 4G、靶机 2G,Web 服务加数据库一起跑的时候,内存太紧会出现服务响应超时、页面加载一半卡住的情况,你会误以为是网络问题或者被防火墙拦了,实际上是靶机自己在换页。我在一台小内存靶机上浪费过将近二十分钟,最后发现是内存爆了。

1.2 从“面具工匠”这个名字里挖线索

我打靶机有个习惯,先不着急扫,先盯着名字想三十秒。出题人给靶机起名不是随机的,名字往往直接点出考点方向。“maskcrafter”这个词拆开来看,mask 是面具、掩码,crafter 是工匠、手艺人,合起来大概是“做面具的人”。这个意象在渗透场景里有几种很常见的对应:伪装成合法用户的凭据、层层嵌套的目录、改了扩展名的文件、藏在图片里的信息、看起来人畜无害的页面其实是入口。

我不建议把这个猜测当成结论,但可以把它当成搜索时的注意力分配权重。比如做目录枚举的时候,我会对备份文件、隐藏目录、带点号开头的路径格外敏感;看页面源码的时候,我会特别留意注释、隐藏表单字段、被 CSS 藏起来的元素;翻文件系统的时候,我会优先看带“bak”“old”“copy”“.save”这类后缀的东西。这套“先猜后验”的打法,比盲目把字典从头跑到尾效率高得多,而且就算猜错了,损失也只是几分钟的注意力。

另外 1.1 这个版本号也有含义。它说明这台靶机迭代过,早期版本可能有一些被判定为“不合理”的设计被修掉了,比如某个口令太容易被猜、某个服务版本有明显的一键利用路径。所以网上流传的一些老 writeup 里的具体路径,在 1.1 上可能已经走不通了,硬套会浪费大量时间。我的态度是:思路可以借鉴,具体路径一定自己验证。

2. 信息收集:先把攻击面摊在桌面上

2.1 主机发现与全端口扫描的参数取舍

信息收集我通常分三层做,从粗到细。第一层是主机发现,目的是确认靶机在线、确认它的地址。命令行我一般这么走:

# 先看本机在这个网段上的地址,确认自己挂对了网络 ip addr show # 网段内存活主机探测,-sn 表示只探活不扫端口 nmap -sn 192.168.56.0/24

如果 ARP 层就能拿到结果,说明靶机和攻击机确实在同一广播域里,后面不会有莫名其妙的连通性问题。有时候扫不出来,先别怀疑靶机坏了,检查一下是不是网卡选错了、虚拟网络挂错了,或者靶机还没启动完成。

第二层是端口扫描。我的常规起手式是:

nmap -sS -p- --min-rate 2000 -T4 192.168.56.101 -oN scan_all.txt

这里几个参数我说一下为什么这么选。-sS是半开扫描,速度快、日志痕迹小;-p-扫全 65535 个端口,靶机最爱把服务放在高位端口,只扫 Top1000 会漏;--min-rate 2000是给发包速率设个下限,防止 nmap 在局域网里自我限速导致扫得慢;-T4是时间模板,局域网环境下这个档位基本不会丢包。这套参数在本地虚拟网络里跑,一般一两分钟就能把全端口过完。

提示:全端口扫完一定要存文件(-oN),别只在终端里看。靶机的端口状态在你折腾的过程中可能变化,比如你启动了一个临时监听,后面回看的时候会对不上,有文件在手才好复盘。

第三层是服务指纹。拿到开放端口之后,针对性地跑一次版本探测和默认脚本:

nmap -sV -sC -p 22,80,8080 192.168.56.101 -oN scan_detail.txt

-sV拿服务版本,-sC跑默认脚本集。默认脚本里 http-title、http-headers 这类东西能直接告诉你 Web 站点的标题和技术栈,省掉手动访问的一步。我见过不少人跳过这一步直接去看页面,结果漏掉了响应头里暴露的框架版本。

2.2 服务指纹识别与Web目录枚举

端口出来之后,我一般会先画一张小表,把“端口-服务-版本-初步判断”四列填上。这张表看着简单,作用却很大,它强迫你对每个端口给出一个“有没有戏”的判断,而不是漫无目的地挨个点。

端口服务版本特征我的初步判断
22SSHOpenSSH 系列有口令就能进,先记着,等拿到用户名再回来
80HTTP常见 Web 中间件主战场,重点看目录和页面逻辑
高位端口自建服务版本信息模糊大概率是出题人放的第二个入口

表格填完,主攻方向基本就清晰了:Web 是入口,SSH 是可能的目标。这个判断在大部分靶机上都成立,因为出题人需要给你一条能走通的路径,而 Web 是最容易做“信息泄露”和“逻辑漏洞”的地方。

接下来是目录枚举。这一步是整台靶机里最考验耐心也最容易出成果的环节:

gobuster dir -u http://192.168.56.101 \ -w /usr/share/wordlists/dirb/common.txt \ -x php,html,txt,bak,zip,tar.gz \ -t 30 -o dirs.txt

-x这一串扩展名是我根据“maskcrafter”这个名字特意加的。备份文件、压缩包、源码泄漏是这类靶机最经典的“藏东西”手法,扩展名不加进去,字典再大也扫不到。-t 30是并发线程数,局域网环境下这个值比较合适,再高容易被中间件限流甚至把自己的请求打挂。

枚举结果我一般会按状态码排序看:200 的直接打开,301/302 的跟一下跳转,403 的别放过(存在但没权限,往往说明这里有东西),401 的记下来(需要认证,可能是下一步的目标)。很多人扫完只看 200,把 403 全忽略了,实际上不少靶机的关键目录就是 403,需要你换个路径或者换个身份才能进。

2.3 把碎片信息拼成一张图

信息收集阶段最容易犯的错误是“扫完就开打”,中间少了一步整理。我的做法是开一个笔记文件,把下面这几类东西都记进去:开放的端口和服务、目录枚举的结果、页面上的可疑文字、源码里的注释、响应头里的版本号、任何看起来像用户名或路径的字符串。

这一步的意义在于,靶机里的线索往往是碎片化的,单独看每一个都不足以突破,但拼起来就能连成一条线。比如页面底部有个不起眼的名字,源码注释里有个邮箱前缀,某个目录下有个以该前缀命名的文件——三条单独看都是噪音,串起来就是一条完整的路径。我在 maskcrafter-1.1 上就有过这种体验:有个字符串第一次看到的时候完全不知道干吗用,隔了半个小时在另一个地方再看到,才意识到它是用户名。

提示:笔记里给每条线索标注“来源位置”和“发现时间”。靶机打久了会串味,尤其是同时开两三台的时候,很容易把 A 机器的口令用到 B 机器上,还以为是口令错了。

这一阶段结束的标志是:你能用一段话描述清楚这台机器大概长什么样——对外暴露了什么、哪些是常规服务、哪些像是人为放上去的、有哪些可疑路径还没验证。描述不出来,说明信息收集还没到位,别急着往下走。

3. 入口突破:Web 层的第一把钥匙

3.1 页面结构里藏着什么

打开首页之后,我的第一反应不是找输入框,而是看源码。右键查看源代码,然后按顺序检查几个地方:<head>里的注释、被注释掉的<script>、隐藏的input字段、># 攻击机侧先监听 nc -lvnp 4444 # 拿到哑终端后,先在靶机上确认可用解释器 which bash sh python3 perl nc

监听这边我建议单独开一个终端窗口,别和其他操作混在一起。混在一起的时候,你会分不清输出是来自监听还是来自本地命令,尤其是在同时开好几个会话的时候,很容易把命令敲到错误的窗口里。

5. 提权思路:把本地枚举做成流水线

5.1 手动枚举的四条主线

进到系统里之后,我没有急着上传自动化脚本。原因有两个:一是精简系统上脚本依赖经常缺失,跑不起来还得排查;二是手动枚举的过程本身会给你很多脚本给不了的“感觉”,比如某个目录的权限特别奇怪、某个文件的时间戳和别的不一样。

手动枚举我会按四条主线走,每条线对应一类常见的配置疏忽:

主线关注点典型信号
身份与权限当前用户、所属组、sudo 权限能免密执行某条命令
文件系统可写目录、SUID 文件、敏感文件权限以高权限运行的二进制
计划任务定时执行的脚本及其权限脚本可被当前用户改写
服务与配置本地监听端口、配置文件、凭据文件配置里留着明文口令

这四条线里,我通常从第一条开始,因为sudo -l一条命令就能出结果,性价比最高。如果当前用户在 sudoers 里有免密条目,那基本就结束了,直接照条目走。没有的话,再看 SUID 和计划任务。

5.2 SUID、sudo与计划任务的排查细节

SUID 排查的命令很固定,但结果需要人工判断:

# 找出所有带 SUID 位的可执行文件 find / -perm -4000 -type f 2>/dev/null # 看看当前用户能免密执行什么 sudo -l # 检查全局计划任务和用户级计划任务 cat /etc/crontab 2>/dev/null ls -la /etc/cron.* 2>/dev/null crontab -l 2>/dev/null

关键在于判断“这个东西是不是标准发行版自带的”。系统自带的 SUID 程序有几十个,绝大多数是正常的,出题人额外放进去的那一两个才是考点。判断方法:一是看路径,放在/usr/bin、/bin下的多半是自带的,放在/opt、/home、/tmp、/usr/local下的就值得警惕;二是看时间戳,和系统安装时间明显不一致的,八成是后加的;三是看权限位,所有者是 root 但文件名很奇怪的,优先看。

计划任务这条线,重点是“脚本权限”。靶机里很常见的一个设计是:root 的 cron 定时执行一个位于某个可写目录下的脚本,而当前用户刚好能改这个脚本。这种情况下,你不需要任何漏洞利用技巧,只要往脚本里加一行内容,等它下次执行就行。判断能不能改,用ls -la看权限位,用test -w直接测;判断什么时候执行,看 cron 表达式。

注意:改计划任务这类操作属于“会留下痕迹”的动作。靶机里无所谓,但真实场景里要格外慎重,改之前先备份原文件,改完记得恢复,别把生产环境搞出一堆隐性变更。

5.3 提权失败后的复盘方法

提权失败是常态,我在这台机器上也不是一次就成的。失败之后我不建议马上换工具再跑一遍,而是先问自己三个问题:第一,我有没有确认过当前用户到底属于哪些组?第二,我有没有把整个文件系统里“所有者是 root 但当前用户可写”的文件列出来?第三,我有没有检查过环境变量和启动脚本?

第一个问题经常被忽略。用户的附加组权限很容易被漏掉,比如属于某个服务组,而这个组对某个配置文件有写权限,配置文件的某个字段又能影响服务的启动行为——这条路绕,但确实能走通。第二个问题用一条 find 就能覆盖:

find / -type f -user root -writable 2>/dev/null | head -50

第三个问题,环境变量里的 PATH 顺序、启动脚本里引用的相对路径,都是经典的可利用点。这类问题的特点是“不显眼”,需要你把启动脚本从头到尾读一遍,而不是扫一眼就过。

6. 常见问题与排查实录

6.1 卡点速查表

打靶机最耗时间的不是技术难点,而是“卡住之后不知道该往哪看”。我把 maskcrafter-1.1 过程中遇到的和以往经常遇到的卡点整理成了一张表,遇到类似情况可以直接对照。

现象优先怀疑排查动作
网段扫不到靶机网络模式挂错、靶机未启动完查本机网卡、重新探活、看靶机控制台
端口扫不全扫描速率被限、防火墙丢包降低速率重扫、换扫描方式对比
目录枚举全是 404字典不匹配、站点有前缀从页面资源路径反推前缀
口令试了没反应用户名不存在、触发锁定观察响应差异、放慢频率
上传成功但访问 404文件被重命名、落在非 Web 目录找上传后的返回路径、看目录列表
反弹连不上出网限制、解释器缺失先测连通性、换载荷类型
提权脚本跑不起来解释器或依赖缺失手动枚举替代、逐个命令验证

这张表的价值在于缩短“怀疑范围”。卡住的时候最怕的是漫无目的地重试,有了明确的怀疑方向,每次重试都是一次有效验证。

6.2 我踩过的几个坑

第一个坑是过度依赖自动化脚本。我早期打靶机的习惯是进去就传枚举脚本,等它跑完看报告。问题是脚本的输出又多又杂,大部分是噪音,真正有用的那几条往往被埋在里面。后来我改成手动跑关键命令,脚本只作为补充,效率反而高了。因为手动执行的时候,你的注意力在“这个结果为什么是这样”上,而不是“报告里有没有标红”。

第二个坑是忽略时间戳。文件的时间戳是一个极强的信号:系统自带的文件时间是安装时间,集中在某一天;出题人后加的文件时间是打包时间,往往和系统文件差好几天甚至几个月。用ls -la --time-style=full-iso看一眼,再按时间排序,可疑文件会自己浮出来。这个技巧我用了很久才发现,之前一直是靠猜文件名。

第三个坑是把“打不开”当成“不存在”。403、500、超时,很多人直接跳过。实际上 403 告诉你“这里确实有东西,只是你没权限”,500 告诉你“这里有东西,只是它报错了”,这两种反馈的信息量比 404 大得多。我在这台机器上就有一个目录,直接访问返回 403,但换个路径层级、换个请求方式之后就正常返回了内容。

第四个坑是不记录。这个问题最致命。打到一半去干别的事,回来之后完全不记得自己试过什么、哪条路走不通、哪个口令试过。我的解决办法是每个动作都在笔记里留一行,格式随意但必须有:时间、动作、结果。看着麻烦,实际上省下来的重复劳动远超记录成本。

7. 复盘:这类靶机到底在训练什么

7.1 方法论沉淀

打完一台靶机,我最看重的不是“拿到了 root”,而是能不能把过程抽象成一套可复用的动作序列。maskcrafter-1.1 给我的最大启发是:信息收集的深度决定了后面所有环节的难度。前期多花二十分钟把目录、源码、响应头、注释都翻一遍,后面突破的时候往往一击即中;前期急着开打,后面就会陷入反复试错。

我现在的固定动作序列大致是这样的:探活确认地址,全端口扫描并保存,服务版本识别,Web 目录枚举(带扩展名),页面源码通读并抄录可疑字符串,笔记整理成线索清单,然后才开始尝试突破。这套流程跑下来大概三十到四十分钟,看着慢,但它把后面的不确定性压到了最低。

另一个沉淀下来的习惯是“每次只改一个变量”。不管是试口令、试参数、试上传绕过还是试提权路径,一次只动一个地方。这样失败的时候能立刻定位原因,而不是面对一堆改动猜哪个起了作用。这个习惯在真实工作里同样适用,排查线上问题时尤其有用。

7.2 后续可以这样扩展练习

同一台靶机可以反复打,但每次换一个约束条件,训练价值会高很多。我给自己定过几个变体练法:一是限时,给自己四十分钟,逼着自己在压力下做优先级判断;二是禁用自动化工具,全程手敲命令,逼自己记住每个参数的含义;三是只看名字不看 writeup,强迫自己从零开始推理;四是反过来做防守,把靶机上发现的问题列出来,逐条写修复方案。

第四个练法我觉得收益最高。你攻进去的每一个点,背后都对应一条可以加固的措施:弱口令对应口令策略和多因素认证,上传点对应类型白名单和落地目录不可执行,SUID 滥用对应最小权限原则和定期审计,计划任务可写对应文件权限收敛。把攻击路径翻译成防御清单,你对这套东西的理解会从“会用工具”变成“看得懂结构”。

我自己的体会是,靶机打得多了容易产生一种错觉,觉得自己什么都会了。但真正检验水平的,是你能不能在一台完全陌生的机器上,用最少的动作找到最短的路径,并且清楚地解释每一步为什么这么做。maskcrafter-1.1 这台机器的设计谈不上多复杂,但它把“藏”这个主题贯彻得很彻底——线索分散、入口不止一个、每一条路都需要你先观察再动手。这种设计恰恰最接近真实的排查场景,因为现实里没人会给你标好考点,你只能靠自己把碎片拼起来。

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

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

立即咨询