在此之前,移动端应用程序会直接忽略掉所有的SSL错误,并允许攻击者拦截和修改自己的通信流量。但是现在,很多热门应用程序至少会检查证书链是否是一个有效可信任的证书机构(CA)颁发的。作为一名渗透测试人员来说,我们常常需要让目标应用程序信任我们的证书是有效的,这样我们就可以进行中间人攻击(MITM)并修改其流量了。

1, SSL MitM

为什么我们要特别关注移动端应用程序的SSL MitM安全情况呢?为了观察或对移动端应用程序的Web服务调用情况,我们需要使用类似BurpSuite或ZAP这样的拦截代理。当我们利用代理拦截下SSL流量之后,客户端的SSL链接将会中断。默认情况下,类似Burp这种工具所生成的自签名证书将失效,如果证书不被信任,那么移动端App将会中断连接。接下来,我们所要介绍的技术将能够让移动端应用程序信任我们的拦截代理所提供的证书。

2, 向用户证书中添加自定义CA

避免SSL错误的最好方法就是设置一个有效可信任的证书。这种方法相对比较简单,如果你可以向设备安装一个新的可信任CA证书,并且操作系统信任你的CA,那么它就会信任由你CA签名的证书。

Android有两个内置的证书存储(即System Store和User Store),它们会对操作系统信任的CA进行跟踪。其中System Store用于存储预装的CA,User Store存储用户安装的CA。默认配置下,使用了类似TLS或HTTPS的安全连接会信任预安装的系统CA,而Android 6.0(API Level23)及以下版本默认会新人用户添加的CA。

这意味着什么呢?如果我们向User Store中添加自己的CA,那我们就可以尝试对Android 6.0及以下版本的设备进行中间人攻击了。如果针对的是高于Android 6.0版本的设备,那么我们所添加的证书将不会被信任。为了解决这个问题,我们可以编辑应用程序的Manifest文件,并强制它适配Android 6.0。目标API Level定义在AndroidManifest.xml文件中的‘platformBuildVersionCode’属性(’manifest’元素):

<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.test.app" platformBuildVersionCode="25"platformBuildVersionName="7.1.1">

我们要把‘platformBuildVersionCode=25’改成23:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.test.app" platformBuildVersionCode="23"platformBuildVersionName="6.0">

关于如何使用ApkTool进行重新打包,可以自行百度。重新打包之后,应用程序将会信任用户添加的CA证书了。
当然了,如果你想要在特定平台版本中运行的话,你也可以在APK的‘/res/xml/network_security_config.xml’文件中定义一个。比如说,下面的代码就定义了一个新的受信任CA,文件存储在/res/raw/my_ca:

<?xm lversion="1.0" encoding="utf-8"?>
<network-security-config>
<base-config>
<trust-anchors>
<certificates src="@raw/my_ca"/>
</trust-anchors>
</base-config>
</network-security-config>

如果第一种方法不起效的话,可能是因为开发人员限制了应用程序所能信任的CA证书了。还记得刚才我们使用自定义的 来提供CA证书路径吗?而开发人员同样可以使用这种方法来保护自己的应用程序免受SSL拦截攻击。在这种场景下,为了让我们的拦截证书可以被信任,我们就需要提取APK并用我们自定义的CA证书来重写应用程序所提供的CA证书。需要注意的是,这种方法可能会要求进行一系列验证。

使用APK Studio之类的工具打开APK文件,然后在窗口中找到应用程序所捆绑的证书。在上图中,证书位于应用程序的assets目录下。接下来,用我们自定义的CA覆盖应用程序原本的CA(‘UniversalRootCA’证书),这样就可以让应用程序直接信任我们的证书了并实现流量拦截了。

3, Frida Hook

如果安装自定义CA也无法成功的话,说明应用程序可能使用了某种SSL绑定技术或采用了额外的SSL验证。一般来说,为了绕过这种验证方法,我们需要对应用程序的代码以及验证接口设置钩子。这种接口一般用于限制手机被root或越狱,但是在Frida框架【工具下载】的帮助下,我们就可以在不root设备的情况下,对应用程序进行动态分析了。

Frida可以在操作系统中以独立应用程序的形式运行,但是这需要对设备进行root。为了避免root操作,我们可以直接将Frida注入到目标APK之中。Frida工具中包含了一个能够让应用程序在运行时加载Frida的动态库,并允许我们对目标应用程序的代码和指令进行动态修改。

接下来,我们需要提取APK文件,注入动态库,然后编辑一些smali代码来让我们的代码库在应用程序启动时最先被调用。完成之后,重新打包APK并进行安装。整个过程的完整操作方法可以参考【这篇文章】。

除此之外,我们也可以使用Objection工具【项目地址】来实现我们的目标。Objection可以让整个过程自动化完成,我们只需要在命令行中提供目标APK的路径,Objection就可以帮我们完成所有的代码注入以及修改操作。下面是使Objection工具的相关命令:

C:\>objection patchapk -s test_app.apk
No architecture specified. Determining it using `adb`...
Detected target device architecture as: armeabi-v7a
Github FridaGadget is v10.6.28, local is v10.6.13. Updating...
Downloading armeabi-v7a library toC:\.objection\android\armeabi-v7a\libfrida-gadget.so.xz...
Unpacking C:\.objection\android\armeabi-v7a\libfrida-gadget.so.xz...
Cleaning up downloaded archives...
Using Gadget version: 10.6.28
Unpacking test_app.apk
App already has android.permission.INTERNET
Reading smali from:C:\Temp\tmp8dxqks1u.apktemp\smali\com/test/app/TestMainActivity.smali
Injecting loadLibrary call at line: 10
Writing patched smali back to:C:\Temp\tmp8dxqks1u.apktemp\smali\com/test/app/TestMainActivity.smali
Creating library path: C:\Temp\tmp8dxqks1u.apktemp\lib\armeabi-v7a
Copying Frida gadget to libs path...
Rebuilding the APK with the frida-gadget loaded...
Built new APK with injected loadLibrary and frida-gadget
Signing new APK.
jar signed.
Signed the new APK
Performing zipalign
Zipaling completed
Copying final apk from C:\Users\cwass\AppData\Local\Temp\tmp8dxqks1u.apktemp.aligned.objection.apkto current directory...
Cleaning up temp files...

接下来,我们的工作目录中应该会出现一个名叫‘test_app.objection.apk’的文件(默认情况下,工具会在原始APK文件名的后面添加一个.objection后缀)。我们可以像安装普通APK一样安装这个文件,使用命令“adb install test_app.objection.apk”可以直接将其推送到连接设备上。安装完成之后运行目标App,此时App将会卡在启动界面。现在,我们就可以连接到Frida服务器,并开始监听设备流量了。Frida命令行工具的使用方法如下:

C:\>frida-ps-U
PID  Name
----  ------
6383  GadgetC:\>frida-U gadget
____
/ _ |Frida 10.3.14 - A world-class dynamic instrumentation framework
| (_||
>_ | Commands:
/_/|_| help -> Displays the help system
. . .. object? -> Display information about 'object'
. . .. exit/quit -> Exit
. . ..
. . .. More info at http://www.frida.re/docs/home/[MotorolaMoto G (5) Plus::gadget]-> Java.available
trueAlternatively,Objection supports interaction with the listening Frida server by using the‘explore’ command:C:\>objectionexplore
___||_  |_|___ ___| |_|_|___ ___
| . |. | | | -_|  _|  _| | . |  |
|___|___|_||___|___|_| |_|___|_|_|
|___|(object)inject(ion)v1.2.2RuntimeMobile Exploration
by:@leonjza from @sensepost[tab]for command suggestions
com.test.appon (motorola: 7.0) [usb] # android hooking search classes TrustManager
android.security.net.config.RootTrustManager
android.app.trust.ITrustManager$Stub$Proxy
android.app.trust.ITrustManager
android.security.net.config.NetworkSecurityTrustManager
android.security.net.config.RootTrustManagerFactorySpi
android.app.trust.TrustManager
android.app.trust.ITrustManager$Stub
com.android.org.conscrypt.TrustManagerImpl
com.android.org.conscrypt.TrustManagerImpl$ExtendedKeyUsagePKIXCertPathChecker
com.android.org.conscrypt.TrustManagerImpl$TrustAnchorComparator
com.android.org.conscrypt.TrustManagerFactoryImpl
javax.net.ssl.TrustManagerFactory$1
javax.net.ssl.TrustManager
javax.net.ssl.TrustManagerFactory
javax.net.ssl.X509TrustManager
javax.net.ssl.TrustManagerFactorySpi
javax.net.ssl.X509ExtendedTrustManager
[Ljavax.net.ssl.TrustManager;C:\>frida-ps-U
PID  Name
----  ------
6383  GadgetC:\>frida-U gadget
____
/ _ |Frida 10.3.14 - A world-class dynamic instrumentation framework
| (_||
>_ | Commands:
/_/|_| help -> Displays the help system
. . .. object? -> Display information about 'object'
. . .. exit/quit -> Exit
. . ..
. . .. More info at http://www.frida.re/docs/home/[MotorolaMoto G (5) Plus::gadget]-> Java.available
trueAlternatively,Objection supports interaction with the listening Frida server by using the‘explore’ command:C:\>objectionexplore
___||_  |_|___ ___| |_|_|___ ___
| . |. | | | -_|  _|  _| | . |  |
|___|___|_||___|___|_| |_|___|_|_|
|___|(object)inject(ion)v1.2.2RuntimeMobile Exploration
by:@leonjza from @sensepost[tab]for command suggestions
com.test.appon (motorola: 7.0) [usb] # android hooking search classes TrustManager
android.security.net.config.RootTrustManager
android.app.trust.ITrustManager$Stub$Proxy
android.app.trust.ITrustManager
android.security.net.config.NetworkSecurityTrustManager
android.security.net.config.RootTrustManagerFactorySpi
android.app.trust.TrustManager
android.app.trust.ITrustManager$Stub
com.android.org.conscrypt.TrustManagerImpl
com.android.org.conscrypt.TrustManagerImpl$ExtendedKeyUsagePKIXCertPathChecker
com.android.org.conscrypt.TrustManagerImpl$TrustAnchorComparator
com.android.org.conscrypt.TrustManagerFactoryImpl
javax.net.ssl.TrustManagerFactory$1
javax.net.ssl.TrustManager
javax.net.ssl.TrustManagerFactory
javax.net.ssl.X509TrustManager
javax.net.ssl.TrustManagerFactorySpi
javax.net.ssl.X509ExtendedTrustManager
[Ljavax.net.ssl.TrustManager;

此时,你就可以使用内置的SSL绑定绕过函数来实施攻击了:

com.test.appon (motorola: 7.0) [usb] # android sslpinning disable
Job:2f633f86-f252-4a57-958e-6b46ac8d69d1 - Starting
[6b46ac8d69d1][android-ssl-pinning-bypass] Custom, Empty TrustManager ready
Job:2f633f86-f252-4a57-958e-6b46ac8d69d1 – Started

4,逆向自定义证书的验证代码

当然了,开发人员也有可能会使用自己开发的SSL库,而不是直接使用系统库来处理SSL证书验证过程。如果这样的话,我们就需要提取出APK文件,然后将smali代码转换成Java代码,这样我们才可以对负责处理证书验证的代码进行分析,并想办法实现流量拦截,这里我们需要使用到dex2jar工具。dex2jar工具的使用命令语句如下所示:

C:\>d2j-dex2jar.bat"C:\test_app.apk"
dex2jarC:\test_app.apk -> .\test_app-dex2jar.jar

输出的.jar文件可以直接在绝大多数Java逆向工具(例如JD-GUI)中打开。

当你找到了负责处理证书验证的代码之后,你就可以选择对代码进行直接修改或者使用Frida来给特定函数设置钩子了。为了避免对整个应用程序进行重构,我们可以直接对证书验证函数设置钩子。具体的操作方法可以参考技术#3所介绍的内容(使用Frida命令行工具或Objection接口)。

附件:
Frida使用教程(无需root):【传送门】
Frida框架:【下载地址】
Objection工具:【下载地址】

绕过安卓SSL验证证书的常见四种方式相关推荐

  1. 绕过安卓SSL验证证书的四种方式

    在此之前,移动端应用程序会直接忽略掉所有的SSL错误,并允许攻击者拦截和修改自己的通信流量.但是现在,很多热门应用程序至少会检查证书链是否是一个有效可信任的证书机构(CA)颁发的. 作为一名渗透测试人 ...

  2. 绕过安卓SSL验证的办法

    为什么我们要特别关注移动端应用程序的SSL MitM安全情况呢?为了观察或对移动端应用程序的Web服务调用情况,我们需要使用类似BurpSuite或ZAP这样的拦截代理.当我们利用代理拦截下SSL流量 ...

  3. 利用xposed绕过安卓SSL证书的强校验

    什么是SSL pinning https协议验证服务器身份的方式通常有三种,一是根据浏览器或者说操作系统(Android)自带的证书链:二是使用自签名证书:三是自签名证书加上SSL Pinning特性 ...

  4. 安卓androidstudio访问本地接口_安卓开发之数据存储在本地的四种方式

    ​ 安卓开发之数据存储在本地的四种方式 本地数据存储,在安卓开发过程中是不可避免的一个话题.这些本地的数据可能是用户的设置,程序的设置,用户的数据图片, 也可能是网络传输的一些缓冲数据. 基本上我们有 ...

  5. 广州技能入户计算机证书,广州职称入户可以考哪些证书?推荐四种证书!

    广州职称入户可以考哪些证书?推荐四种证书! 作者:广州阔客入户 日期:2019-05-20 浏览: 广州入户的方式很多,有广州职称入户.学历人才入户.技能人才入户.积分入户等方式.其中广州职称入户一般 ...

  6. anydesk远程计算机,AnyDesk远程软件连接失败的常见四种状况?

    AnyDesk远程软件是我们日常生活工作中常用的一款远程软件.体积小,灵活又便捷,帮助我们随时随地移动办公.但我们使用AnyDesk远程软件时,也会出现一些连接失败的情况.接下来,下文将详细叙述一下A ...

  7. 大金空调自动关机常见四种原因

    大金空调属于空调界的NO.1有着完美的技术,但是缺点就是价格有点高,所以维修起来难度也大,在此株洲大金空调维修售后提供大金空调自动关机常见四种问题和原因,望对各位技师或用户有一定的帮助 1.遥控器设置 ...

  8. 访问数据库的四种方式

    IRIS 中支持的四种方式: SQL.Objects.REST 和 GraphQL   卡济米尔·马列维奇,<运动员>(1932) > > "你当然无法理解! 习惯了 ...

  9. Java遍历Map对象的四种方式

    关于java中遍历map具体哪四种方式,请看下文详解吧. 方式一 这是最常见的并且在大多数情况下也是最可取的遍历方式.在键值都需要时使用. 1 2 3 4 Map<Integer, Intege ...

最新文章

  1. 【Android】AsyncTask异步类
  2. 鼠标平滑滤波_38年依然保持旺盛创作力,罗技G Hero16K撑起无线游戏鼠标时代
  3. 从零到两百台服务器的创业野蛮生长史
  4. 数字图像的加载、显示和输出
  5. python Matplotlib.pyplot 如何绘制三维折线图, 散点图, 线框图, 表面图, 柱状图, 箭头图, 2D转3D图, 文本图, 3D拼图, 网状图, 直方图, 角面片图, 条状图?
  6. 搜索推荐炼丹笔记:CVR预估中的延迟反馈问题
  7. 差分放大电路差模共模公式_选择正确的放大器
  8. BMP格式图像的显示
  9. 前端学习(1752):前端调试值之网络请求的监控
  10. vmware linux ens32,修改Centos7的网卡ens32 改为eth0
  11. python笔记小白入门_Python 笔记:全网最详细最小白的Class类和实例详解
  12. 此加载项为此计算机的所有用户安装_MDI Jade 6.5软件安装教程
  13. php预编译mysql扩展_PHP-Mysqli扩展库的预编译
  14. 让APK只包含指定的ABI(转)
  15. mybatis 中collection中需要 open close separator
  16. java怎么导包_java包与导包
  17. 计算机硬盘根目录是什么,解决方案:硬盘根目录是什么意思?它存储在哪里?...
  18. [休闲]GDC China 2007上海中国游戏开发者大会
  19. 计算机图形学坐标系的作用,坐标系的概念和坐标系之间的变换
  20. (好文重发)朴英敏:用crash工具分析Linux内核死锁的一次实战

热门文章

  1. 分辨率并不是越高越好,因为人眼分辨能力存在极限
  2. 网络中的代理(proxy)和NAT
  3. 你们要的歌单:网易云音乐收藏量前100的歌单
  4. 鲁大师11月新机排行:只有5款机型发布,OPPO撑起榜单
  5. ORACLE通过dblink同步SDO_ORDINATE_ARRAY_STR的数据
  6. BZOJ 3039 玉蟾宫
  7. 如何用计算机计算概率,概率计算器与阶乘方程
  8. 截止9月10日苹果审核指南中文版
  9. 【总结】二手书网站开发总结(业余时间开发)
  10. win10 python3.6安装numpy路径报错_Python3.6的组件numpy的安装 猪悟能