文章目录
- 前言
- 一、测试app的客户端和服务端
- 二、BurpSuite设置代理
- 三、反编译apk文件
- 四、编写brida/frida hook脚本
- 五、Custom plugins自动加解密
- 六、本期送书《二进制安全基础》
- 总结
前言
之前有写过如何安装brida的文章和视频讲解,大家感兴趣的可以看看之前的内容,分别是
①BurpSuite插件Brida的安装
②Brida js-hook脚本的简单配置和debug调试。
完整内容在这里:
我的B站主页
今天就是介绍下Brida的核心功能——自动加解密;如何在反编译之后hook加密和解密函数,自动加解密暴破密码。
提示:以下是本篇文章正文内容,下面案例可供参考
一、测试app的客户端和服务端
由于直接拿网上线成的app来做测试的话,会涉及到法律问题,所以干脆我就自己开发了一个,大致效果如下图:
功能非常简单,所以需要暴破出正确的密码登录进去就算通关了。客户端就是这样,想要源码或者apk的可以公众号找我要,我就不直接在这里公开了。
说完客户端,接下来讲下服务端,服务端也简单,我是直接用python写的:
直接把server.py文件放到一台公网的服务器上面,直接用python3运行就可以了:
python3 server.py
二、BurpSuite设置代理
手机安装burpsuite证书,然后电脑和手机连接同一个wifi,burp监听8080,手机代理端口8080保持ip和端口一直,输入用户名admin,密码随意,显示登录失败:
密码为密文。
说明配置都没问题,可以进行下一步,也就是Brida的核心,Custom plugins自定义组件实现自动加解密。
三、反编译apk文件
我比较喜欢用JEB这款工具,使用起来很方便,直接把apk文件拖进去就行了。
选中任意一个类,点击解析:
因为我写的这个程序比较简单啊,其实我就写了两个类,所以找加解密的函数是很好找的:
也可以直接搜索名字,比如encrypt,就可以很方便的定位:
先来看看这个加密函数的逻辑:
这个encrypt方法用的是AES加密算法,需要传两个参数,对原始的数据进行一个加密。返回的数据是以Base64编码格式的字符串。
鼠标选中这个函数,然后右键交叉引用,就可以找到这个方法的调用。
在这段核心代码里面,s1就是密码文本框里面的数据,后面这一大串数字就是aes的秘钥key,这个字符串s2就是加密后的内容。
在搞懂了逻辑了之后就可以开始写brida的脚本,去尝试hook这个方法,这里直接导入一下,关于怎么调试这个js脚本,我在之前的视频里面已经讲过了,所以就不多说,直接看下一标题的演示吧。
四、编写brida/frida hook脚本
配置brida环境,这些内容都在之前的博客里有十分详细的介绍,不懂的可以回顾之前的超详细文章。
获取app的id:
frida-ps -a -U
启动frida服务端:
Start Server,Attach application,下图表示成功:
加载brida.js:
,
test: function(){
console.log(123123);
return "test123213123";
},
先点击Sava JS file再点击Compile & reload JS,后续的所有js脚本都需要按照这个步骤来,否则极其容易报错。
成功返回测试数据,说明配置成功。
那么调试没有问题的话,就可以开始写加密的hook脚本了,关于这个脚本的文档,其实frida官方是有的:https://frida.re/docs/javascript-api/
访问这个url,搜索Java.perform。不懂的话可以翻译一下。根据反编译的源码,编写hook脚本非常简单:
encrypt: function(data, key) {
var encrypted = "";
Java.perform(function() {
try {
var AESCipher = Java.use("com.example.myapplication.AESCipher");
encrypted = AESCipher.encrypt(data, key);
console.log("Encrypted: " + encrypted);
} catch (e) {
console.log(e);
}
});
return encrypted;
},
但是由于这里的key是一个常量,所以脚本还可以再优化一下,只传入一个明文的参数就行了:
encrypt: function(data){
var encrypted= "";
Java.perform(function(){
var AESCipher = Java.use("com.example.myapplication.AESCipher");
encrypted = AESCipher.encrypt(data,"1234567890123456");
console.log("加密后结果:"+encrypted);
});
return encrypted;
}
app上输入999999:
请求包显示加密后的字符串为:
这个返回的结果跟我们在app上面操作的是一样,说明我们的脚步写的没问题,解密的脚本也很好写,变化其实不大:
decrypt: function(encryptedData){
var decrypted= "";
Java.perform(function(){
var AESCipher = Java.use("com.example.myapplication.AESCipher");
decrypted = AESCipher.decrypt(encryptedData,"1234567890123456");
console.log("解密后结果:"+decrypted);
});
return decrypted;
}
也是一样,测试下能不能调用成功。
ok,脚本没问题的话就可以设置一个自定义的插件了。
五、Custom plugins自动加解密
这里介绍下每个标签的意思。
Plugin name
: 插件名
Plugin Type
: 有4种类型,每种类型后面都会有英文的解释。这里选IHttpListener就可以了。意思是:动态处理每个请求和响应的插件。
Name of the Frida exported function
:要使用的JS函数名。因为app的密码是加密过的,我们暴破字典是明文的,所以我们要hook加密函数,把字典里的明文自动变成密文呢,因此这里的名字选encrypt。
Execute on
:作用于什么地方,有3个选项,请求、响应和所有。因为用户名和密码字段在请求包中,所以选择“请求”——Requests。
Burp Suite Tools
:作用于Burpsuite的哪个工具中?这里选重放Repeater和暴破Intruder就行了。
Execute
:作用于哪个接口。我选择用正则去匹配请求和响应的内容,指定/login登录接口。
其他保持默认。
Parameters
:hook脚本的参数。用正则匹配。
Plugin output
:也是用正则,作为插件的输出。
点击Add plugin->Enable:
这时,我们直接用明文来请求,发现请求是能正常过去的。说明没问题。
返回插件面板,打开debug窗口:
重放一下这个接口,就能发现整体的逻辑了。我们输入的是明文999999,但是修改后的请求Modefied request已经将密码自动加密成密文去请求。
为了更直观的看到效果,把插件先关掉。
再明文请求一次,会发现是报错的。状态码500,服务端异常,因为我们的服务端无法处理明文的数据。
重新把插件打开,直接用明文的字典来暴破。
可以直接用字典,但是由于时间关系,我就随便手打一些上去吧。
最终也是用明文的字典成功暴破出了正确的密码。
admin 123456
Login Successful!!
六、本期送书《二进制安全基础》
如果对二进制感兴趣的朋友,这本书很不错!推荐大家阅读。
《二进制安全基础》为二进制安全技术知识普及与技术基础教程,不仅能为初学二进制安全技术的读者提供全面、实用的C语言反汇编知识,而且能有效培养读者的漏洞挖掘和软件逆向分析基础能力。《二进制安全基础》配套示例源码、PPT课件、教学大纲、教案、习题答案、作者QQ群答疑。 《二进制安全基础》共12章,内容包括二进制安全概述、基本数据类型、表达式、流程控制、函数、变量、数组和指针、结构体、C++反汇编、其他编程知识、二进制漏洞挖掘(PWN)、软件逆向分析。 《二进制安全基础》适合二进制安全初学者和网络安全从业人员,也适合作为应用型本科与高职高专网络空间安全、信息安全类专业的教材。
推荐
《二进制安全基础》以网络空间安全中常见的二进制安全技术为主线,详细介绍 C 语言反汇编技术、二进制漏洞挖掘和软件逆向分析基础技能。 《二进制安全基础》配套示例源码、PPT课件、教学大纲、教案、习题答案、作者QQ群答疑。 《二进制安全基础》适合二进制安全技术初学者、系统安全研究人员、底层软件开发人员、病毒分析人员。 《二进制安全基础》可以作为企事业单位网络安全从业人员的技术参考用书,也可以作为应用型本科、高职高专网络空间安全、信息安全类专业的教材。
如何领书
公众号送书(EureKa安全团队)
关注公众号,参与抽奖,中奖即可送书