performing-mobile-app-certificate-pinning-bypass

在授权安全评估期间,绕过 Android 和 iOS 应用中的 SSL/TLS 证书固定实现,以启用流量拦截。 涵盖使用 Frida、Objection 和自定义脚本对 OkHttp、TrustManager、NSURLSession 及第三方固定库的绕过技术。适合证书固定绕过、SSL 固定破解、移动 TLS 拦截 或代理抗性应用测试相关请求。

9 stars

Best use case

performing-mobile-app-certificate-pinning-bypass is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

在授权安全评估期间,绕过 Android 和 iOS 应用中的 SSL/TLS 证书固定实现,以启用流量拦截。 涵盖使用 Frida、Objection 和自定义脚本对 OkHttp、TrustManager、NSURLSession 及第三方固定库的绕过技术。适合证书固定绕过、SSL 固定破解、移动 TLS 拦截 或代理抗性应用测试相关请求。

Teams using performing-mobile-app-certificate-pinning-bypass should expect a more consistent output, faster repeated execution, less prompt rewriting.

When to use this skill

  • You want a reusable workflow that can be run more than once with consistent structure.

When not to use this skill

  • You only need a quick one-off answer and do not need a reusable workflow.
  • You cannot install or maintain the underlying files, dependencies, or repository context.

Installation

Claude Code / Cursor / Codex

$curl -o ~/.claude/skills/performing-mobile-app-certificate-pinning-bypass/SKILL.md --create-dirs "https://raw.githubusercontent.com/killvxk/cybersecurity-skills-zh/main/skills/performing-mobile-app-certificate-pinning-bypass/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/performing-mobile-app-certificate-pinning-bypass/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How performing-mobile-app-certificate-pinning-bypass Compares

Feature / Agentperforming-mobile-app-certificate-pinning-bypassStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

在授权安全评估期间,绕过 Android 和 iOS 应用中的 SSL/TLS 证书固定实现,以启用流量拦截。 涵盖使用 Frida、Objection 和自定义脚本对 OkHttp、TrustManager、NSURLSession 及第三方固定库的绕过技术。适合证书固定绕过、SSL 固定破解、移动 TLS 拦截 或代理抗性应用测试相关请求。

Where can I find the source code?

You can find the source code on GitHub using the link provided at the top of the page.

SKILL.md Source

# 执行移动应用证书固定绕过

## 适用场景

适用于以下情况:
- 移动应用因证书固定而拒绝通过代理连接
- 进行需要 HTTPS 流量拦截的授权安全测试
- 评估固定实现的强度和绕过难度
- 评估移动应用网络安全的纵深防御

**不适用场景**:未经明确授权不得绕过应用的证书固定。

## 前置条件

- 已配置的 Burp Suite 代理,监听所有接口
- 已 root 的 Android 设备或已越狱的 iOS 设备
- 目标设备上运行 Frida 服务端
- 已安装 Objection(`pip install objection`)
- 目标应用已安装并表现出固定行为

## 工作流程

### 步骤 1:识别固定实现

**Android 固定方法识别:**
```
1. 网络安全配置(res/xml/network_security_config.xml)
   含证书哈希固定的 <pin-set>

2. OkHttp CertificatePinner
   CertificatePinner.Builder().add("api.target.com", "sha256/...")

3. 自定义 TrustManager
   代码中的 X509TrustManager 覆盖

4. 第三方库
   - TrustKit
   - 证书透明度检查
```

**iOS 固定方法:**
```
1. NSURLSession 委托(URLSession:didReceiveChallenge:)
2. ATS(应用传输安全)自定义信任评估
3. TrustKit 框架
4. Alamofire ServerTrustPolicy
5. 自定义 SecTrust 评估
```

### 步骤 2:使用 Objection 绕过(最快方案)

```bash
# Android
objection --gadget com.target.app explore
android sslpinning disable

# iOS
objection --gadget com.target.app explore
ios sslpinning disable
```

Objection 可 Hook 常见固定实现,包括 OkHttp CertificatePinner、TrustManagerImpl、NSURLSession 委托方法和 SecTrust 评估。

### 步骤 3:使用自定义 Frida 脚本绕过

**Android - 通用 SSL 固定绕过:**
```javascript
// android_ssl_bypass.js
Java.perform(function() {
    // 绕过 TrustManagerImpl
    var TrustManagerImpl = Java.use("com.android.org.conscrypt.TrustManagerImpl");
    TrustManagerImpl.verifyChain.implementation = function(untrustedChain, trustAnchorChain,
        host, clientAuth, ocspData, tlsSctData) {
        console.log("[+] 已为以下主机绕过 TrustManagerImpl: " + host);
        return untrustedChain;
    };

    // 绕过 OkHttp3 CertificatePinner
    try {
        var CertificatePinner = Java.use("okhttp3.CertificatePinner");
        CertificatePinner.check.overload("java.lang.String", "java.util.List").implementation =
            function(hostname, peerCertificates) {
                console.log("[+] 已绕过 OkHttp3 固定,主机: " + hostname);
                return;
            };
    } catch(e) {}

    // 绕过自定义 X509TrustManager
    var X509TrustManager = Java.use("javax.net.ssl.X509TrustManager");
    var TrustManager = Java.registerClass({
        name: "com.bypass.TrustManager",
        implements: [X509TrustManager],
        methods: {
            checkClientTrusted: function(chain, authType) {},
            checkServerTrusted: function(chain, authType) {},
            getAcceptedIssuers: function() { return []; }
        }
    });

    // 绕过 SSLContext
    var SSLContext = Java.use("javax.net.ssl.SSLContext");
    SSLContext.init.overload("[Ljavax.net.ssl.KeyManager;",
        "[Ljavax.net.ssl.TrustManager;", "java.security.SecureRandom").implementation =
        function(km, tm, sr) {
            console.log("[+] 正在 SSLContext.init 中替换 TrustManagers");
            this.init(km, [TrustManager.$new()], sr);
        };

    // 绕过 NetworkSecurityConfig(Android 7+)
    try {
        var NetworkSecurityConfig = Java.use(
            "android.security.net.config.NetworkSecurityConfig");
        NetworkSecurityConfig.isCleartextTrafficPermitted.implementation = function() {
            return true;
        };
    } catch(e) {}

    console.log("[*] SSL 固定绕过已加载");
});
```

```bash
frida -U -f com.target.app -l android_ssl_bypass.js --no-pause
```

**iOS - 通用 SSL 固定绕过:**
```javascript
// ios_ssl_bypass.js
if (ObjC.available) {
    // 绕过 NSURLSession 委托
    var resolver = new ApiResolver("objc");
    resolver.enumerateMatches(
        "-[* URLSession:didReceiveChallenge:completionHandler:]", {
        onMatch: function(match) {
            Interceptor.attach(match.address, {
                onEnter: function(args) {
                    var completionHandler = new ObjC.Block(args[4]);
                    var NSURLSessionAuthChallengeUseCredential = 0;
                    var trust = new ObjC.Object(args[3])
                        .protectionSpace().serverTrust();
                    var credential = ObjC.classes.NSURLCredential
                        .credentialForTrust_(trust);
                    completionHandler.invoke(NSURLSessionAuthChallengeUseCredential,
                        credential);
                }
            });
        },
        onComplete: function() {}
    });

    // 绕过 SecTrustEvaluate
    var SecTrustEvaluateWithError = Module.findExportByName(
        "Security", "SecTrustEvaluateWithError");
    if (SecTrustEvaluateWithError) {
        Interceptor.replace(SecTrustEvaluateWithError, new NativeCallback(
            function(trust, error) {
                return 1;  // 始终返回 true
            }, "bool", ["pointer", "pointer"]
        ));
    }

    console.log("[*] iOS SSL 固定绕过已加载");
}
```

### 步骤 4:处理高级固定

对于使用高级固定(TrustKit、自定义二进制检查)的应用:

```bash
# 识别特定固定库
frida-trace -U -n TargetApp -m "*[*Trust*]" -m "*[*Pin*]" -m "*[*SSL*]" -m "*[*Certificate*]"

# Hook 识别到的验证函数
# 针对特定实现的自定义 Frida 脚本
```

### 步骤 5:验证绕过成功

应用绕过后:
1. 将设备代理配置为 Burp Suite
2. 打开目标应用并浏览认证流程
3. 验证 HTTPS 流量出现在 Burp Suite HTTP History 中
4. 检查是否仍有未被捕获的固定连接

## 核心概念

| 术语 | 定义 |
|------|------|
| **证书固定** | 将可接受的服务器证书限制为已知集合,防止通过伪造 CA 证书进行 MITM 攻击 |
| **公钥固定** | 固定服务器公钥哈希而非完整证书,在证书轮换时仍然有效 |
| **网络安全配置** | Android XML 配置,用于按域名声明信任锚点、固定和明文策略 |
| **TrustKit** | 实现证书固定并带报告功能的开源库,同时支持 Android 和 iOS |
| **HPKP 弃用** | HTTP 公钥固定标头已在浏览器中弃用,但相关概念在移动应用中仍然存在 |

## 工具与系统

- **Objection**:对常见库(OkHttp、NSURLSession、TrustKit)的预置固定绕过
- **Frida**:针对特定固定实现的自定义 JavaScript Hook
- **apktool**:APK 反编译,用于识别网络安全配置中的固定
- **SSLUnpinning(Xposed)**:Android 系统级固定绕过的 Xposed 框架模块
- **ssl-kill-switch2**:在越狱设备上全局禁用 iOS SSL 固定的 tweak

## 常见问题

- **证书透明度**:某些应用除固定外还检查 CT 日志,可能需要单独绕过 CT 验证。
- **多层固定**:应用可能在多个层级(OkHttp + 自定义 TrustManager)实现固定,需绕过所有层级。
- **二进制级固定**:某些应用在原生 C/C++ 代码中验证证书,需要在原生函数地址使用 Interceptor.attach,而非 Java/ObjC Hook。
- **动态固定更新**:使用 TrustKit 或类似工具的应用可能从服务器获取更新的固定值,测试期间需监控固定轮换。

Related Skills

testing-mobile-api-authentication

9
from killvxk/cybersecurity-skills-zh

测试移动应用 API 的认证与授权机制,识别认证失效、不安全的令牌管理、会话固定、 权限提升和 IDOR 漏洞。适用于对移动应用后端进行 API 安全评估、测试 JWT 实现、 评估 OAuth 流程或评估会话管理的场景。适合涉及移动 API 认证测试、令牌安全评估、 OAuth 移动端流程测试或 API 授权绕过的相关请求。

performing-yara-rule-development-for-detection

9
from killvxk/cybersecurity-skills-zh

通过识别可执行文件中的唯一字节模式、字符串和行为指标,开发精准的 YARA 恶意软件检测规则,同时将误报率降至最低。

performing-wireless-security-assessment-with-kismet

9
from killvxk/cybersecurity-skills-zh

使用 Kismet 通过被动射频监控进行无线网络安全评估,检测流氓接入点(Rogue AP)、隐藏 SSID、弱加密和未授权客户端。

performing-wireless-network-penetration-test

9
from killvxk/cybersecurity-skills-zh

执行无线网络渗透测试,通过捕获握手包、破解 WPA2/WPA3 密钥、检测流氓接入点以及使用 Aircrack-ng 和相关工具测试无线网络分段,评估 WiFi 安全性。

performing-windows-artifact-analysis-with-eric-zimmerman-tools

9
from killvxk/cybersecurity-skills-zh

使用 Eric Zimmerman 的开源 EZ Tools 套件(包括 KAPE、MFTECmd、PECmd、LECmd、JLECmd 和 Timeline Explorer)执行全面的 Windows 取证制品分析,解析注册表 hive、预取文件、事件日志和文件系统元数据。

performing-wifi-password-cracking-with-aircrack

9
from killvxk/cybersecurity-skills-zh

在授权无线安全评估中捕获 WPA/WPA2 握手包,并使用 aircrack-ng、hashcat 和字典攻击进行离线密码破解, 以评估密码短语强度和无线网络安全状况。

performing-web-cache-poisoning-attack

9
from killvxk/cybersecurity-skills-zh

在授权安全测试期间,通过未纳入缓存键的头部和参数毒化缓存响应,利用 Web 缓存机制向其他用户投递恶意内容。

performing-web-cache-deception-attack

9
from killvxk/cybersecurity-skills-zh

通过利用 CDN 缓存层与源服务器之间的路径规范化差异,执行 Web 缓存欺骗攻击,从而缓存并获取敏感的已认证内容。

performing-web-application-vulnerability-triage

9
from killvxk/cybersecurity-skills-zh

使用 OWASP 风险评级方法论对 DAST/SAST 扫描器的 Web 应用程序漏洞发现进行分类,区分真阳性和假阳性,并确定修复优先级。

performing-web-application-scanning-with-nikto

9
from killvxk/cybersecurity-skills-zh

Nikto 是一款开源 Web 服务器和 Web 应用程序扫描器,可针对超过 7,000 个潜在危险文件/程序进行测试,检查超过 1,250 个服务器的过期版本,并识别超过 270 个服务器的版本特定问题。

performing-web-application-penetration-test

9
from killvxk/cybersecurity-skills-zh

遵循 OWASP Web 安全测试指南(WSTG)方法论,对 Web 应用程序执行系统化安全测试,识别认证、授权、 输入验证、会话管理和业务逻辑中的漏洞。测试人员以 Burp Suite 作为主要拦截代理,结合手动测试技术 发现自动化扫描器遗漏的缺陷。适用于 Web 应用渗透测试、OWASP 测试、应用安全评估或 Web 漏洞测试等请求场景。

performing-web-application-firewall-bypass

9
from killvxk/cybersecurity-skills-zh

使用编码技术、HTTP 方法操控、参数污染和载荷混淆绕过 Web 应用防火墙保护,将 SQL 注入、XSS 及其他攻击载荷穿透 WAF 检测规则。