Burpsuite插件-Brida

本文作者:杉木@涂鸦智能安全实验室

通过一道CTF题目来认识一下Frida
objection
前面两篇通过对Frida的了解,以及利用objection来分析,这篇来了解一下分析后实际利用,以及通过实现插件自动化的方式来利用。

Brida介绍

https://github.com/federicodotta/Brida

Brida components

请添加图片描述

官方使用文档翻译

时间记录,20230725;

测试版本:0.5

虽然说官方文档是最新的,但是使用文档的截图依旧跟新版本的插件不一致,然后能够查到的资料也是比较久的内容,不过大体功能是差不多,但是还是自己操作一遍后记录一下相关问题;

这里只记录自己测试的环境,其他环境参考官方文档;

Android

  1. 安装frida和其server,并启动具体可以参考通过一道CTF题目来认识一下Frida
  2. 配置brida

在配置之前先简单了解一下brida的UI及其功能;

请添加图片描述

1 主面板

这里包含所有brida工具和配置

  1. Configurations
  2. JS Editor
  3. Hooks and functions
  4. Graphical analysis
  5. Graphical hooks
  6. Custom plugins
  7. Generate stubs
  8. Debug export

2 brida按钮面板

Brida按钮面板由三个不同的部分组成:

  • 顶部(前两行)是 Pyro4 服务器的状态(启动/停止)和应用程序的状态(hook状态)
  • (在两条黄线上方的按钮)在中间有一组固定在Brida所有选项卡上的按钮。这些按钮用于执行常规任务,如启动/停止 Pyro4 服务器、生成/附加/停止/分离应用程序(使用 frida-compile 编译)、重新加载 JS 文件、编译重新加载JS、分离所有hook、清除log等。
  • (黄线下)底部有一组按钮,取决于特定的Brida子选项卡

3 brida控制台

log输出

brida工具介绍

Configurations

配置界面

从上往下依次是

  1. Pyro服务状态
  2. 应用状态
  3. 是否使用虚拟的python环境
  4. python可以执行文件的路径
  5. Pyro服务地址(默认)
  6. Pyro端口(默认)
  7. frida-complile可以执行文件的路径
  8. 是否使用旧版本的frida-complile,尽量使用10以下的版本,一开始用默认版本会出现问题,hook上了,但是总有奇怪的报错
  9. 包含所有Brida JS文件的文件夹,第一次需要先生成一下默认的JS文件
  10. 需要hook的应用名/PID,如果为应用名,则在连接的时候是点按钮面板的Spawn application,如果为PID,则Attach;
  11. Frida连接方式
  12. 如果配置是远程连接frida,需要配置对应的地址和端口;

请添加图片描述

JS Editor

请添加图片描述

集成到Burp Suite中的JS编辑器,以便能够编辑Brida JS文件并直接从Burp Suite添加自定义hook和导出函数。编辑器具有JS语法突出显示。

Hooks and functions

请添加图片描述

此选项卡包括许多默认hooks和方法,可以通过按钮启用/执行。这些Frida脚本包括最新的Android和iOS平台的hook能力,以绕过和检查安全功能。

Graphical analysis

请添加图片描述

Graphical analysis

这里功能类似于objection的能力集成进来,

load tree = android hooking list classes //展示所有class 搜索 = android hooking search methods [search_name] //在内存中所有已加载的方法中搜索包含特定关键词的方法
//但是这里Android的用起来会导致应用闪退,官方提了这个,只有iOS支持;双击对应的class = android hooking watch class com.xxx.xxx //hook指定类, 会打印该类下的所以调用
右键Inspect = android hooking watch class_method com.xxx.xxx.methodName --dump-args --dump-backtrace --dump-return //hook指定类, 会打印该类下的所以调用
右键change return vule = android hooking set return_value com.xxx.xxx.methodName false //设置返回值

实际使用

参考:通过一道CTF题目来认识一下Frida

对函数进行打印,然后替换返回值,但是这里官方提供的返回值没有byte

请添加图片描述

Graphical hooks

请添加图片描述

管理之前hook的所有内容;

Custom plugins

请添加图片描述

强大的功能;

可以理解成自定义生成burpsuite插件,有四种可自定义插件类型;

  • IHttpListener:能让所有请求,通过正则匹配去替换/修改指定的内容,并让这个匹配到的内容通过frida构造的hook脚本处理(加解密、重新生成sign等)
  • IMessageEditorTab:将自定义选项卡添加到Burp Suite请求/响应窗格,以便能够使用Frida导出的函数解密/解码/处理请求/响应(或其中的一部分)(然后加密/编码/处理修改并替换原始请求/响应,如果有)
  • IContextMenu:将自定义上下文菜单选项添加到Burp Suite的右键菜单中,用于在请求和响应(或其中的一部分)上调用Frida导出的函数
  • JButton:添加调用/启用 Frida 导出函数的按钮

Generate stubs

请添加图片描述

如果内部自定义插件引擎无法解决复杂情况,则可以从外部Burp Suite插件使用Brida引擎。此选项卡生成 Java 和 Python 存根,可以复制并粘贴到外部插件中,以便允许 Burp Suite 和 Frida 使用 Brida 进行通信。

Debug export

请添加图片描述

此选项卡可用于在 Brida 插件中使用 Frida 导出的函数之前对其进行调试。为了使用 Brida 自定义插件(或使用 Brida 的外部插件),有必要将 Frida 代码放入一些由插件调用的 Frida 导出函数中。在此选项卡中,可以直接调用 Frida 导出,以便轻松调试。

使用问题记录

Windows环境

Spawn/Attach application时报错:entrypoint must be inside the project root

【移动安全】Frida + Burp -> Brida | APP加解密 | CN-SEC 中文网

把Frida的js文件放到burpsuite应用的目录下;

在Debug export中Run export是报错[frida.core.RPCException] unable to find method 'test’

排查了很久,只找到了frida-compile版本过高这种情况,只能测试一下低版本是否会有问题,用npm在burpsuite应用的目录下执行npm install frida-compile@9.5.2,然后将安装的目录配置到frida-compile path中就能解决;

使用了低版本的frida-compile后报错java.io.IOException: Cannot run program

"C:\AAAA\agent\BurpSuiteCommunity\node_modules\.bin\frida-compile": 
CreateProcess error=193, %1 不是有效的 Win32 应用程序。

一开始配置没有带.cmd,

请添加图片描述

请添加图片描述
请添加图片描述

**UnicodeEncodeError: ‘gbk’ codec can’t encode

character '\u03f1' in position 49: illegal multibyte sequence**

刚好遇到一个反编译后用中文混淆的,这里用objection和python执行相关处理的时候就会报编码错误,在对应路径相关代码输出处加上utf-8编码输出就能解决;然后objection需要修改后重新编译;

请添加图片描述

源码解析

java调用python脚本

# -*- coding: utf-8 -*-
import frida
import codecs
import Pyro4
import sys#reload(sys)   
#sys.setdefaultencoding('utf-8')class Unbuffered(object):def __init__(self, stream):self.stream = streamdef write(self, data):self.stream.write(data)self.stream.flush()def writelines(self, datas):self.stream.writelines(datas)self.stream.flush()def __getattr__(self, attr):return getattr(self.stream, attr)@Pyro4.expose
class BridaServicePyro:def __init__(self, daemon):self.daemon = daemondef attach_application(self,pid,frida_script,device,host_port_device_id):self.frida_script = frida_scriptif pid.isnumeric():self.pid = int(pid)else:self.pid = pidif device == 'remote':self.device = frida.get_remote_device()elif device == 'usb':self.device = frida.get_usb_device()elif device == 'local':self.device = frida.get_local_device()elif device == 'device':self.device = frida.get_device(host_port_device_id)        else:self.device = frida.get_device_manager().add_remote_device(host_port_device_id)self.session = self.device.attach(self.pid)with codecs.open(self.frida_script, 'r', 'utf-8') as f:source = f.read()self.script = self.session.create_script(source)self.script.load()return    def spawn_application(self,application_id,frida_script,device,host_port_device_id):self.application_id = application_idself.frida_script = frida_scriptif device == 'remote':self.device = frida.get_remote_device()elif device == 'usb':self.device = frida.get_usb_device()elif device == 'local':self.device = frida.get_local_device()elif device == 'device':self.device = frida.get_device(host_port_device_id)        else:self.device = frida.get_device_manager().add_remote_device(host_port_device_id)self.pid = self.device.spawn([self.application_id])self.session = self.device.attach(self.pid)with codecs.open(self.frida_script, 'r', 'utf-8') as f:source = f.read()self.script = self.session.create_script(source)self.script.load()returndef resume_application(self):self.device.resume(self.pid)returndef reload_script(self):with codecs.open(self.frida_script, 'r', 'utf-8') as f:source = f.read()self.script = self.session.create_script(source)self.script.load()returndef disconnect_application(self):self.device.kill(self.pid)returndef detach_application(self):self.session.detach()returndef callexportfunction(self, methodName, args):method_to_call = getattr(self.script.exports, methodName)# Take the Java list passed as argument and create a new variable list of argument# (necessary for bridge Python - Java, I think)s = []for i in args:s.append(i)return_value = method_to_call(*s)return return_value@Pyro4.onewaydef shutdown(self):print('shutting down...')self.daemon.shutdown()# Disable python buffering (cause issues when communicating with Java...)
sys.stdout = Unbuffered(sys.stdout)
sys.stderr = Unbuffered(sys.stderr)host = sys.argv[1]
port = int(sys.argv[2])
daemon = Pyro4.Daemon(host=host,port=port)#daemon = Pyro4.Daemon(host='127.0.0.1',port=9999)
bs = BridaServicePyro(daemon)
uri = daemon.register(bs,objectId='BridaServicePyro')print("Ready.")
daemon.requestLoop()

