Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Lokal Adminrechte erlangen (https://www.delphipraxis.net/204156-lokal-adminrechte-erlangen.html)

Hobbycoder 30. Apr 2020 11:36

AW: Lokal Adminrechte erlangen
 
Zitat:

Zitat von himitsu (Beitrag 1463209)
Das stimmt so nicht ganz. Es lassen sich sogar einzelne Threads mit unterschiedlichen Rechten ausführen,
aber es ist einfacher die Rechte direkt beim Start eines Prozesses/Threads festzulegen, bzw. kurz nach dem Start umzuschalten.

Im Puff und hier Forum (Luckie) sollten es einige Beispiele und Tutorials zu finden sein.

Wenn ich mir Luckie's Beispiel auf o.g. Url anschaue ist es ja das, was ich eben so verwende. Müsste dann nicht die weiteren Routinen (ForceDirectories) unter dem entsprechenden Benutzerkontext (Also der mit dem ich mich im Impersonate angemeldet habe) ausgeführt werden?

PS: In Luckie's Bespiel ist noch ein ReversToItself enthalten. Ist das auch aus der API?

himitsu 30. Apr 2020 11:40

AW: Lokal Adminrechte erlangen
 
Schon mit Vista fing der Spaß mit UAC und Co. an, wo die Rechte der gestarteten Programme nicht mehr direkt mit den Rechten des eingeloggten Benutzers übereinstimmen.

MSDN-Library durchsuchenRevertToSelf

Der Rest des Programms läuft ja noch mit geringeren Rechten, da sollte die Zeit mit den höheren Rechten nicht unbegrenzt andauern. (nur so lang wie nötig)
Entweder schnell wieder zurücksetzen oder den jeweiligen Thread beenden.
Damit böse Buben es nicht zu einfach ausnutzen können sich in dein Programm zu hacken und von da in den Thread zu kommen.

Wenn man z.B. auf einen anderen Desktop kommen will, dann geht das nur direkt beim Start des Threads, bevor die Messagebehandlung anläuft.
Siehe Anmeldebildschirm oder die UAC-Passwortabfrage. So Manches geht nur, wenn es noch nicht andersweitig initialisiert/benutzt wurde
und in punkto Sicherheit sollte man sicherheitshalber nichts zu lange unsicher lassen.



Zwischen Impersonate und Revert wird jeder Code in diesem Thread mit dessen Rechten ausgeführt, also eigentlich auch ein ForceDirectories.
Es gibt noch ein paar Fallstricke mit Dingen die zwar in dem Thread aufgerufen/gestartet, aber in einem anderen Thread ausgeführt werden.

Der schöne Günther 30. Apr 2020 12:22

AW: Lokal Adminrechte erlangen
 
Es gibt keinen "Rest" des Programms. Es hat auch nichts wirklich mit Rechten eines Benutzers zu tun. Entweder der Prozess hat beim Start Admin-RechteFähigkeiten mitbekommen, oder er hat sie nicht. Man durch diese "Impersonation" sich als anderer Benutzer ausgeben, auf dessen Resourcen (z.B. Registry oder Dateien) zugreifen, aber die Admin-Fähigkeiten kommen dadurch nicht nach.

Das ist auch einer der Gründe weshalb ich bei diesen klassischen alten "setup.exe" am Schluss nie das Häkchen "Anwendung direkt starten" (oder so ähnlich) anhake, denn das Setup vererbt die Admin-Fähigkeiten gleich an den zu startenden Prozess weiter. Zumindest die allermeisten.

Aviator 30. Apr 2020 14:21

AW: Lokal Adminrechte erlangen
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1463220)
Das ist auch einer der Gründe weshalb ich bei diesen klassischen alten "setup.exe" am Schluss nie das Häkchen "Anwendung direkt starten" (oder so ähnlich) anhake, denn das Setup vererbt die Admin-Fähigkeiten gleich an den zu startenden Prozess weiter. Zumindest die allermeisten.

Haha. Ich dachte, ich wäre der Einzige der das so macht. Ich nehme den Haken auch immer raus und starte die Anwendung lieber aus dem Startmenü von Hand.

Assarbad 30. Apr 2020 15:05

AW: Lokal Adminrechte erlangen
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1463191)
Das Impersonate gibt dem Prozess nicht plötzlich Adminrechte. Entweder ein Prozess wird mit Adminrechten gestartet, oder ohne. Das lässt sich nicht nachträglich ändern.

Öhm ... also MSDN-Library durchsuchenImpersonateLoggedOnUser gibt in der Tat dem Thread die Rechte des Nutzers dessen Identität man annimmt. Himitsu erwähnte es bereits.

Kann es sein, daß du eher das hier meinst? Denn die von dir beschriebene Abgrenzung gibt es meines Wissens nach dort, aber nicht auf der Ebene um welche sich die Frage dreht. Ich lasse mich gern eines besseren belehren.

Zitat:

Zitat von Der schöne Günther (Beitrag 1463191)
Selbst Anwendungen wie z.B. Visual Studio Code installieren sich standardmäßig dorthin.

Faszinierend, oder? Entgegen Microsofts eigenen Empfehlungen. Nunja. Vermutlich liegt's daran, daß VSCode Electron-basiert ist?!

Zitat:

Zitat von Moombas (Beitrag 1463200)
Und nicht das hier ein Denkfehler geschieht "User mit Adminrechten" <> Administratoruser (unter Windows 10 zumindest).

Definiere:
  1. Adminrechte
  2. Adminstratoruser

Also redest du über RID=500 (DOMAIN_USER_RID_ADMIN)? Oder geht es um die "Privileges" (ich meine eingedeutscht hießen die Benutzerrechte)?

Zitat:

Zitat von Der schöne Günther (Beitrag 1463220)
Es gibt keinen "Rest" des Programms. Es hat auch nichts wirklich mit Rechten eines Benutzers zu tun. Entweder der Prozess hat beim Start Admin-RechteFähigkeiten mitbekommen, oder er hat sie nicht. Man durch diese "Impersonation" sich als anderer Benutzer ausgeben, auf dessen Resourcen (z.B. Registry oder Dateien) zugreifen, aber die Admin-Fähigkeiten kommen dadurch nicht nach.

Sicher? Du bist dir da so 100%ig sicher, daß du das hier Hilfesuchenden als definitive Aussage präsentierst? Woher genau bekommst du denn das Token? Normalerweise wird das MSDN-Library durchsuchenLogonUser oder Tokenklau sein. Und wenn du dich in MSDN-Library durchsuchenLogonUser als Admin ausgewiesen hast, bekommst du selbstverfreilich die entsprechenden Rechte. Wie genau definierst du "Admin-Fähigkeiten"? Das ist ja gerade der Zweck dieser Funktionen.

Ich verweise auf Mimikatz (siehe auch GitHub).

Die Lektüre des Codes von SuRun empfiehlt sich ebenfalls.

Also entweder reden wir aufgrund mangelnder gemeinsam akzeptierter Definition von "Admin-Fähigkeiten" aneinander vorbei, oder du bist auf dem Holzweg.

Aviator 30. Apr 2020 15:59

AW: Lokal Adminrechte erlangen
 
Zitat:

Zitat von Assarbad (Beitrag 1463243)
Zitat:

Zitat von Der schöne Günther (Beitrag 1463191)
Selbst Anwendungen wie z.B. Visual Studio Code installieren sich standardmäßig dorthin.

Faszinierend, oder? Entgegen Microsofts eigenen Empfehlungen. Nunja. Vermutlich liegt's daran, daß VSCode Electron-basiert ist?!

Naja, bei VSCode gibt es zwei verschiedene Installer. Einen User Installer und einen System Installer. Der User Installer ist wohl nur verfügbar, um das Updaten und ggf. installieren von Erweiterungen zu vereinfachen. Im gewerblichen Umfeld in einer Domain bei der die User keine Admin Rechte haben sollten, sehe ich das als nützlich an.
Nachteilig sehe ich es für die Benutzer, die gerne Anwendungen auf anderen Festplatten auslagern, dazu zähle ich mich auch. Dadurch, dass der User Installer aber ins Benutzerprofil installiert wird und dieses in der Regel auf dem gleichen Laufwerk liegt wie die Windows Installation, funktioniert das nicht und der Speicher wird dort verbraucht.

Aber ich glaube, das geht jetzt langsam etwas am Thema vorbei. :oops:

Assarbad 30. Apr 2020 17:00

AW: Lokal Adminrechte erlangen
 
Zitat:

Zitat von Aviator (Beitrag 1463248)
Nachteilig sehe ich es für die Benutzer, die gerne Anwendungen auf anderen Festplatten auslagern, dazu zähle ich mich auch. Dadurch, dass der User Installer aber ins Benutzerprofil installiert wird und dieses in der Regel auf dem gleichen Laufwerk liegt wie die Windows Installation, funktioniert das nicht und der Speicher wird dort verbraucht.

Klick, klick (/j) :zwinker: ... ja, gibt's seit Windows 2000. Und so lange benutze ich das auch schon.

Aviator 30. Apr 2020 17:02

AW: Lokal Adminrechte erlangen
 
Zitat:

Zitat von Assarbad (Beitrag 1463254)
Zitat:

Zitat von Aviator (Beitrag 1463248)
Nachteilig sehe ich es für die Benutzer, die gerne Anwendungen auf anderen Festplatten auslagern, dazu zähle ich mich auch. Dadurch, dass der User Installer aber ins Benutzerprofil installiert wird und dieses in der Regel auf dem gleichen Laufwerk liegt wie die Windows Installation, funktioniert das nicht und der Speicher wird dort verbraucht.

Klick, klick (/j) :zwinker: ... ja, gibt's seit Windows 2000. Und so lange benutze ich das auch schon.

Ich kenne das, klar. Aber es gibt auch Leute, die so etwas nicht kennen oder auch nicht nutzen wollen. Ich gehöre eher zu letzteren. :)

Assarbad 30. Apr 2020 17:11

AW: Lokal Adminrechte erlangen
 
Zitat:

Zitat von Aviator (Beitrag 1463256)
Ich kenne das, klar. Aber es gibt auch Leute, die so etwas nicht kennen oder auch nicht nutzen wollen. Ich gehöre eher zu letzteren. :)

Ja gut, dann kann ich dir auch nicht helfen :zwinker:

Ich benutze das schon seit weit über einer Dekade um bspw. das Profil von Browser und Email-Programm in einen verschlüsselten Container zu verbannen. Ganz selten habe ich damit auch andere Daten (bspw. riesige Spiele) "ausgelagert" oder Programme welche sich selbst zickig anstellen, wenn sie nicht auf der Systemplatte landen. Keine Ahnung warum man das nicht einsetzen wollen würde. Es hat jedenfalls nicht die gleichen Sicherheitsimplikationen wie symbolische Links und braucht daher auch nicht das entsprechende Benutzerrecht.

Der schöne Günther 30. Apr 2020 17:37

AW: Lokal Adminrechte erlangen
 
Zitat:

Zitat von Assarbad (Beitrag 1463243)
Also entweder reden wir aufgrund mangelnder gemeinsam akzeptierter Definition von "Admin-Fähigkeiten" aneinander vorbei

Ich denke das ist es. Oder ich hatte zu wenig Kaffee.


Ganz konkret:
  • Zwei Benutzer, "localUser" und "localAdmin". Ersterer gehört nicht zur Gruppe "Administratoren", letzterer schon
  • Eine aktive Sitzung im Benutzer "localUser". Der Benutzer doppelklickt unseren Prozess
  • Der Prozess hat in seinem Manifest, wie wohl so ziemlich jeder,
    Delphi-Quellcode:
    requestedExecutionLevel
    level="asInvoker"
  • Der Prozess soll nun das Verzeichnis C:\Program Files\Watzn erstellen.

Kann er das? Dein Beitrag liest sich so als ginge das. Wenn ja, was ist dann hieran falsch?

Delphi-Quellcode:
uses
  System.SysUtils,
  WinApi.Windows;

const
   adminName = 'localAdmin';
   adminPwd = 'localAdmin';

function getAdminToken(): THandle;
begin
   Win32Check( LogonUser(
      adminName,
      nil,
      adminPwd,
      LOGON32_LOGON_INTERACTIVE,
      LOGON32_PROVIDER_DEFAULT,
      Result
   ) );
end;

procedure p();
var
   adminToken: THandle;
begin
   adminToken := getAdminToken();
   try
      Win32Check( ImpersonateLoggedOnUser(adminToken) );
      try
         Win32Check( CreateDirectory('C:\Program Files\Watzn', nil) );
      finally
         Win32Check( RevertToSelf() );
      end;
   finally
      CloseHandle(adminToken);
   end;
end;
Selbst bei TeamViewer kann man das beobachten: Der Benutzer führt einen TeamViewer-QuickSupport aus. Authentifiziert sich jemand von außen mit den Kontodaten eines Administrator-Accounts startet TeamViewer sich selbst noch einmal und beendet sich dann. So kannte ich es bislang.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:27 Uhr.
Seite 2 von 3     12 3      

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