
Ein Werkzeug zum Auffinden und Analysieren privater (und öffentlicher) Schlüsseldateien, einschließlich Unterstützung für Android-APK-Dateien.
CERT Keyfinder ist ein Dienstprogramm zum Auffinden und Analysieren von Schlüsseldateien auf einem Dateisystem sowie in Android APK-Dateien. Die Entwicklung von CERT Keyfinder wurde vom United States Department of Homeland Security (DHS) gesponsert. Installationsvoraussetzungen:
git clone des Keyfinder-Repositorys oder durch Herunterladen einer Zip-Datei des Repositorys erfolgen.$ pip3 install androguard python-magic PyOpenSSL
Verwenden Sie auf Windows-Plattformen das Paket python-magic-bin anstelle von python-magic. Dies stellt die DLL bereit, die für die Analyse des Datei-Magic erforderlich ist.$ python3 keyfinder.py usage: A tool for analyzing key files, with Android APK support [-h] [-e EXTRACT_APK] [-u] [-k CHECK_KEYFILE] [-p PASSWORD] [-v] [-d] [apkpath]
positional arguments: apkpath APK file or directory
optional arguments: -h, --help show this help message and exit -e EXTRACT_APK, --extract EXTRACT_APK Extract specified APK using apktool -u, --checkused Check if the key file is referenced by the app (slow) -k CHECK_KEYFILE, --key CHECK_KEYFILE Key file or directory -p PASSWORD, --password PASSWORD Specify password -v, --verbose Verbose output -d, --debug Debug output
## Schlüssel-Parsing
CERT Keyfinder kann verwendet werden, um die Dateien auf Ihrem System zu scannen und standardmäßig nur private und/oder passwortgeschützte Schlüsseldateien zu melden.
### Einfaches Beispiel
Zum Beispiel, wenn Keyfinder im `~`-Verzeichnis auf einem CERT Tapioca System ausgeführt wird:```
$ python keyfinder.py -k ~/tapioca
keyfile: /home/tapioca/tapioca/.mitmproxy/mitmproxy-ca-cert.p12
type: pkcs12
protected: True
=====================
keyfile: /home/tapioca/tapioca/.mitmproxy/mitmproxy-ca.pem
private: True
protected: False
iskey: True
iscert: True
encoding: pem
type: pkcs8
certhash: 902073e933d0bf9b3da49a3a120d0adecdf031960f87576947bdc3157cd62d8e
keyhash: 3aae8d85450bae20aaf360d046bc0d90b2998800b3a7356f0742ef6a8824e423
=====================
Die obige Befehlszeile durchsucht jede Datei im angegebenen Verzeichnis, ermittelt mithilfe der Dateierweiterung und des Datei-Magic, ob es sich um eine mögliche Schlüsseldatei handelt, und zeigt abschließend kurze Details für jede Datei an, die als private und/oder passwortgeschützte Schlüsseldatei identifiziert wird.
Falls wir mehr Details wünschen, können wir dieselbe Befehlszeile ausführen, jedoch mit dem ausführlichen Flag -v:```
$ python keyfinder.py -k ~/tapioca -v
keyfile: /home/tapioca/tapioca/.mitmproxy/mitmproxy-ca-cert.cer
x509text:
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 15259797775478 (0xde0f2d36476)
Signature Algorithm: sha256WithRSAEncryption
Issuer: CN=mitmproxy, O=mitmproxy
Validity
Not Before: May 8 19:16:17 2018 GMT
Not After : May 9 19:16:17 2021 GMT
Subject: CN=mitmproxy, O=mitmproxy
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:b0:91:be:f6:cc:62:5f:fd:af:9e:48:1e:b9:c5:
59:ca:36:f0:02:a7:e5:62:48:5c:26:1b:78:c1:3a:
74:02:0f:af:85:74:0c:d7:24:5f:85:4c:ce:e0:9b:
2f:3f:0a:85:ba:8f:36:3e:bc:4b:3b:3c:13:d8:8f:
b9:46:38:42:69:9c:b2:7e:51:fa:cc🆎fc:57:95:
49:89:45:5c:a2:17:b9:6c:fc:a3:f6:0c:df:50:9e:
36:28:71:1e:43:d2:e7:13:0a:ec:25:e1:5d:27:a5:
69:5d:48:75:f2:4c:44:3f:b6💿33:a2:db:49:d3:
97:4d:4f:2c:60:ac:a0:4f:4a:96:19:52:d9:4d:b9:
ce:70:49:e6:2d:eb:99:c6:cb:45:8c:5b:df:79:0a:
10:53:44:ac:c2:a3:6c:fd:7d:a3:04:93:73:5e:2e:
d2:d9:b9:c9:f2:5d:ad:a0:68:6e:b9:43:31:2e:2b:
31:b5:8d:2b:09:04:7b:63:1e:79:5a:0b:cc:02:16:
7e:6c:7e:0b:04:d0:07:d6:3b:f9:6d:f8:80:e4:b5:
e2:36:73:ee:c2:6a:a2:b3:ad:20:ac:42:00:24:61:
ad:ff:ed:8d:3d:e7:9f:36:ed:51:a1:91:cf:13:60:
b4:40:1c:e4:82:29:4e:d5:05:43:36:2d:04:b2:37:
c5:cb
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints: critical
CA:TRUE
Netscape Cert Type:
SSL CA
X509v3 Extended Key Usage:
TLS Web Server Authentication, TLS Web Client Authentication, E-mail Protection, Time Stamping, Microsoft Individual Code Signing, Microsoft Commercial Code Signing, Microsoft Trust List Signing, Microsoft Server Gated Crypto, Microsoft Encrypted File System, Netscape Server Gated Crypto
X509v3 Key Usage: critical
Certificate Sign, CRL Sign
X509v3 Subject Key Identifier:
18:85:41:4C:5B:CD:3F:32:0B:BE:12:F2:C8:6E:98:78:6E:B6:EA:33
Signature Algorithm: sha256WithRSAEncryption
9a:84:35:8c:50:81:ae:53:46💿25:31:24:22:3a:25:a3:b0:
c9:bd:68:d9:7f:06:3c:88💿23:0e:24:00:06:55:c6:91:0f:
81:a9:b6:1d:3d:01:58:54:8b:bc:e6:38:f3:0b:1d:fb:6c:d8:
67:46:d4:0e:cc:5c:ff:17:a4:e6:d0:95:e7:8c:c3:95:4c:80:
40:51:5b:b7:32:65:2d:50:25:26:0b:4a:d4:9d:35:59:f0:d9:
cc:1e:2b:54:47:24:02:64:6d:f3:01:85:02:c8:4e:7d:02:13:
30:0c:92:c8:7c:48:2a:c6:dd:64:54:5f:8e:65:ce:c6:91:27:
61:e9:c6:51:25:f2:f4:f7:33:7e:48:c5:0e:a1:c1:86:83:6a:
5a:84:b7:3d:73:28:0b:0c:5a:98:eb:64:1f:a8:72:fd:ca:71:
3c:e7:37:b4:ff:94:ce:15:3d:d5:f4:e0:18:75:41:3c:f9:63:
01:6e🇩🇪73:73:1e:bf:e2:02:d7:47:a6:4a:9e:70:2d:ce:06:
c4:a9:e5:a5:3b:b9:5f:d8:b6:9d:33:58:fc:38:ce:fb:80:0b:
ad:5d:6f:56:62:ca:81:d1:27:36:5e:6f:03:7b:2b:75:29:bd:
85:d3💿11:a3:32:b7:72:09:d2:87:10💿fd:4b:bb:88:28:
ce:15:3e:d2
SHA256 Fingerprint=90:20:73:E9:33:D0:BF:9B:3D:A4:9A:3A:12:0D:0A:DE:CD:F0:31:96:0F:87:57:69:47:BD:C3:15:7C:D6:2D:8E
-----BEGIN CERTIFICATE-----
MIIDoTCCAomgAwIBAgIGDeDy02R2MA0GCSqGSIb3DQEBCwUAMCgxEjAQBgNVBAMM
CW1pdG1wcm94eTESMBAGA1UECgwJbWl0bXByb3h5MB4XDTE4MDUwODE5MTYxN1oX
DTIxMDUwOTE5MTYxN1owKDESMBAGA1UEAwwJbWl0bXByb3h5MRIwEAYDVQQKDAlt
aXRtcHJveHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCwkb72zGJf
/a+eSB65xVnKNvACp+ViSFwmG3jBOnQCD6+FdAzXJF+FTM7gmy8/CoW6jzY+vEs7
PBPYj7lGOEJpnLJ+UfrMq/xXlUmJRVyiF7ls/KP2DN9QnjYocR5D0ucTCuwl4V0n
pWldSHXyTEQ/ts0zottJ05dNTyxgrKBPSpYZUtlNuc5wSeYt65nGy0WMW995ChBT
RKzCo2z9faMEk3NeLtLZucnyXa2gaG65QzEuKzG1jSsJBHtjHnlaC8wCFn5sfgsE
0AfWO/lt+IDkteI2c+7CaqKzrSCsQgAkYa3/7Y0955827VGhkc8TYLRAHOSCKU7V
BUM2LQSyN8XLAgMBAAGjgdAwgc0wDwYDVR0TAQH/BAUwAwEB/zARBglghkgBhvhC
AQEEBAMCAgQweAYDVR0lBHEwbwYIKwYBBQUHAwEGCCsGAQUFBwMCBggrBgEFBQcD
BAYIKwYBBQUHAwgGCisGAQQBgjcCARUGCisGAQQBgjcCARYGCisGAQQBgjcKAwEG
CisGAQQBgjcKAwMGCisGAQQBgjcKAwQGCWCGSAGG+EIEATAOBgNVHQ8BAf8EBAMC
AQYwHQYDVR0OBBYEFBiFQUxbzT8yC74S8shumHhutuozMA0GCSqGSIb3DQEBCwUA
A4IBAQCahDWMUIGuU0bNJTEkIjolo7DJvWjZfwY8iM0jDiQABlXGkQ+BqbYdPQFY
VIu85jjzCx37bNhnRtQOzFz/F6Tm0JXnjMOVTIBAUVu3MmUtUCUmC0rUnTVZ8NnM
HitURyQCZG3zAYUCyE59AhMwDJLIfEgqxt1kVF+OZc7GkSdh6cZRJfL09zN+SMUO
ocGGg2pahLc9cygLDFqY62QfqHL9ynE85ze0/5TOFT3V9OAYdUE8+WMBbt5zcx6/
4gLXR6ZKnnAtzgbEqeWlO7lf2LadM1j8OM77gAutXW9WYsqB0Sc2Xm8Deyt1Kb2F
080RozK3cgnShxDN/Uu7iCjOFT7S
-----END CERTIFICATE-----
private: False protected: False type: certificate
=====================
keyfile: /home/tapioca/tapioca/.mitmproxy/mitmproxy-dhparam.pem private: False type: DH
=====================
keyfile: /home/tapioca/tapioca/.mitmproxy/mitmproxy-ca-cert.p12 type: pkcs12 protected: True
=====================
keyfile: /home/tapioca/tapioca/.mitmproxy/mitmproxy-ca.pem private: True protected: False iskey: True iscert: True encoding: pem type: pkcs8 certhash: 902073e933d0bf9b3da49a3a120d0adecdf031960f87576947bdc3157cd62d8e x509text: Certificate: Data: Version: 3 (0x2) Serial Number: 15259797775478 (0xde0f2d36476) Signature Algorithm: sha256WithRSAEncryption Issuer: CN=mitmproxy, O=mitmproxy Validity Not Before: May 8 19:16:17 2018 GMT Not After : May 9 19:16:17 2021 GMT Subject: CN=mitmproxy, O=mitmproxy Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit) Modulus: 00:b0:91:be:f6:cc:62:5f:fd:af:9e:48:1e:b9:c5: 59:ca:36:f0:02:a7:e5:62:48:5c:26:1b:78:c1:3a: 74:02:0f:af:85:74:0c:d7:24:5f:85:4c:ce:e0:9b: 2f:3f:0a:85:ba:8f:36:3e:bc:4b:3b:3c:13:d8:8f: b9:46:38:42:69:9c:b2:7e:51:fa:cc🆎fc:57:95: 49:89:45:5c:a2:17:b9:6c:fc:a3:f6:0c:df:50:9e: 36:28:71:1e:43:d2:e7:13:0a:ec:25:e1:5d:27:a5: 69:5d:48:75:f2:4c:44:3f:b6💿33:a2:db:49:d3: 97:4d:4f:2c:60:ac:a0:4f:4a:96:19:52:d9:4d:b9: ce:70:49:e6:2d:eb:99:c6:cb:45:8c:5b:df:79:0a: 10:53:44:ac:c2:a3:6c:fd:7d:a3:04:93:73:5e:2e: d2:d9:b9:c9:f2:5d:ad:a0:68:6e:b9:43:31:2e:2b: 31:b5:8d:2b:09:04:7b:63:1e:79:5a:0b:cc:02:16: 7e:6c:7e:0b:04:d0:07:d6:3b:f9:6d:f8:80:e4:b5: e2:36:73:ee:c2:6a:a2:b3:ad:20:ac:42:00:24:61: ad:ff:ed:8d:3d:e7:9f:36:ed:51:a1:91:cf:13:60: b4:40:1c:e4:82:29:4e:d5:05:43:36:2d:04:b2:37: c5:cb Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Basic Constraints: critical CA:TRUE Netscape Cert Type: SSL CA X509v3 Extended Key Usage: TLS Web Server Authentication, TLS Web Client Authentication, E-mail Protection, Time Stamping, Microsoft Individual Code Signing, Microsoft Commercial Code Signing, Microsoft Trust List Signing, Microsoft Server Gated Crypto, Microsoft Encrypted File System, Netscape Server Gated Crypto X509v3 Key Usage: critical Certificate Sign, CRL Sign X509v3 Subject Key Identifier: 18:85:41:4C:5B:CD:3F:32:0B:BE:12:F2:C8:6E:98:78:6E:B6:EA:33 Signature Algorithm: sha256WithRSAEncryption 9a:84:35:8c:50:81:ae:53:46💿25:31:24:22:3a:25:a3:b0: c9:bd:68:d9:7f:06:3c:88💿23:0e:24:00:06:55:c6:91:0f: 81:a9:b6:1d:3d:01:58:54:8b:bc:e6:38:f3:0b:1d:fb:6c:d8: 67:46:d4:0e:cc:5c:ff:17:a4:e6:d0:95:e7:8c:c3:95:4c:80: 40:51:5b:b7:32:65:2d:50:25:26:0b:4a:d4:9d:35:59:f0:d9: cc:1e:2b:54:47:24:02:64:6d:f3:01:85:02:c8:4e:7d:02:13: 30:0c:92:c8:7c:48:2a:c6:dd:64:54:5f:8e:65:ce:c6:91:27: 61:e9:c6:51:25:f2:f4:f7:33:7e:48:c5:0e:a1:c1:86:83:6a: 5a:84:b7:3d:73:28:0b:0c:5a:98:eb:64:1f:a8:72:fd:ca:71: 3c:e7:37:b4:ff:94:ce:15:3d:d5:f4:e0:18:75:41:3c:f9:63: 01:6e🇩🇪73:73:1e:bf:e2:02:d7:47:a6:4a:9e:70:2d:ce:06: c4:a9:e5:a5:3b:b9:5f:d8:b6:9d:33:58:fc:38:ce:fb:80:0b: ad:5d:6f:56:62:ca:81:d1:27:36:5e:6f:03:7b:2b:75:29:bd: 85:d3💿11:a3:32:b7:72:09:d2:87:10💿fd:4b:bb:88:28: ce:15:3e:d2 SHA256 Fingerprint=90:20:73:E9:33:D0:BF:9B:3D:A4:9A:3A:12:0D:0A:DE:CD:F0:31:96:0F:87:57:69:47:BD:C3:15:7C:D6:2D:8E -----BEGIN CERTIFICATE----- MIIDoTCCAomgAwIBAgIGDeDy02R2MA0GCSqGSIb3DQEBCwUAMCgxEjAQBgNVBAMM CW1pdG1wcm94eTESMBAGA1UECgwJbWl0bXByb3h5MB4XDTE4MDUwODE5MTYxN1oX DTIxMDUwOTE5MTYxN1owKDESMBAGA1UEAwwJbWl0bXByb3h5MRIwEAYDVQQKDAlt aXRtcHJveHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCwkb72zGJf /a+eSB65xVnKNvACp+ViSFwmG3jBOnQCD6+FdAzXJF+FTM7gmy8/CoW6jzY+vEs7 PBPYj7lGOEJpnLJ+UfrMq/xXlUmJRVyiF7ls/KP2DN9QnjYocR5D0ucTCuwl4V0n pWldSHXyTEQ/ts0zottJ05dNTyxgrKBPSpYZUtlNuc5wSeYt65nGy0WMW995ChBT RKzCo2z9faMEk3NeLtLZucnyXa2gaG65QzEuKzG1jSsJBHtjHnlaC8wCFn5sfgsE 0AfWO/lt+IDkteI2c+7CaqKzrSCsQgAkYa3/7Y0955827VGhkc8TYLRAHOSCKU7V BUM2LQSyN8XLAgMBAAGjgdAwgc0wDwYDVR0TAQH/BAUwAwEB/zARBglghkgBhvhC AQEEBAMCAgQweAYDVR0lBHEwbwYIKwYBBQUHAwEGCCsGAQUFBwMCBggrBgEFBQcD BAYIKwYBBQUHAwgGCisGAQQBgjcCARUGCisGAQQBgjcCARYGCisGAQQBgjcKAwEG CisGAQQBgjcKAwMGCisGAQQBgjcKAwQGCWCGSAGG+EIEATAOBgNVHQ8BAf8EBAMC AQYwHQYDVR0OBBYEFBiFQUxbzT8yC74S8shumHhutuozMA0GCSqGSIb3DQEBCwUA A4IBAQCahDWMUIGuU0bNJTEkIjolo7DJvWjZfwY8iM0jDiQABlXGkQ+BqbYdPQFY VIu85jjzCx37bNhnRtQOzFz/F6Tm0JXnjMOVTIBAUVu3MmUtUCUmC0rUnTVZ8NnM HitURyQCZG3zAYUCyE59AhMwDJLIfEgqxt1kVF+OZc7GkSdh6cZRJfL09zN+SMUO ocGGg2pahLc9cygLDFqY62QfqHL9ynE85ze0/5TOFT3V9OAYdUE8+WMBbt5zcx6/ 4gLXR6ZKnnAtzgbEqeWlO7lf2LadM1j8OM77gAutXW9WYsqB0Sc2Xm8Deyt1Kb2F 080RozK3cgnShxDN/Uu7iCjOFT7S -----END CERTIFICATE-----
keyhash: 3aae8d85450bae20aaf360d046bc0d90b2998800b3a7356f0742ef6a8824e423
=====================
keyfile: /home/tapioca/tapioca/.mitmproxy/mitmproxy-ca-cert.pem x509text: Certificate: Data: Version: 3 (0x2) Serial Number: 15259797775478 (0xde0f2d36476) Signature Algorithm: sha256WithRSAEncryption Issuer: CN=mitmproxy, O=mitmproxy Validity Not Before: May 8 19:16:17 2018 GMT Not After : May 9 19:16:17 2021 GMT Subject: CN=mitmproxy, O=mitmproxy Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit) Modulus: 00:b0:91:be:f6:cc:62:5f:fd:af:9e:48:1e:b9:c5: 59:ca:36:f0:02:a7:e5:62:48:5c:26:1b:78:c1:3a: 74:02:0f:af:85:74:0c:d7:24:5f:85:4c:ce:e0:9b: 2f:3f:0a:85:ba:8f:36:3e:bc:4b:3b:3c:13:d8:8f: b9:46:38:42:69:9c:b2:7e:51:fa:cc🆎fc:57:95: 49:89:45:5c:a2:17:b9:6c:fc:a3:f6:0c:df:50:9e: 36:28:71:1e:43:d2:e7:13:0a:ec:25:e1:5d:27:a5: 69:5d:48:75:f2:4c:44:3f:b6💿33:a2:db:49:d3: 97:4d:4f:2c:60:ac:a0:4f:4a:96:19:52:d9:4d:b9: ce:70:49:e6:2d:eb:99:c6:cb:45:8c:5b:df:79:0a: 10:53:44:ac:c2:a3:6c:fd:7d:a3:04:93:73:5e:2e: d2:d9:b9:c9:f2:5d:ad:a0:68:6e:b9:43:31:2e:2b: 31:b5:8d:2b:09:04:7b:63:1e:79:5a:0b:cc:02:16: 7e:6c:7e:0b:04:d0:07:d6:3b:f9:6d:f8:80:e4:b5: e2:36:73:ee:c2:6a:a2:b3:ad:20:ac:42:00:24:61: ad:ff:ed:8d:3d:e7:9f:36:ed:51:a1:91:cf:13:60: b4:40:1c:e4:82:29:4e:d5:05:43:36:2d:04:b2:37: c5:cb Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Basic Constraints: critical CA:TRUE Netscape Cert Type: SSL CA X509v3 Extended Key Usage: TLS Web Server Authentication, TLS Web Client Authentication, E-mail Protection, Time Stamping, Microsoft Individual Code Signing, Microsoft Commercial Code Signing, Microsoft Trust List Signing, Microsoft Server Gated Crypto, Microsoft Encrypted File System, Netscape Server Gated Crypto X509v3 Key Usage: critical Certificate Sign, CRL Sign X509v3 Subject Key Identifier: 18:85:41:4C:5B:CD:3F:32:0B:BE:12:F2:C8:6E:98:78:6E:B6:EA:33 Signature Algorithm: sha256WithRSAEncryption 9a:84:35:8c:50:81:ae:53:46💿25:31:24:22:3a:25:a3:b0: c9:bd:68:d9:7f:06:3c:88💿23:0e:24:00:06:55:c6:91:0f: 81:a9:b6:1d:3d:01:58:54:8b:bc:e6:38:f3:0b:1d:fb:6c:d8: 67:46:d4:0e:cc:5c:ff:17:a4:e6:d0:95:e7:8c:c3:95:4c:80: 40:51:5b:b7:32:65:2d:50:25:26:0b:4a:d4:9d:35:59:f0:d9: cc:1e:2b:54:47:24:02:64:6d:f3:01:85:02:c8:4e:7d:02:13: 30:0c:92:c8:7c:48:2a:c6:dd:64:54:5f:8e:65:ce:c6:91:27: 61:e9:c6:51:25:f2:f4:f7:33:7e:48:c5:0e:a1:c1:86:83:6a: 5a:84:b7:3d:73:28:0b:0c:5a:98:eb:64:1f:a8:72:fd:ca:71: 3c:e7:37:b4:ff:94:ce:15:3d:d5:f4:e0:18:75:41:3c:f9:63: 01:6e🇩🇪73:73:1e:bf:e2:02:d7:47:a6:4a:9e:70:2d:ce:06: c4:a9:e5:a5:3b:b9:5f:d8:b6:9d:33:58:fc:38:ce:fb:80:0b: ad:5d:6f:56:62:ca:81:d1:27:36:5e:6f:03:7b:2b:75:29:bd: 85:d3💿11:a3:32:b7:72:09:d2:87:10💿fd:4b:bb:88:28: ce:15:3e:d2 SHA256 Fingerprint=90:20:73:E9:33:D0:BF:9B:3D:A4:9A:3A:12:0D:0A:DE:CD:F0:31:96:0F:87:57:69:47:BD:C3:15:7C:D6:2D:8E -----BEGIN CERTIFICATE----- MIIDoTCCAomgAwIBAgIGDeDy02R2MA0GCSqGSIb3DQEBCwUAMCgxEjAQBgNVBAMM CW1pdG1wcm94eTESMBAGA1UECgwJbWl0bXByb3h5MB4XDTE4MDUwODE5MTYxN1oX DTIxMDUwOTE5MTYxN1owKDESMBAGA1UEAwwJbWl0bXByb3h5MRIwEAYDVQQKDAlt aXRtcHJveHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCwkb72zGJf /a+eSB65xVnKNvACp+ViSFwmG3jBOnQCD6+FdAzXJF+FTM7gmy8/CoW6jzY+vEs7 PBPYj7lGOEJpnLJ+UfrMq/xXlUmJRVyiF7ls/KP2DN9QnjYocR5D0ucTCuwl4V0n pWldSHXyTEQ/ts0zottJ05dNTyxgrKBPSpYZUtlNuc5wSeYt65nGy0WMW995ChBT RKzCo2z9faMEk3NeLtLZucnyXa2gaG65QzEuKzG1jSsJBHtjHnlaC8wCFn5sfgsE 0AfWO/lt+IDkteI2c+7CaqKzrSCsQgAkYa3/7Y0955827VGhkc8TYLRAHOSCKU7V BUM2LQSyN8XLAgMBAAGjgdAwgc0wDwYDVR0TAQH/BAUwAwEB/zARBglghkgBhvhC AQEEBAMCAgQweAYDVR0lBHEwbwYIKwYBBQUHAwEGCCsGAQUFBwMCBggrBgEFBQcD BAYIKwYBBQUHAwgGCisGAQQBgjcCARUGCisGAQQBgjcCARYGCisGAQQBgjcKAwEG CisGAQQBgjcKAwMGCisGAQQBgjcKAwQGCWCGSAGG+EIEATAOBgNVHQ8BAf8EBAMC AQYwHQYDVR0OBBYEFBiFQUxbzT8yC74S8shumHhutuozMA0GCSqGSIb3DQEBCwUA A4IBAQCahDWMUIGuU0bNJTEkIjolo7DJvWjZfwY8iM0jDiQABlXGkQ+BqbYdPQFY VIu85jjzCx37bNhnRtQOzFz/F6Tm0JXnjMOVTIBAUVu3MmUtUCUmC0rUnTVZ8NnM HitURyQCZG3zAYUCyE59AhMwDJLIfEgqxt1kVF+OZc7GkSdh6cZRJfL09zN+SMUO ocGGg2pahLc9cygLDFqY62QfqHL9ynE85ze0/5TOFT3V9OAYdUE8+WMBbt5zcx6/ 4gLXR6ZKnnAtzgbEqeWlO7lf2LadM1j8OM77gAutXW9WYsqB0Sc2Xm8Deyt1Kb2F 080RozK3cgnShxDN/Uu7iCjOFT7S -----END CERTIFICATE-----
private: False protected: False type: certificate
=====================
Hier sehen wir öffentliche Schlüssel und X509-Textausgaben für Zertifikate.
## APK Parsing
CERT Keyfinder begann sein Leben als Teil des Frameworks, das für mein [Experiment zum Auffinden privater Schlüssel in Android-Apps](https://resources.sei.cmu.edu/library/asset-view.cfm?assetid=517768) verwendet wurde. Daher enthält Keyfinder die Möglichkeit, Android-Anwendungs-APK-Dateien zu parsen.
### Einfaches APK-Beispiel```
$ python3 keyfinder.py com.shopgate.android.app21760.apk
Reached a NAMESPACE_END without having the namespace stored before? Prefix ID: 24, URI ID: 25
testapks/com.shopgate.android.app21760.apk distributes its signing key as: res/raw/keystore.jks
testapks/com.shopgate.android.app21760.apk includes private,protected key: res/raw/keystore.jks (Java KeyStore)
testapks/com.shopgate.android.app21760.apk includes protected key: res/raw/shopgate_bks_neu.bks (BouncyCastle Keystore V1)
test@test-virtual-machine:/mnt/v1/keyfinder$
Hier sehen wir, dass die betreffende Anwendung eine Java-KeyStore-Datei enthält, die geschützt ist, und dass sie auch einen privaten Schlüssel enthält. Obwohl der Java-KeyStore mit einem Passwort geschützt ist, verbirgt die KeyStore-Datei den Inhalt nicht. Keyfinder nutzt diese Schwachstelle aus, um das KeyStore-Passwort zu ändern und dann den Inhalt mit dem nativen Java-keytool-Dienstprogramm zu parsen. Interessant ist in diesem Fall auch die Tatsache, dass der private Schlüssel res/raw/keystore.jks den privaten Schlüssel enthält, mit dem die Android-Anwendung selbst signiert wurde. Google weist darauf hin, dass die Verwaltung Ihres Schlüssels und seine Sicherheit sowohl für Sie als auch für Ihre Benutzer sehr wichtig sind, aber in diesem Fall hat der Autor der Anwendung ihn an die Öffentlichkeit weitergegeben!
Für jeden von Keyfinder gefundenen Schlüssel wird die SHA256-Signatur des Schlüssels auf der crt.sh-Website abgefragt. Diese Website überwacht mehrere Certificate-Transparency-Quellen, um zu überprüfen, ob ein Schlüssel oder ein Zertifikat im öffentlichen Bereich gesehen wurde. Der übliche Grund dafür ist, dass ein HTTPS-Webserver einen bestimmten Schlüssel oder ein bestimmtes Zertifikat verwendet.
CERT Keyfinder wird crt.sh mit zwei Informationsquellen abfragen:
Wenn CERT Keyfinder meldet, dass sich ein Schlüssel in crt.sh befindet, ist dies wahrscheinlich ein Grund zur Besorgnis. Der Grund für diese Besorgnis ist, dass ein privater Schlüssel, der mit einem in einer Certificate-Transparency-Datenbank aufgeführten Zertifikat verbunden ist, wahrscheinlich ein Schlüssel ist, der nicht öffentlich zugänglich sein sollte. Zum Beispiel ist jede Android-APK aus dem Google Play Store offensichtlich öffentlich verfügbar. Dies ist nicht der Ort für einen privaten Schlüssel für einen HTTPS-Website-Schlüssel.``` $ python3 keyfinder.py apks/ireland.numt.aplykey.apk apks/ireland.numt.aplykey.apk includes private key: assets/sample-keys/ca.key (pkcs5) apks/ireland.numt.aplykey.apk includes private key: assets/sample-keys/client.key (pkcs5) Enter pass phrase for keys/ireland.numt.aplykey/assets/sample-keys/pass.key:apks/ireland.numt.aplykey.apk includes private,protected key: assets/sample-keys/pass.key (pkcs5) apks/ireland.numt.aplykey.apk includes protected key: assets/sample-keys/pkcs12.p12 (pkcs12) apks/ireland.numt.aplykey.apk includes private key: assets/sample-keys/server.key (pkcs5) apks/ireland.numt.aplykey.apk key assets/sample-keys/server.key is listed in crt.sh: https://crt.sh/?spkisha256=493f34228ad3179e2dad25a392acae4d2dcaebcf633240a9df9d7f4413c4e681 $
Hier sehen wir, dass die Datei `assets/sample-keys/server.key` in crt.sh aufgeführt ist unter: [https://crt.sh/?spkisha256=493f34228ad3179e2dad25a392acae4d2dcaebcf633240a9df9d7f4413c4e681](https://crt.sh/?spkisha256=493f34228ad3179e2dad25a392acae4d2dcaebcf633240a9df9d7f4413c4e681). Da es sich bei dieser Abfrage um einen Hash eines öffentlichen Schlüssels handelt und nicht um das Zertifikat selbst, müssen wir auf eines der angezeigten Zertifikate klicken, um Details darüber zu erhalten, wofür der private Schlüssel möglicherweise verwendet wird. Wenn wir auf [https://crt.sh/?id=35604116](https://crt.sh/?id=35604116) klicken, sehen wir, dass das Zertifikat von Comodo CA Limited für die Domainnamen `oxsv.meta-level.de` und `www.oxsv.meta-level.de` ausgestellt wurde. Da dieses Zertifikat im Jahr 2013 abgelaufen ist, ist dieses Problem vielleicht nicht besonders schwerwiegend. Dennoch könnte man sich fragen, wie der private Schlüssel `assets/sample-keys/server.key` in eine öffentlich veröffentlichte Android-Anwendung gelangte und auch von einem öffentlich verfügbaren Server verwendet wurde. Die Auswirkungen eines solchen Schlüssellecks können davon abhängen, wie der betreffende Server genutzt wird.
### Nutzung von Schlüsseldateien
Keyfinder bietet eine weitere Funktion, die dabei helfen kann, die Funktionalität eines von einer Android-Anwendung verwendeten Schlüssels zu bestimmen. Mit der Option `-u` extrahiert Keyfinder den APK-Inhalt mit [apktool](https://ibotpeaches.github.io/Apktool/) und sucht dann im APK-Inhalt nach Verweisen auf diese Schlüsseldatei. Beispiel:```
$ python3 keyfinder.py apks/by_sha256/06/14/49/06144936809844bcb120d360ecc148679e33fd013c2bdac8bd9d7b63d71a57a4/tntapp.trinitymember.apk -u
I: Using Apktool 2.3.1-dirty on tntapp.trinitymember.apk
I: Loading resource table...
I: Decoding AndroidManifest.xml with resources...
I: Loading resource table from file: /tmp/tntapp.trinitymember/1.apk
I: Regular manifest package...
I: Decoding file-resources...
I: Decoding values */* XMLs...
I: Baksmaling classes.dex...
I: Copying assets and libs...
I: Copying unknown files...
I: Copying original files...
res/raw/sm_private is referenced by extracted/tntapp.trinitymember/smali/tntapp/trinitymember/R$raw.smali
res/raw/sm_private is referenced by extracted/tntapp.trinitymember/res/values/public.xml
apks/by_sha256/06/14/49/06144936809844bcb120d360ecc148679e33fd013c2bdac8bd9d7b63d71a57a4/tntapp.trinitymember.apk includes private key: res/raw/sm_private (pkcs5)
Hier können wir sehen, dass der Android-Code R$raw.smali auf die Schlüsseldatei sm_private verweist. Wenn wir uns die Datei R$raw.smali ansehen, sehen wir einen Verweis auf sm_private:```
.field public static final sm_private:I = 0x7f060001
Wenn wir nach `0x7f060001` im Code der Anwendung suchen, sehen wir, dass es in `smali/tntapp/trinitymember/model/RSA.smali` referenziert wird```
const v18, 0x7f060001
invoke-virtual/range {v17 .. v18}, Landroid/content/res/Resources;->openRawResource(I)Ljava/io/InputStream;
move-result-object v7
.line 114
.local v7, "is":Ljava/io/InputStream;
new-instance v3, Ljava/io/BufferedReader;
new-instance v17, Ljava/io/InputStreamReader;
const-string v18, "UTF-8"
move-object/from16 v0, v17
move-object/from16 v1, v18
...
smali code ist nicht besonders schön anzusehen, daher können wir den Code in Java dekompilieren, was etwas lesbarer ist:```java public static byte[] decryptRSA(Context arg20, String arg21) throws Exception { System.out.println(":" + arg21); byte[] v14 = Base64.decode(arg21.getBytes("UTF-8"), 0); BufferedReader v3 = new BufferedReader(new InputStreamReader(arg20.getResources().openRawResource(0x7F060001), "UTF-8")); ArrayList v13 = new ArrayList(); while(true) { String v12 = v3.readLine(); if(v12 == null) { break; }
((List)v13).add(v12);
}
...
Hier können wir deutlich sehen, dass wir eine Funktion namens `decryptRSA` haben, die den privaten Schlüssel öffnet, der als Ressource `0x7F060001` referenziert ist. Wenn wir weiter in den Anwendungscode vordringen, können wir eine bessere Vorstellung davon bekommen, wofür der private Schlüssel verwendet wird. Aber das überlassen wir dem Leser als Übung.