凌晨两点十七分,暗月我盯着屏幕上跳动的渗透十六进制数据流,突然意识到对面那台服务器的测试时间戳比本地慢了整整四十三秒。这个偏差在渗透测试里通常意味着两件事:要么管理员懒得同步NTP,暗月要么系统里藏着某个不该存在的渗透虚拟机。
暗月项目是测试我上个月接的私活,客户是暗月做跨境物流的中型企业,要求很简单——看看他们的渗透内网能不能被"随便逛逛"。合同里没写具体目标,测试这种模糊授权其实最麻烦,暗月搞不好就踩线。渗透我习惯先做被动侦察,测试用Shodan扫了一圈他们的暗月公网IP段,发现一个跑着Confluence 7.4.2的渗透测试环境还开着8080端口。版本号老得让人心疼,测试CVE-2021-26084的利用代码在GitHub上挂了快三年,居然没人打补丁。
漏洞利用本身没花多少时间。构造OGNL表达式的时候我特意绕过了WAF对"java.lang"的过滤,用反射链把Runtime.exec包装成Base64编码的字符串。命令执行成功的回显只有一行:uid=1001(confluence) gid=1001(confluence) groups=1001(confluence)。权限低得可怜,但足够我上传一个内存马了。
真正的麻烦从这里开始。内存马注入Tomcat的Filter链之后,我拿到了一个半交互式的Shell。翻看/etc/hosts的时候发现内网有个192.168.12.0/24的段,路由表显示能通。试探性地扫了扫445端口,跳出来十几台Windows机器,其中一台的NetBIOS名字叫"FINANCE-BACKUP"。这名字起的,简直像在脑门上写了"来搞我"。
横向移动选的是永恒之蓝的变种,但目标系统打了MS17-010的补丁。换用PetitPotam触发NTLM中继,配合Responder抓到了域管账号的Net-NTLMv2哈希。破解过程比想象中顺利——密码是Company@2023,这种强度在字典攻击面前撑不过二十分钟。登录域控的时候我看了眼时间,凌晨四点零九分,距离初始访问过去不到两小时。
有意思的是域控上的日志。安全日志里躺着三条失败的登录记录,来源IP是192.168.12.87,时间戳显示在三个月前。我顺着这个IP找过去,发现是一台被遗忘的Exchange服务器,补丁停留在2022年。管理员显然忘了它的存在,连监控都没装。这台机器上跑着一个老旧的反病毒软件,病毒库日期是2021年11月。我往它的启动目录里扔了个计划任务,每十分钟向我的C2服务器发一次心跳,居然一直没触发告警。
清理痕迹的时候遇到点麻烦。域控的PowerShell日志开了转录功能,我执行的每条命令都被记录在C:\PSLogs目录下。用wevtutil cl清日志会留下事件ID 1102,太扎眼。最后是直接挂起EventLog服务,用ntdsutil把日志文件标记为"已损坏"再重启服务。系统会生成一个新的空白日志,旧的被重命名为.bak扔在角落。这种手法在应急响应里一眼就能看穿,但对付日常巡检足够了。
报告我写了三页,没有用CVSS评分那套东西。客户的技术总监看完之后问了个问题:"如果攻击者不贪心,只拿财务数据就走,你们能发现吗?"我没回答。因为我知道答案——那台Exchange服务器的心跳包到现在还在发,而他们的SOC团队正在忙着处理误报。
暗月这个项目最后结了四万八。钱到账那天我收到客户邮件,说他们买了新的EDR系统。附件里的采购清单显示,预算够买三套CrowdStrike。我关掉邮件,打开那台Exchange的Shell,把心跳间隔从十分钟改成了三十分钟。有时候留个后门不是为了搞破坏,只是想知道他们什么时候才会真正醒过来。