第4章:信息收集——SDK包分析、文档查找与开放端口探测

信息收集这个阶段,说白了就是「知己知彼」。你连对手的底牌都没摸清,谈什么渗透测试?我做了这么多年SDK安全评估,见过太多人上来就掏工具乱扫一气——结果呢?要么漏掉了核心资产,要么被蜜罐耍得团团转。我个人习惯,拿到一个SDK的第一周,70%的时间都在做信息收集。这活越细,后面越省心。

SDK 信息收集核心流程 SDK 包体分析 文档与情报查找 开放端口探测 汇聚 → 交叉关联分析 APP 级攻击面 协议级攻击面 配置级攻击面 ⚠ 持续迭代:新线索 → 回溯补充收集

4.1 SDK 包体分析——扒开外衣看本质

拿到一个SDK压缩包,第一步干什么?我建议别急着解压。先检查MD5/SHA256校验值,确保文件完整且未被篡改。我在项目中遇到过一种情况:甲方提供的SDK包和官方仓库的哈希对不上,后来发现是被中间人插了后门。所以,校验这一步不能省。

4.1.1 包结构快速摸底

解压后,先看目录层级。你想想看,一个三方的推送SDK,如果根目录下就躺着 libcore.so 和 config.json,那还好。但如果它带着 res/、assets/、META-INF/,那就复杂了。我一般用 tree 命令先输出全貌,然后再写个小脚本提取特征。

文件/目录重点关注原因常见风险
jniLibs/ 或 lib/包含 .so 原生库,很难反编译隐藏加密逻辑、反调试、C2地址
res/raw/资源文件,常放证书、密钥、配置硬编码口令、、自签名根证书
AndroidManifest.xml权限声明、组件暴露、provider权限过度申请、组件可任意调用
classes.dex / .aarJava/Kotlin 业务代码逻辑漏洞、加密算法逆向
build.gradle / podspec构建配置、依赖版本依赖已知漏洞库(Log4j、OkHttp 旧版)
小技巧: 解压时使用 unzip -l sdk.aar 先列表再看内容,别一股脑全扔到工作目录。很多SDK包体积大但有效文件不多,提前了解布局能节约时间。

4.1.2 关键文件深度审查

我个人会把精力放在三个方面:

  • 构建配置(.gradle / .podspec):这里面暴露的依赖版本和仓库地址,往往能透出SDK用的第三方组件。我记得有一次,我在一个.gradle文件里看到了okhttp:3.8.0,那年头正好爆出SSRF漏洞。顺着这个线索,我后来真的找到了一个远程命令执行的入口。
  • 原生库字符串:.so文件用strings命令跑一遍,重点过滤http://、https://、api.、secret、key、password等关键词。硬编码的测试环境和生产环境地址是常见漏洞。
  • 权限与组件声明:AndroidManifest里的uses-permission如果写了40个权限,其中一半跟SDK功能无关,那就要警惕了——这可能是在为将来的隐私采集预留通道。
避坑指南: 我曾经在分析一个广告SDK时,忽略了lib/armeabi下的一个签名校验so文件。结果所有动态分析都打不开它的接口。后来才发现,那个so加载时会校验集成App的签名,不是白名单包名就直接exit。一定要先把这种自保护机制识别出来,否则后面白费功夫。

4.2 文档与情报查找——别当「野人」

你可能会说:「文档有啥好看的?」嗯,这话对那些文档质量差到极点的SDK来说,确实有一定道理。但正式做渗透测试之前,看文档是性价比最高的情报收集手段。为什么?因为文档会告诉你官方期望的集成方式、接口调用顺序以及——它们自己都不好意思写的限制和坑。

