Archive for September, 2007

Oracle 0xDEADF00D

Samstag, September 22nd, 2007

Thorsten Schröder und Felix „FX“ Lindner von Recurity Labs GmbH haben gerade einen sehr lesenswerten Artikel über die Erfahrungen bei der Suche nach dem neuen Oracle 11g Passwort-Algorithmus gepostet.

Oracle Password Algorithmus 11g – PoC Code

Freitag, September 21st, 2007

Mit Oracle 11g hat Oracle einen neuen Algorithmus zum Hashen der Oracle-Passworte gewählt. Anstatt des alten Hash-Verfahrens, das auf DES basiert, verwendet der neue Algorithmus SHA-1. Weiterhin ist neu, dass nun auch Groß- und Kleinbuchstaben unterstützt werden.

Unser Partner, Recurity Labs GmbH, einer der führenden Experten für reverse Engineering, hat sich den neuen Oracle Passwort Algorithmus angesehen. Ein Blog-Eintrag mit der Analyse des Oracle Password Algorithmus von Recurity GmbH findet sich hier.

Thorsten Schröder von Recurity Labs GmbH (die vor kurzem umbenannte S*bre Labs GmbH) hat auch ein kleines Python Script geschrieben. Die an Oracle 11g angepasste checkpwd Version 2.0 und Performance-Werte gibt es am Montag.

Die Veröffentlichung des Oracle Passwort Algorithmus ist kein Security Problem, sondern hilft, auch 11g Datenbanken auf schwache Passworte zu überprüfen.

#!python

# „PoC“ Oracle 11g Database password-hash cracker
# This program uses the password hash value „spare4“ from the internal
# oracle user-database and a list of passwords via stdin to calculate a new
# hash value of the plaintext password. The new generated hash value is subsequently
# compared against the hash-value from sys.user, the internal oracle user-database.

# Author: Thorsten Schroeder <ths „theAthing“ recurity-labs.com>
# Berlin, 19. Sep. 2007

# TODO:
# cut passwords at length 30

import hashlib
import binascii
import sys

def main():

if( len(sys.argv[1]) != 60 ):
usage()
sys.exit(1)

try:
oraHash = sys.argv[1]
oraSalt = oraHash[40:60]
oraSha1 = oraHash[:40]
oraSha1 = oraSha1.upper()

print „[+] using salt: 0x%s“ % oraSalt
print „[+] using hash: 0x%s“ % oraSha1

for passwd in sys.stdin:
passwd = passwd.rstrip()
#print „[*] trying password „%s““ % passwd

s = hashlib.sha1()
s.update(passwd)
s.update(binascii.a2b_hex(oraSalt))
if( s.hexdigest().upper() == oraSha1 ):
print „[*] MATCH! -> %s“ % passwd
sys.exit(0)

except Exception, e:
print „[!] Error: „, e
usage()
raise

sys.exit(0)

def usage():
print „[+] usage: ./ora11gPWCrack.py <hex-value> < wordlist.txt“
return

if __name__ == ‚__main__‘:
main()

Kommendes Oracle Patchset 10.2.0.4

Mittwoch, September 12th, 2007

Im heutigen Oracle Security Training habe ich bei der Übung „Oracle Metalink Hacking“ die ersten Informationen zum Oracle Patchset 10.2.0.4  (erfordert Metalink-Account) gefunden. Wie üblich beschreibt Oracle vorab, welche Fehler im kommenden Patchset 10.2.0.4 korrigiert werden.

Beim Lesen der Fehlerliste wurde mir ein wenig unwohl. Zwar wusste ich, dass es ab und zu bei Abfragen in Oracle falsche Ergebnisse gibt (speziell bei Outer-Join-Syntax, daran laboriert Oracle seit Jahren), aber die Liste der Fehlerkorrekturen „Wrong Results“ ist mit 80 schon recht beeindruckend.

80 Fehler „Wrong Results“:
z.B. Wrong Results with with count() and IS NULL, Wrong results from CONNECT BY query, wrong results (no rows) from ANSI outer join, Wrong results using more than one OLS policy on a table, ….

Im Patchset sind auch einige Fehler mit „Security-Potential“ sind darunter. Vielleicht geht es aber auch nur mir so, dass mich Fehler wie

FGA records are not written for view on remote table (5860927),  Wrong results from V$XML_AUDIT_TRAIL (4596532), Dump in HS with very long TNS connect string (4767996),   Spin using UTL_TCP / UTL_HTTP (4686467), …

beunruhigen.