Android渗透测试HTTPS证书校验绕过
字数 1381 2025-08-22 12:22:24

Android渗透测试HTTPS证书校验绕过完全指南

一、HTTPS证书校验概述

在Android渗透测试中,HTTPS证书校验是常见的安全防护措施,主要分为三种情况:

  1. 情况1:客户端不存在证书校验,服务器也不存在证书校验
  2. 情况2:客户端存在校验服务端证书,服务器不存在证书校验(单项校验)
  3. 情况3:客户端存在证书校验,服务器也存在证书校验(双向校验)

二、环境准备

  • 操作系统:Windows 10
  • 工具:
    • JEB3(反编译工具)
    • Burp Suite(抓包工具)
    • Androidkiller(APK修改工具)
    • JustTrustMe(Xposed模块)
    • Frida(动态Hook工具)

三、情况1:无证书校验

检测方法

  1. 使用JEB3反编译APK文件
  2. 搜索checkClientTrustedcheckServerTrusted字符串
  3. 若无相关代码,则说明无证书校验

渗透方法

直接设置代理,伪造证书即可抓取数据包

四、情况2:客户端校验服务端证书(单项校验)

检测方法

  1. 反编译APK后搜索checkServerTrusted方法
  2. 分析Java代码确认存在客户端校验逻辑

绕过方法

方法1:修改APK代码

  1. 使用Androidkiller反编译APK
  2. 找到checkServerTrusted方法的smali代码
  3. 删除所有校验部分的代码
  4. 重新打包APK并安装
  5. 设置代理抓包

方法2:使用JustTrustMe模块

  1. 安装Xposed框架
  2. 安装JustTrustMe模块
  3. 启用模块并重启设备
  4. 设置代理抓包

注意:JustTrustMe在Xposed 5.4版本可运行,高版本需自行测试

方法3:使用Frida动态Hook

  1. 准备Frida环境(PC端和Android端)
  2. 使用以下脚本启动Frida服务:
# startFridaService.py
import sys
import subprocess

cmd = ["adb shell", "su", "cd /data/local/tmp", "./frida-server-12-7-11-android-arm64"]

def Forward1():
    s = subprocess.Popen("adb forward tcp:27042 tcp:27042")
    return s.returncode

def Forward2():
    s = subprocess.Popen("adb forward tcp:27043 tcp:27043")
    return s.returncode

def Run():
    s = subprocess.Popen("adb shell", stdin=subprocess.PIPE, stdout=subprocess.PIPE, shell=True)
    for i in range(1, len(cmd)):
        s.stdin.write(str(cmd[i] + "\r\n").encode("utf-8"))
        s.stdin.flush()
    return s.returncode

if __name__ == "__main__":
    Forward1()
    print("adb forward tcp:27042 tcp:27042")
    Forward2()
    print("adb forward tcp:27043 tcp:27043")
    print("Android server--->./frida-server-12-7-11-android-arm64")
    print("success-->frida-ps -R")
    Run()
  1. 运行主脚本:
# application.py
import frida, sys, re, sys, os
import codecs, time

APP_NAME = ""

def sbyte2ubyte(byte):
    return (byte % 256)

def print_result(message):
    print("[!] Received: [%s]" % (message))

def on_message(message, data):
    if 'payload' in message:
        data = message['payload']
        if type(data) is str:
            print_result(data)
        elif type(data) is list:
            a = data[0]
            if type(a) is int:
                hexstr = "".join([("%02X" % (sbyte2ubyte(a))) for a in data])
                print_result(hexstr)
                print_result(hexstr.decode('hex'))
            else:
                print_result(data)
                print_result(hexstr.decode('hex'))
        else:
            print_result(data)
    else:
        if message['type'] == 'error':
            print(message['stack'])
        else:
            print_result(message)

def main():
    try:
        with codecs.open("hooks.js", 'r', encoding='utf8') as f:
            jscode = f.read()
        process = frida.get_usb_device().attach(APP_NAME)
        script = process.create_script(jscode)
        script.on('message', on_message)
        print("[*] Intercepting on (pid: )...")
        script.load()
        sys.stdin.read()
    except KeyboardInterrupt:
        print("[!] Killing app...")

if __name__ == "__main__":
    if (len(sys.argv) > 1):
        APP_NAME = str(sys.argv[1])
        main()
    else:
        print("must input two arg")
        print("For exanple: python application.py packName")
  1. 设置代理抓包

五、情况3:双向证书校验

客户端校验绕过

  1. 尝试使用JustTrustMe模块
  2. 若失败,可能客户端使用了其他校验方法(如checkClientTrusted等)
  3. 下载JustTrustMe源代码,添加对新校验方法的Hook
  4. 重新编译安装自定义模块
  5. 启用模块并重启设备

服务端校验绕过

  1. 在APK中查找客户端私钥:

    • 检查assets目录下的证书库文件
    • 搜索证书名称字符串
    • 反编译KeyStore.getInstanceKeyStore.load方法
  2. 使用Burp Suite配置客户端证书:

    • 进入User options > SSL > Client SSL Certificates
    • 点击Add添加找到的客户端证书
    • 配置正确的密码和证书类型
  3. 重新抓包

六、高级技巧

  1. 脱壳处理:若APK有加固,需先脱壳才能分析证书相关代码
  2. 动态Hook:使用Frida Hook关键方法获取签名方法和私钥
  3. 多方法组合:当单一方法失效时,可组合使用多种绕过技术

七、注意事项

  1. 修改APK可能导致应用无法运行,需测试稳定性
  2. 部分应用有防篡改检测,修改后可能触发安全机制
  3. 真机测试时Xposed模块需要完全重启才能生效
  4. 高版本Android系统可能有额外的安全限制

通过以上方法,可以有效地绕过Android应用中的HTTPS证书校验,为安全测试提供便利。实际应用中应根据具体情况选择最适合的绕过方式。

Android渗透测试HTTPS证书校验绕过完全指南 一、HTTPS证书校验概述 在Android渗透测试中,HTTPS证书校验是常见的安全防护措施,主要分为三种情况: 情况1 :客户端不存在证书校验,服务器也不存在证书校验 情况2 :客户端存在校验服务端证书,服务器不存在证书校验(单项校验) 情况3 :客户端存在证书校验,服务器也存在证书校验(双向校验) 二、环境准备 操作系统:Windows 10 工具: JEB3(反编译工具) Burp Suite(抓包工具) Androidkiller(APK修改工具) JustTrustMe(Xposed模块) Frida(动态Hook工具) 三、情况1:无证书校验 检测方法 使用JEB3反编译APK文件 搜索 checkClientTrusted 或 checkServerTrusted 字符串 若无相关代码,则说明无证书校验 渗透方法 直接设置代理,伪造证书即可抓取数据包 四、情况2:客户端校验服务端证书(单项校验) 检测方法 反编译APK后搜索 checkServerTrusted 方法 分析Java代码确认存在客户端校验逻辑 绕过方法 方法1:修改APK代码 使用Androidkiller反编译APK 找到 checkServerTrusted 方法的smali代码 删除所有校验部分的代码 重新打包APK并安装 设置代理抓包 方法2:使用JustTrustMe模块 安装Xposed框架 安装JustTrustMe模块 启用模块并重启设备 设置代理抓包 注意 :JustTrustMe在Xposed 5.4版本可运行,高版本需自行测试 方法3:使用Frida动态Hook 准备Frida环境(PC端和Android端) 使用以下脚本启动Frida服务: 运行主脚本: 设置代理抓包 五、情况3:双向证书校验 客户端校验绕过 尝试使用JustTrustMe模块 若失败,可能客户端使用了其他校验方法(如 checkClientTrusted 等) 下载JustTrustMe源代码,添加对新校验方法的Hook 重新编译安装自定义模块 启用模块并重启设备 服务端校验绕过 在APK中查找客户端私钥: 检查assets目录下的证书库文件 搜索证书名称字符串 反编译 KeyStore.getInstance 和 KeyStore.load 方法 使用Burp Suite配置客户端证书: 进入 User options > SSL > Client SSL Certificates 点击 Add 添加找到的客户端证书 配置正确的密码和证书类型 重新抓包 六、高级技巧 脱壳处理 :若APK有加固,需先脱壳才能分析证书相关代码 动态Hook :使用Frida Hook关键方法获取签名方法和私钥 多方法组合 :当单一方法失效时,可组合使用多种绕过技术 七、注意事项 修改APK可能导致应用无法运行,需测试稳定性 部分应用有防篡改检测,修改后可能触发安全机制 真机测试时Xposed模块需要完全重启才能生效 高版本Android系统可能有额外的安全限制 通过以上方法,可以有效地绕过Android应用中的HTTPS证书校验,为安全测试提供便利。实际应用中应根据具体情况选择最适合的绕过方式。