Windows Vista/Windows 7-Privileg: SeDebugPrivilege & OpenProcess

Lesezeit: 8 Minuten

Windows VistaWindows 7 Privileg SeDebugPrivilege OpenProcess
KevenK

Alles, was ich über die Eskalation zu den entsprechenden Privilegien für meine Bedürfnisse finden konnte, stimmt mit meinen derzeitigen Methoden überein, aber das Problem besteht. Ich hoffe, vielleicht hat jemand einige interne Erfahrungen mit Windows Vista / Windows 7 gemacht, die etwas Licht ins Dunkel bringen könnten, wo nur Dunkelheit ist. Ich bin sicher, das wird lang, aber bitte haben Sie Geduld.

Kontext

Ich arbeite an einer Anwendung, die den Zugriff auf den Speicher anderer Prozesse auf dem aktuellen Computer erfordert. Dies erfordert natürlich Administratorrechte. Es erfordert auch SeDebugPrivilege (Nein, es ist kein Schreibfehler von SetDebugPrivilege). Code hat bisher erfolgreich auf allen Versionen von Windows XP und auf meinen Testumgebungen mit Vista 32 Bit und Windows 7 64 Bit funktioniert.

Verfahren

  • Programm wird Stets mit Administratorrechten ausgeführt werden. Davon kann in diesem Beitrag ausgegangen werden.
  • Eskalieren des aktuellen Prozesses Access Token einschließen SeDebugPrivilege Rechte.
  • Verwenden von EnumProcesses um eine Liste der aktuellen PIDs auf dem System zu erstellen
  • Öffnen eines Griffs mit OpenProcess mit PROCESS_ALL_ACCESS Zugangsrechte
  • Verwenden von ReadProcessMemory um den Speicher des anderen Prozesses auszulesen.

Problem:

Während der Entwicklung und meiner persönlichen Tests hat alles gut funktioniert (einschließlich Windows XP 32 & 64, Windows Vista 32 und Windows 7 x64). Während einer Testbereitstellung auf Windows Vista (32-Bit) und Windows 7 (64-Bit) Computern eines Kollegen scheint es jedoch ein Berechtigungs-/Rechteproblem mit . zu geben OpenProcess scheitern mit einem generischen Access Denied Error. Dies tritt sowohl bei der Ausführung als eingeschränkter Benutzer (wie zu erwarten) als auch bei der Ausführung explizit als Administrator (Rechtsklick → Als Administrator ausführen und bei Ausführung über eine Eingabeaufforderung auf Administratorebene).

Dieses Problem war jedoch für mich in meiner Testumgebung nicht reproduzierbar. Ich habe das Problem aus erster Hand erlebt, daher vertraue ich darauf, dass das Problem existiert. Der einzige Unterschied, den ich zwischen der tatsächlichen Umgebung und meiner Testumgebung feststellen kann, ist, dass die tatsächlich Fehler tritt auf, wenn ein Domänenadministratorkonto an der UAC-Eingabeaufforderung verwendet wird, während meine Tests (die ohne Fehler funktionieren) ein lokales Administratorkonto an der UAC-Eingabeaufforderung verwenden.

Es scheint, dass, obwohl die verwendeten Anmeldeinformationen es UAC ermöglichen, als Administrator ausgeführt zu werden, der Prozess immer noch nicht die richtigen Rechte erhält, um in der Lage zu sein OpenProcess auf einen anderen Prozess. Ich bin mit den Interna von Vista/Windows 7 nicht vertraut genug, um zu wissen, was dies sein könnte, und ich hoffe, jemand hat eine Idee, was die Ursache sein könnte.

Der Kicker

Die Person, die diesen Fehler gemeldet hat und deren Umgebung diesen Fehler regelmäßig reproduzieren kann, hat eine kleine Anwendung namens RunWithDebugEnabled Dabei handelt es sich um ein kleines Bootstrap-Programm, das anscheinend seine eigenen Berechtigungen erweitert und dann die an es übergebene ausführbare Datei startet (und somit die erweiterten Berechtigungen erbt). Wenn dieses Programm mit denselben Domänenadministrator-Anmeldeinformationen an der UAC-Eingabeaufforderung ausgeführt wird, funktioniert das Programm ordnungsgemäß und kann erfolgreich aufgerufen werden OpenProcess und funktioniert wie vorgesehen.

Dies ist also definitiv ein Problem beim Erwerb der richtigen Berechtigungen, und es ist bekannt, dass das Domänenadministratorkonto ist ein Administratorkonto, das in der Lage sein sollte, auf die richtigen Rechte zuzugreifen. (Natürlich wäre es großartig, diesen Quellcode zu erhalten, aber ich wäre nicht hier, wenn das möglich wäre).

Anmerkungen

Wie bereits erwähnt, sind die von der fehlgeschlagenen gemeldeten Fehler OpenProcess Versuche sind Access Denied. Laut MSDN-Dokumentation von OpenProcess:

Wenn der Aufrufer das Privileg SeDebugPrivilege aktiviert hat, wird der angeforderte Zugriff unabhängig vom Inhalt der Sicherheitsbeschreibung gewährt.

Dies führt mich zu der Annahme, dass es unter diesen Bedingungen vielleicht ein Problem gibt, entweder mit (1) Erhalten SeDebugPrivileges oder (2) Erfordern anderer Berechtigungen, die in keiner MSDN-Dokumentation erwähnt wurden und die sich zwischen einem Domänenadministratorkonto und einem lokalen Administratorkonto unterscheiden können

Beispielcode:

void sample()
{
   /////////////////////////////////////////////////////////
   //   Note: Enabling SeDebugPrivilege adapted from sample
   //     MSDN @ http://msdn.microsoft.com/en-us/library/aa446619%28VS.85%29.aspx
   // Enable SeDebugPrivilege
   HANDLE hToken = NULL;
   TOKEN_PRIVILEGES tokenPriv;
   LUID luidDebug;
   if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken) != FALSE)
   {
      if(LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luidDebug) != FALSE)
      {
         tokenPriv.PrivilegeCount           = 1;
         tokenPriv.Privileges[0].Luid       = luidDebug;
         tokenPriv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
         if(AdjustTokenPrivileges(hToken, FALSE, &tokenPriv, 0, NULL, NULL) != FALSE)
         {
            // Always successful, even in the cases which lead to OpenProcess failure
            cout << "SUCCESSFULLY CHANGED TOKEN PRIVILEGES" << endl;
         }
         else
         {
            cout << "FAILED TO CHANGE TOKEN PRIVILEGES, CODE: " << GetLastError() << endl;
         }
      }
   }
   CloseHandle(hToken);
   // Enable SeDebugPrivilege
   /////////////////////////////////////////////////////////

   vector<DWORD> pidList = getPIDs();  // Method that simply enumerates all current process IDs

   /////////////////////////////////////////////////////////
   // Attempt to open processes
   for(int i = 0; i < pidList.size(); ++i)
   {
      HANDLE hProcess = NULL;
      hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pidList[i]);
      if(hProcess == NULL)
      {
         // Error is occurring here under the given conditions
         cout << "Error opening process PID(" << pidList[i] << "): " << GetLastError() << endl;
      }
      CloseHandle(hProcess);
   }
   // Attempt to open processes
   /////////////////////////////////////////////////////////
}

Danke!

Wenn jemand einen Einblick in die möglichen Berechtigungen, Privilegien, Rechte usw. hat, die mir möglicherweise fehlen, um einen anderen Prozess korrekt zu öffnen (vorausgesetzt, die ausführbare Datei wurde ordnungsgemäß mit “Als Administrator ausführen” ausgeführt) unter Windows Vista und Windows 7 unter den oben genannten Bedingungen , wäre sehr dankbar.

Ich wäre nicht hier, wenn ich nicht völlig ratlos wäre, aber ich hoffe, dass die Erfahrung und das Wissen der Gruppe noch einmal hell erstrahlen. Ich danke Ihnen, dass Sie sich die Zeit genommen haben, diese Textwand zu lesen. Allein die guten Absichten werden geschätzt, danke, dass Sie die Art von Person sind, die Stack Overflow für alle so nützlich macht!

  • Okay jetzt das ist eine Frage.

    – CMircea

    28. Mai ’10 um 21:01


  • Wenn Sie nur aus dem Prozessspeicher lesen möchten, können Sie wahrscheinlich nach einem bestimmten Recht fragen und nicht nur nach PROCESS_ALL_ACCESS (ich weiß, dass dies nicht der Sinn der Frage ist)

    – Anders

    29. Mai ’10 um 19:55

  • @Anders Laut MSDN, OpenProcess sollte unabhängig vom angeforderten Zugriff funktionieren, wenn der Basisprozess SeDebugPrivilege aktiviert. Um dies auf den notwendigen Zugriff zu reduzieren PROCESS_VM_READ würde noch brauchen SeDebugPrivilege funktionieren, daher bin ich mir nicht sicher, ob das Ergebnis anders ausfallen würde (es sei denn, die MSDN-Dokumentation ist falsch, was nicht unmöglich ist).

    – KevenK

    29. Mai ’10 um 20:50

  • Welche Prozesse können Sie nicht öffnen? Viele Sicherheitssoftware verwenden Kernel-Modus-Hooks, um den Zugriff auf ihre Prozesse zu blockieren. Wenn das nicht der Fall ist, ist vielleicht etwas mit den SIDs in den Token der Problemprozesse herum. Sie müssen Process Explorer auf einem problematischen Computer ausführen, um einige Antworten zu erhalten.

    – Lukas

    29. Mai ’10 um 22:47

  • Ist AdjustTokenPrivileges erfolgreich? Wenn dies der Fall ist, müssen Sie GetLastError immer noch untersuchen, da es ERROR_NOT_ALL_ASSIGNED zurückgeben kann. In diesem Fall ist SeDebugPrivilege aus irgendeinem Grund nicht im Prozesstoken vorhanden. Machen Sie in diesem Code einen Identitätswechsel? Stellen Sie sicher, dass der Gruppe Administratoren die Debug-Berechtigung in der lokalen Sicherheitsrichtlinie erteilt wird (dies ist die Standardeinstellung).

    – Lukas

    30. Mai ’10 um 1:11

Windows VistaWindows 7 Privileg SeDebugPrivilege OpenProcess
KevenK

Nachdem ich viele Fehler behoben und viele Leute mit Informationen belästigt hatte, konnte ich endlich den Typen ausfindig machen, der das geschrieben hat RunWithDebugEnabled Anwendung und erhalten Sie einen Überblick über die Funktionsweise.

Das Problem ist in diesem Fall, dass Debug programs Die Berechtigung in der lokalen Richtlinie für den Domänenadministrator wurde entfernt und damit die SeDebugPrivilege Token war im Zugriffstoken des Prozesses nicht vorhanden. Es kann nicht aktiviert werden, wenn es überhaupt nicht vorhanden ist, und ich kenne immer noch keine Möglichkeit, die Berechtigung einem vorhandenen Zugriffstoken hinzuzufügen.

So funktioniert die aktuelle Magie:

Also die RunWithDebugEnabled Die magische Anwendung würde ihre Administratorrechte verwenden, um sich als Dienst zu installieren und sich selbst zu starten, und läuft somit unter dem SYSTEM Benutzerkonto statt des Domänenadministrators. Mit SYSTEM Berechtigungen erstellt die App dann ein neues Zugriffstoken, das mit dem Administrator-Token identisch ist, nur mit dem SeDebugPrivilege Zeichen vorhanden. Dieses neue Token wird verwendet, um CreateProcessAsUser() und führen Sie das Programm mit dem neu aktivierten aus SeDebugPrivilege das fehlte vorher.

Ich mag diese “Lösung” hier eigentlich nicht und habe meine Suche nach einem “saubereren” Weg fortgesetzt, um dieses Privileg zu erhalten. Ich werde dies als eine weitere Frage hier auf SO posten, die ich versuchen werde, auch hier zu verlinken, um anderen zu helfen, mitzumachen und für zukünftige Referenzen.

BEARBEITEN: Imitieren Sie SYSTEM (oder gleichwertig) vom Administratorkonto

Ich danke Ihnen allen für Ihre Zeit und Energie bei der Hilfe bei der Fehlersuche und Lösung dieses Problems. Es wird wirklich sehr geschätzt!

  • Sie sagten, Sie wissen nicht, wie man die Berechtigung einem vorhandenen Token hinzufügt: Ist das nicht? Token-Privilegien anpassen soll das machen? Dies funktioniert natürlich nur, wenn das Privileg aktiviert ist und das vorhandene Token es einfach nicht hat.

    – Roman Starkov

    23. Feb. ’11 um 20:39 Uhr

  • @romkyns: AdjustTokenPrivileges, erlaubt meines Wissens nur das Aktivieren, Deaktivieren oder Entfernen der Berechtigung von einem Zugriffstoken. Wenn jedoch das Privileg selbst vollständig fehlt (oder entfernt wurde) aus dem Zugriffstoken, AdjustTokenPrivileges kann die fehlende Berechtigung nicht hinzufügen.

    – KevenK

    24. Februar ’11 um 5:26

  • Können Sie mir eine Kopie von RunWithDebugEnabled schicken? Ist die Quelle verfügbar? Das klingt wirklich cool und würde mir etwas Zeit sparen.

    – Schleife

    4. Mai ’12 um 0:30

  • Wahrscheinlich ist mein Problem das gleiche wie Ihres. Obwohl ich eingestellt habe SeDebugPrivilege und verwenden PROCESS_ALL_ACCESS richtig, ich bekomme immer Access is denied. Fehler beim Lesen des Speichers einer Anwendung wird als Administrator ausgeführt. Ich kenne mich mit dem was du sagst nicht aus. Was ist RunWithDebugEnabled Anwendung? Ich habe es durchsucht und nichts gefunden. Ich stimme @test zu. Könntest du es bitte mit uns teilen?

    – Ahmet DAL

    11. Januar ’15 um 0:30

  • Mir ist klar, dass ich zu spät zu dieser Party komme. Wenn Sie nach einem ungefähren Äquivalent zu RunWithDebugEnabled suchen, den neuen Prozess jedoch als Kindprozess des ursprünglichen Prozesses starten möchten (dh nicht als Kind eines Systemdienstes), gibt es jetzt eine Möglichkeit, dies zu tun: github.com/cubiclesoft/createprocess-windows

    – CubicleSoft

    15. Mai ’21 um 3:11

.

255730cookie-checkWindows Vista/Windows 7-Privileg: SeDebugPrivilege & OpenProcess

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy