Bypasses SSL/TLS certificate pinning in Android and iOS apps using Frida, Objection, and custom scripts for OkHttp, TrustManager, NSURLSession during authorized security assessments to enable traffic interception.
npx claudepluginhub killvxk/cybersecurity-skills-zhThis skill uses the workspace's default tool permissions.
适用于以下情况:
Bypasses SSL/TLS certificate pinning in Android and iOS apps using Frida, Objection, and custom scripts to enable proxy traffic interception for authorized security assessments.
Bypasses SSL/TLS certificate pinning in Android/iOS apps using Objection, Frida scripts for proxy traffic interception during authorized mobile security assessments.
Conducts penetration testing on Android/iOS apps using Frida, Objection, MobSF for insecure data storage, certificate pinning bypass, API vulns, binary flaws, runtime manipulation. Useful for mobile security audits.
Share bugs, ideas, or general feedback.
适用于以下情况:
不适用场景:未经明确授权不得绕过应用的证书固定。
pip install objection)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 评估
# 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 评估。
Android - 通用 SSL 固定绕过:
// 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 固定绕过已加载");
});
frida -U -f com.target.app -l android_ssl_bypass.js --no-pause
iOS - 通用 SSL 固定绕过:
// 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 固定绕过已加载");
}
对于使用高级固定(TrustKit、自定义二进制检查)的应用:
# 识别特定固定库
frida-trace -U -n TargetApp -m "*[*Trust*]" -m "*[*Pin*]" -m "*[*SSL*]" -m "*[*Certificate*]"
# Hook 识别到的验证函数
# 针对特定实现的自定义 Frida 脚本
应用绕过后:
| 术语 | 定义 |
|---|---|
| 证书固定 | 将可接受的服务器证书限制为已知集合,防止通过伪造 CA 证书进行 MITM 攻击 |
| 公钥固定 | 固定服务器公钥哈希而非完整证书,在证书轮换时仍然有效 |
| 网络安全配置 | Android XML 配置,用于按域名声明信任锚点、固定和明文策略 |
| TrustKit | 实现证书固定并带报告功能的开源库,同时支持 Android 和 iOS |
| HPKP 弃用 | HTTP 公钥固定标头已在浏览器中弃用,但相关概念在移动应用中仍然存在 |