Die Sicherheitsbeschreibung des Policy Objektes
Der folgende
Artikel bezieht sich auf die Betriebsysteme Windows2000/XP. Die hier
aufgeführten Tests wurden unter Windows2000 unter einem
Administratoraccount durchgeführt.
Für das
Nachvollziehen der hier gemachten Aussagen sind folgende
Zusatzprogramme erforderlich:
- PrivAktivate
- Eine Version
von Profan² bzw. XProfan.
Auch hier soll wieder um
einen Wert unter dem Registryschlüssel Security
unter HKEY_LOCAL_MACHINE
gehen, dessen Werte und Unterschlüssel normalerweise selbst für
einen Administrator unsichtbar sind:
Um das wirklich sichtbar zu machen, um das es geht, müssen
wir auch hier wieder "zu einem Teil des Betriebssystems werden".
Dazu starten wir zuerst PrivAktivate.
Über den Menüpunkt 'Programm' und 'PrivAktivate als Service
starten' verleihen wir PrivAktivate den Access Token des
Betriebssystems mit dessen Privilegien und Zugriffsrechten. Über
den zweiten Button von links kann nun RegEdit gestartet werden.
Jetzt sieht die Sache schon ganz anders aus...
Unter dem Schlüssel Policy
finden wir einen Unterschlüssel mit dem Namen SecDesc,
der einen etwas längeren Binärwert enthalt:
SecDesc
lässt uns als erfahrene Windowstüftler gleich an einen
Security Descriptor,
also an eine Sicherheitsbeschreibung denken. Aber ist das, was da
steht, wirklich ein Security
Descriptor?
Wir schauen da mal
mit dem unten stehenden Quelltext etwas genauer nach:
Def @Regopenkeyex(5) !"ADVAPI32","RegOpenKeyExA" |
Def @Regqueryvalueex(6) !"ADVAPI32","RegQueryValueExA" |
Def @Regclosekey(1) !"ADVAPI32","RegCloseKey" |
Def @IsValidSecurityDescriptor(1) !"ADVAPI32","IsValidSecurityDescriptor" |
DEF @LsaOpenPolicy(4) !"advapi32","LsaOpenPolicy" |
DEF @LsaClose(1) !"advapi32","LsaClose" |
DEF @LsaNtStatusToWinError(1) !"advapi32","LsaNtStatusToWinError" |
Declare Handle#,Fehler&,Key#,Name#,Wert#,Size#,Type#,Zaehler%,Binaer$ |
Declare Attribut#,Policy_Handle# |
Struct LSA_OBJECT_ATTRIBUTES=Length&,RootDirectory&,Length%,MaximumLength%, \ |
Buffer&,Attributes&,SecurityDescriptor#(4),SecurityQualityOfService#(4) |
Dim Key#,513 |
Dim Handle#,4 |
Dim Name#,250 |
Dim Size#,4 |
Dim Wert#,2000 |
Dim Type#,4 |
DIM Policy_Handle#,4 |
DIM Attribut#,LSA_OBJECT_ATTRIBUTES |
String Key#,0="Security\Policy\SecDesc" 'zu öffnender Schlüssel |
Let Fehler&=@Regopenkeyex($80000002,Key#,0,$1,Handle#) |
Addstring "Fehlercode beim Öffenen des Schlüssels: "+@str$(Fehler&) |
Clear Wert# |
If Fehler&=0 |
String Name#,0="" 'auszulesender Wert |
Long Size#,0=2000 |
Let Fehler&=@Regqueryvalueex(@Long(Handle#,0),Name#,0,Type#,Wert#,Size#) |
Addstring "Fehlercode beim Auslesen des Schlüssels: "+@str$(Fehler&) |
Addstring "" |
Clear Zaehler%,Binaer$ |
While Zaehler%<@Long(Size#,0) |
LET Binaer$=Binaer$+@right$("00"+@Hex$(@Byte(Wert#,Zaehler%)),2)+" " |
Inc Zaehler% |
wend |
Addstring "Ausgelesener Wert: "+Binaer$ |
Addstring "Typ des Schlüssels: "+@str$(@Long(Type#,0)) |
Addstring "Länge des Wertes: "+@str$(@Long(Size#,0))+" Bytes" |
Addstring "" |
@Regclosekey(@Long(Handle#,0)) |
Endif |
LET Fehler&=@IsValidSecurityDescriptor(Wert#) |
Addstring "Rückgabe von IsValidSecurityDescriptor: "+@str$(Fehler&) |
Clear POLICY_Handle#,Attribut# |
LET Fehler&=@LsaOpenPolicy(0,Attribut#,16 | 2048,POLICY_Handle#) |
Let Fehler&=@LsaNtStatusToWinError(Fehler&) |
Addstring "Rückmeldung von LsaOpenPolicy: "+@STR$(Fehler&) |
IF Fehler&=0 |
LET Fehler&=@LsaClose(@long(Policy_Handle#,0),0) |
Let Fehler&=@LsaNtStatusToWinError(Fehler&) |
Addstring "Rückmeldung von LsaClose: "+@STR$(Fehler&) |
endif |
Dispose Type# |
Dispose Wert# |
Dispose Key# |
Dispose Handle# |
Dispose Name# |
Dispose Size# |
Dispose Policy_Handle# |
Dispose Attribut# |
@editbox("Rückaben",1) |
Dieser
Quelltext liest zuerst den besagten Schlüssel aus der Registry
aus und vergleicht dann mittels IsValidSecurityDescriptor, ob es sich
um eine gültige Sicherheitsbeschreibung handelt (1 als Rückgabe,
wenn dem so ist). Zum Schluss wird dann versucht, das Policy Object
zu öffnen - 0 bei Erfolg.
Diese Quelltext compilieren wir zu
einer EXE und starten ihn dann mit der als Service gestarteten
Anwendung PrivAktivate über den Button Anwendung auswählen
Wir bekommen dann folgende Rückmeldungen:
Fehlercode beim Öffenen des Schlüssels: 0 |
Fehlercode beim Auslesen des Schlüssels: 0 |
Ausgelesener Wert: 01 00 04 80 48 00 00 00 58 00 ... |
Typ des Schlüssels: 0 |
Länge des Wertes: 100 Bytes |
Rückgabe von IsValidSecurityDescriptor: 1 |
Rückmeldung von LsaOpenPolicy: 0 |
Rückmeldung von LsaClose: 0 |
Wie die
Rückgabe von IsValidSecurityDescriptor beweist, steht hier also
wirklich eine Sicherheitsbeschreibung in der Registry - aber welche?
Um das zu testen, benennen wir einfach den Schlüssel einmal
folgendermaßen um:
Starten wir jetzt wie vorher wieder unseen compilierten
Quelltext über PrivAktivate, kommen wir diesmal zu folgenden
Ergebnissen:
Fehlercode beim Öffenen des Schlüssels: 2 |
Rückgabe von IsValidSecurityDescriptor: 0 |
Rückmeldung von LsaOpenPolicy: 2 |
Wie man sieht, lässt sich jetzt das
Policy Objekt nicht mehr öffnen - die dort in der Registry
gefundene Sicherheitsbeschreibung bezieht sich also definitiv auf das
Handle des Policy Objektes!
PS: Das Zurückbenennen des
Schlüssels nicht vergessen!