抓包:安全与研发之间的战争
众所周知,现在的app各种防抓包手段是越来越离谱了,本帖就列举列举那些离谱的防抓包手段与反制措施。
Frida/Xposed/Root/Hook检测及绕过不在本帖的讨论范畴。
协议层
单向认证
原理
客户端校验服务端证书的有效性。
解决方案
- Xposed环境下可使用Justtrustme模块
- Firda环境下可使用sslpinning脚本
- 如果上述两种方案均不行,可能需要自己去找校验证书的逻辑,进行hook
双向认证
原理
客户端和服务端均校验服务端证书的有效性。
解决方案
参照单向认证部分处理客户端校验
解包App,查找证书,常见证书格式如下:
.DER .CER,文件是二进制格式,只保存证书,不保存私钥。
.PEM,一般是文本格式,可保存证书,可保存私钥。
.CRT,可以是二进制格式,可以是文本格式,与 .DER 格式相同,不保存私钥。
.PFX .P12,二进制格式,同时包含证书和私钥,一般有密码保护。
.JKS,二进制格式,同时包含证书和私钥,一般有密码保护。
当然,也不能低估研发想隐藏证书的决心,比如某行直接将证书文件保存为图片后缀。
除了找证书,还得找密码,理想的情况下,密码是直接硬编码在代码中,直接翻翻就能找到。翻不到的话可以参考该文章,自吐证书密码。
找到证书和密码后直接导入Burp就可以愉快的抓包了。
本地代理套壳VPN
原理
App启动时在本地开一个代理服务,该代理加密链接到VPN服务器,App所有请求通过代理走VPN。
解决方案
- Hook【开启本地代理】这一步的监听地址,将
127.0.0.1修改为0.0.0.0,使其可以被burp访问,在burp上配置上游代理(部分代理可能需要认证,也需要将认证的用户名密码填入burp)。 - Hook【链接代理】这一步的代理地址,将
127.0.0.1:9999修改为burp的地址。 - 部分App可能还会检查代理地址是否为
127.0.0.1,这个时候也需要hook掉检查方法。 - 这样就可以在burp上抓到数据包了。
Websocket 二进制数据传输
原理
实际上是传递的ArrayBuffer类型的数据。之所以看到是乱码,是因为显示在浏览器中和Burp的数据为String类型。
解决方案
通常的Webscoket 二进制数据发送类似于:
let arrayBuffer = getArrayBufferMessagesFromUser(); // 获取用户需要发送的消息数据,为一个ArrayBuffer对象let webSocket = getWebSocket(); // 获取已经连接成功的WebSocket实例websocket.binaryType = 'arraybuffer'; // 指定WebSocket接受ArrayBuffer实例作为参数webSocket.send(arrayBuffer);接收二进制数据类似于:
let webSocket = getWebSocket(); // 获取已经连接成功的WebSocket实例websocket.binaryType = 'arraybuffer'; // 指定WebSocket接受ArrayBuffer实例作为参数webSocket.addEventListener('message', (message) => { let arrayBuffer = message.data; // 获取用户接收到的消息数据,为一个ArrayBuffer对象 let data = parseMessage(arrayBuffer); // 解析二进制数据});只要在js中找到类似的段落就可以还原出发送和接受的二进制数据(显然,这个过程不会那么轻松),一般情况下ArrayBuffer转换出来的数据是某个类的实例。
因为Websocket归根到底还是TCP协议的一种,如果需要重放websocket数据就必须重新建立连接,对应的二进制数据包也需要不断编码转换。
如果是在App中,可以通过Hook数据包发送之前的数据实现修改数据包。
TCP私有协议
原理
私有协议,直接封装TCP帧进行数据交互。
解决方案
- 部分App可能为了保障用户的使用体验会在TCP连接失败的时候换用HTTP协议进行通信,可以找找app中有没有相关的逻辑,如果有的话,尝试通过hook或者其他方式使其走HTTP协议。
- 找封装TCP协议之前的数据进行Hook修改。
数据层
这一层无非是各种乱七八糟的请求包加密解密/响应包加密解密,常用的算法诸如:
- 使用RSA获取AES加密密钥,使用AES交换公钥/私钥,使用RSA进行数据传输
- 使用SM2获取SM4加密密钥,使用SM4交换公钥/私钥,使用SM2进行数据传输
上述两种方案的核心都是在数据传输前进行Hook获取明文数据,因为这两种都是非对称加密,只有公钥无法解密数据包。
其他的一些方案基本都是对称加密了,核心就是找对称加密密钥,找到加密密钥后可以使用CustomCrypto插件进行辅助解密。