¿Hay alguna forma de mediante programación obtener una huella digital de la clave del servidor SSH sin autenticarse ?

Estoy intentando ssh -v user@host false 2>&1 | grep "Server host key", pero esto se cuelga esperando una contraseña si la autenticación basada en claves no está configurada.

Respuesta

Puede hacerlo combinando ssh-keyscan y ssh-keygen:

$ file=$(mktemp) $ ssh-keyscan host > $file 2> /dev/null $ ssh-keygen -l -f $file 521 de:ad:be:ef:de:ad:be:ef:de:ad:be:ef:de:ad:be:ef host (ECDSA) 4096 8b:ad:f0:0d:8b:ad:f0:0d:8b:ad:f0:0d:8b:ad:f0:0d host (RSA) $ rm $file 

(desafortunadamente, el ssh-keyscan host | ssh-keygen -l -f /dev/stdin mucho más simple no funciona)

Comentarios

  • ¿Quizás ssh-keygen -l -f - <(ssh-keyscan host) sí?
  • OpenSSH > = 7.2 ssh-keyscan puede leer desde stdin: ssh-keyscan host | ssh-keygen -lf -
  • Simplemente haga: ssh-keygen -l -f <(ssh-keyscan host)
  • ssh-keygen -l -f - funciona como se esperaba en ssh-keygen 7.2 y superior. Produce algunas líneas de comentarios en STDERR que se pueden filtrar, como se menciona en la respuesta er de Anthony Geoghegan o ssh-keyscan host 2>/dev/null | ssh-keygen -l -f -
  • Las nuevas versiones de openssh (7.2 al menos) mostrarán la huella digital como SHA256 (por ejemplo: 2048 SHA256:gYz11pP/v/SMzUD58jrZ+m1EFC1pvyMxvIrg4PYlvDY) Si lo desea en el formato anterior, proporcione -E md5 y ‘ verá algo como 2048 MD5:0b:f5:49:d2:69:a5:49:2c:d9:45:75:87:4d:a0:7d:33.

Responder

Recientemente tuve que hacer esto yo mismo, así que pensé Agregaría una respuesta que muestre cómo se puede hacer esto (con versiones de OpenSSH 7.2 o más reciente ) en una línea usando la sustitución del proceso:

ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null) 

El siguiente texto explica cómo funcionan estos comandos y destaca algunas de las diferencias de comportamiento entre las versiones más antiguas y más nuevas de las utilidades de OpenSSH.

Obtener claves públicas de host

El comando ssh-keyscan se desarrolló para que los usuarios puedan obtener claves públicas de host sin necesidad de autenticarse en el servidor SSH. Desde su página de manual:

ssh-keyscan es una utilidad para recopilar las claves de host ssh públicas de varios Hospedadores. Fue diseñado para ayudar a construir y verificar ssh_known_hosts archivos.

Tipo de clave

El tipo de clave que se va a obtener se especifica mediante la opción -t.

  • rsa1 (obsoleto Versión 1 del protocolo SSH)
  • rsa
  • dsa
  • ecdsa (versiones recientes de OpenSSH)
  • ed25519 (versiones recientes de OpenSSH)

En las versiones modernas de OpenSSH, los tipos de clave predeterminados que se deben obtener son rsa (desde la versión 5.1), ecdsa (desde la versión 6.0) y ed25519 (desde la versión 6.7).

Con versiones anteriores de ssh-keyscan (antes de OpenSSH versión 5.1), el tipo de clave predeterminado era el rsa1 obsoleto (Protocolo SSH 1), por lo que los tipos de clave deberían especificarse explícitamente:

ssh-keyscan -t rsa,dsa hostname 

Obtener hashes de huellas digitales de claves Base64

ssh-keyscan imprime la clave de host del servidor SSH en Formato codificado en Base64 . Para convertir esto en un hash de huella digital, la utilidad ssh-keygen se puede utilizar con su opción -l para imprimir la huella digital de la clave pública especificada.

Si usa Bash, Zsh (o el shell Korn), sustitución de proceso se puede usar para una práctica frase de una sola línea:

ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null) 

Nota : Con versiones de OpenSSH anteriores a la 7.2, las funciones utilizadas por ssh-keygen para leer archivos, no manejaba las tuberías con nombre (FIFO) muy bien, por lo que este método no funcionaría, lo que requeriría el uso de archivos temporales.

Algoritmos hash

Versiones recientes de ssh-keygen print SHA256 hash de huellas dactilares de las claves. Para obtener MD5 hashes de las huellas digitales de la clave del servidor (el comportamiento anterior), el -E se puede usar para especificar el algoritmo hash:

ssh-keygen -E md5 -lf <(ssh-keyscan hostname 2>/dev/null) 

Usando una canalización

Si usa un shell POSIX (como dash) que no incluye la sustitución de procesos, las otras soluciones que utilizan archivos temporales funcionarán. Sin embargo, con las versiones más recientes de OpenSSH (desde la 7.2), se puede utilizar una canalización simple ya que ssh-keygen aceptará - como nombre de archivo para el flujo de entrada estándar, que permite un comando de canalización de una línea.

ssh-keyscan hostname 2>/dev/null | ssh-keygen -E md5 -lf - 

Comentarios

  • Agradable y completo respuesta, esto es ciertamente mejor que tener un archivo temporal.¿Puedo sugerirle que proporcione un TL; DR al principio con la versión de sustitución del proceso, para que la gente impaciente la encuentre más rápido? 🙂
  • No parece funcionar en Ubuntu 14.04 LTS; Recibo un error » / dev / fd / 63 no es un archivo de clave pública «. El subproceso funciona.
  • @melleb Encontré lo mismo en un sistema 12.04 al que tengo acceso. Sospecho que ssh-keygen de versiones anteriores de OpenSSH tienen problemas para leer desde el canal FIFO / named. ‘ investigaré esto (y actualizaré mi respuesta) cuando tenga tiempo libre.
  • @melleb Después de pasar mi tiempo descargando varias versiones de código fuente e insertando declaraciones de depuración printf en la función do_fingerprint(), encontré que con versiones de OpenSSH anteriores a 7.2, las funciones utilizadas por ssh-keygen para leer archivos, no manejaba las tuberías con nombre (FIFO) muy bien, por lo que el método de sustitución de procesos no funcionaría.
  • Esto funciona, pero si se usa para verificar una huella digital, los usuarios deben saber que existe ‘ una condición de carrera: la huella digital que está verificando con este comando no es ‘ t necesariamente la de la clave que buscar, a menos que vuelques la clave antes de llamar a ssh-keygen.

Responder

nmap proporciona esta capacidad mediante el uso de la secuencia de comandos ssh-hostkey.

Para devolver la huella digital hexadecimal de la clave:

$ nmap [SERVER] --script ssh-hostkey 

Para devolver el contenido de la clave:

$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=full 

Para devolver la burbuja visual de la clave

$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey="visual bubble" 

Para devolver todo lo anterior:

$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=all 

Fuente: nmap docs

Comentarios

  • ¿Estos ejemplos asumen que SSH siempre se está ejecutando en el puerto 22? ¿Qué pasa si ssh escucha en un puerto no estándar?
  • @MartinVegter (parafraseando a Guarin42, que no pudo ‘ t comentario 🙂 nmap tiene la opción -p que puede especificar un puerto, por ejemplo, -p 22000. ‘ s también es posible utilizar la opción -vv para aumentar la verbosidad (cantidad de información proporcionada)
  • Respuesta

    filezilla muestra claves hash con md5 en hexadecimal formato.

    para encontrar esto en su máquina ubuntu linux use este comando:

    ssh-keygen -l -E md5 -f <(ssh-keyscan localhost 2>/dev/null) 

    nota: reemplace «localhost» con la ip de la máquina que desea verificar.

    Comentarios

    • Esto funcionó para mí en Ubuntu 18, pero tenga en cuenta que obtendrá resultados diferentes para localhost 127.0.0.1 o domain.tld. Compruebe la huella digital de la URL que le preocupa ~!

    Respuesta

    Aquí hay un script de shell (principalmente Bourne shell pero usando la palabra clave local, que está disponible en la mayoría de /bin/sh) moderna que he escrito para hacer esto. Úselo como ssh-hostkey hostname. Mostrará las huellas digitales en formato sha256 y md5 para todas las claves de host para el nombre de host o la dirección IP especificados. También puede especificar manualmente «md5 «o» sha256 «como segundo argumento para mostrar solo ese formato en particular.

    Utiliza un archivo temporal en lugar de canalizar para hacerlo compatible con paquetes OpenSSH más antiguos (como se describe en otras respuestas). El archivo temporal usa /dev/shm (memoria compartida) si está disponible.

    #!/bin/sh usage () { printf "%s\n" "Usage: ssh-hostkey HOSTNAME [FPRINTHASH]" } ssh_hostkey () { local host="$1" local fprinthash="$2" local tmp= case "$host" in -h|--help|"") usage >&2 return 1 ;; esac case "$fprinthash" in md5|sha256|"") true;; *) usage >&2 printf "%s\n" "Fingerprint hash may be "md5" or "sha256"" >&2 return 2 ;; esac if test -d /dev/shm then tmp="$(mktemp -d -p /dev/shm)" else tmp="$(mktemp -d)" fi trap "trap - INT TERM EXIT; rm -rf "$tmp"" INT TERM EXIT ssh-keyscan "$host" > "$tmp/f" 2> /dev/null case "$fprinthash" in sha256|"") ssh-keygen -l -f "$tmp/f" 2> /dev/null;; esac case "$fprinthash" in md5|"") ssh-keygen -l -E md5 -f "$tmp/f" 2> /dev/null;; esac trap - INT TERM EXIT rm -rf "$tmp" > /dev/null 2>&1 } ssh_hostkey "$@" 

    Comentarios

    • Esta es una buena demostración de cómo encapsular herramientas de nivel inferior con opciones de línea de comandos. Incluye una ventaja sobre cómo usar memoria compartida /dev/shm que nunca pensé que fuera tan conveniente. ¡Gracias por compartir !

    Responder

    Para mi propio servidor, uso esto:

    ssh-keygen -l -E md5 -f <(cat /etc/ssh/ssh_host_*_key.pub) ssh-keygen -l -E sha256 -f <(cat /etc/ssh/ssh_host_*_key.pub) 

    Responder

    La respuesta simple cuando ya tiene acceso al servidor es:

    ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub 

    Ahora, es posible que no esté usando la clave RSA: si al conectarse, ssh le dice

    ECDSA la huella digital de la clave es SHA256: XXXXX

    En su lugar, debe utilizar /etc/ssh/ssh_host_ecdsa_key.pub. (aviso _ecdsa_ ). De este modo, se puede construir un comando más universal que enumere todas las claves ( fuente ):

    for f in /etc/ssh/ssh_host_*_key.pub; do ssh-keygen -lf "$f"; done 

    Puede escribir la lista cuando configure el servidor, para referencia futura.Otra opción es almacenarlos en registros DNS


    Desde la página de manual de ssh-keygen (1):

    -l Mostrar la huella digital del archivo de clave pública especificado. Para las claves RSA y DSA, ssh-keygen intenta encontrar el archivo de clave pública correspondiente e imprime su huella digital. Si se combina con -v, se proporciona una representación artística ASCII visual de la clave con la huella digital.

    -f filename Especifica el nombre del archivo de clave.

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *