frida rpc远程调用 内网穿透

  • A+
所属分类:移动安全

我们在逆向过程中,经常碰到这样的场景。
分析某个算法的时候,算法强度很大,做了很多骚操作,让你看了反编译的代码就直接回收站处理。
面对高强度算法,这时候我们的选择一般是

  1. 硬钢(适合大佬和时间充足的选手)

  2. firda rpc 远程调用

  3. xposed rpc 远程调用

  4. unicorn 模拟执行

后续陆续更新上面提到4种方法。这篇文章主要介绍frida rpc调用的简单实现

做frida rpc视频 文章初衷

frida rpc远程调用 内网穿透


某粉丝大佬后天私信我,2月就想做了 但是太懒 4月才开始做  后续大佬们想看啥视频也可以私信我  我统计一下比较多的 有时间就录

开始正文

大家好,我是王铁头 一个乙方安全公司搬砖的菜鸡
持续更新移动安全,iot安全,编译原理相关原创视频文章

视频演示:

原理图

frida rpc远程调用 内网穿透
正向流程
frida rpc远程调用 内网穿透
反向流程

rpc远程调用效果图

在尝试过几种frida rpc的框架后,我找到了很简单的一种实现方法,从启动环境到架设到外网直接访问调用,整个过程不要两分钟。首先看下效果图。

frida rpc远程调用 内网穿透


frida rpc远程调用 内网穿透
返回数据


这里做一个演示 调用一个加密方法 输入参数 字符串111

frida rpc远程调用 内网穿透


frida rpc远程调用 内网穿透
frida rpc返回数据 网页查看

这里也可以直接执行命令行 返回一样的结果

frida rpc远程调用 内网穿透
命令执行
frida rpc远程调用 内网穿透
frida rpc传递多个参数

在真机上 输入同样的参数 返回一样的结果

frida rpc远程调用 内网穿透


注意!
注意!
注意!
在自动化测试的场景下 可以写个脚本 打到批量测试的目的
比如像下面这样 写个脚本批量去跑

frida rpc远程调用 内网穿透
rpc远程调用frida

这里之所以说简单,是因为使用简单,除了安装环境麻烦之外,在安装好环境后,每次使用的时候,基本不用做啥重复性操作,编写脚本,启动环境,就ojbk了

注意 这里演示环境是ubuntu 但是实测windows和ubuntu都是可以的。操作过程基本没什么区别

适用场景

frida远程调用不仅可以调用 java层的函数,也可以调用so层的函数。
但是,frida并不太稳定。frida rpc也不太稳定。有一些比较坑爹的问题。
也并不太适用于工业级,比如frida并不适用于 在一些高并发,多线程的场景。

frida rpc 的前提条件就是,手机里面正在运行要注入的app, 更适合一些测试场景,比如协助一些渗透同事做一些数据的加解密。
或者一些规模比较小的工业级调用

frida 远程调用demo

假设 我们遇到的apk是这样子的:

frida rpc远程调用 内网穿透

可以看到上面的app 有2个加密按钮 我们这次要用frida 远程调用的 也是这两个功能函数

  1. AES加密

  2. 菜鸡加密

目标函数

frida rpc远程调用 内网穿透
frida 远程调用函数

上图是要远程调用的目标函数 函数声明如下

public static byte[] aes_dec(String str_dec)
public String caiji_enc(String str_data, int n_conunt) 

frida 远程调用实现

frida rpc 远程调用算法是我们经常用的一种算法调用的手段,也有现成的一些解决方案,甚至有人已经写出了专门的框架来节省我们的时间,让我们不至于手动去每次搭建环境都费时费力。

1. 普通青年实现frida rpc

frida + flask + nps
在这个方案里:

  1. frida 实现调用具体实现

  2. flask提供网页访问相关接口

  3. nps内网穿透 直接把内网映射到公网,让接口可以在外网直接被访问。

这种方法可以是可以,可是比较麻烦,一套流程下来,可能20分钟往上了。
而且nps这东西想要实现内网穿透,要么你自己有服务器,要么还得搞谷歌云的服务器,费时费力。
这个方法后续会写篇文章介绍

2. 优秀青年实现frida rpc

arida + 花生壳
实现步骤:

  1. 编写frida js注入 脚本 (耗时95秒)

  2. 修改配置文件         (耗时10秒)

  3. 启动环境                 (耗时10秒)

  4. 直接访问 配置好的公网地址 (耗时5秒)
    这篇文章主要讲利用 arida + 花生壳 实现frida rpc

0 前提 关于arida框架 和 花生壳

arida

