Android渗透测试HTTPS证书校验绕过
字数 1381 2025-08-22 12:22:24
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服务:
# 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()
- 运行主脚本:
# 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")
- 设置代理抓包
五、情况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证书校验,为安全测试提供便利。实际应用中应根据具体情况选择最适合的绕过方式。