猿人学APP09-证书验证闯关

尝试

平常常见的关键词 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环境

image-20231229182603589

image-20231229161050587

文件名是: ./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 搜索SSLTLS中配置证书

image-20231230165018837

image-20231230165206011

转换证书

在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',
# 'Content-Length': '6',
# 'Accept-Encoding': 'gzip, deflate, br',
'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)

image-20231230165520348

参考文章

1.使用 OpenSSL 实现私钥和证书的转换

2.安卓APP抓包之双向认证突破

3.双向认证APP自吐证书密码与抓包

4.使用openssl从pkcs12文件中导出证书私钥


猿人学APP09-证书验证闯关
https://kingjem.github.io/2024/10/14/猿人学/猿人学APP09实战/
作者
Ruhai
发布于
2024年10月14日
许可协议