Frida.Android.Practice (ssl unpinning)

目录:

  • android下hook框架对比
  • 基础设置
  • 免root使用frida
  • hook java 实战 ssl pinning bypass
  • hook native
  • some tips
  • 推荐工具和阅读

0x00 功能介绍竞品对比


官方主页

github

Inject JavaScript to explore native apps on Windows, Mac, Linux, iOS and Android.

  • Hooking Functions
  • Modifying Function Arguments
  • Calling Functions
  • Sending messages from a target process
  • Handling runtime errors from JavaScript
  • Receiving messages in a target process
  • Blocking receives in the target process

相对于xposed或cydia

优势:

  • 更改脚本不用重启设备(有些xposed插件也可以做到)
  • 对native hook支持较好
  • 开发更便捷(简单的模块确实如此)
  • 兼容性更好,支持设备和系统版本更广
  • 不用单独处理multidex(classLoader问题).

劣势: 不适合写过于复杂的项目,影响app性能比较明显 需要自己注意脚本加载时机 相对容易被检测到,都这样吧. app启动后进行attach.可以使用-f参数frida来生成已经注入的进程(先注入Zygote为耗时操作),通常配合–no-pause使用. PY JS脚本混杂排错困难(-l 选项直接写js脚本,新版本错误提示已经非常人性化了.) E4A这种中文的代码直接GG. * 不能全局hook也就是不能一次性hook所有app.只能指定进程hook.

0x01 基础入门设置

PC端设置

python环境

可选:源码编译

Android设备设置

首先下载android版frida-server,尽量保证与fridaServer与pc上的frida版本号一致.

完整frida-server release地址

https://github.com/frida/frida/releases

下一步部署到android设备上:

跑起来

设备上运行frida-server:

电脑上运行adb forward tcp转发:

27042端口用于与frida-server通信,之后的每个端口对应每个注入的进程.

运行如下命令验证是否成功安装:

正常情况应该输出进程列表如下:

0x02 免root使用frida

针对无壳app,有壳app需要先脱壳.

手动完成frida gadget注入和调用.

1.apktool反编译apk

2.将对应版本的gadget拷贝到/lib没有了下.例如arm32的设备路径如下.

/lib/armeabi/libfrida-gadget.so

下载地址:

https://github.com/frida/frida/releases/

3.smali注入加载library,选择application类或者Activity入口.

4.如果apk没有网络权限需要在配置清单中加入如下权限申明

5.回编译apk

6.重新签名安装运行.成功后启动app会有如下日志

使用objection自动完成frida gadget注入到apk中.

兼容性较差,不是很推荐.

0x03 JAVA hook 实战 SSL Pinning bypass

实战如何使用Frida,就较常见的证书锁定来做演练.要想绕过证书锁定抓明文包就得先知道app是如何进行锁定操作的.然后再针对其操作进行注入解锁.

客户端关于证书处理的逻辑按照安全等级我做了如下分类:

文章要对抗的是最后两种锁定的情况(预告:关于证书锁定方案细节另有文章待发布).

注意这里要区分开攻击场景,证书锁定是用于对抗中间人攻击的而非客户端注入,不要混淆.

HttpsURLConnection with a PinningTrustManager

apache http client 因为从api23起被android抛弃,使用率太低就先不管了.

使用传统的HttpURLConnection类封装请求,客户端锁定操作需要实现X509TrustManager接口的checkServerTrusted方法,通过对比预埋证书信息与请求网站的的证书来判断.

https://github.com/moxie0/AndroidPinning/blob/master/src/org/thoughtcrime/ssl/pinning/PinningTrustManager.java

知道锁定方法就可以hook解锁了,注入SSLContext的init方法替换信任所有证书的TrustManger

okhttp ssl pinning

okhttp将锁定操作封装的更人性化,你只要在client build时加入域名和证书hash即可.

okhttp3.x 锁定证书示例代码

frida Unpinning script for okhttp

webview ssl pinning

这种场景比很少见,本文拿一个开源项目举例. https://github.com/menjoo/Android-SSL-Pinning-WebViews 例子中的网站 https://www.infosupport.com/ 证书已经更新过一次,代码中的证书info是2015年的,而线上证书已于2017年更换,所以导致pinning失效,直接使用pinning无法访问网站.

这个开源项目的锁定操作本质是拦截webview的请求后自己用httpUrlConnection复现请求再锁定证书.貌似和之前一样,但是这里的关键不是注入点而是注入时机!

这个例子和上文注入点一样hook SSLcontext即可Unpinning,关键在于hook时机,如果用xposed来hook就没有问题,但是用frida来hook在app启动后附加便会失去hook到init方法的时机.因为pinning操作在Activity onCreate时调用而我们附加是在onCreate之后执行.需要解决能像xposed一样启动前就注入或者启动时第一时间注入.

首选想到是spawn,但是spawn后并没有将脚本自动load..( LD_PRELOAD 条件苛刻不考虑),也就是使用-f参数的时候-l参数并未生效.

改由python 来完成spawn注入

成功Unpinning .(app启动后需要前后台切换一次才会成功hook到init,猜测是因为pinning初始化是在Activity onCreate时完成的.frida注入onCreate有点问题.https://github.com/frida/frida-java/issues/29)

日志如下

0x04 Native hook

没有合适公开的例子,就拿 https://www.52pojie.cn/thread-611938-1-1.html 帖子中提到的无法 hook ndk 中 getInt 函数问题来做演示.

ndk代码

关键在于对指针和函数入口的理解,例子用了偏移寻址和符号寻址两种方式做对比,偏移和导出符号均可通过IDA静态分析取得,最后效果是一样的.

hook 代码

0x05 tips

获取app context

创建对象示例

hook 构造方法

实现java接口

https://gist.github.com/oleavr/3ca67a173ff7d207c6b8c3b0ca65a9d8

java接口使用参考,其中X509TrustManager是interface类型.TrustManager为其实现类.manager为实例.

我就成功过这一个接口,其他接口比如Runnable , HostNamerVerifier都没成功.

str int指针操作,有点乱

utf8 string写 Memory.allocUtf8String(str) var stringVar = Memory.allocUtf8String(“string”); utf8 string读

Memory.readUtf8String(address[, size = -1])

int写

var intVar = ptr(“0x100”);

var intVar = ptr(“256”);

int读

toInt32(): cast this NativePointer to a signed 32-bit integer

二进制读取

hexdump(target[, options]): generate a hexdump from the provided_ArrayBuffer_ or _NativePointer_ target, optionally with options for customizing the output.

0x06 推荐工具和阅读

frida api

https://www.frida.re/docs/javascript-api

中文翻译

https://zhuanlan.kanxue.com/article-342.htm

https://zhuanlan.kanxue.com/article-414.htm

工具推荐

appmon : https://github.com/dpnishant/appmon

droidSSLUnpinning : https://github.com/WooyunDota/DroidSSLUnpinning

objection : https://github.com/sensepost/objection

0x07 reference


https://github.com/datatheorem/TrustKit-Android

https://github.com/moxie0/AndroidPinning

https://koz.io/using-frida-on-android-without-root/

https://medium.com/@appmattus/android-security-ssl-pinning-1db8acb6621e

https://developer.android.com/training/articles/security-ssl.html#Pinning

https://developer.android.com/training/articles/security-config.html?hl=zh-cn

 

转载自:https://sec.xiaomi.com/article/43    原文作者:瘦蛟舞