git地址[https://github.com/lateautumn4lin/arida]
看雪文章[[https://bbs.pediy.com/thread-262643.htm]
缺点:

  1. 安装比较麻烦。git文档比较感人,我按文档安装失败多次。
    建议观看视频 一步步来 我老王在安装环境的时候 反反复复搞了2-3天 踩了很多坑

  2. 参数支持 string 和 int,事实上大部分时间也用不到别的类型。特殊类型我们直接在注入的脚本里写就好了 不影响使用。

优点:

  1. 使用简单 一条命令就可以自动注入 会自动搭建http相关环境

花生壳

优点:

  1. 使用简单。瞬间完成内网穿透

缺点:

  1. http访问需要交6块大洋(巨款)的认证费。

第一步 frida rpc 编写js注入脚本

要注入的方法如下

public static byte[] aes_dec(String str_dec)
public String caiji_enc(String str_data, int n_conunt) 

注入代码如下:

//rpc函数  aes加密 
function test_aes(str_data
{
  var str_ret = null;

  Java.perform(function (
  
{
    console.log("===========>aes");

    // 获取类
    var obj = Java.use('com.wangtietou.test_rpc_all.Test_Enc_Dec');

    //调用类方法 因为这里是静态方法 所以可以直接调用
    var bytes_ret = obj.aes_enc(str_data);

    //返回值是byte[] 这里转换成 string
    str_ret = toHexString(bytes_ret);
    console.log("aes result: " + str_ret);
  });
  return str_ret;
}

//rpc函数 菜鸡加密 arida支持int参数 但是要配置
function test_caiji(str_data, str_cnt
{
  var str_ret = null;

  Java.perform(function (
  
{    
        console.log("===========>caiji");
        //获取内存中已有对象 主动调用
        Java.choose("com.wangtietou.test_rpc_all.Test_Enc_Dec"
        {
          //匹配到对象执行的回调函数
          onMatch: function (instance
          
{
            var n_cnt = parseInt(str_cnt);
            str_ret = instance.caiji_enc(str_data, n_cnt);
          },
          //搜索完成后执行的回调函数
          onComplete: function (
          
{
          }
        });

    console.log("caiji result: " + str_ret);
  });
  return str_ret;
}

//功能函数  byte[] 转hexString
function toHexString(arrBytes{
    var str = "";
    for (var i = 0; i < arrBytes.length; i++) {
        var tmp;
        var num = arrBytes[i];
        if (num < 0) {
            tmp = (255 + num + 1).toString(16);
        } else {
            tmp = num.toString(16);
        }
        if (tmp.length == 1) {
            tmp = "0" + tmp;
        }
        str += tmp;
    }
    return str;
}

//要导出 被远程调用的接口 这里要写一个配置
rpc.exports = {
  testAes: test_aes, 
  testCaiji: test_caiji
}  

这里 把写好的文件 命名为wtt.js

第2步 frida rpc 修改配置文件

arida代码目录下有个config.py 如图所示

frida rpc远程调用 内网穿透
远程调用配置

修改配置信息:

frida rpc远程调用 内网穿透


这里修改下配置文件  可以同时注入多个app
这里要注入几个app就写几个配置信息

#INJECTION_APPS 这里面只写要启动的app 其他建议注释掉
INJECTION_APPS = [
    {
        "name""移动安全王铁头",  
        "path""wtt",
        "package_name""com.wangtietou.test_rpc_all"
    }
]

修改好之后,把之前写好的注入脚本文件放到 apps目录就可以了

frida rpc远程调用 内网穿透
rpc 配置文件


frida rpc远程调用 内网穿透
ifrida rpc远程调用脚本

第3步 启动环境

启动环境比较简单

  1. 启动frida_server

  2. 进入arida目录 启动conda 环境
    执行 uvicorn main:app --reload 命令
    如图所示:

    frida rpc远程调用 内网穿透


    frida rpc远程调用 内网穿透
    frida rpc远程调用启动


    完成这步之后 如果不需要映射到公网的同学 到这里就可以了
    直接访问 http://127.0.0.1:8000/docs
    如图

    frida rpc远程调用 内网穿透
    frida rpc内网


    frida rpc远程调用 内网穿透
    frida 远程调用网页访问


    frida rpc远程调用 内网穿透


    frida rpc远程调用 内网穿透
    算法调用返回结果

第四步 访问花生壳配置的公网地址

花生壳配置比较简单

frida rpc远程调用 内网穿透
frida rpc 花生壳


frida rpc远程调用 内网穿透
花生壳配置


frida rpc远程调用 内网穿透
花生壳 网址


启动花生壳客户端

frida rpc远程调用 内网穿透

这时候 就可以在公网访问搭建在我们内网的 frida rpc了

frida rpc远程调用 内网穿透
frida rpc公网
frida rpc远程调用 内网穿透
远程调用app


frida rpc远程调用 内网穿透
frida rpc 云控


frida rpc远程调用 内网穿透
frida rpc算法调用返回结果

bingo 大功告成
更详细的安装环境和 frida 调用 java层so层 静态方法,对象方法,so层函数的具体代码可以直接回复 rpc 进行下载。

本文始发于微信公众号(移动安全王铁头):frida rpc远程调用 内网穿透

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: