Kennwort-Hash im Bash-Skript überprüfen?

Kennwort-Hash im Bash-Skript überprüfen?

BezüglichWarum ist das Root-Passwort bei Linux Mint mein Benutzerpasswort?

Es scheint, dass für meine Mint 17.3-Box ein Root-Passwort festgelegt ist: Ich sehe einen Passwort-Hash in /etc/shadow(er beginnt mit $6$...). Ich möchte diesen Passwort-Hash mit meinem (bekannten) Benutzerpasswort vergleichen.

Aus irgendeinem Grund vertraue ich su -(in der verlinkten Frage) nicht darauf,MeinPasswort, im Vergleich zuWurzelPasswort.

Gibt es eine einfache Möglichkeit (z. B. in Bash), einen bekannten Hash mit einem bekannten Passwort zu vergleichen und zu sehen, ob sie übereinstimmen?

Antwort1

Suchen Sie nach dem in verwendeten Salt /etc/shadow. Es sind die Zeichen zwischen dem zweiten und dritten $, normalerweise sind es acht.

Verwenden Sie mkpasswd -m sha-512 -S <salt>und geben Sie das Passwort ein, das Sie für richtig erachten, wenn Sie danach gefragt werden. Es wird der Hash mit $6$<salt>$Präfix ausgegeben.

Antwort2

Am Ende müssen Sie die crypt(3)Funktion libcrypt(die auf GNU-Systemen wie Linux Mint mit der GNU libc geliefert wird) mit dem Passwort als erstem Argument und dem Hash ( $6$...) als zweitem Argument aufrufen.

pythonist ein solches Tool, das diese Funktion bereitstellt, sodass Sie Folgendes tun können:

HASH='$6$...' python2 -c 'import crypt, os, getpass
print(crypt.crypt(getpass.getpass(), os.environ["HASH"]))'

Und wenn die Ausgabe mit dem Hash übereinstimmt, war es das richtige Passwort.

$HASHoben kann entweder der vollständige Hash (wie $6$rounds=1234$somesalt$6eFBNhSgwEwdfZBHueBedpcqaVKGcV2DJy/tQMFd3JL88hwvgTkISJShnOUrbtP1fRs8I9rGIdsgWCoiujxD2/) oder nur der Teil davon bis ganz rechts stehen $, d. h. einschließlich des Salt und der optionalen Rundenanzahl ( $6$rounds=1234$somesalt$).

Oder Sie können die Überprüfung in folgender Weise durchführen python:

HASH='$6$...' python2 -c '
import crypt, os, getpass
hash = os.environ["HASH"]
if crypt.crypt(getpass.getpass(), hash) == hash:
  print "OK"
else:
  print "Wrong password"'

$HASH( muss dann natürlich den vollständigen Hash enthalten).

Mit pythonkönnen Sie mithilfe des ctypesModuls auch Funktionen aus beliebigen Bibliotheken aufrufen. Eine andere Möglichkeit, die Funktion des Systems aufzurufen crypt()(nicht, dass Sie das müssten, da es sich um crypteines der Standardmodule handelt, ich hatte nur vorher den Eindruck, dass das cryptModul mit einer eigenen separaten crypt()Implementierung geliefert wird), ist etwa so:

HASH='$6$...' python2 -c '
from ctypes import *
import os, getpass
l = CDLL("libcrypt.so.1")
l.crypt.restype = c_char_p
print l.crypt(getpass.getpass(), os.environ["HASH"])'

Antwort3

ssh root@localhostfällt mir ein, obwohl Ihre Distribution möglicherweise die kennwortbasierte Anmeldung für Root vollständig deaktiviert und/oder ein Schlüsselpaar installiert hat; oder die Anmeldung auf Ihrem üblichen grafischen Anmeldebildschirm als Benutzer root. (Selbst wenn Sie die automatische Anmeldung aktiviert haben, bietet das Dialogfeld zum Herunterfahren möglicherweise die Anmeldung als anderer Benutzer an.)

verwandte Informationen