python app 抓包_APP爬虫-双向认证抓包的两种方法

APP抓包相对繁琐,越来越多的 APP 在 https 请求和响应时,为了防止中间人攻击(或中间人抓包),会做证书认证,让抓包工具抓不到请求。

证书认证分单向认证和双向认证,双向认证是相较于单向认证而言的,单向认证就是只在 APP 侧做证书校验,单向认证有现成的解决方法,比如用各种 bypass ssl 校验的 hook 脚本既可让单向认证失效,例如:JustTrustMe 。如果 APP 的网络请求库有混淆,上述 bypass ssl 脚本无效,也有开源作者开发了自适配的 bypass 程序,可以 hook 混淆后的网络库。比如:JustMePlush 。

简单说了下单向认证如何解决,开始说双向认证如何解决。

双向认证除了要在 APP 侧做证书校验外, 对方服务端还要做证书校验。对方服务端是要检测证书的,不提交真正的证书给服务端,肯定会请求失败。

双向认证抓包有两种解决方法:

一是:按照搞定证书的思路去想的话,就是要想办法拿到真正的证书。

二是:Hook SSL 对数据解密数据的地方。

方法一:

因为 APP 能正常跟服务端通信,所以真正的证书肯定是在 APP 里面。所以就是要想办法从 APP 里抠出证书。抠证书有开源的 Frida Hook 脚本。如下地址是开源作者写的 Frida Hook 脚本

https://gist.github.com/ceres- c/cb3b69e53713d5ad9cf6aac9b8e895d2gfgg

可以把证书从内存里读出来保存到本地,并且证书密码也能读出来,非常的方便。

该脚本的原理是:

因为 APP 在向服务端发请求时, APP 肯定会操作证书,所以如果能找到 APP 操作证书的代码地方, Hook 这部分代码,对参数做些输出打印,证书和证书密码就都有了。

大部分情况下,我们不用非常熟悉安卓原理,比如安卓在代码层面是如何操作证书的(当然熟悉更好)。因为资讯发达,一般灵活借助搜索引擎,灵活查阅资料,可以大体知道这些,就可以尝试去写 Hook 脚本去尝试看看。

查阅资料可以知道,安卓操作证书通常是 java.security.KeyStore 这个类,然后再了解下这个类的用法,参数形式。就可以尝试去 Hook 了。上述脚本就是 Hook java.security.KeyStore 这个类的 load 方法,load 方法的形参就是我们需要的证书和密码。

抠出的证书和密码,配置进 fiddler 或 charles 里面,就可以抓到双向认证的包。

PS: 还要注意证书的格式,抠出的证书可能是 jks 或 bks 格式的,fiddler 可能需要 p12 格式的, 所以要找工具先转换一下格式。

方法二:

如果只是想抓包,还有另一种方法,不需要抠证书的方法。虽然 https 在传输过程中是加密的,但在终端显示的时候,必然会解密,不然 APP 上都没法显示了。所以如果能知道安卓解密 SSL 加解密是哪个类, Hook 这个类, 类里相关方法的输入输出肯定就是传输的明文数据。

所以可以查阅资料,看看相关类的用法,就可以尝试去 Hook 打印输出看看情况。也有开源作者开源了该 Hook 脚本, 比如 5alt 老板在google开源的脚本基础上做了修改了的 ssl_logger 。

https://github.com/5alt/ssl_logger

能够 Hook SSL 加解密的地方,它会把传输的数据保存为 pcap 格式。再使用 wireshark 打开该 pcap文件, 在 wireshark 上就可以看到明文的数据了。

如果要模拟向服务器发送请求的话,还是只能使用第一种方法,因为客服端必须要提交正确的证书,服务端才会正确响应。必须得抠出证书,模拟请求时必须带上证书,才能请求到数据。安卓上的证书好多是 jks/bks格式的, 如果使用 Python requests 库的话, 不支持这个格式, 所以要想办法把证书转成 cert 格式的。

上面两种方法都是使用 Frida 进行 Hook ,所以要有 Root 过的手机和明白Frida 怎么使用就能搞定。

对于爬虫来说,搞定抓包和请求参数加密的问题,大部分 Hook ,都可以通过 Hook 安卓系统 API 来找到 APP 代码位置,或直接搞定。其实很少人能很熟悉安卓系统的各种原理,大部分时候能灵活通过各种关键字能查到相关原理的讲解文献,文献里讲的 API 灵活点拿去 Hook 康康线索,就能搞定很多拉。

其实使用双向认证的 APP 还是少数, 对服务器性能多少有影响。

PS :建了一个爬虫技术和爬虫技术做副业交流群, 可以扫我私人微信(dismissmewp)加入,备注:猿人学 。

我的公众号:猿人学 Python 上会分享更多心得体会,敬请关注。

***版权申明:若没有特殊说明,文章皆是猿人学 yuanrenxue.com 原创,没有猿人学授权,请勿以任何形式转载。***

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SSL双向认证是一种安全机制,可以在客户端和服务器之间建立安全通信。在应用程序开发和爬虫抓包中,也可以使用SSL双向认证来加强安全性。以下是两种常见的方法: 1. 使用证书文件 在应用程序和爬虫中,可以使用证书文件来进行SSL双向认证。客户端和服务器之间交互时,需要客户端向服务器发送证书(通常是PEM格式的文件),证明自己的身份。服务器会验证证书的合法性,如果通过验证,就可以建立安全连接。在Python中,可以使用requests库来实现SSL双向认证。示例代码如下: ```python import requests # 客户端证书文件路径 client_cert = '/path/to/client/cert.pem' # 客户端私钥文件路径 client_key = '/path/to/client/key.pem' # 服务器证书文件路径 server_cert = '/path/to/server/cert.pem' # SSL双向认证 response = requests.get(url, cert=(client_cert, client_key), verify=server_cert) ``` 2. 使用OpenSSL工具 另一种常见的方法是使用OpenSSL工具进行SSL双向认证。在Linux和Mac系统中,可以使用openssl命令来生成证书和私钥文件。在Windows系统中,可以下载OpenSSL工具并安装。生成证书和私钥文件后,可以在应用程序和爬虫中使用。示例代码如下: ```python import subprocess # 生成客户端证书和私钥文件 subprocess.run(['openssl', 'req', '-newkey', 'rsa:2048', '-nodes', '-keyout', 'client.key', '-x509', '-days', '365', '-out', 'client.crt', '-subj', '/CN=client']) # 生成服务器证书和私钥文件 subprocess.run(['openssl', 'req', '-newkey', 'rsa:2048', '-nodes', '-keyout', 'server.key', '-x509', '-days', '365', '-out', 'server.crt', '-subj', '/CN=server']) ``` 在应用程序中,可以使用SSLContext对象来进行SSL双向认证。示例代码如下: ```python import ssl import socket # 客户端证书和私钥文件路径 client_cert = '/path/to/client/cert.pem' client_key = '/path/to/client/key.pem' # 服务器证书文件路径 server_cert = '/path/to/server/cert.pem' # SSLContext对象 context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH) context.load_cert_chain(certfile=client_cert, keyfile=client_key) context.load_verify_locations(cafile=server_cert) # 建立SSL连接 with socket.create_connection((host, port)) as sock: with context.wrap_socket(sock, server_hostname=host) as ssock: ssock.sendall(b'Hello, world!') ``` 以上是两种常见的SSL双向认证方法,可以根据实际需求选择适合自己的方法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值