1. 项目概述:一次从公开资产切入的深度信息收集实战
最近在复盘一个内部授权的安全评估项目,整个过程挺有意思,不是那种直接对着IP段一顿猛扫的常规操作,而是从目标单位的微信公众号和官方APP这两个看似平常的“门面”入手,像剥洋葱一样,一层层挖出了不少有价值的信息,甚至为后续的渗透测试铺平了道路。很多朋友觉得信息收集就是跑跑子域名、扫扫端口,其实远不止于此。尤其是在当前移动互联网时代,企业的微信公众号和APP本身就是一座信息富矿,里面藏着大量开发人员无意中遗留的线索、配置,甚至是直接的安全漏洞。这次实战,我就把整个从这两个“前端入口”进行信息收集、关联分析,到最后形成有效攻击面的完整流程和思考逻辑,给大家拆解一遍。
无论你是安全工程师、渗透测试人员,还是对企业安全建设感兴趣的开发者,理解这套从公开应用逆向推导内部资产的方法,都能帮你更立体地认识自身或客户的安全边界。这不仅仅是技术操作,更是一种攻击者视角的思维训练。
2. 核心思路与策略:为什么是公众号和APP?
在动手之前,得先想清楚为什么选择这两个点作为突破口。这背后是基于对现代企业数字资产暴露面的一个基本判断。
2.1 公众号:被忽视的“企业名片”与情报源
微信公众号,尤其是服务号和企业号,早已超越了单纯的内容发布功能。它本质上是一个Web应用的轻量级前端,背后连接着服务器API、数据库以及各种第三方服务。从安全角度看,它暴露出几个关键攻击面:
- 交互功能中的接口暴露:很多公众号集成了查订单、查进度、在线客服、会员中心等功能。这些功能都需要调用后台API。通过抓包分析这些请求,我们能直接拿到API的URL、参数结构,甚至发现未授权访问、参数遍历等漏洞。
- JS文件与前端源码泄露:公众号内嵌的H5页面,其JavaScript文件里可能硬编码了API密钥、云存储路径、内部系统地址(如测试环境、管理后台)等敏感信息。开发者为了方便,常常把这些信息直接写在前端代码里。
- 历史消息与招聘信息:翻看公众号的历史文章,特别是技术团队发布的招聘启事、产品更新日志,可能会透露他们使用的技术栈(如“我们全面转向了Spring Cloud”、“使用了Redis集群”)、第三方服务商(如“接入了XX云的短信服务”),甚至是办公地点、部门架构,这些都能用于社会工程学攻击或针对性漏洞利用。
我的策略是,不把公众号当成一个黑盒,而是把它当作一个通向企业后端系统的“接线板”,目标是找到所有从这块“接线板”延伸出去的“线头”。
2.2 官方APP:移动端的“完整镜像”
相比公众号,官方APP包含的信息维度更广、更深。它是一个编译后的二进制文件,但通过逆向工程,我们可以窥见其内部逻辑。
- 硬编码敏感信息:这是最常见的问题。API密钥、数据库连接字符串(尽管少见)、第三方SDK的Token、加密盐值等,可能会以明文或简单编码的形式存放在配置文件中。
- API接口全集:APP与服务器通信的所有接口,几乎都会在代码中有所体现。通过静态分析(反编译后阅读代码)和动态分析(抓包),可以绘制出完整的后端接口地图。
- 证书与SSL Pinning绕过:分析APP使用的证书,有时能发现内部域名。如果APP使用了SSL Pinning(证书绑定)来防止中间人攻击,我们需要掌握绕过它的技术,以便进行深入的动态测试。
- 业务逻辑漏洞的入口:很多业务逻辑漏洞,如越权、重放攻击、竞争条件等,其触发点就在APP的某个操作流程中。理解了APP的逻辑,才能设计出有效的测试用例。
核心思路总结:我们的目标不是直接攻破公众号或APP本身(虽然也有可能),而是将它们作为“探针”和“地图”,收集关于目标后端服务器、API架构、子域名、第三方依赖乃至组织信息的碎片,然后通过关联分析,拼凑出一张可供后续渗透测试使用的“靶场蓝图”。
3. 针对微信公众号的信息收集实操
拿到目标公众号后,我一般会在电脑端和手机端协同操作,工具以Burp Suite、浏览器开发者工具为主。
3.1 基础信息抓取与页面分析
首先,在电脑上使用浏览器访问公众号历史消息页面或具体功能页。打开浏览器开发者工具(F12),切换到“网络”(Network)选项卡。
- 全面抓包:清空记录,然后在公众号页面内进行各种交互:点击每个菜单、查询、提交表单。目标是捕获所有发出的HTTP/HTTPS请求。
- 接口识别与归类:重点关注请求URL。通常,公众号的后端接口会有明显的路径特征,比如包含
/api/,/wechat/,/mobile/,或者域名可能是api.xxx.com,m.xxx.com等。将所有这些接口URL整理到一个列表中。 - 参数分析:仔细查看每个请求的参数。注意像
userId,orderId,token,openid这类参数。思考:- 这些参数是如何生成的?(是递增的数字吗?可否遍历?)
- 哪些参数是用于身份认证的?(如
token)它是否容易被伪造或重放? - 是否存在像
debug=true这样的参数,可能开启调试模式?
实操心得:很多公众号的API对
openid的校验并不严格。openid是微信用户相对于该公众号的唯一标识。在某些查询类接口中,尝试修改openid参数为其他值(如果接口返回了其他用户的openid),可能会造成越权访问,直接看到他人信息。这是公众号类应用一个非常高发的漏洞点。
3.2 JS文件深度挖掘
这是信息收集的“富矿”。在开发者工具的“源代码”(Sources)选项卡中,找到该公众号H5页面加载的所有JS文件。
- 搜索关键词:在JS文件内容中(可使用全局搜索),查找以下关键词:
apikey,secret,password,tokenurl,domain,host,endpointdebug,test,staging,dev(这些可能指向测试环境)oss,cos,bucket(可能暴露云存储配置信息)- 具体的第三方服务域名,如
qcloud.com,aliyun.com
- 分析前端逻辑:阅读JS代码,理解前端是如何构造请求、处理响应的。有时能发现前端进行的输入校验,这可以帮助我们设计绕过前端校验、直接攻击后端API的Payload。
- 示例发现:在一次测试中,我在一个名为
config.js的文件里发现了如下内容:
这简直是“宝藏”。我立刻得到了:window.APP_CONFIG = { apiBaseUrl: 'https://test-api.目标公司.com/v2', ossBucket: 'prod-bucket-targetcompany', ossRegion: 'oss-cn-shenzhen', mapKey: 'abcdefghijklmnopqrstuvwxyz123456' };- 一个测试环境的API地址:
test-api.目标公司.com - 生产环境OSS存储桶名称和区域,为后续针对云存储的测试提供了目标。
- 一个高德或百度地图的API密钥,虽然不一定能直接利用,但丰富了信息维度。
- 一个测试环境的API地址:
3.3 公众号本身元信息利用
- 账号主体:在公众号详情页,查看账号主体信息。如果是企业,会显示公司全称。用这个公司全称,可以去工信部备案网站、企业信用信息公示系统等平台,查询该公司的网站备案信息,从而获得其官网域名,这是子域名爆破的起点。
- 文章内容挖掘:使用搜狗微信搜索(或其他能搜索公众号文章的引擎),搜索目标公司名称、产品名称,可能会找到其技术团队运营的其他公众号、博客,从中发现更多的技术细节和人员信息。
4. 针对官方APP的逆向与动态分析
对于APP,我们需要静态和动态分析相结合。准备一台已Root的安卓测试手机或模拟器(如雷电模拟器),以及电脑上的分析工具。
4.1 基础静态分析:解包与反编译
- 获取APK:从官方应用市场下载,或直接通过一些第三方APK下载网站获取。确保版本较新。
- 使用工具:
- Apktool:用于解包APK,获取资源文件、AndroidManifest.xml(清单文件,包含权限、组件、可能的部分域名)和
classes.dex文件。 - dex2jar + JD-GUI或Jadx:将
classes.dex转换为Jar包,然后用反编译器查看Java源代码。我个人更推荐Jadx,它是一体化工具,图形界面友好,搜索功能强大。
- Apktool:用于解包APK,获取资源文件、AndroidManifest.xml(清单文件,包含权限、组件、可能的部分域名)和
- 关键搜索:在反编译后的代码中,进行全局搜索,关键词与JS文件搜索类似,但要加上移动端特有的:
http://,https://(直接查找所有URL).com,.cn(查找域名)SharedPreferences,getString(查找本地存储的配置)sqlite,database(查找数据库相关操作)- 特定第三方库的初始化代码,如
Umeng,JPush,Bugly,这些库的配置里可能包含AppKey等。
4.2 深入代码审计:寻找硬编码与逻辑漏洞
静态分析不只是找字符串,更要尝试理解代码逻辑。
- 网络请求模块:找到负责网络请求的类(通常包含
HttpClient,OkHttp,Retrofit等关键词)。分析请求是如何组装的,加密/签名算法是什么,头部信息如何添加。这里可能发现固定的User-Agent、自定义的认证头,或者脆弱的签名算法。 - 加密解密函数:搜索
encrypt,decrypt,AES,DES,MD5,SHA等关键词。找到加解密函数,分析密钥是否硬编码、加密模式是否不安全(如ECB模式)。有时甚至能直接找到解码函数,将抓包到的加密数据解密。 - 配置文件:检查
assets,res/raw目录下的文件,以及SharedPreferences的默认存储值。常见文件名如config.properties,setting.xml。
踩坑记录:有一次分析一个金融类APP,发现其将所有接口的URL都放在一个
url_config.xml文件里,并且根据BuildConfig.DEBUG标志位切换测试环境和生产环境地址。通过修改反编译后的Smali代码,强制让APP在运行时认为自己是DEBUG版本,成功将其流量导到了测试环境,而测试环境的防护通常弱得多。
4.3 动态分析:抓包、调试与Hook
静态分析获得蓝图,动态分析才是实战。
- 环境配置:
- 测试手机设置代理到电脑(如Burp Suite)。
- 在手机上安装Burp或Charles的CA证书。
- 对付SSL Pinning:如果APP启用了SSL Pinning,抓包会失败。常用绕过工具有:
- Frida:通过注入脚本,在运行时绕过证书检查。需要一定的脚本编写能力。
- Objection:基于Frida的命令行工具,常用命令
android sslpinning disable一键搞定很多情况。 - JustTrustMe模块(适用于Xposed或Magisk):这是一个系统级模块,可以禁用所有APP的证书验证,简单粗暴但有效。
- 全面流量捕获:启动APP,遍历所有功能点。在Burp Suite中观察所有请求。重点关注:
- 登录/注册流程:密码是否明文传输?是否有验证码可爆破或回显?
- 身份认证凭证:登录成功后,返回的
token、session是如何存储和后续使用的?是放在Cookie里还是自定义头部? - 接口参数:动态分析时,可以更直观地看到参数在真实请求中的样子,尝试修改它们进行测试。
- 文件系统监控:使用
adb shell连接手机,在APP运行过程中,监控其私有数据目录 (/data/data/包名/),看是否在本地存储了敏感数据,如缓存图片、日志文件、数据库文件等。
5. 信息关联与攻击面构建
收集到的信息是零散的,就像拼图碎片。这一步就是把它们拼成完整的图画。
5.1 资产关联与扩展
- 域名收集:将从JS、APP、公众号文章、备案信息中找到的所有域名和子域名汇总。
- 使用工具如
subfinder,amass,OneForAll进行子域名爆破。 - 对发现的所有域名进行端口扫描(
nmap,masscan),识别开放的服务(Web, 数据库, 中间件等)。
- 使用工具如
- API接口聚合:将从公众号抓包和APP分析得到的所有API接口,按功能模块整理。特别注意那些看起来像管理功能的接口(路径中包含
admin,manage,backstage等)。 - 人员与组织信息:从招聘文章、技术博客中提取的技术栈、人员昵称、邮箱后缀(如
@targetcompany.com)等信息,可用于制作钓鱼字典或进行密码喷洒攻击。
5.2 漏洞初步探测与验证
在深入渗透之前,先进行一轮快速筛查。
- 目录/文件扫描:对发现的Web站点和API域名,使用
dirsearch,ffuf等工具扫描隐藏目录、备份文件(如.git,.svn,.bak,wwwroot.zip)、配置文件等。 - API安全测试:
- 未授权访问:直接访问那些需要认证的API接口,看是否返回数据。
- 越权测试:修改请求中的ID参数,看是否能访问其他用户的数据。
- 注入测试:对API的参数进行SQL注入、NoSQL注入、命令注入的简单测试。
- 敏感信息泄露:检查API的响应头、错误信息是否暴露服务器版本、路径、数据库信息等。
- 第三方服务测试:如果发现了OSS存储桶信息,尝试直接访问
https://prod-bucket-targetcompany.oss-cn-shenzhen.aliyuncs.com或使用工具如ossbrowser、CloudBrute来测试存储桶的权限配置(是否可公开列出、上传、下载)。
5.3 构建攻击路径
将以上所有信息整合,形成几条清晰的攻击路径假设:
- 路径A(由公众号JS泄露引发):测试环境API (
test-api.目标公司.com) -> 可能存在弱口令或默认口令的管理后台 -> 获取更高级权限。 - 路径B(由APP接口发现):主站API (
api.目标公司.com) 的某个查询接口存在ID遍历漏洞 -> 获取大量用户敏感数据。 - 路径C(由资产扫描发现):某个被遗忘的子公司官网 (
old.targetcompany.com) 使用了存在已知漏洞的框架版本(如Struts2, ThinkPHP)-> 直接获取服务器权限。
6. 常见问题与排查技巧实录
在实际操作中,总会遇到各种问题。这里记录几个典型场景和我的解决思路。
6.1 抓包时APP无网络或证书错误
- 现象:设置代理后,APP无法连接网络,或提示“证书错误”、“网络连接失败”。
- 排查:
- 检查代理设置:确保手机Wi-Fi代理设置正确,电脑防火墙允许了代理端口连接。
- 确认证书安装:确保Burp/Charles的CA证书已正确安装到手机的系统信任证书库中(而不仅仅是用户证书库)。在安卓7.0以上,APP默认不信任用户安装的证书,需要将证书移动到系统目录(需Root),或使用Magisk的“Move Certificates”模块。
- SSL Pinning:这是最可能的原因。使用Frida+Objection进行检测和绕过。如果不会用Frida,可以尝试使用虚拟机或低版本安卓系统(如5.1),其SSL Pinning机制可能较弱。
- APP自身代理检测:有些金融、社交类APP会检测是否设置了系统代理。解决办法是使用透明代理模式,比如将测试手机接入一个设置了iptables规则进行流量转发的路由器或VPN网关,这样APP层面感知不到代理的存在。
6.2 反编译后的代码混淆严重,无法阅读
- 现象:用Jadx打开后,类名、方法名、变量名都是
a,b,c,d这种无意义字符。 - 应对:
- 不要慌:混淆主要影响可读性,但不改变程序逻辑。字符串常量、网络请求的URL通常不会被混淆。
- 重点搜索字符串:直接在全代码中搜索
http、url、api、域名等关键词,这些信息仍然可见。 - 分析网络库调用:即使类名混淆,但像
OkHttpClient.Builder()、Request.Builder().url()这样的关键方法调用链,其模式相对固定,可以通过特征来定位网络请求相关代码。 - 动态调试辅助:结合动态分析,先抓包看到具体的请求和响应,然后在混淆的代码中搜索关键的URL路径或参数名,来定位处理该请求的代码区域。
6.3 收集到的子域名或IP资产非常多,如何确定优先级?
- 策略:不是所有资产都值得投入同等精力。需要建立优先级。
- 业务重要性:优先测试与核心业务相关的系统,如
api.、mobile.、admin.、manage.、pay.、order.等子域名。 - 技术特征:通过横幅信息(banner)识别服务、框架、中间件版本。优先测试那些使用了已知存在高危漏洞的旧版本系统(如Apache Struts2, ThinkPHP, Weblogic, Jenkins等)。
- 暴露面大小:优先测试直接面向互联网、功能复杂的Web应用,其次是简单的展示站,最后是那些只有特定端口(如SSH, RDP)的服务。
- 信息关联度:优先测试从公众号/APP直接关联出来的域名和IP,因为它们与核心业务链路最近,突破后影响最大。
- 业务重要性:优先测试与核心业务相关的系统,如
6.4 疑似发现漏洞,但无法稳定复现或利用
- 现象:测试时偶然触发了一个异常(如报错信息泄露、一次未授权访问),但再次请求时又正常了。
- 排查:
- 记录所有上下文:立即保存完整的HTTP请求和响应(包括所有头、Cookie、参数)。使用Burp Suite的“Copy as curl command”功能保存完整的请求命令。
- 对比分析:将触发异常的请求与正常请求进行逐字节对比,找出差异点。可能是一个特殊的参数值、一个额外的头部、一个特定的时间戳,甚至是请求顺序有关。
- 检查会话状态:确认两次请求的会话(Cookie, Token)是否一致。可能是第一次请求时处于未登录状态,第二次已经自动登录了。
- 考虑竞争条件:有些漏洞属于“时间竞争”漏洞,需要在极短的时间内发送多个请求。尝试使用Burp的Turbo Intruder或自己编写脚本进行并发测试。
- 环境一致性:确保测试环境没有变化,比如IP是否被临时加入白名单、是否有WAF在学习和拦截。
信息收集从来不是机械的工具堆砌,而是一个需要不断思考、关联和验证的智力活动。从公众号和APP这类公开资产入手,往往能绕过外围的防护,直指开发与运维过程中留下的“痕迹”。这套方法的关键在于耐心和细心,把每一个看似无用的信息碎片都捡起来,最终它们可能会拼出一条通往核心系统的捷径。在整个过程中,保持合法授权的边界意识至关重要,我们所有的操作都应在明确授权的范围内进行,目的是帮助客户发现问题,加固防线。