freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

medusa:一款基于FRIDA的二进制分析框架
2024-02-05 21:41:27

概述

MEDUSA是一个可扩展且模块化的框架,用于自动化在动态分析Android和iOS应用程序过程中采用的各种方法和技术。
image


安装

按照以下步骤进行安装:

  1. 克隆github存储库
git clone https://github.com/Ch0pin/medusa.git
  1. 进入Medusa的目录
  2. 执行以下命令:
$ pip install -r requirements.txt --upgrade

已知问题

在macOS安装过程中,可能会遇到以下问题:

由于找不到受支持的readline版本,已禁用包括制表符补全在内的Readline功能。为解决此问题,在Windows上安装pyreadline3,或在Linux/Mac上安装gnureadline。

您可以通过安装Python的gnureadline来解决此问题:

pip install gnureadline

使用Docker
您可以在medusa/目录中找到Docker文件。

构建步骤:

$ docker build -t medusa:tag1 ./

运行步骤:

$ docker run --name medusa --net=host --rm -it medusa:tag1

在物理设备或模拟器上以TCP/IP模式运行adbd:

$ adb tcpip 5555

通过以下方式从Docker映像连接到您的设备:

root@docker# adb connect device_ip:5555

系统要求

  • Linux或macOS(目前Medusa不支持Windows)
  • Python 3(使用最新的Python版本,而不是macOS附带的版本,以避免使用libedit而不是GNU的readline引起的问题)
  • Rooted设备或模拟器
  • adb
  • FRIDA服务器(在移动设备上运行)

用法

Medusa用法
image

搜索模块

使用show命令,后面跟着以下选项之一:

  • all:显示所有可用的模块
  • mods:显示已储存的模块
  • categories:显示可用的模块类别
  • mods [category]:显示所选类别的可用模块

使用info [模块名称]来获取有关特定模块的帮助。

储存/取消储存

使用use [模块名称]将模块添加到储存的模块中:

medusa> use http_communications/multiple_unpinner

使用rem [模块名称]将模块从储存的模块中移除:

medusa> rem http_communications/multiple_unpinner

使用add [完整模块路径]将保存在默认目录之外的模块添加到储存中:

medusa> add /full/path/to/module.med

使用reset清空储存的模块列表并清除统一脚本。

使用swap更改储存的模块的编译顺序:

medusa> swap [索引1] [索引2]

编译

使用compile将您储存的模块编译成一个统一的模块:

medusa> compile

使用compile -t X(其中X是以毫秒为单位的延迟值)添加加载延迟:

medusa> compile -t 1000

开始一个会话

使用run -f [包名]或者run -n [包编号]来启动或重新启动一个应用程序并附加到它(您可以使用list命令获取包编号)。

medusa> run -f com.foo.bar

使用run [包名]来附加到一个应用程序。

medusa> run com.foo.bar

在会话菜单中

[会话中] |c:清屏 |e:退出 |r:重新加载 | | rs:重置scratchpad |i:信息 |t:跟踪 |?:帮助 |:

在“会话中”,您可以使用以下命令之一:

  • 'c'(清屏)清除屏幕
  • 'e'(退出)退出会话
  • 'r'(重新加载)在脚本更改的情况下重新加载
  • 'rs'(重置scratchpad)重置scratchpad
  • 'i'(信息)打印有关应用程序的信息
  • 't'(跟踪)跟踪函数并打印堆栈跟踪(例如,t com.foo.bar.func
  • '?' 打印此帮助消息

hook

使用hook命令,后面跟着以下选项之一,以拦截当前可用模块中不存在的方法:

  • -a [类名]:为给定类的所有方法设置挂钩。例如:
medusa> hook -a com.foo.bar.className

-f: 为单个方法设置挂钩。示例:

medusa> hook -f

输入方法的完整名称:

  • 类名:com.foo.bar
  • 方法名(按CTRL+C退出):fooMethod

启用回溯?(y/N)y

[+] 方法:fooMethod 挂钩已添加!

输入方法名(按CTRL+C退出):
可以使用jtrace命令达到相同的结果:

medusa> jtrace full_path_to_method

-n: 为本地方法设置挂钩。示例:

medusa> hook -n

库名称(例如:libnative.so):libfoo.so

导入或导出的函数?(i/e)e

函数名称或偏移(例如:0x1234):0x1234

函数参数的数量(0表示禁用跟踪):3

启用回溯?(y/N)y

启用内存读取?(y/N)y

读取缓冲区大小(0-1024):128

模块scratchpad已经添加!

-r: 重置到目前为止设置的挂钩

使用pad命令来编辑scratchpad。

处理本地库

使用libs命令,后面跟着以下选项之一,以列出应用程序的本地库:

  • -a:列出所有应用程序的库。
  • -s:仅列出系统的库。
  • -j:仅列出应用程序的库。

添加--attach以附加到已经运行的应用程序实例(通常效果更好)。
示例:

medusa> libs -j com.foo.bar libnative.so --attach

处理应用程序内存

您可以使用memopsmemmap命令来读取/写入/搜索/转储应用程序的内存。前者需要连接到一个库,而后者使用内存区域。

在两种情况下,应用程序必须已经在运行!

memops示例:

medusa> memops package_name libname.so

如果附加成功,Medusa将启动一个会话,其中您可以选择以下选项:

  • (E)xit退出
  • r@offset读取指定偏移处的内存
  • w@offset写入指定偏移处的内存
  • 进入下一行
  • scan内存扫描
  • (h)elp帮助
  • dump转储内存

要获取有关每个选项功能的详细信息,请参阅“基本用法”部分。

memmap示例:

medusa> memmap package_name

然后从子菜单中选择一个内存区域。

如果附加成功,Medusa将启动一个会话,其中您可以选择以下选项:

  • (E)xit退出
  • r@offset读取指定偏移处的内存
  • dump转储内存

获取类和对象快照

使用describe_java_class来打印类的详细信息,示例:

medusa> describe_java_class full.path.to.class.name

使用get来打印一个类的字段的值,假设该类已经被实例化。

medusa> get package_name full.path.to.class.field

实用工具

运行Shell命令:

medusa> c ls -al

在连接的设备上运行Shell命令:

medusa> cc ls -al

清除屏幕:

medusa> clear

打开交互式Shell:

medusa> shell

转储应用程序的DEX文件

medusa> dump com.foo.bar

列出已安装的包

medusa> list

列出包的路径

medusa> list com.foo.bar path

加载或重新加载设备:

medusa> loaddevice

重新加载Medusa模块。在更改Medusa模块时,此选项很有用。

medusa> reload

加载保存的会话

medusa> reload -r session-filename

打印当前会话状态

medusa> status

记录系统调用

medusa> strace package_name

向设备发送文本

medusa> type 'text'

保存一个会话

medusa> export file-name

要加载回这个会话,可以使用以下选项之一:

./medusa -r file-name
medusa> reload -r file-name

Mango用法
image启动会话

您可以将现有的会话文件作为参数传递给 mango 脚本(./mango session_file),或者启动 mango 时不带参数并按照提示操作:

--------------------------------------------------
[?] 您想要做什么?
--------------------------------------------------

1 启动新会话
2 继续现有会话
3 退出

加载应用程序

您可以导入:

  • 已下载的 APK:mango> import /full/path/to/foo.apk
  • 已安装在连接设备上的 APK:mango> pull package_name,然后mango> import base.apk
  • 或者重新加载已经分析过的 APK:mango> load package_name

处理应用程序组件

您可以使用show命令后跟组件类型来查看应用程序的组件(活动、服务等)。
示例:

mango> show activities

其他选项包括:activityAlias、services、receivers、providers、permissions、deeplinks 和 intentFilters。

在适用的情况下,使用-e将仅打印出导出的组件。

此外,show命令支持以下附加选项:

  • exposure:打印应用程序的“攻击面”,包括深度链接、导出的活动、活动别名、服务、接收器和提供程序。
  • info:打印有关已加载应用程序的有用信息。
  • strings:打印应用程序的字符串资源。
  • database:打印数据库文件的结构。该输出可用于构造原始 SQL 查询(参见query命令)。
  • applications:此选项可用于加载不同的应用程序或管理现有的应用程序。

您可以通过输入query,后跟查询内容,向当前会话的数据库发出“原始” SQL 查询:

query select permission, type from Permissions where app_sha256="a2e5bfac992ecac9c3b7013294936517330e9f6b2cfb1b6b98bf9a366eb31ff0"

与应用程序交互

您可以通过输入start,后跟制表符或活动的完整名称,强制当前加载的应用程序启动一个活动:

mango> start com.foo.bar.ActivityA

同样,您可以通过输入startsrv,后跟制表符或服务的完整名称,强制应用程序启动一个服务:

mango> startsrv com.foo.bar.ServiceA

或者通过输入以下命令停止一个服务:

mango> stopsrv com.foo.bar.ServiceA

要触发深度链接,请输入deeplink,后跟制表符或深度链接的完整URI:

mango> deeplink example://mywebview

此外,您可以通过输入killspawn,后跟应用程序的名称,分别杀死或启动一个应用程序:

mango> spawn com.example.package

与设备交互

要安装应用程序,请使用mango> install /full/path/to/foo.apk

要卸载应用程序,请使用mango> uninstall [package name]

要安装 Burp 证书,请输入installBurpCert,并按照 mango 指示的步骤进行操作。

要修改设备的代理设置,请输入proxy,后跟以下选项之一:

  • get以打印当前的代理配置。

设置 IP:端口 以配置代理。添加 -t(例如,mango> proxy set -t 192.168.1.2:8080)将设置透明代理。

reset将清除设备的代理。

要启动一个交互式 ADB 会话,请输入adb

要启动一个带有 BusyBox 支持的交互式 shell,请输入box并按照给定的说明操作。

要获取特定包的 logcat,请输入logcat [package name]。您还可以使用nlog获取设备的本机日志,或者使用jlog获取Java崩溃日志。

要获取屏幕截图,请输入screencap -o [filename.png]

要在连接的设备上运行 Shell 命令,请输入:cc [command]

您可以通过输入notify notification_title notification_body向设备发送通知。此命令要求安装 medusa 代理,可以使用installagent命令完成。

修补 APK

将给定 APK 的 debuggable 标志设置为 true:patch /full/path/to/foo.apk

此选项要求在设备上安装 apksigner 和 zipalign。如果它们不存在,Mango 将在本地下载并使用。

使用jdwp [package name]在应用程序中动态调试。

启动一个 frida-trace 会话,使用trace命令和以下选项之一:

  • -j跟踪 Java 类的所有函数。例如:trace -j com.myapp.name*// 跟踪 com.myapp.name* 类的所有函数
  • -n跟踪本地函数。例如:trace -n name*
  • -a跟踪本地库的所有函数。例如:trace -a libfoo.so

使用medusa.py
MEDUSA的主要理念是能够在大规模上添加或删除Java或Native方法的钩子,同时保持过程简单而有效。MEDUSA拥有超过90个可以组合的模块,每个模块专注于一组任务。一些典型的任务包括:

  • SSL pinning绕过
  • UI限制绕过(例如Flag secure,按钮启用)
  • 类枚举
  • 监控:
    • 加密过程(密钥、IV、待加密数据)
    • 意图(Intents)
    • Http通信
    • Websockets
    • Webview事件
    • 文件操作
    • 数据库交互
    • 蓝牙操作
    • 剪贴板
  • 监控被恶意应用程序使用的API调用,如:
    • 间谍软件
    • 点击欺诈
    • 通行欺诈
    • 短信欺诈
      此外,您可以拦截属于第三方应用程序的Java或Native方法,或者仅用几个简单的命令创建复杂的frida模块。

使用mango.py
Mango是Medusa的孪生兄弟,可用于:

  • 解析和分析Android清单
  • 枚举应用程序的攻击入口点(导出的活动、深度链接、服务等)
  • 跟踪所有已分析的应用程序
  • 自动化乏味的流程,例如:
    • 设置中间人攻击(MITM)
    • 打补丁
    • 封装adb命令
    • 设置/查看/重置设备的代理配置
    • ...等等。

许可证协议

本项目遵循GPL-3.0开源许可协议

参考文献

https://github.com/Ch0pin/medusa

# 移动安全 # 二进制分析工具
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录