Brida介绍
-
官方解释:Brida 是 Burp Suite 扩展,它作为 Burp Suite 和 Frida 之间的桥梁,可以在篡改应用程序与后端服务/服务器之间交换的流量的同时使用和操作应用程序自己的方法。它支持 Frida 支持的所有平台(Windows、macOS、Linux、iOS、Android 和 QNX)。
https://github.com/federicodotta/Brida
https://github.com/vichhika/Brida
自己理解:brida 可以直接和frida server配合 。brida通过frida server对app进行spwn或者attach。将brida的js脚本通过frida-server注入app内。然后通过RPC主动调用方式对请求明文进行自动加密或者自动解密。发送到服务器上。服务器收到请求。解密然后响应方式加密数据发送给brida。brida 通过主动调用接收直接对加密数据进行解密。从而达到自动化测试的目的。
Brida环境安装
- 安装的环境参考https://www.bilibili.com/video/av332313470/ 不在过多介绍。这里我用的python环境是python3
app进行分析
- 使用jadx进行反编看看这个apk
- 360加固应该是整体加固。
- 脱整体加固的工具有frida-dexdump(python编写可以单独使用可以配合objection),blackDex(就是一个app直接安装就行了)。等工具我觉得这个两个工具最好用。工具百度或者github去搜索
- 这里我使用blackDex进行脱壳
- 利用adb pull命令拉下来。把打包的dex文件压缩成zip文件然后放到jadx里面即可
- 接下来打开postern和Charles对软件进行抓包
- 刚打开手机发现提示root,我们通过截图可以看到是toast方法这是一个定位点
- 然后我们点击账号登陆随便输入进行抓包。这个没有检测代理也没有检测vpn可以直接抓并且是http协议所以不存在什么证书双向验证等问题。开搞
- 我们看到有一个param=我们去源代码里面搜素一下发现都是关联的d.c.a.k.r.c 函数
- 看代码是RSA的加密方式不过他这和普通的好像不太一样有一个b函数实现加密解密逻辑
- 核心加密算法代码如下:
-
package d.c.a.k; import android.util.Base64; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.security.KeyFactory; import java.security.NoSuchAlgorithmException; import java.security.interfaces.RSAPublicKey; import java.security.spec.InvalidKeySpecException; import java.security.spec.X509EncodedKeySpec; import javax.crypto.Cipher; /* compiled from: U.java */ /* loaded from: dex_.dex */ public class u { private static RSAPublicKey a(String str) throws NoSuchAlgorithmException, InvalidKeySpecException { return (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(Base64.decode("xxxx", 0))); } public static String b(String str) { try { Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); RSAPublicKey a2 = a("xxxx"); cipher.init(2, a2); return new String(d(cipher, 2, Base64.decode(str, 0), a2.getModulus().bitLength()), "UTF-8"); } catch (Exception unused) { m.b("解密字符串[" + str + "]时遇到异常"); return ""; } } /* JADX INFO: Access modifiers changed from: package-private */ public static String c(String str) { try { Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); RSAPublicKey a2 = a("xxxx"); cipher.init(1, a2); return Base64.encodeToString(d(cipher, 1, str.getBytes("UTF-8"), a2.getModulus().bitLength()), 2); } catch (Exception e2) { e2.printStackTrace(); m.b("加密字符串[" + str + "]时遇到异常"); return ""; } } private static byte[] d(Cipher cipher, int i2, byte[] bArr, int i3) { 核心算法 由于该app目前在运行阶段所以核心代码我就忽略了。 return byteArray; } }
- 仔细看加解密使用的都是同一个公钥。公钥我们用xxx进行代替。这种我是第一次见笑脸。
Frida Hook脚本编写确定猜想
- 编写frida脚本需要frida api基础java和JavaScript基础如果不懂建议去学习。这里不再讲述
使用博主编写算法通杀脚本快速定位
- 可以去频道下载(这个只能吐出明文并不能定位),直接定位的后续内部发布
app加密通信过程
- 1:app明文请求通过RSA/ECB/PKCS1Padding 非对称算法对明文请求加密
- 2:服务器收到加密请求使用秘钥对加密请求进行解密(注意这里public static String b) 对请求加密的数据无法解密因为是非对称的加密算法
- 3:把解密的数据在服务器里面顺序执行判断等。结果在加密然后发送(响应)给app客户端。
- 4:app客户端收到加密响应用自己的解密算法对响应进行解密
frida和brida和burp与app和服务器的关系解读
brida 主动调用js编写
- 编写frida脚本需要frida api基础java和JavaScript基础 Brida 编写脚本的基础 如果不懂建议去学习。这里不再讲述
- 测试是否生效
brida 主动调用插件编写
最终测试截图
- 此篇文章提供思路,具体有不会编写。插件自己思考一下。或者百度参考。涉及到的脚本和细节问题以后如果创建内部群会详细讲解。关注博主的频道和github主页。了解最新动态。至此我们可以把hook出的明文直接在repeteror中填写然后发送利用brida实现自动加密解密。测试app。不过这种需要依赖app不稳定可能。