去年冬天,靶机我在一个内网环境里用一台 Windows Server 2012 做跳板,渗透花了三个小时把域控里的测试一台“靶机”打穿。说是靶机靶机,其实是渗透客户专门搭的一套模拟生产环境,里面跑着他们内部用的测试 OA 和数据库。那次经历让我重新理解了靶机渗透测试到底在测什么——它不是靶机让你去炫技,而是渗透逼你在一个可控的废墟里,把真实攻击链上的测试每个环节都踩一遍。
很多人以为靶机就是靶机装个 DVWA 或者 VulnHub 下载个镜像,然后拿 sqlmap 跑一遍就完事。渗透这种玩法跟打游戏开作弊码没区别。测试真正有价值的靶机靶机环境,必须包含网络分段、渗透域信任关系、测试甚至一些配置错误的服务。比如我见过一个靶机,Web 服务本身没漏洞,但它的 Redis 没设密码,而且 Redis 所在的那台机器上还存着运维的 SSH 私钥。这就是典型的多米诺骨牌——你不需要正面硬刚,只需要找到第一块倒下的牌。
渗透测试的第一步永远是信息收集,但靶机环境里的信息收集跟外网完全两码事。外网你可能靠 Shodan、Fofa 扫端口,靶机里你只能靠 nmap 和手动探测。有一次我在靶机里扫到一个 8080 端口跑着 Jenkins,版本是 2.138,这个版本有个未授权的 RCE。但问题来了,Jenkins 的脚本命令行默认是关闭的,你得先想办法进后台。我没去爆破密码,而是翻了翻同一网段里的一台 GitLab,里面有个公开仓库,提交记录里赫然写着 Jenkins 的管理员初始密码。这种“非技术漏洞”才是靶机渗透里最有趣的部分——它考的是你的耐心和联想能力。
拿到 Jenkins 的 shell 之后,别急着提权。先看当前用户能访问什么。那台机器上有个共享目录,挂载了另一台文件服务器。我用 net use 列了一下,发现文件服务器上有个脚本文件夹,里面有个 PowerShell 脚本,内容是每天凌晨自动把数据库备份到本地。脚本里硬编码了数据库的 sa 密码。你看,一个 Jenkins 的漏洞,最终导致整个数据库沦陷。这种链条在真实攻击里很常见,但在靶机里你可以慢慢复盘每一步。
提权环节是很多人卡住的地方。Windows 靶机提权无非就是那几个方向:未引用的服务路径、AlwaysInstallElevated、令牌窃取。我印象最深的一次是靶机里装了个老版本的 360 安全卫士,它的驱动存在一个任意地址写漏洞。我花了整整一个下午写利用脚本,最后成功把 SYSTEM 令牌复制到了当前进程。这种成就感比拿下一个域管还爽,因为你是真的在跟一个具体的软件漏洞较劲,而不是靠一个现成的 exp。
横向移动的时候,别一上来就上 mimikatz。先看看当前机器上有没有保存的凭据。浏览器里、注册表里、甚至一些配置文件里,都可能藏着明文密码。我见过一个靶机,运维把域管密码写在了桌面的一个 txt 文件里,文件名就叫“密码.txt”。这种低级错误在真实环境里并不少见,靶机只是把它放大了。拿到域管之后,整个域就是你的了。但别急着收工,去看看域控上的组策略,看看有没有什么登录脚本或者计划任务,这些往往是下一个攻击入口。
最后说一句,靶机渗透测试的终点不是拿到 flag,而是写出一份能让人看懂的复盘报告。你得说清楚每个漏洞是怎么被利用的,影响了哪些资产,以及怎么修复。我见过太多人只贴一张 whoami 的截图就交差,那跟没做有什么区别。靶机是练手的地方,但练的是脑子,不是手速。