Category: windows

Accounts auf Windows 7 Loginseite verstecken

15.09.2015 yahe administration legacy security windows

Zur Einschulung meines Neffen habe ich ihm einen aufgearbeiteten Computer geschenkt. Als Sechsjähriger sollte er natürlich nur einen begrenzten Zugriff auf Systemfunktionen (Administration, Softwareinstallation, etc.) haben, was über einen eingeschränkten Account realisiert werden sollte. Gleichzeitig sollte es aber möglich sein, dass er den Rechner einschaltet kann und beim Hochfahren sofort in seinen Account eingeloggt wird. Das wiederum funktioniert nur, wenn es auf der Loginseite nur einen Account gibt, der ohne Passwort angelegt wurde. Also musste eine Lösung her, in einem eingeschränkten Account viel Administration unterbinden zu können und gleichzeitig nur einen Account auf der Windows-Loginseite zu haben.

Mein erster Schritt war, den vorhandenen, aber nicht sichtbaren, Administratoraccount in Windows 7 zu aktivieren. Dazu gebt ihr in das Suchfeld des Startmenüs die Buchstaben "cmd" ein. In der Liste darüber sollte euch die Kommandozeile als Ergebnis angezeigt werden. Macht einen Rechtsklick auf den Eintrag mit der Kommandozeile und führt sie als Administrator aus. In der Kommandozeile gebt ihr dann folgenden Befehl ein:

net user administrator /active:yes

Nun kann man sich als Administrator am System einloggen und ihm zum Beispiel ein Passwort geben. Weiterhin kann man nun den einzuschränkenden Account ordentlich konfigurieren (z.B. die Jugendschutzoptionen aktivieren). Leider hat man nun auf der Windows-Loginseite auch den Administrator-Account, der den automatischen Login verhindert. Um diesen wieder zu verstecken, können wir ein wenig Registry-Magie einsetzen. Wir erstellen uns eine "hide-admin.reg"-Datei mit folgendem Inhalt:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList]
"Administrator"=dword:00000000

Ebenso erstellen wir uns eine "show-admin.reg"-Datei mit diesem Inhalt:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList]
"Administrator"=dword:00000001

Dazu basteln wir uns noch zwei Batch-Dateien. Zuerst die "hide-admin.bat"-Datei:

runas /user:administrator "regedit hide-admin.reg"

Als zweites noch die "show-admin.bat"-Datei:

runas /user:administrator "regedit show-admin.reg"

Wenn wir nun mit dem eingeschränkten Account eingeloggt sind und den Administrator-Account auf der Windows-Loginseite verstecken wollen, rufen wir einfach die "hide-admin.bat"-Datei per Doppelklick auf. In der sich öffnenden Kommandozeile werden wir nach dem Passwort des Administrator-Accounts gefragt, das wir noch mit Enter bestätigen. Anschließend ist der Administrator-Account auf der Windows-Loginseite versteckt und beim Hochfahren loggt sich das System automatisch in den eingeschränkten Account ein.

Sollten wir nun administrative Aufgaben wahrnehmen müssen, rufen wir einfach im eingeschränkten Account die "show-admin.bat"-Datei auf, geben das Administrator-Passwort ein und bestätigen mit Enter. Anschließend können wir den Benutzer wechseln, die administrativen Aufgaben erledigen (z.B. Updates installieren, Software installieren, Konfigurationsänderungen vornehmen, etc.), danach wieder in den eingeschränkten Account wechseln und den Administrator-Account wieder verstecken.


NGINX: Subdomains umschreiben

10.09.2011 yahe administration legacy linux windows

Derzeit bin ich dabei, einfach konfigurierbare Domains nach NGINX umzuziehen. Heute war eine Domain darunter, die 1:1 auf eine andere Domain verweist. Dazu gehören auch die entsprechenden Subdomains. Leider fehlen der Rewrite-Sprache von NGINX hier und da ein paar Fähigkeiten wie verschachtelten IF-Blöcke und logischen Verknüpfungen in IF-Abfragen, um so etwas elegant zu lösen. Aus diesem Grund bin ich nun zu folgender Lösung gekommen, um Domains mitsamt ihrer Subdomains umzuleiten:

server {
  listen      80;
  server_name .example.com;

  set $subdomain "www";
  if ($host ~* "^(.*)\.example\.com$") {
    set $subdomain $1;
  }
  rewrite ^(.*)$ $scheme://$subdomain.example.net$1 break;
}

Der Server-Name mit vorangestelltem Punkt sorgt dafür, dass der Server-Block sich um alle Example.com-Hosts inklusive sämtlicher Subdomains kümmert. Anschließend setzen wir eine Variable "$subdomain" auf den Default-Wert "www". Im Anschluss wird geprüft, ob der Domain eine Subdomain vorangestellt ist. Falls ja, wird die Variable $subdomain auf den Namen dieser Subdomain gesetzt. Abschließend wird ein Redirect durchgeführt und der gespeicherte Subdomain-Wert dabei mit berücksichtigt.


mod_rewrite und die falsche SSL-Sicherheit

10.03.2011 yahe administration legacy linux security windows

Immer wieder kommt es mir unter die Augen: Administratoren, die sich mit der von ihnen betreuten Software nicht auskennen und SSL für eine Anwendung benötigen, die überhaupt nicht für die Verwendung von SSL ausgelegt ist. Häufig wird in solchen Situationen beherzt und völlig ahnungslos auf eine Lösung auf Basis des Apache-Moduls mod_rewrite zurückgegriffen. Solche Lösungen sehen dann meist wie diese aus:

RewriteEngine On 
RewriteCond   %{SERVER_PORT} 80 
RewriteRule   ^(.*)$ https://www.example.com/$1 [R,L]

Was soll schon passieren? Es funktioniert doch wie es soll? Fall erledigt, denkt sich zumindest der unbedarfte Administrator. Diese Aussage sollte er sich allerdings zweimal überlegen, denn sie hat einen gravierenden Fehler: die Software.

Wenn man sich Software wie z.B. WordPress anguckt, dann fällt einem eine Sache auf: Auch für Links, die auf andere Bereiche der gleichen Seite zeigen, werden vollständige URLs generiert - inklusive der Protokollbezeichnung. Das heißt, dass jedes Mal, wenn man einen Link anklickt, eine Anfrage per HTTP an den Server gesendet wird. Dieser sieht, dass er auf HTTPS umlenken soll und tut das dann auch entsprechend.

Umlenken von HTTP auf HTTPS

Doch bei jedem dieser Aufrufe werden bereits alle Informationen unverschlüsselt übertragen, egal, ob Cookies, URL-Parameter, oder Formularinhalte. Es werden lediglich die vom Server verschickten Informationen immer verschlüsselt. Die Daten, die der User versendet, gehen jedes Mal doppelt über die Leitung, einmal unverschlüsselt und einmal verschlüsselt.


RealVNC vs. TightVNC - Wer hat bei wem abgeschrieben?

17.12.2010 yahe administration legacy security windows

Wisst ihr noch? Vor ein paar Tagen habe ich euch erklärt, dass man die Passworte von TightVNC ermitteln kann, wenn man Zugriff auf die Registry hat. Kurz darauf hatte ich euch gezeigt, wie ein entsprechendes Programm hierfür aussehen könnte.

Da ich hier Zuhause RealVNC einsetze, war das natürlich kein Problem. Trotzdem interessierte mich, wie das Problem wohl bei dieser Software gelöst ist. Da es sich jedoch um kommerzielle Software handelt, dachte ich nicht, dass ich darauf eine Antwort kriegen würde, bis ich letztens mal wieder den RealVNC-Viewer herunterladen musste. Da fiehl mir auf, dass ich vor dem Herunterladen der GPL-Lizenz zustimmen musste. Also dachte ich mir: "Hey! Dann müsste ich ja auch den Quelltext bekommen können!". Und tatsächlich steht dieser zum freien Download bereit.

Nach wenigen Sekunden versank ich auch schon im Quelltext. Interesse weckte zuerst die Datei "win\vncconfig\PasswordDialog.cxx", die mich zur "common\rfb\Password.cxx" weiterführte. An dieser Stelle war meine Suche bereits beendet. Und Ernüchterung machte sich breit. Nicht nur, dass RealVNC das Passwort ebenfalls DES-verschlüsselt in der Registry ablegt (im Wert "HKLM\SOFTWARE\RealVNC\WinVNC4\Password"). Für die DES-Verschlüsselung wird auch noch exakt derselbe Schlüssel wie bei TightVNC verwendet! Das letztens vorgestellte Programm funktioniert also auch für RealVNC!

Achja! Und an alle Nutzer von UltraVNC: Auch eure Software nutzt denselben Schlüssel. In der entsprechenden Datei ("rfb\vncauth.c") findet sich sogar noch der originale Copyright-Kommentar von RealVNC!


TightVNC-Passwörter entschlüsseln...

11.12.2010 yahe administration code legacy security windows

Letztens hatte ich euch erklärt, dass es möglich ist, die Passwörter zu entschlüsseln, die das Tool TightVNC in der Registry ablegt. Heute möchte ich euch gerne anhand eines Quelltextes zeigen, wie das gemacht werden kann. Den Ansporn dazu hat mir Hannes Schurig mit seinem neuen Artikel zu TightVNC gegeben. Darin beschreibt er, wie man TightVNC für die Fernwartung mehrerer Rechner nutzen kann, inklusive automatisierter Konfiguration und allem drum und dran.

Leider ist mir bei der ganzen Sache aufgefallen, dass das Problem der Passwortwiederherstellung viel zu stiefmütterlich behandelt wurde. Ja, es wurde gesagt, dass die Wiederherstellung möglich sei. Allerdings wurde auch darauf verwiesen, dass dies nur mit viel Können und Forscherdrang möglich sei. Um diese Aussage zu widerlegen, habe ich nun kurzerhand das Tool "tvncpass" geschrieben, mit dem man die Passwörter verschlüsseln und auch wieder entschlüsseln kann.

#include <stdio.h>
#include <string.h>

#include "VncPassCrypt.h"

const char* HEX_CHARS = "0123456789ABCDEF";

#define APP_NAME     "tvncpass"
#define DECODE_PARAM "--decode"
#define ENCODE_PARAM "--encode"

void hexToDecimal(char* hexText, UINT8* decimalText, int decimalLength) {
    int index;

    if (decimalLength > 0) {
        // reset output
        memset(decimalText, 0, decimalLength);

        if ((strlen(hexText) <= decimalLength * 2) && ((strlen(hexText) % 2) == 0)) {
            // only proceed if string length is small enough
            for (index = 0; index < strlen(hexText); index += 2) {
                decimalText[index/2] = ((strchr(HEX_CHARS, hexText[index]) - HEX_CHARS) * strlen(HEX_CHARS)) + (strchr(HEX_CHARS, hexText[index+1]) - HEX_CHARS);
            }
        }
    }
}

void printHelp() {
    printf("Usage: %s (%s|%s) PASSWORD\n", APP_NAME, DECODE_PARAM, ENCODE_PARAM);
    printf("\n");
    printf("The password has to be provided in hexadecimal form.\n");
    printf("In addition to that the password must not be longer\n");
    printf("than 8 bytes and the hexadecimal representation must\n");
    printf("be in all uppercase.\n");
}

void printHex(UINT8* decimalText, int decimalLength) {
    for (int index = 0; index < decimalLength; index++) {
        if (decimalText[index] < strlen(HEX_CHARS)) {
            printf("0%X", decimalText[index]);
        } else {
            printf("%X", decimalText[index]);
        }
    }
    printf("\n");
}

int main(int argc, char** argv) {
    // define variables
    int   index;
    UINT8 input[8];
    bool  isEncode;
    UINT8 output[8];
    char* password;

    if (argc == 3) {
        isEncode = (strcmp(argv[1], ENCODE_PARAM) == 0);
        if (!isEncode) {
            if (strcmp(argv[1], DECODE_PARAM) != 0) {
                // exit if first param does not match
                printHelp();
                return 1;
            }
        }

        // this is our password
        password = argv[2];
        if ((strlen(password) <= 16) && ((strlen(password) % 2) == 0)) {
            // read password as decimal
            hexToDecimal(password, input, sizeof(input)/sizeof(UINT8));

            // encrypt or decrypt
            if (isEncode) {
                VncPassCrypt::getEncryptedPass(output, input);
            } else {
                VncPassCrypt::getPlainPass(output, input);
            }

            // print result as hex
            printHex(output, sizeof(output)/sizeof(UINT8));
        } else {
            // the password must not be longer than 8 bytes
            printHelp();
            return 1;
        }
    } else {
        // exit if wrong number of params
        printHelp();
        return 1;
    }

    return 0;
}

Da der Quelltext ziemlich quick-and-dirty geschrieben wurde, gibt es dieses Mal keine kompilierte Version des ganzen. Wenn ihr das Tool also selbst kompiliert haben solltet, könnt ihr es wie folgt aufrufen:

tvncpass (--decode|--encode) PASSWORD

Wenn ihr den "--decode" Modus nutzt, könnt ihr das Passwort entschlüsseln, wenn ihr den "--encode" Modus nutzt, könnt ihr es verschlüsseln. Das Passwort selbst muss dabei in Hexadezimalform und in Großbuchstaben übergeben werden und es darf nicht länger als 16 Zeichen lang sein. Um also z.B. das Passwort "test" zu verschlüsseln, muss es als "74657374" an das Programm übergeben werden:

tvncpass --encode 74657374

Um daraus nun wieder das ursprüngliche Passwort zu erhalten, müsst ihr das Ergebnis der ersten Operation an das Programm übergeben:

tvncpass --decode 2F981DC548E09EC2

Search

Links

RSS feed

Categories

administration (40)
arduino (12)
calcpw (2)
code (33)
hardware (16)
java (2)
legacy (113)
linux (27)
publicity (6)
review (2)
security (58)
thoughts (21)
windows (17)
wordpress (19)