Brida加解密入门学习

  • A+
所属分类:移动安全

00


前言


Brida是BurpSuite的一个插件,它可以将Burp和Frida结合起来使用,可以在BurpSuite中直接调用目标应用程序中的加/解密函数,可以根据你的需求修改移动端APP与服务器的通信流量。通过编写简单的js脚本调用APK自身加密解密函数,可以实现一键加密解密操作。


01


实验环境


实验环境:JDK11WIN10python2.7工具:Brpsuite2020、安卓模拟器

环境自行安装,需要配置好环境变量。所需要的工具以及环境均以打包,到文末获取下载链接即可。


1.安装frida

解压好相关文件,先将frida-14.2.2-py2.7-win-amd64.egg文件放到C盘用户目录,目的是加快frida安装速度。

pip2 install fridapip2 install frida-toolspip2 install pyro4

2.配置服务端

adb是安卓调试桥,工具在模拟器安装目录下。通过命令 adb shell 进入交互界面:

Brida加解密入门学习

通过adb将frida-server86文件移动到内部目录/data/local/tmp:

abd push frida-server64 /data/local/tmp

给文件配置权限并启动:

chmod 777 frida-server64./frida-server64

Brida加解密入门学习

3.Adb端口转发:

adb forward tcp:27042 tcp:27042adb forward tcp:27043 tcp:27043

Brida加解密入门学习

利用命令 frida-ps -U 可以查看在运行的进程:

Brida加解密入门学习

4.模拟器配置burpsuite代理

Brida加解密入门学习

5.burpsuite安装brida

有两种安装方式,一种是在BApp Stores中进行在线安装(最新版);另一钟是本地安装,如下:

Brida加解密入门学习

环境配置好后点击运行,没有报错即可。

Brida加解密入门学习


02


实例学习


1.环境启动

将APP的服务端文件放到Phpstudy中,启动环境并成功访问即可

Brida加解密入门学习

Brida加解密入门学习

在模拟器中利用命令 adb install -t eseBrida.apk 安装eseBrida.apk文件

Brida加解密入门学习

打开APP并配置服务端连接地址:

Brida加解密入门学习

填写admin/123456进行抓包,账号密码以及返回信息均经过加密:

Brida加解密入门学习

2.寻找加解密函数

利用反编译APP得到源码,定位加密算法位置

Brida加解密入门学习

接着跟进AesEncryptionBase64出现的位置

Brida加解密入门学习

继续跟进eseeServer.AesKey的位置,发现硬编码加密密钥AesKey的值。

Brida加解密入门学习

了解它的加密过程后,看看服务端的代码:

<?php  //加解密  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; }?>
后端拿到加密数据后,会用和客户端相同key进行解密。如果提交的口令不等于admin/654321那么返回加密后的“error”值,否则返回加密后的“login_success”值。其实brida提供了“插桩”操作,会自动化列出进程中类,方便我们将可疑的函数hook住。有概率可以找到正确的加解密函数。

Brida加解密入门学习

3.编写brida对应的脚本eseScript.js:

'use strict';
// 1 - FRIDA EXPORTSrpc.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 stringfunction 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 stringfunction 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加解密入门学习

勾选密文,右键选择Brida Custom2进行解密

Brida加解密入门学习

得到的明文信息和之前输入的一致

Brida加解密入门学习选中返回的密文信息,右键选择BridaCustom4,得到明文信息“error”

Brida加解密入门学习

Brida加解密入门学习

当我们输入正确口令admin /654321时,显示登录成功

Brida加解密入门学习

Brida加解密入门学习

参考:

https://bwshen.blog.csdn.net/article/details/102691898



END



  这是学渣成长之路的第 12 篇文章。


需要学习实例以及环境的小伙伴公众号回复“00003”

本文始发于微信公众号(WhITECat安全团队):Brida加解密入门学习

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: