AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Verständnisfrage Elevation und Impersonation

Verständnisfrage Elevation und Impersonation

Ein Thema von Der schöne Günther · begonnen am 21. Feb 2014 · letzter Beitrag vom 21. Feb 2014
Antwort Antwort
Seite 1 von 2  1 2   
Der schöne Günther
Online

Registriert seit: 6. Mär 2013
5.963 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Verständnisfrage Elevation und Impersonation

  Alt 21. Feb 2014, 11:51
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 LogonUser(..) und dann 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?
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#2

AW: Verständnisfrage Elevation und Impersonation

  Alt 21. Feb 2014, 13:15
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.
fork me on Github
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

AW: Verständnisfrage Elevation und Impersonation

  Alt 21. Feb 2014, 13:30
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.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl (21. Feb 2014 um 13:34 Uhr)
  Mit Zitat antworten Zitat
Buddelfish
(Gast)

n/a Beiträge
 
#4

AW: Verständnisfrage Elevation und Impersonation

  Alt 21. Feb 2014, 13:30
Aber wenigstens benötigte der CCCleaner einmalig Adminrechte, um den Task anzulegen, oder?
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#5

AW: Verständnisfrage Elevation und Impersonation

  Alt 21. Feb 2014, 13:32
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.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl (21. Feb 2014 um 13:35 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther
Online

Registriert seit: 6. Mär 2013
5.963 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Verständnisfrage Elevation und Impersonation

  Alt 21. Feb 2014, 13:37
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
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#7

AW: Verständnisfrage Elevation und Impersonation

  Alt 21. Feb 2014, 13:53
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.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl (21. Feb 2014 um 14:03 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther
Online

Registriert seit: 6. Mär 2013
5.963 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Verständnisfrage Elevation und Impersonation

  Alt 21. Feb 2014, 14:06
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;
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#9

AW: Verständnisfrage Elevation und Impersonation

  Alt 21. Feb 2014, 14:33
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.
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
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl (21. Feb 2014 um 14:36 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther
Online

Registriert seit: 6. Mär 2013
5.963 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: Verständnisfrage Elevation und Impersonation

  Alt 21. Feb 2014, 14:38
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.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:05 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf