使用抓包工具burpsuite、fiddler等进行抓包,方法和原理类似,下面一burpsuite为例,https通信时,客户端需要获取服务器的证书进行验证,直接使用burpsuite抓取https的请求,会出现ssl协商错误。因为在抓包工具抓包过程中,抓包工具是作为一个中间人进行数据包拦截和转发,当进行https请求时,需要服务器的证书验证通过才能信任,同时正文的解密密钥也是通过证书来协商的,而burpsuite没有证书,无法被浏览器信任,导致请求无法正常完成,因此需要导入burpsuite的证书到浏览器,让其信任burpsuite
电脑端浏览器抓包
- 开启burpsuite代理proxy,option
- 将浏览器代理设置为上述ip和端口
- 在浏览器中输入ip:端口,进入burpsuite证书下载界面,下载证书,然后安装证书
- 开始抓https包:
Android的https数据包抓取
安卓端同样可以采取上述的方法进行抓包,下载证书导入到手机中安装,将wifi代理设置为burpsuite中设置的ip和端口。
但是Android端有很多问题,在安卓6.0之前,应用默认是信任系统和用户的证书的,可以使用上述的方法,但是在7.0之后,默认是不信任用户证书。
Android7.0之后抓https包(已经root)
- 首先查看app是否信任系统证书。用apktool解包,找到network_cerxxx.xml文件,里面会写明所信任的对象,包括system和user。
- 如果只信任系统证书,那么我们可以将下载好的证书导入到系统目录下/system/ect/security/cacerts。系统证书的格式为hash.0,所以需要按这个格式修改证书。
- 如果下载的证书是pem格式:
openssl x509 -inform PEM -subject_hash_old -in PortSwiggerCA.pem | head -1
如果der格式:
openssl x509 -inform DER -subject_hash -in PortSwiggerCA.der | head -1
使用以上命令可以计算证书hash。
- 将证书放到指定目录下,然后重启:
> adb mount
> adb push xxxxx.0 /system/etc/security/cacerts
> adb remount
> adb reboot
将证书导入后即可抓去https包
Android7.0及以上,自定义的证书验证的https包抓取
这种情况就是应用开发者自己定义了证书验证方法
X509TrustManager.checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
//verify cert
}
该应用及不信任系统证书也不信任用户证书。这时只能通过hook checkServerTrusted方法。
使用frida hook上述方法,直接返回,不做任何认证即可抓去https包。
- 使用jd-gui打开目标apk(自行百度如何将apk转为jar),全局搜索X509TrustManage做验证的地方,也就是checkServerTrusted实现的地方。
- 然后编写Frida注入的js脚本:
var hook = Java.use('xxxx') //xxx为checkServerTrusted所在的类名全称
hook.checkServerTrusted.overload('Lxxxxx', 'java.lang.String').implement(arg1, arg2) =
{
return;
}
//L后的xxx为X509Certificate类名全称
不会hook可以百度如何ook android app,之后会写blog介绍如何hook。
- 开启frida hook程序,打开应用开始抓包。