Ich versuche, alle Standardbenutzerkennwörter auf mehreren Servern mit zu entfernen ansible
. Zunächst möchte ich den Namen jedes Benutzers ausgeben, dessen aktuelles Kennwort lautet foobar
. Wie kann ich das erreichen?
Meine erste Absicht bestand darin, den Hash daraus /etc/shadow
und grep
dafür zu erhalten, aber das funktionierte wegen des Saltings nicht.
Muss ich hierfür eigene Hashes berechnen und vergleichen? Oder gibt es einen schnelleren und einfacheren Ansatz?
Antwort1
Es gibt ein spezielles Tool zum Prüfen schwacher Passwörter:John der Ripperverfügbar und wahrscheinlich in allen gängigen Unix- und Linux-Varianten verpackt.
Hier ist ein Anwendungsbeispiel unter Debian GNU/Linux 9 (Schatten aufhebenkommt vorbeiJohn). Beim Bearbeiten von Passwortdateien ist etwas Vorsicht geboten, dies ist nur ein PoC. Beachten Sie, dass dieJohnDer Befehl kann remote ausgeführt werden (und muss daher nur auf einem dedizierten System installiert werden), solange geeignete Kennwortdateien bereitgestellt werden.
Setup (inkl. Passwort setzen)foobarRechnungprüfen):
# echo test:foobar | chpasswd
# grep ^test: /etc/shadow
test:$6$84SIejUB$qM5UulJEIiwjOc4PWXYupWoyU/jMP0rKA8cM1g8CEOgxMlC.x4ndbbdRq438rjKb.6UwCoTqzvgxoi0h51Kpm1:18050:0:99999:7:::
# unshadow /etc/passwd /etc/shadow > /root/workpasswd
# echo foobar > /tmp/wordlist
Test auf verbotene/Standard-Passwörter:
# john -wordlist:/tmp/wordlist /root/workpasswd
Created directory: /root/.john
Loaded 3 password hashes with 3 different salts (crypt, generic crypt(3) [?/64])
Press 'q' or Ctrl-C to abort, almost any other key for status
foobar (test)
1g 0:00:00:00 100% 5.882g/s 5.882p/s 17.64c/s 17.64C/s foobar
Use the "--show" option to display all of the cracked passwords reliably
Session completed
Ergebnis:
# john -show /root/workpasswd
test:foobar:1001:1001:,,,:/home/test:/bin/bash
1 password hash cracked, 2 left
Aufräumen:
# rm -r /root/workpasswd /root/.john /tmp/wordlist
Antwort2
Können Sie versuchen, sich als jeder Benutzer anzumelden? zB
echo "foobar" | su username
Sie müssten vorübergehendDeaktivieren Sie die TTY-Prüfung.
Antwort3
Hier ist ein kleiner C-Ausschnitt, der das Passwort bestehender Benutzer überprüft:
Speichern Sie den folgenden Codeausschnitt in einer Datei mit dem Namen:checkpass.c
#include <pwd.h>
#include <shadow.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <crypt.h>
static int pwcheck (char *user, char *passwd)
{
struct passwd *pw;
struct spwd *spwd;
char *epasswd, *cpasswd;
char *tty;
if ((pw = getpwnam(user)) == NULL) {
return 1;
}
/*
* XXX If no passwd, let them login without one.
*/
if (pw->pw_passwd[0] == '\0') {
return 0;
}
spwd = getspnam(user);
cpasswd = (spwd ? spwd->sp_pwdp : pw->pw_passwd);
epasswd = crypt(passwd, cpasswd);
if (epasswd == NULL) {
return 2;
}
if (strcmp (epasswd, cpasswd)) {
return 1;
}
return 0;
}
int main (int argc, char *argv[])
{
if (argc < 3) return 4;
return pwcheck (argv[1], argv[2]);
}
Kompilieren Sie den obigen Code mit:
gcc -o checkpass checkpass.c -lcrypt
Führen Sie nun in der Befehlszeile einfach Folgendes aus:
while IFS=: read -r user _; do
if ./checkpass "$user" foobar; then
printf 'The ollowing user %s has the password set to foobar\n' "$user";
fi;
done </etc/passwd
Es ist vielleicht ein langer Weg, aber es sollte klappen!
Antwort4
Da ich kein Fan davon bin, zusätzliche Software zu installieren und nicht mit herumspielen möchte sudoers
, habe ich letztendlich Folgendes getan:
sshpass -p foobar ssh -o PreferredAuthentications=keyboard-interactive,password -o PubkeyAuthentication=no user@host
und überprüfen Sie anschließend den Exit-Code in Ansible. Wenn das Passwort korrekt war, ist der Exit-Code 0, andernfalls 5.
Dies funktioniert natürlich nur, wenn in Ihrer SSH-Serverkonfiguration die Kennwortauthentifizierung zugelassen ist.