Estoy intentando eliminar todas las contraseñas de usuario predeterminadas en varios servidores con ansible
. En primer lugar, me gustaría mostrar el nombre de cada usuario cuya contraseña actual sea foobar
. ¿Cómo puedo conseguir esto?
Mi primera intención fue obtener el hachís de /etc/shadow
y grep
para él, pero esto no funcionará debido a la salazón.
¿Necesito calcular mis propios hashes para esto y compararlos? ¿O existe un enfoque más rápido y sencillo?
Respuesta1
Existe una herramienta especializada para comprobar la debilidad de las contraseñas:Juan el Destripadordisponible y probablemente empaquetado en todas las versiones comunes de Unix y Linux.
Aquí hay un ejemplo de uso en Debian GNU/Linux 9 (desombrearviene junto conJohn). Se debe tener cierto cuidado al manipular archivos de contraseñas, esto es solo una prueba de concepto. Tenga en cuenta que elJohnEl comando podría ejecutarse de forma remota (y, por lo tanto, no instalarse en ningún otro lugar que no sea un sistema dedicado) siempre que proporcione archivos de contraseña adecuados.
Configuración (incluida la configuración de contraseñaFoobara la cuentaprueba):
# 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
Prueba de contraseñas prohibidas/predeterminadas:
# 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
Resultado:
# john -show /root/workpasswd
test:foobar:1001:1001:,,,:/home/test:/bin/bash
1 password hash cracked, 2 left
Limpiar:
# rm -r /root/workpasswd /root/.john /tmp/wordlist
Respuesta2
¿Puedes intentar iniciar sesión como cada usuario? p.ej
echo "foobar" | su username
Necesitarías temporalmentedesactivar la verificación TTY.
Respuesta3
Aquí hay un pequeño fragmento de C que verifica la contraseña de los usuarios existentes:
Guarde el siguiente fragmento en un archivo llamado: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]);
}
Compile el código anterior usando:
gcc -o checkpass checkpass.c -lcrypt
Ahora desde la línea de comando simplemente ejecute lo siguiente:
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
Quizás sea una posibilidad remota, ¡pero debería funcionar!
Respuesta4
Como no soy partidario de instalar software adicional y no quiero perder el tiempo sudoers
, lo que terminé haciendo fue
sshpass -p foobar ssh -o PreferredAuthentications=keyboard-interactive,password -o PubkeyAuthentication=no user@host
y luego verifique el código de salida en Ansible. Si la contraseña era correcta el código de salida será 0, en caso contrario 5.
Obviamente, esto solo funcionará si se permite la autenticación de contraseña en la configuración de su servidor SSH.