首页
社区
课程
招聘
[原创]Brida操作指南
2019-1-15 22:44 45074

[原创]Brida操作指南

2019-1-15 22:44
45074

瞎扯

之前虽然开了一个·frida-all-in-one的仓库,但最近一直在研究一些自动化分析方向的内容,所以gayhub也没怎么更新,不过加星球加群吹水聊天的倒是不少 (。・∀・)ノ゙ヾ(・ω・。)。

 

不得不说Frida真的是一个好东西,以前搞iOS的时候就想着CycriptTheos真的是太他娘的方便了,Cycript就不用说了,Frida百分之两百足够替代他,LogOS语法和JavaScript API也各有千秋,js有时候还是挺香的。

 

我现在工作中Android端基本已经用Frida代替了Xposed & DebuggerDwarf真的很香,墙裂推荐。(虽然现在很少调试就是了...)

言归正传

大家如果经常做APP安全测试的话,抓包应该经常会遇到加密或者需要sign的请求,然后这个时候就很蛋疼,一般的做法可能就是需要自己去逆算法扣代码解包拼包来写fuzzer

 

再坑爹一点的,APP加个固,算法混个淆,鬼才看得懂,但是老板分配的任务又他娘的不能shift+del,然后就花了两天(像我这种拖延症,不重要的事情一般其实是两周)时间撸一遍算法,最后用5分钟来发包发现0高0中0低,内心:wtm....

 

Brida就是用来解决这个问题的,仅需20分钟,加密、解密、Fuzz、Scan一条龙服务。

简单介绍

  1. Brida是一个Burp的插件,BurpSuite不用说了吧,大家懂的。
  2. Brida是一座连接BurpFrida的桥,Frida也不用说了吧,我记得@roysue写过好几次了。
  3. 人家是有官方手把手教程的,就是这个,但是我相信你们很多人都懒得看英文,所以就有了这篇文章。
  4. github上好像没有0.3的release,所以之前我是自己编译的,后来我发现Burp里原来可以直接装.....

开始操作

Python

我一般就用Python2.7,py3应该也没啥问题。多版本管理用星球里介绍过的pyenv

  1. 装Frida: pip install frida & pip install frida-tools
  2. 装Pyro4: pip install Pyro4

Frida

这个不多说了,手机上装好APP,最好关掉selinux,开起frida-server,转发Frida的端口出来:

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

即可。

BurpSuite

首先,打开你的免费版\破解版BurpSuite(别装了我知道你的正版BurpSuite肯定不是自己出钱买的),点击Extender找到Brida把它装上。然后你就会发现你多了一张同款选项卡。

 

 

然后到这就结束了,我们下期再见。。。。

 

.

 

.

 

.

 

.

 

.

 

我开玩笑的,别扔鸡蛋了好伐...

  1. 填好你的Python路径
  2. Start server: 这个会调用PythonPyro4库起一个套接字,host和端口也可以自己配置,后面写Proxy就是在这个端口上拿数据。
  3. JS file可以选择点default script,然后随便找个地方存,待会再用编辑器写RPC脚本。
  4. Application ID写上APP的包名。
  5. Spwan application,这个时候就会打开你手机上的APP了。

找算法

相比较算法还原,相信算法在哪里这个问题对各位大黑阔来说应该不是什么多大的问题。不过,Brida提供了一个很方便的操作:插桩

 

切换到Analyze Binary,点击Load tree,然后可能会卡一会,因为在加载类列表,加载完点开Java,可以看到这个进程里的所有类,一般我在这就直接搜crypt,然后他就会卡更久,因为这个智障把SO里的导出导入函数也搜了一个遍,最后可以右键->Inspect,把可疑的给hook住。

 

 

然后让他发包,如果方法被调用了就会打出日志,运气好的话直接就找到他的加解密函数了,运气不好的话....不存在的,我运气一直很好。(我信你个鬼,你个糟老头子坏的很,大部分情况下还是得自己看代码找算法位置,配合着来。

调用算法

这里就是编辑那个js脚本了,可以看到代码里的rpc.exports里帮你写了四个contextcustom,这四个是给右键菜单预留的,contextcustom1、contextcustom2会出现在repeater等模块中request的右键菜单,contextcustom2、contextcustom3则会出现在response的右键菜单。主要就是为了实现手动加解密的功能,就是这样:

 

 

值得注意的是,这四个函数接收的参数都是hex形式的,所以返回的时候也要转成hex再传出去。
当然你可以自己在rpc.exports添加函数,然后再contextcustom里调就可以了,只要是在这里面的,后面都可以在API中被调用到。

 

具体代码可以看github,上次跟着PPT一起发过了。

Proxy

作为一名资深的老湿基(其实连驾照都没拿到..),不能做到自动驾驶自己都说不过去。既然上面都说需要一条龙服务了,显然是不可能用手撸..那么多请求的!有现成的IntruderScanner不用白不用,所以这个时候就需要Proxy+Pyro4

Jython

在开始之前,你需要先装一个Jython,因为坑爹的BurpSuite全是Java写的,所以不支持CPython,就用了这个Java实现的Python来作为代替品。 当然你也可以选择使用Java来写插件。

 

如果你有pyenv的话直接

pyenv install jython-2.7.1

没有的话就自己去看官网Guide自己装一个。

 

装完你还需要pip,放心吧CPythonget-pip.pyJython上是用不了的,you need this

jython setup.py install

然后你就拥有一个Jython的pip了,最后安装一个Pyro4即可:

pip install pyro4

Extender

到这就是看BurpAPI然后开发扩展了,BurpAPI不多,文档也还算友好,所以并没有多难。

 

申明一个类,继承于IBurpExtenderIHttpListener

class BurpExtender(IBurpExtender, IHttpListener)

重写registerExtenderCallbacksprocessHttpMessage:

    def registerExtenderCallbacks(self, callbacks):

        self._callbacks = callbacks
        self._helpers = callbacks.getHelpers()
        self._callbacks.setExtensionName("fuck encrypt!")
        callbacks.registerHttpListener(self)

    def processHttpMessage(self, toolFlag, messageIsRequest, messageInfo):
        # tool https://portswigger.net/burp/extender/api/constant-values.html#burp.IBurpExtenderCallbacks
        if toolFlag == 64 or toolFlag == 16 or toolFlag == 32: # TOOL_REPEATER     TOOL_SCANNER     TOOL_INTRUDER
            request = messageInfo.getRequest()
            analyzedRequest = self._helpers.analyzeRequest(request)
            headers = analyzedRequest.getHeaders()
            if not messageIsRequest:
                response = messageInfo.getResponse()
                analyzedResponse = self._helpers.analyzeResponse(response)
                messageInfo.setResponse(self.decrypt(analyzedResponse, response))
            # elif toolFlag != 4:
            else:
                messageInfo.setRequest(self.encrypt(analyzedRequest, request))

对着toolFlag一顿if是为了过滤Burp的模块,判断他是从哪过来的,这里是过滤了三个:reperterscannerintruder,抓包过来的无需处理,如果你处理了那APP就不能正常收发数据了。
self.decryptself.encrypt就是去跟Brida开的端口交换数据,处理加解密:

uri = 'PYRO:BridaServicePyro@localhost:9999'
pp = Pyro4.Proxy(uri)
...
    def decrypt(self, RequestOrResponse,raw):
        body = raw[RequestOrResponse.getBodyOffset():]
        newbody = body.tostring()
        args = []
        args.append(newbody.encode('hex'))
        ret = pp.callexportfunction('contextcustom3',args)
        ret = self._helpers.bytesToString(ret).decode('hex')
        return self._helpers.buildHttpMessage(RequestOrResponse.getHeaders(), ret)

    def encrypt(self, RequestOrResponse,raw):
        body = raw[RequestOrResponse.getBodyOffset():]
        newbody = body.tostring()
        args = []
        args.append(newbody.encode('hex'))
        ret = pp.callexportfunction('contextcustom2',args)
        ret = self._helpers.bytesToString(ret).decode('hex')
        return self._helpers.buildHttpMessage(RequestOrResponse.getHeaders(), ret)

callexportfunction来调用你刚才js脚本里rpc.exports里的函数,参数是函数名和参数列表。

 

好了代码到这就写完了,完整代码看github,复制粘贴两分钟搞定。

 

然后去

Burp -> Extender -> Options -> Python Environment -> Location Of Jython standalone JAR file

 

把你Jython的jar包扔进去,pyenv可以用

pyenv which jython

看到你的bin路径,这个jar包就在bin往上一级的安装目录里。

 

最后把你的py加进去,就可以使用Scanner等功能了

最后就是这个效果

PDF

...太大了传了好久传不上来,还是去星球下吧


[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

收藏
点赞9
打赏
分享
最新回复 (41)
雪    币: 1
活跃值: (693)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
saliey 2019-1-16 00:02
2
1
雪    币: 7443
活跃值: (2689)
能力值: (RANK:520 )
在线值:
发帖
回帖
粉丝
netwind 13 2019-1-16 10:03
3
1
感谢分享
雪    币: 6571
活跃值: (3823)
能力值: (RANK:200 )
在线值:
发帖
回帖
粉丝
LowRebSwrd 4 2019-1-16 10:08
4
1
赞!
雪    币: 60
活跃值: (881)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
wonderzdh 1 2019-1-16 10:56
5
1
雪    币: 3907
活跃值: (5742)
能力值: ( LV12,RANK:200 )
在线值:
发帖
回帖
粉丝
roysue 3 2019-1-16 13:44
6
1
雪    币: 438
活跃值: (228)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
ID蝴蝶 1 2019-1-16 14:13
7
1
赞。
最后于 2019-1-16 14:14 被ID蝴蝶编辑 ,原因:
雪    币: 18867
活跃值: (60313)
能力值: (RANK:125 )
在线值:
发帖
回帖
粉丝
Editor 2019-1-16 14:23
8
0
感谢分享!
雪    币: 2719
活跃值: (1507)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
Vn小帆 2019-1-16 15:21
9
0
弄了一套 跟你差不多的  但是  没你这个弄得复杂  而且现在很多的APP     SO 里面也加了反射 调用java 层的
雪    币: 1414
活跃值: (9782)
能力值: ( LV9,RANK:240 )
在线值:
发帖
回帖
粉丝
misskings 4 2019-1-19 08:33
10
0
学习了。我也搭下试试
雪    币: 5855
活跃值: (438)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
NightGuard 1 2019-1-19 11:17
11
0
不理解 BurpSuite 在这个过程的作用是啥。。
看起来没用到什么 BurpSuite 的功能?为啥要做成 BurpSuite 的插件
雪    币: 403
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
DWwinter 2019-1-24 09:20
12
0
雪    币: 242
活跃值: (56)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
foundkey 2019-1-24 18:16
13
0
星球在哪里?
雪    币: 916
活跃值: (3419)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
葫芦娃 1 2019-1-25 01:13
14
0
Scanner,Repeater, Intruder都是burpsuite的功能啊
雪    币: 916
活跃值: (3419)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
葫芦娃 1 2019-1-25 01:13
15
0
foundkey 星球在哪里?
Github上有二维码
雪    币: 2473
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
PYGame 2019-1-25 06:43
16
0
Brida 赞 看起来不错
雪    币: 254
活跃值: (1889)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
陈某人 2019-2-15 15:23
17
0
不用编译0.3怎么直接装?
雪    币: 916
活跃值: (3419)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
葫芦娃 1 2019-2-15 17:17
18
0
陈某人 不用编译0.3怎么直接装?
extender  BApp store
雪    币: 21
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
北风飘然 2019-2-19 09:51
19
0
老哥 每次我用frida都是用  --no-pause这个参数  不加的话程序就会崩溃 怎么回事呀     这有什么办法么   小米6的机器
雪    币: 121
活跃值: (44)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
linlon 2019-2-27 17:50
20
0
Exception starting Pyro server java.io.IOException: Cannot run program "E:\Python36-32": CreateProcess error=5, 拒绝访问。 java.lang.ProcessBuilder.start(Unknown Source)

路径该如何填写呢,拒绝访问
雪    币: 2378
活跃值: (3456)
能力值: ( LV13,RANK:405 )
在线值:
发帖
回帖
粉丝
奔跑的阿狸 1 2019-3-1 18:13
21
0
雪    币: 55
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Jmdebugger 2019-4-22 21:05
22
0
雪    币: 2359
活跃值: (278)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
coolsnake 2019-4-26 12:29
23
0
果然是神器
雪    币: 57
活跃值: (50)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
eyascn 2019-5-20 14:11
24
0
python3不支持,必须python2.
雪    币: 219
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Mr.周 2019-5-21 12:38
25
0
Exception starting Pyro server java.util.concurrent.TimeoutException java.util.concurrent.FutureTask.get(Unknown Source) burp.BurpExtender.launchPyroServer(BurpExtender.java:914) burp.BurpExtender.actionPerformed(BurpExtender.java:1367)
一大堆异常!

游客
登录 | 注册 方可回帖
返回