漏洞悬赏计划:涂鸦智能安全响应中心(https://src.tuya.com)欢迎白帽子来探索。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/216342.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在 Node-RED 中引入 ECharts 实现数据可视化

Node-RED 提供了强大的可视化工具,而通过引入 ECharts 图表库,您可以更直观地呈现和分析数据。在这篇博客中,我们将介绍两种在 Node-RED 中实现数据可视化的方法:一种是引入本地 ECharts 库,另一种是直接使用 CDN&…

微软 Power Platform 零基础 Power Pages 网页搭建高阶实际案例实践(四)

微软 Power Platform 零基础 Power Pages 网页搭建教程之高阶案例实践学习(四) Power Pages 实际案例学习进阶 微软 Power Platform 零基础 Power Pages 网页搭建教程之高阶案例实践学习(四)1、新增视图,添加List页面2…

深度学习的目标检测算法综述

信息记录材料 2022年10月 第23卷第10期 【摘要】目标检测是深度学习的一个重要应用,目前在智能驾驶、工业检测相关领域都获得应用,具有重要的现实意义。本文对基于深度学习目标检测算法原理和应用情况进行简述,首先介绍结合区域提取和卷积神经…

Docker部署Nacos集群并用nginx反向代理负载均衡

首先找到Nacos官网给的Github仓库,里面有docker compose可以快速启动Nacos集群。 文章目录 一. 脚本概况二. 自定义修改1. example/cluster-hostname.yaml2. example/.env3. env/mysql.env4. env/nacos-hostname.env 三、运行四、nginx反向代理,负载均衡…

【C语言】RDMACM、Verbs API与epoll一起使用的示例

一、epoll介绍 epoll是Linux内核为处理大批量文件描述符而作了改进的poll,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。 以下是epoll的主要使用方法和优点: epo…

fuxploide,一款针对文件上传的Fuzz检测工具

fuxploide,一款针对文件上传的Fuzz检测工具 1.工具概述2.安装3.参数解析4.使用案例1.工具概述 Fuxploider 是一种开源渗透测试工具,可自动检测和利用文件上传表单缺陷。该工具能够检测允许上传的文件类型,并能够检测哪种技术最适合在所需的 Web 服务器上上传 Web Shell 或任…

Postswigger 靶场 XSS 通关

文章目录 PostSwigger靶场XSS通关学徒:第一关学徒:第二关学徒:第三关学徒:第四关学徒:第五关学徒:第六关学徒:第七关学徒:第八关学徒:第九关 PostSwigger靶场XSS通关 靶…

三、Shell 环境

一、Linux 系统分类 在 Linux 中,常见的 Shell 有以下几种: Bourne Shell(sh):最早的 Shell,由 Stephen Bourne 开发。它是大多数其他 Shell 的基础。Bourne Again Shell(bash)&am…

前端 Web Workers 简介

简介 以前我们总说,JS 是单线程没有多线程,当 JS 在页面中运行长耗时同步任务的时候就会导致页面假死影响用户体验,从而需要设置把任务放在任务队列中;执行任务队列中的任务也并非多线程进行的,然而现在 HTML5 提供了…

遥感深度学习:如何读取TIFF文件和切片成256*256?

博客已同步微信公众号:GIS不要炒茄子 01 前言 最近打算认真从头开始学习深度学习和遥感结合的相关内容,主要通过Python进行处理。此前用深度学习进行遥感相关的学习一直都是用 tensorflow3.0 框架,但是考虑很多因素我后面打算换用 Pytorch…

使用HTTP协议在Linux上进行API调用

在Linux系统上使用HTTP协议进行API调用是一种常见的操作,有时候我们需要调用一些外部API来获取数据或者进行自动化操作。下面是一个使用HTTP协议在Linux上进行API调用的代码示例,希望能够帮助你更好地理解这个过程。 首先,我们需要使用curl命…

单臂路由与三层交换机

单臂路由 划分VLAN后同一VLAN的计算机属于同一个广播域,同一VLAN的计算机之间的通信是不成问题的。然而,处于不同VLAN的计算机即使是在同一交换机上,它们之间的通信也必须使用路由器。 图(a)是一种实现VLAN间路由的方…

人工智能学习8(集成学习之xgboost)

编译工具:PyCharm 文章目录 编译工具:PyCharm 集成学习XGBoost(Extreme Gradient Boosting)极端梯度提升树1.最优模型的构建方法XGBoost目标函数案例1:泰坦尼克号案例2:对奥拓集团差评进行正确分类。数据准备:1.第一种…

Redis和MySQL双写一致性实用解析

1、背景 先阐明一下Mysql和Redis的关系:Mysql是数据库,用来持久化数据,一定程度上保证数据的可靠性;Redis是用来当缓存,用来提升数据访问的性能。 关于如何保证Mysql和Redis中的数据一致(即缓存一致性问题…

36V/48V转12V 10A直流降压DC-DC芯片-AH1007

AH1007是一款36V/48V转12V 10A直流降压(DC-DC)芯片,它是一种高性能的降压变换器,常用于工业、汽车和电子设备等领域。 AH1007采用了先进的PWM调制技术和开关电源控制算法,能够高效地将输入电压从36V/48V降低到12V&…

【Anaconda】Ubuntu anaconda使用(新建环境、最小化安装Tensorflow)

Ubuntu anaconda使用(新建环境、最小化安装Tensorflow) 清华源地址: https://pypi.tuna.tsinghua.edu.cn/simplepip安装使用的时候, pip install xxx(库名) -i https://pypi.tuna.tsinghua.edu.cn/simple请先安装好anaconda&am…

无论您用selenium、appium还是playwright都必须使用PO设计模式

随着UI自动化测试工具可选性越来越多,工具也越来越稳定,前几年关于自动化测试架构设计的概念逐渐淡化,但是自动化架构设计中最有用的PO设计模式思想依然需要刚入门自动化测试领域的小白深刻掌握,本文就带大家理解什么是PO设置模式…

fastapi.templating与HTMLResponse

要声明一个模板对象,应将存储html模板的文件夹作为参数提供。在当前工作目录中,我们将创建一个 “templates “目录。 templates Jinja2Templates(directory“templates”) 我们现在要把这个页面的HTML代码渲染成HTMLResponse。让我们修改一下hello()函…

LeetCode:1631. 最小体力消耗路径(SPFA Java)

目录 1631. 最小体力消耗路径 题目描述: 实现代码与解析: BFSDP 原理思路: 1631. 最小体力消耗路径 题目描述: 你准备参加一场远足活动。给你一个二维 rows x columns 的地图 heights ,其中 heights[row][col] 表…

electron命令下载失败,手动安装教程

现象:pnpm i electron, 一直卡在提示错误node install.js 一 、下载需要的electron版本 地址 二、下载完毕,解压压缩包, 进入项目的node_modules/electron文件夹,创建dist文件夹,将下载的zip包里的文件复制到dist…