Android渗透测试frida-Brida插件加解密实战
Android APP测试时,经常发生会遇见数据包加密传输,这样就会影响测试。不过,Brida可以编写加密解密脚本,对加密的数据包进行解密,在加密。工具或者插件都是为了测试方便。
环境
Android 8.1.0 pixel
Burpsuite 1.7
windows 10
eseBrida.apk (下面给下载地址)
phpstudy
什么是Brida
介绍Brida
1、Brida.jar为Burpsuite插件
2、bridaServicePyro是用于Frida适配到burpsuite上的python脚本,这一部分存储在插件中,在执行brida过程中复制到缓存文件夹中。
3、script.js是要注入到目标应用程序的javascript脚本,它会通过Frida带有的rpc.exports功能将信息返回到拓展程序中。
4、该script.js脚本会被Frida注入到我们在 Brida中指定的进程中所以我们可以直接使用 Frida的 api。
5、目前只支持python2.7
安装frida
需要安装frida,参考文章https://www.jianshu.com/p/c349471bdef7
安装Brida
在Burpsuite安装Brida
安装完成,在python2.7安装Pyro4pip install Pyro4
实战
apk运行环境
本文提供一个自己写的eseBrida.apk,拿到apk,因为我这里是测试版本,安装需要加-t参数,
adb install -t esebrida.apk
,安装运行如下:
有个设置按钮,可设置服务器地址。这里利用phpstudy在www目录下运行AndroidLogin.php,
然后在浏览器访问服务器地址如http://192.168.3.254/AndroidLogin.php
看是否可以访问成功,如下:
将此地址填入安卓apk设置中,burpsuite设置代理:
手机wifi设置代理,如下:
在apk中输入用户名密码,
查看抓取的数据包:
重点
这里的数据是密文传输,不利于爆破,这里想对算法进行解密,然后在实现加密传输大奥服务器端。
分析apk
利用jeb 反编译apk,发现加解密算法AesEncryptionBase64类
上层定位,发现加密算法的秘钥硬编码,如下
自此,apk的流程已经分析清楚了。接着可以有两种思路
方法1、将java代码复制出来,在eclipse实现以下加解密流程,就可以对传输的数据进行解密加密了。
方法2、利用Brida调用apk自身加密解密函数,一键实现加密解密操作。
自然,方法2相对1要简单,而且操作方便。所有便有这篇文章
编写Brida js脚本
1、运行frida
首先下载startFridaService.py,运行python startFridaService.py
2、运行Brida,如下
3、先给一个Brida简单的test.js框架
'use strict';
// 1 - FRIDA EXPORTS
rpc.exports = {
exportedFunction: function() {
},
contextcustom1: function(message) {
console.log("Brida start :--->");
return "Brida test1";
},
getplatform: function () {
if (Java.available) {
return 0;
} else if (ObjC.available) {
return 1;
} else {
return 2;
}
}
}
4、测试方法contextcustom1
成功执行脚本
5、编写Brida调用encrypt加密函数
'use strict';
// 1 - FRIDA EXPORTS
rpc.exports = {
exportedFunction: function() {
},
contextcustom1: function(message) {
console.log("Brida start :--->");
return "Brida test1";
},
contextcustom2: function(message) {
console.log("Brida Java Starting script ---->ok");
var enc;
Java.perform(function () {
try {
var key = "9876543210123456";
var text = "admin";
//hook class
var AesEncryptionBase64 = Java.use('com.ese.http.encrypt.AesEncryptionBase64');
console.log("Brida start : encrypt before--->"+text);
//hook method
enc = AesEncryptionBase64.encrypt(key,text);
console.log("Brida start : encrypt after--->"+enc);
} catch (error) {
console.log("[!]Exception:" + error.message);
}
});
return enc;
},
getplatform: function () {
if (Java.available) {
return 0;
} else if (ObjC.available) {
return 1;
} else {
return 2;
}
}
}
6、执行方法contextcustom2
通过签名抓取的数据包, 发现加密数据一致,证实调用apk加密算法。
7、Burpsuite右键菜单
发现4个方法与请求数据包与返回数据包相互一一对应
1、Brida Custom 1----->contextcustom1
2、Brida Custom 2----->contextcustom2
3、Brida Custom 3----->contextcustom3
4、Brida Custom 4----->contextcustom4
8、编写对应插件eseScript.js脚本
加载其他脚本,需要重启burpsuite,
'use strict';
// 1 - FRIDA EXPORTS
rpc.exports = {
exportedFunction: function() {
},
//AesEncryptionBase64 encrypt
contextcustom1: function (message) {
console.log("Brida start :0--->" + message);
var data = hexToString(message)
console.log("Brida start :1--->" + data);
var enc;
Java.perform(function () {
try {
var key = "9876543210123456";
var text = data;
//hook class
var AesEncryptionBase64 = Java.use('com.ese.http.encrypt.AesEncryptionBase64');
console.log("Brida start : AesEncryptionBase64 ---> success");
console.log("Brida start : encrypt before--->"+text);
//hook method
enc = AesEncryptionBase64.encrypt(key,text);
console.log("Brida start : encrypt after--->"+enc);
} catch (error) {
console.log("[!]Exception:" + error.message);
}
});
return stringToHex(enc);
},
//AesEncryptionBase64 decrypt
contextcustom2: function (message) {
console.log("Brida start :0--->" + message);
var data = hexToString(message)
console.log("Brida start :1--->" + data);
var text;
Java.perform(function () {
try {
var key = "9876543210123456";
var enc = data;
//hook class
var AesEncryptionBase64 = Java.use('com.ese.http.encrypt.AesEncryptionBase64');
console.log("Brida start : AesEncryptionBase64 ---> success");
console.log("Brida start : decrypt before--->"+enc);
//hook method
text = AesEncryptionBase64.decrypt(key,enc);
console.log("Brida start : decrypt after--->"+text);
} catch (error) {
console.log("[!]Exception:" + error.message);
}
});
console.log("Brida start : decrypt after--->"+stringToHex(text));
return stringToHex(text);
},
//AesEncryptionBase64 encrypt
contextcustom3: function (message) {
console.log("Brida start :0--->" + message);
var data = hexToString(message)
console.log("Brida start :1--->" + data);
var enc;
Java.perform(function () {
try {
var key = "9876543210123456";
var text = data;
//hook class
var AesEncryptionBase64 = Java.use('com.ese.http.encrypt.AesEncryptionBase64');
console.log("Brida start : AesEncryptionBase64 ---> success");
console.log("Brida start : encrypt before--->"+text);
//hook method
enc = AesEncryptionBase64.encrypt(key,text);
console.log("Brida start : encrypt after--->"+enc);
} catch (error) {
console.log("[!]Exception:" + error.message);
}
});
return stringToHex(enc);
},
//AesEncryptionBase64 decrypt
contextcustom4: function (message) {
console.log("Brida start :0--->" + message);
var data = hexToString(message)
console.log("Brida start :1--->" + data);
var text;
Java.perform(function () {
try {
var key = "9876543210123456";
var enc = data;
//hook class
var AesEncryptionBase64 = Java.use('com.ese.http.encrypt.AesEncryptionBase64');
console.log("Brida start : AesEncryptionBase64 ---> success");
console.log("Brida start : decrypt before--->"+enc);
//hook method
text = AesEncryptionBase64.decrypt(key,enc);
console.log("Brida start : decrypt after--->"+text);
} catch (error) {
console.log("[!]Exception:" + error.message);
}
});
console.log("Brida start : decrypt after--->"+stringToHex(text));
return stringToHex(text);
},
getplatform: function () {
if (Java.available) {
return 0;
} else if (ObjC.available) {
return 1;
} else {
return 2;
}
}
}
// Convert a ASCII string to a hex string
function stringToHex(str) {
return str.split("").map(function(c) {
return ("0" + c.charCodeAt(0).toString(16)).slice(-2);
}).join("");
}
// Convert a hex string to a ASCII string
function hexToString(hexStr) {
var hex = hexStr.toString();//force conversion
var str = '';
for (var i = 0; i < hex.length; i += 2)
str += String.fromCharCode(parseInt(hex.substr(i, 2), 16));
return str;
}
注意: 因为从message接受的数据是hex,所有调用hexToString转成字符串,然后进行加密操作,最后调用hexToString转换成hex返回。
9、运行效果
解密
加密
自此,解实现了一键加密,一键解密操作。本片文章的目的就达到了。
彩蛋
你以为就结束了吗?No No No ......
当你输入 账号:admin 密码:654321
来源:先知
注:如有侵权请联系删除