4.2.1 公开文档挖掘

  • 官方集成指南:重点关注「快速开始」章节,这里会暴露初始化流程和必要参数。配合AppKey或Secret的输入位置,通常能反推出后端校验逻辑。
  • API 参考文档:仔细阅读init()、setToken()、setCallback()等关键方法的入参说明。我遇到过一种情况:文档里写参数「建议使用UUID」,但代码里实际上做了是否有效的校验——这就意味着后端有存储和验证机制,可以打点。
  • 版本更新日志(Changelog):这里藏着的「修复了某个安全漏洞」往往是你未测试版本的前车之鉴。对照当前SDK版本和漏洞公告,直接能推测可能存在的攻击向量。

4.2.2 非公开情报与泄露搜索

除了官方文档,我建议你做两件事:

  1. GitHub 搜索:搜SDK名称 + 、SDK名称 + secret。有些粗心的开发者会把示例代码中的测试密钥直接提交到公开仓库。我有一次在GitHub上搜到某知名推送SDK的Master Secret,直接可以用官方控制台接口下推消息给所有注册设备——你不用怀疑人生,这就是真实案例。
  2. 网络空间搜索引擎:比如 Shodan、Fofa、ZoomEye。搜索SDK默认域名或特定请求路径,看有多少服务暴露在公网。如果发现大量开发者集成的测试/生产环境实例,那你就可以分析这些实例的响应差异。
核心原则: 文档和情报是SDK设计者的「心理地图」。你越懂他们怎么想的,就越能预测他们会犯哪些错误。这不是玄学,这是渗透。

4.3 开放端口探测——看看SDK在「通话」的对象

SDK本质上是一段代码,它会在宿主App里联网。所以,它的开放端口和网络交互行为是暴露攻击面的最直接窗口。我个人会在集成SDK的测试App上做以下探测,而不是对SDK包本身静态分析——动静结合才完整。

4.3.1 本地端口监听

SDK如果在本机启动了服务端口(比如127.0.0.1:xxxxx),那就意味着它可能提供了跨进程通信能力(IPC)。这类端口的作用通常包括:

  • 跨App共享登录或支付状态
  • 本地调试接口(一些SDK留了后门用来检测集成状态)
  • 对端服务器的健康检查或心跳回复

怎么探测?在集成测试App运行期间,用netstat -an | grep LISTEN查看本机所有监听端口。对比App启动前后多出来的端口,基本就是SDK开的。

端口范围常见用途风险程度
1024-49151SDK自用服务端口中-高(可能存在未授权访问)
49152-65535动态临时端口,通常是客户端行为低(一般是短连接)
8080/8443HTTP/HTTPS代理或调试服务高(很多SDK会留调试接口)
9090/4444WebSocket或自定义协议端口中(需进一步分析协议)

4.3.2 远程目标端口探测

这个就不只是本机了。你可以通过抓包工具(比如Burp、Charles)、流量分析工具(Wireshark、tcpdump)或者直接看strings输出,提取SDK通信的域名和IP。然后对这些目标进行常规端口扫描。

建议: 扫描时带上-sV(版本探测),因为你不仅要知道端口开了,还要知道开了什么服务。比如443端口上可能不是标准HTTPS,而是自定义的加密隧道。版本信息能帮你判断后端是否存在已知漏洞。

4.3.3 协议指纹识别

端口开放只是第一步,更重要的是识别协议。用nmap -sV --version-intensity 9能拿到大部分协议指纹。但我还会手动发一个简单的HTTP请求,看响应是不是JSON、XML、二进制块或者纯文本。这能帮我快速判断这个SDK是用RESTful API、gRPC、WebSocket还是自定义二进制协议通信。

我曾经踩过的坑: 有一次我用nmap扫描一个SDK的C2服务器,发现8443端口上挂了HTTPS。我以为跟正常WEB打点一样,结果用Burp直接代理过去,对方回复了一串不可读的二进制。后来发现那是经过AES-GCM加密的Protobuf流——必须拿到对称密钥和proto定义才能解析。所以啊,端口探测不等于渗透终点,它只是告诉你「这里可能有东西」,怎么吃下去还得靠后面的分析。