8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png
Frida-brida之hook抓包初探
aiyun 2021-3-17

环境准备

1、安装npm

https://nodejs.org/en/download/官网下载后直接安装

2、安装frida:

pip install frida

pip install frida-tools

npm install [email protected]

注:Frida-compile较新版本缺少brida编译参数会报错,具体那个版本后去除参数的未进行测试,有兴趣的可自行尝试。

3、安装birda和依赖:

Github下载v.0.4导入burp扩展中:https://github.com/federicodotta/Brida/releases/tag/v0.4

pip install Pyro4

注:burp商店自带的也有brida,当不介意在商店直接安装,笔者在burp商店直接安装brida时hook的js脚本无法解释参数,最后换官网的包解决的问题,本萌新也不知道原因,求大佬指点。

4、测试apk环境搭建

测试apk下载地址:https://pan.baidu.com/s/1r2pKkbsB22FMfu_bD2vhtw

安装:Adb install -t eseBrida.apk

注:本着最快入手讲解使用的原则使用了大佬的测试app。(好吧其实就是本人菜对加解函数的查找还不太会,先用测试app练练手,后续学会加密姿势后可能会继续写个学习过程)

服务端环境搭建:

1611024501_60064875e0c077e6b0568.png!small?1611024502748

如上图所示,下载后四个文件,有hook.js脚本和服务端的处理代码,还有个就是开启frida服务的脚本,如需使用请参考实际环境。

一切为了效率,我们可以直接使用phpstudy搭建服务,将php文件放进phpstudy的web根目录即可。

访问结果如下:

1611024510_6006487e6b8ad49a0ae72.png!small?1611024511293

注:如果访问看到的是源代码或空白页可能是php版本问题,更改版本即可,此处我用的是5.4.45

在apk内设置服务地址:

1611024529_6006489184f9ca4751c7f.png!small?1611024530336

开始

下载对应的frida-server版本并传入测试机中运行:

1611024542_6006489ed37c533ccb200.png!small?1611024543681

进行端口转发:

1611024548_600648a483bf222514af4.png!small?1611024549529

进入burp开启服务和应用:

1611024558_600648ae76b2dd618d29d.png!small?1611024559326

Js直接加载默认js脚本就好,在默认js内进行修改,两个路径选择安装时的路径即可,找不到可用everything等工具搜索文件名找到路径。

包名可通过下图命令进行查找或在打开软件后使用adb shell dumpsys window w |findstr \/ |findstr name=   进行查看

1611024580_600648c40608091bfc3c1.png!small?1611024581057

脚本调试

查看大佬的js文件:

1611024589_600648cde2bfa8b453119.png!small?1611024590763

对比反编译的加密算法:

1611024598_600648d66cc9c02269779.png!small?1611024599334

Key值:

1611024606_600648def2ff03a73fd04.png!small?1611024607799

加载默认的brida.js:

1611024620_600648ecb4edf9fde353e.png!small?1611024621595

写入下图中的js代码:

1611024635_600648fbef0cb012eec3c.png!small?1611024636858

保存并重新编译js,然后进行调试(每次修改js代码后都需要进行保存编译操作):

1611024644_60064904dd0ba2f46bf8b.png!small?1611024645735

添加数据运行contextcustom1方法,确认brida有无问题:

1611024653_6006490d8cb4b3bf20116.png!small?1611024654426

运行contextcustom2方法,对比加解密函数是否正确:

1611024663_60064917e83faade08e80.png!small?1611024665046

1611024681_6006492928b0bb528a496.png!small?1611024681931

1611024688_60064930d304b31b0f61c.png!small?1611024689707

使用大佬的js代码进行调试:

1611024697_60064939bab834e89030c.png!small?1611024698668

查看输出,发现有问题,查看js代码发现该js传输的为16进制byte流数据,更改代码使之传输字符串数据查看结果:1611024709_600649455a0663d504445.png!small?1611024710176

1611024721_6006495127c4137bb3795.png!small?1611024722021

同理修改解密脚本:1611024730_6006495a5e1dbb580d16c.png!small?1611024731197

1611024739_60064963e60cca9892f90.png!small?1611024740802

按理说大佬的js应该是没有问题的,不清楚是调用还是brida更新后机制改变了,有兴趣的可以研究下,然后希望有知道原因的大佬指点下本萌新。

插件使用

Bridav0.4直接附带有几个利用脚本的插件,挺方便的,也简单的用下插件,入个门。

IHttpListener

IhttpListener插件是根据条件自动调用js加解的插件:

1611024749_6006496d98c8f3f3d8e6f.png!small

下列是该插件各项代表的意义:

插件名称:BridaEncryptPassword

插件类型:IHttpListener

Frida导出函数的名称:(我们在前面的步骤中定义的JS函数的名称。请勿在导出的函数名称中使用大写字符

执行于:请求/响应

Burp Suite工具:RepeaterIntruderScanner(为了能够手动测试密码参数,使用Intruder执行蛮力并使用Scanner进行扫描)

仅处理范围内的请求/响应:(为了避免对意外的请求进行加密)

执行:(我们可以给插件一个正则表达式或检查的所有请求/响应选择是否插件应该启用纯文本字符串,为了只能在指定的请求/响应上运行我们的插件。在我们的情况下,我们仅对登录请求感兴趣)

参数:正则表达式。(我们可以定义一个正则表达式,可以包括使用正则表达式组参数的任意数量的在我们的插件,我们想要传递的参数传递给弗里达导出函数只密码字段并且我们的正则表达式可以完成此任务; Brida提供了许多不同的选项来传递参数,例如完整的请求/响应,正文,标头,带有弹出窗口的动态Feed,...)

编码函数参数:(在将提取的参数发送到Frida导出函数之前,我们可以对其进行编码,但是在这种情况下没有必要。这对于二进制输入非常重要:在这种情况下,最好使用ASCII-HEX编码参数或Base64并在Frida导出函数中对其进行解码。单击时,自定义插件的所有编码/解码选项都会打开一个弹出式窗口,您可以在其中选择一种或多种编码/压缩算法,例如Base64,ASCII-HEX,URL, GZIP,...)

解码函数输出:(我们可以解码Frida返回的输出。至于参数,如果输出为二进制形式,则最好使用Frida导出函数对其进行编码,并使用此选项在插件中对其进行解码。例如,我们用于插件的iOS函数+ cryptoPassword:返回Base64输出。后端等待使用相同函数编码的加密数据,因此我们不需要对其进行解码)

插件输出:用正则表达式(带括号)(我们将Frida返回的加密值替换为他的未加密形式,由我们在Repeater或Burp在“入侵者/扫描仪”中插入。至于参数,我们使用REGEX组来选择插入点)

插件输出编码:(此菜单允许我们在将Frida输出插入请求/响应之前对其进行编码。)

1611024814_600649ae08ab1a201384e.png!small?16110248151111611024823_600649b7142bdcbd96df5.png!small?1611024823915

1611024830_600649beb2c6f2e9070cc.png!small?1611024831682

正则等规则在这个插件中尤其重要,匹配错误的话就会失误。

IcontextMenu

IcontextMenu该插件是添加单击右键可以加解密选项功能的插件:

1611024845_600649cd85119fd1b8413.png!small?1611024846429

下列是该插件各项代表的意义:

插件名称:

插件类型:IContextMenu

Frida导出函数的名称:(我们在前面的步骤中定义的JS函数的名称。请勿在导出的功能名称中使用大写字符

执行上:右键解密功能的名称

参数:请求/响应中突出显示的值(通过单击并拖动鼠标左键突出显示的请求/响应部分,将作为参数提供给Frida导出函数。Brida提供了许多其他不同的选项来传递参数,例如完整的请求/响应,带组的正则表达式,正文,标题,带弹出窗口的动态Feed,...)

编码函数参数:(我们可以在将参数发送到移动应用程序之前对其进行编码,但是在这种情况下没有必要。这对于二进制输入非常重要:在这种情况下,最好使用ASCII-HEX或Base64对参数进行编码并在Frida导出的函数中对其进行解码。单击时,“自定义插件”的所有编码/解码选项均会打开一个弹出窗口,您可以在其中选择一种或多种编码/压缩算法,例如Base64,ASCII-HEX,URL,GZIP ...)

解码函数输出:(我们可以解码Frida返回的输出。至于参数,如果输出为二进制形式,则最好使用Frida导出函数对其进行编码,并使用此选项在插件中对其进行解码。在我们的插件中,我们用于插件的iOS函数+ cryptoResponse:,以ASCII字符串返回搜索操作的结果,因此我们不需要对其进行解码)

插件输出:在请求/响应中替换突出显示的值(Frida导出功能的输出将代替作为参数提供的突出显示的值)

插件输出编码:(此菜单允许我们在将Frida输出插入所选位置之前对其进行编码。但是,在我们当前的插件中,这不是必需的,我们将其设置为none)

Emm,还有两个插件类型,有兴趣的可以去了解下,在brida的GitHub上有详细的教程我也是参考其wiki学习的:https://github.com/federicodotta/Brida/wiki

参考

https://github.com/federicodotta/Brida/wiki-----《birda的wiki》

https://blog.csdn.net/weixin_39190897/article/details/102691898---《移动安全-Brida加解密数据》

最新回复 (0)
    • Ai云
      2
        立即登录 立即注册
返回