00
—
前言
Brida是BurpSuite的一个插件,它可以将Burp和Frida结合起来使用,可以在BurpSuite中直接调用目标应用程序中的加/解密函数,可以根据你的需求修改移动端APP与服务器的通信流量。通过编写简单的js脚本调用APK自身加密解密函数,可以实现一键加密解密操作。
01
—
实验环境
实验环境:JDK11、WIN10、python2.7
工具:Brpsuite2020、安卓模拟器
环境自行安装,需要配置好环境变量。所需要的工具以及环境均以打包,到文末获取下载链接即可。
1.安装frida
解压好相关文件,先将frida-14.2.2-py2.7-win-amd64.egg文件放到C盘用户目录,目的是加快frida安装速度。
pip2 install frida
pip2 install frida-tools
pip2 install pyro4
2.配置服务端
adb是安卓调试桥,工具在模拟器安装目录下。通过命令 adb shell 进入交互界面:
通过adb将frida-server86文件移动到内部目录/data/local/tmp:
abd push frida-server64 /data/local/tmp
给文件配置权限并启动:
chmod 777 frida-server64
./frida-server64
3.Adb端口转发:
adb forward tcp:27042 tcp:27042
adb forward tcp:27043 tcp:27043
利用命令 frida-ps -U 可以查看在运行的进程:
4.模拟器配置burpsuite代理:
5.burpsuite安装brida
有两种安装方式,一种是在BApp Stores中进行在线安装(最新版);另一钟是本地安装,如下:
环境配置好后点击运行,没有报错即可。
02
—
实例学习
1.环境启动
将APP的服务端文件放到Phpstudy中,启动环境并成功访问即可
在模拟器中利用命令 adb install -t eseBrida.apk 安装eseBrida.apk文件
打开APP并配置服务端连接地址:
填写admin/123456进行抓包,账号密码以及返回信息均经过加密:
2.寻找加解密函数
利用反编译APP得到源码,定位加密算法位置
接着跟进AesEncryptionBase64出现的位置
继续跟进eseeServer.AesKey的位置,发现硬编码加密密钥AesKey的值。
了解它的加密过程后,看看服务端的代码:
//加解密
class Security {
private static function pkcs5_pad ($text, $blocksize) {
$pad = $blocksize - (strlen($text) % $blocksize);
return $text . str_repeat(chr($pad), $pad);
}
public static function encrypt($input, $key) {
$size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
$input = Security::pkcs5_pad($input, $size);
$td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_ECB, '');
$iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
mcrypt_generic_init($td, $key, $iv);
$data = mcrypt_generic($td, $input);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
$data = base64_encode($data);
return $data;
}
public static function decrypt($sStr, $sKey) {
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128,$sKey,base64_decode($sStr),MCRYPT_MODE_CBC);
$dec_s = strlen($decrypted);
$padding = ord($decrypted[$dec_s-1]);
$decrypted = substr($decrypted, 0, -$padding);
return $decrypted;
}
}
error_reporting(0);//加上error_reporting(0);就不会弹出警告了
//post方式 秘钥与Android端一致
$privateKey = "9876543210123456";
//获取Android 端传输来的json数据
$json = file_get_contents("php://input");
$data = json_decode($json, true);
$resname = $data['username'];
$respasswd = $data['password'];
$name = Security::decrypt($resname, $privateKey);
$passwd = Security::decrypt($respasswd, $privateKey);
//echo "------".$name."--------".$passwd."-------n";
if($name=="admin" and $passwd =="654321"){
$data = Security::encrypt("login_success", $privateKey);
echo $data;
}else{
$data1 = Security::encrypt("error", $privateKey);
echo $data1;
}
3.编写brida对应的脚本eseScript.js:
;
// 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;
}
4.brida解密
Brida中选择编写好的js脚本文件和包名,启动服务
勾选密文,右键选择Brida Custom2进行解密
得到的明文信息和之前输入的一致
选中返回的密文信息,右键选择BridaCustom4,得到明文信息“error”
当我们输入正确口令admin /654321时,显示登录成功
参考:
https://bwshen.blog.csdn.net/article/details/102691898
END
—
这是学渣成长之路的第 12 篇文章。
需要学习实例以及环境的小伙伴公众号回复“00003”
本文始发于微信公众号(WhITECat安全团队):Brida加解密入门学习
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论