Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Verständnisfrage Elevation und Impersonation (https://www.delphipraxis.net/179229-verstaendnisfrage-elevation-und-impersonation.html)

Der schöne Günther 21. Feb 2014 11:51

Verständnisfrage Elevation und Impersonation
 
Eine ganz dumme Frage:

Ein Prozess läuft in einem normalen Benutzeraccount. Der Prozess hat allerdings eine Möglichkeit, an die momentan gültigen Anmeldedaten (Benutzername, Passwort) eines Administrator-Accounts zu kommen. Das soll er nutzen, um einen Registry-Schlüssel in HKLM zu ändern.

Ist das möglich? Als reiner Laie habe ich es als erstes mit reiner "Impersonation" versucht (sprich
Delphi-Quellcode:
LogonUser(..)
und dann
Delphi-Quellcode:
ImpersonateLoggedOnUser(..)
). Die zweite Möglichkeit wäre, einen komplett neuen Prozess für diese Aufgabe unter dem gewünschten Benutzeraccount zu starten, aber das funktioniert ebenso wenig.

Ich weiß, die Windows-UAC-Geschichte sollte langsam jeder mitbekommen haben. Ich nicht. Sehe ich das richtig, dass ich an diesem Dialog für den Benutzer nicht vorbeikommen werde?

sx2008 21. Feb 2014 13:15

AW: Verständnisfrage Elevation und Impersonation
 
Ich habe vor Kurzem entdeckt wie sich CCleaner Adminrechte verschafft ohne UAC auszulösen.
Und zwar ist im Windows Taskplaner eine Aufgabe mit dem Namen "CCleanerSkipUAC" eingetragen.
Es sind keine Trigger eingetragen so dass man die Aufgabe nur manuell starten kann.
Ausserdem ist das Flag "Mit höchsten Berechtigungen ausführen" gesetzt.

Mit der Kommandozeile
Code:
schtasks /run /TN CCleanerSkipUAC
kann man die Aufgabe starten was dazu führt das CCleaner.exe mit Adminrechten gestartet wird.

Es gibt auch eine API mit der man auch Parameter für die Exe übergeben kann.
Auf jeden Fall ein interessanter Ansatz.

Zacherl 21. Feb 2014 13:30

AW: Verständnisfrage Elevation und Impersonation
 
Was genau hat denn bei LogonUser() und ImpersonateLoggedOnUser() nicht funktioniert? Was sagt GetLastError, etc? Ich vermute mal deinem Benutzerkonto fehlt das "SeImpersonatePrivilege", welches standardmäßig nur Administrator Accounts besitzen. In diesem Falle würde ich vermutlich einfach eine neue Instanz des eigenen Prozesses über CreateProcessAsUser() starten und per Parameter signalisieren, dass die entsprechende Admin Funktionalität ausgeführt werden soll.

Buddelfish 21. Feb 2014 13:30

AW: Verständnisfrage Elevation und Impersonation
 
Aber wenigstens benötigte der CCCleaner einmalig Adminrechte, um den Task anzulegen, oder?

Zacherl 21. Feb 2014 13:32

AW: Verständnisfrage Elevation und Impersonation
 
Zitat:

Zitat von Buddelfish (Beitrag 1248969)
Aber wenigstens benötigte der CCCleaner einmalig Adminrechte, um den Task anzulegen, oder?

Korrekt. Bei der Installation.

Das Problem bei dieser Methode ist übrigens, dass die "höchsten Rechte" auf einem Limited Account, leider auch nur "limited" sind. Sprich: Der Taskplaner Trick zur Unterdrückung der UAC Meldung funktioniert nur auf Admin Accounts.

Der schöne Günther 21. Feb 2014 13:37

AW: Verständnisfrage Elevation und Impersonation
 
Zitat:

Zitat von Zacherl (Beitrag 1248968)
Was genau hat denn bei LogonUser() und ImpersonateLoggedOnUser() nicht funktioniert? Was sagt GetLastError, etc? Ich vermute mal deinem Benutzerkonto fehlt das "SeImpersonatePrivilege", welches standardmäßig nur Administrator Accounts besitzen. In diesem Falle würde ich vermutlich einfach eine neue Instanz des eigenen Prozesses über CreateProcessAsUser() starten und per Parameter signalisieren, dass die entsprechende Admin Funktionalität ausgeführt werden soll.

Das LogonUser und ImpersonateLoggedOnUser funktioniert. Das sehe ich beispielsweise daran, wenn ich auf Dateien zugreifen möchte- Blockiere ich einem Benutzer explizit den Schreibzugriff auf die Datei, gebe mich dann als dieser aus, kann ich dort auch nicht mehr schreiben.

Das scheint allerdings nur die "Persönlichkeit" an sich zu betreffen. Gebe ich mich beispielsweise als Administrator aus, kann ich trotzdem keine HKLM-Registry-Veränderungen durchführen oder Systemdateien löschen.

Die Errorcodes reiche ich nach, Sorry :oops:

Zacherl 21. Feb 2014 13:53

AW: Verständnisfrage Elevation und Impersonation
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1248974)
Das scheint allerdings nur die "Persönlichkeit" an sich zu betreffen. Gebe ich mich beispielsweise als Administrator aus, kann ich trotzdem keine HKLM-Registry-Veränderungen durchführen oder Systemdateien löschen.

Sofern dein Adminbenutzer Zugriff auf die Systemdateien hat, solltest du die definitiv löschen können. Um auf HKEY_CURRENT_USER Keys zuzugreifen, musst du erst noch MSDN-Library durchsuchenLoadUserProfile aufrufen, wenn ich mich recht erinnere. HKEY_LOCAL_MACHINE sollte aber eigentlich ohne Probleme funktionieren.

Ich vermute mal, dass LogonUser() dich zwar korrekt mit einem Adminaccount einloggt, aber leider auch nur das Restricted Admin Token zurückliefert.

Edit: Grade nochmal nachgelesen. LogonUser() liefert tatsächlich nur das restrikted Token. Du könntest probieren dir das Linked Token zu extrahieren, wie ich es hier demonstriert habe:
http://www.delphipraxis.net/160355-s...t-starten.html
Ich vermute allerdings, dass dazu wiederrum bestimmte Privilegien / SYSTEM Context nötig sind, die du als normaler Administrator nicht besitzt. Andernfalls könnte man die UAC ja jederzeit umgehen.

Der schöne Günther 21. Feb 2014 14:06

AW: Verständnisfrage Elevation und Impersonation
 
Nein, das ist definitiv nicht der Fall. Beispiel: Textdatei direkt auf C:\ schreiben.

Delphi-Quellcode:
procedure TForm20.Button1Click(Sender: TObject);
var
   strings: TStrings;
begin
   strings := TStringList.Create();
   strings.Append('Hallo Welt');
   strings.SaveToFile('c:\textfile.txt');
end;
Führt man das als "normaler Benutzer" aus: Zugriff verweigert. Führt man das mit einem normalen Administratorkonto aus: Geht.

Soweit alles wie erwartet.

Gebe ich mich vor dem Schreibvorgang als Admin aus:

Delphi-Quellcode:
procedure TForm20.Button1Click(Sender: TObject);
var
   strings: TStrings;
begin
   strings := TStringList.Create();
   strings.Append('Hallo Welt');

   if not TWindowsUser.Impersonate(
      'admin',
      '1234567890'
   ) then
      Beep();

   try
      strings.SaveToFile('c:\textfile.txt');
   finally
      RevertToSelf();
   end;
end;
funktioniert es weder ("Zugriff verweigert"), wenn ich die Datei als normaler Benutzer starte, noch als Admin. Das verstehe ich auch nicht.


--
Die Methode "Impersonate" habe ich glaube ich einfach von Luckie gestohlen
Delphi-Quellcode:
class function TWindowsUser.Impersonate(
   const username: String;
   const password: String;
   const domain: String = Para_Impersonate_domain
): Boolean;
var
   LogonType: Integer;
   LogonProvider: Integer;
   TokenHandle: THandle;

   strAdminUser: string;
   strAdminDomain: string;
   strAdminPassword: string;
begin
   LogonType := LOGON32_LOGON_INTERACTIVE;
   LogonProvider := LOGON32_PROVIDER_DEFAULT or LOGON32_PROVIDER_WINNT50;

    {TODO -oJM -cDoc : ActionItem}

   // Token für den gewünschten Benutzer holen
   Result := LogonUser(
      PChar(username),
      PChar(domain),
      PChar(password),
      LogonType,
      LogonProvider,
      TokenHandle
   );

   // Wenn das Token in Erfahrung gebracht werden konnte...
   if Result then begin
      Result := ImpersonateLoggedOnUser(TokenHandle);
      CloseHandle(TokenHandle);
   end;
end;

Zacherl 21. Feb 2014 14:33

AW: Verständnisfrage Elevation und Impersonation
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1248981)
Nein, das ist definitiv nicht der Fall. Beispiel: Textdatei direkt auf C:\ schreiben.

Delphi-Quellcode:
procedure TForm20.Button1Click(Sender: TObject);
var
   strings: TStrings;
begin
   strings := TStringList.Create();
   strings.Append('Hallo Welt');
   strings.SaveToFile('c:\textfile.txt');
end;
Führt man das als "normaler Benutzer" aus: Zugriff verweigert. Führt man das mit einem normalen Administratorkonto aus: Geht.

:shock: Das sollte bei aktivierter UAC aber definitiv nicht der Fall sein.

Warum es nach deiner Impersonation nicht funktioniert ist klar. LogonUser() liefert dir wie gesagt nur das restricted Admin Token. Das hat nicht mehr Rechte als ein eingeschränktes Benutzerkonto.

Du hast folgende Möglichkeiten:
  1. 2.Prozess (zeigt aber jedes Mal eine UAC Meldung an)
  2. TaskScheduler
  3. System Service

Der schöne Günther 21. Feb 2014 14:38

AW: Verständnisfrage Elevation und Impersonation
 
Zitat:

Zitat von Zacherl (Beitrag 1248989)
Warum es nach deiner Impersonation nicht funktioniert ist klar. LogonUser() liefert dir wie gesagt nur das restricted Admin Token. Das hat nicht mehr Rechte als ein eingeschränktes Benutzerkonto.

Alles klar, das war dann wohl ein Missverständnis meinerseits. Ich dachte, damit würde ich gleichzeitig in meinem Thread auch die Rechte des Administrators erhalten.

Danke für die Lösungsvorschläge, aber eine UAC-Meldung ist leider keine Option, die vorherige "Installation" versuche ich zu vermeiden.

Ich schildere demnächst mal mein konkretes Problem, wahrscheinlich brauche ich noch nicht einmal Administratorrechte.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:44 Uhr.
Seite 1 von 2  1 2   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz