NT-Password (NT Hash) unter Windows generieren

pedant
Goto Top
Hallo,

es muss doch irgendwie möglich sein ein NT-Password (einen NT-Hash) unter Windows zu erzeugen!?

Es ist doch ein "Windows-Ding":
NT-Password = Windows NT hashed passwords
Quelle: https://freeradius.org/radiusd/man/rlm_pap.txt

Die einzigen Möglichkeiten des Erzeugens, die ich gefunden habe, sind entweder nur online oder unter Linux.
Online: https://tobtu.com/lmntlm.php
Linux: /usr/bin/smbencrypt "geheim"

Ich benötige es, weil ich einen Radiusserver betreiben möchte, der auf einer LinuxVM läuft, sich aber die Zugangsdaten aus einer MySQL-Datenbank seines Windows-Hosts holen soll.
Ich möchte die Eingabe und Pflege der Zugangsdaten, die in der selbstentworfenen MySQL-Datenbank gespeichert werden, unter Windows (per selbstgeschriebenen Webinterface) durchführen.
Weniger aus Sicherheitsgründen, mehr aus Gründen der Diskretion, möchte ich die Kennwörter nicht im Klartext in der Datenbank ablegen.
(Ich möchte nicht sehen können, wer welches Kennwort nutzt.)

Das kompatibelste Hash-Format ist NT-Password (NT-Hash)
Quelle: http://deployingradius.com/documents/protocols/compatibility.html

Was ich Suche ist ein offline Hash-Generator für Windows.
Das kann gerne eine der folgenden Ansätze sein:
- exe
- PowerShell
- php
- MySQL
- JavaScript
- eventuell Sonstiges

Ich habe mir jetzt einen Workaroud geschrieben, der nicht gerade das Ei des Kolumbus ist (bestenfalls sein Linkes).


Workaround

Auf der Linux-VM namens "linuxvm" habe ich Apache 2.4 und php 7.0 installiert.

Im Webroot der Linux-VM habe ich ein php-Skript abgelegt, das ein per Get übergegenes Kennwort mit exex() an das Tool /usr/bin/smbencrypt übergibt.
Die Ausgabe des php-Skripts ist inhaltlich wie eine php-Datei, die lediglich eine Variable zuweist.

Auf dem Windows-Rechner ist ebenfalls Apache und php installiert.
Zusätzlich ist dort das Tool "WGet" vorhanden.
Auf dem Windowsrechner liegt im Web-Ordner ein php-Skript, das ein per Get übergegenes Kennwort mit exex() an das Tool wget.exe übergibt.
WGet ruft damit das php-Script der Linux-VM auf und speichert dessen Ausgabe in eine temporäre php-Datei, die im Skript per include eingebunden und gleich wieder gelöscht wird.

Ab dann steht dem php-Skript auf dem Windowsrechner das gehashte Kennwort in einer Variablen namens "verschluesselt" zur weiteren Verarbeitung zur Verfügung.


php-Skript "nthash.php" auf der Linux-VM
Beim Aufruf per http://linuxvm/nthash.php?kennwort=geheim&modus=php
wird Folgendes generiert:


php-Skript "nthash.php" auf dem Windows-Host

Beim Aufruf per http://windowshost/nthash.php?kennwort=geheim
steht im Skript die Variable "verschluesselt" mit dem NT-Hash als Inhalt, zur Verfügung.
Resultat:
(Kennwort "geheim" wir zu "C2AE1FE6E648846352453E816F2AEB93")

...und schon ist die Aufgabe erledigt.
(Die Eingangs erwähnte Diskretion sollte mich noch dazu veranlassen die Übergaben des Kennworts per Post und nicht per Get auszuführen.)

Mit der Behauptung "Das muss auch einfacher gehen" stehe ich hoffentlich nicht alleine da.

Gruß Frank

Content-Key: 364398

Url: https://administrator.de/contentid/364398

Ausgedruckt am: 18.08.2022 um 22:08 Uhr

Mitglied: wiesi200
Lösung wiesi200 10.02.2018 aktualisiert um 15:03:25 Uhr
Goto Top
Hallo,

hab das jetzt vor ein Paar wochen auch gemacht, für ein Mitarbeiter W-LAN. Nur Liegt das Webfrontend (PHP) auf nem Linux Server.
Ich such's kurz raus und Schick es dir.


Wo ich das gefunden hab, kann ich leider nicht mehr sagen.
Mitglied: 135333
135333 10.02.2018 aktualisiert um 15:33:53 Uhr
Goto Top
Powershell:
Get-MD4Hash

Gruß snap
Mitglied: Pedant
Pedant 10.02.2018 um 16:53:26 Uhr
Goto Top
Hallo wiesi200,

danke für den Code.

Ich habe ihn hier eingesetzt und ausprobiert.
nthash.php
Aufruf: http://windowshost/nthash.php?kennwort=geheim

Hier erhalte ich für "geheim"
31D6CFE0D16AE931B73C59D7E0C089C0
und nicht
C2AE1FE6E648846352453E816F2AEB93

Verwende ich mhash() statt hash() erhalte ich:
Fatal error: Call to undefined function mhash() in D:\www\webroot\test\nthash2.php on line 11
Installiert ist hier: PHP Version 5.2.10


Hallo snap,

danke für den PowerShell-Link.

In Bezug auf PS bin ich noch sehr unbedarft.
Ich habe den dortigen Code in eine Datei kopiert und diese Get-MD4Hash.ps genannt.
Rufe ich sie dann auf:
PS D:\Temp> ./Get-MD4Hash -DataToHash $([Text.Encoding]::Unicode.GetBytes("geheim"))
erhalte ich:

Eine Funktion ist also noch kein Skript.
"Schade" dachte sich da der Ochs' vorm Berg.

Gruß Frank
Mitglied: 135333
Lösung 135333 10.02.2018 aktualisiert um 17:14:17 Uhr
Goto Top
Zitat von @Pedant:
In Bezug auf PS bin ich noch sehr unbedarft.
Ich habe den dortigen Code in eine Datei kopiert und diese Get-MD4Hash.ps genannt.
Rufe ich sie dann auf:
PS D:\Temp> ./Get-MD4Hash -DataToHash $([Text.Encoding]::Unicode.GetBytes("geheim"))
erhalte ich:
Das ist falsch. Die PS1 muss ja erst mal so aufgerufen werden damit die Funktion der aktuellen Powershell-Konsole bekannt ist.

Mach es folgendermaßen, kopiere den u.s. Code in eine PS1 und dann rufst du diese in der Powershell so auf

p.s. mit den Daten aus der Funktion lässt sich auch schnell eine EXE z.B. mit c# schreiben wenn man möchte.
Mitglied: wiesi200
wiesi200 10.02.2018 um 17:16:20 Uhr
Goto Top
Hallo,

ich hab's grad getestet.
Bei mir kommt

Unter Linux mit PHP 7.0.23
Und auch unter Windows PHP 5.6.28
Mitglied: 135333
135333 10.02.2018 aktualisiert um 17:33:59 Uhr
Goto Top
Ich schätze mal das kommt vom unterschiedlichen PHP-Encoding seiner PHP-Umgebung. Er sollte prüfen ob alles auf UTF-8 kodiert vorliegt/eingestellt ist. Oder eben das Input-Encoding mit mb_http_input auslesen und an iconv übergeben.
Mitglied: Pedant
Pedant 10.02.2018 um 17:47:06 Uhr
Goto Top
Hallo snap,

prima, danke.
So funktioniert's.
PS D:\Temp> ./ntcrypt.ps1 geheim
C2AE1FE6E648846352453E816F2AEB93


Hallo wiesi200,

bei mir funktioniert es jetzt auch.
Es war lediglich Schlamperei meinerseits.
Ich hatte den Get-Parameter in $kennwort gespeichert, aber dann unverändert mit $Input gearbeitet.
$Input war dann aber unbelegt und damit wurde dann "Nichts" gehasht.

Hier der korrigierte Code:
nthash.php

Aufruf per http://windowshost/nthash.php?kennwort=geheim
C2AE1FE6E648846352453E816F2AEB93


Euch Beiden recht herzlichen Dank
Gruß Frank