尝试
平常常见的关键词 cert password 都搜索不到
不起作用
1
| objection -g com.yuanrenxue.challenge explore --startup-command "android hooking watch class_method java.io.File.$init –-dump-args –-dump-backtrace –-dump-return"
|
代码审查
搜索关键词 借问酒家何处有跳转到相关的组件中进行代码审查
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| public void onCreate(Bundle bundle) { super.onCreate(bundle); try { C9174oo0o0Oo.C9175OooO00o OoooO002 = new C9174oo0o0Oo().OooOoO0().OoooO00(false); TimeUnit timeUnit = TimeUnit.SECONDS; C9174oo0o0Oo.C9175OooO00o OoooO0O2 = OoooO002.OooO0o0(60, timeUnit).Oooo(60, timeUnit).OoooO0O(60, timeUnit); TrustManagerFactory instance = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); instance.init(OooOooO()); TrustManager[] trustManagers = instance.getTrustManagers(); if (trustManagers.length == 1) { TrustManager trustManager = trustManagers[0]; if (trustManager instanceof X509TrustManager) { KeyStore instance2 = KeyStore.getInstance(C8385o00O0O.OooO00o(-5190684656253612251L)); instance2.load(getContext().getApplicationContext().getAssets().open(C8385o00O0O.OooO00o(-5190684673433481435L)), C8385o00O0O.OooO00o(-5190684729268056283L).toCharArray()); KeyManagerFactory instance3 = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); instance3.init(instance2, C8385o00O0O.OooO00o(-5190684802282500315L).toCharArray()); SSLContext instance4 = SSLContext.getInstance(C8385o00O0O.OooO00o(-5190684875296944347L)); instance4.init(instance3.getKeyManagers(), trustManagers, new SecureRandom()); OoooO0O2.OoooO0(instance4.getSocketFactory(), (X509TrustManager) trustManager); OoooO0O2.Oooo0o0(new C6642oo000o(this)); this.f12034OooO0o = OoooO0O2.OooO0OO(); return; } } throw new IllegalStateException(C8385o00O0O.OooO00o(-5190684505929756891L) + Arrays.toString(trustManagers)); } catch (Exception unused) { } }
|
找到相关代码
1
| instance2.load(getContext().getApplicationContext().getAssets().open(C8385o00O0O.OooO00o(-5190684673433481435L)), C8385o00O0O.OooO00o(-5190684729268056283L).toCharArray());
|
发现不是明文,补C8385o00O0O.OooO00o
环境
文件名是: ./clientCA.bks
密码是:MZ4cozY8Qu32UzGe
证书转换
bks 不是标准的jks 文件需要安装 BouncyCastleProvider 密码学组件
官网地址:https://www.bouncycastle.org/latest_releases.html
1.8到17 版本的jar包 https://www.bouncycastle.org/download/bcprov-ext-jdk18on-177.jar
jdk17 不支持 lib/ext/ 目录
openjdk version “1.8.0_292” 有bug
本文使用的是 openjdk version "1.8.0_392"
版本
1 2 3 4 5 6 7 8 9
| sudo cp ~/Downloads/bcprov-jdk18on-177.jar/Library/Java/JavaVirtualMachines/openjdk1.8.392/Contents/Home/jre/lib/ext
sudo vim /Library/Java/JavaVirtualMachines/openjdk1.8.392/Contents/Home/jre/lib/security/java.security
增加 security.provider.11=org.bouncycastle.jce.provider.BouncyCastleProvider #这一行
11 代表行数 如果有11 这一行,这个编号就往后加
|
将bks 文件转换为 p12
1
| keytool -importkeystore -srckeystore ./clientCA.bks -srcstoretype BKS -destkeystore clientCA.p12 -deststoretype PKCS12
|
将p12 文件转换为 pem
1
| openssl pkcs12 -in clientCA.p12 -out clientCA.pem
|
密码是上面解出来的 MZ4cozY8Qu32UzGe
抓包
mitmproxy 没有起作用
1
| mitmweb -p 9998 --certs ./clientCA.pem --cert-passphrase MZ4cozY8Qu32UzGe
|
这里使用的是新版的BurpSuite 社区版,点击右上角settings
搜索SSL
在TLS
中配置证书
转换证书
在python 中使用自定义证书
requests 不支持p12 证书需要进行转换
1 2 3 4
| openssl pkcs12 -clcerts -nokeys -out cer.pem -in ./clientCA.p12
openssl pkcs12 -nocerts -out key.pem -in ./clientCA.p12 -nodes
|
在这里,我们通过**-in参数指定传入的文件名称,而-out文件指定输出的文件名称,而-nodes**参数表示不对私钥进行加密。在这个过程中,我们需要输入签名时的密码。
在requests 中使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| import requests
cert_file = '/Users/king/cer.pem' cert_password = '/Users/king/key.pem'
headers = { 'Host': '180.76.60.244:8443', 'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent': 'okhttp/4.9.1', 'Connection': 'close', }
data = { 'page': '1', }
response = requests.post('https://180.76.60.244:8443/api/app9', headers=headers, data=data, verify=False, cert=(cert_file, cert_password))
print(response) print(response.text)
|
参考文章
1.使用 OpenSSL 实现私钥和证书的转换
2.安卓APP抓包之双向认证突破
3.双向认证APP自吐证书密码与抓包
4.使用openssl从pkcs12文件中导出证书私钥