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!



Impressum