Risposta di cattura Tentativo di connessione ad Open SSH

1

Voglio poter tentare di connettermi a un host utilizzando l'autenticazione della password e memorizzare la risposta del server in una variabile. Questo per vedere quali host nel mio elenco accettano le password per i loro servizi ssh.

Il problema è che non posso reindirizzare questa risposta a una variabile: root @ password ip:

L'obiettivo è catturare "root @ ip's password:" come stringa e memorizzarla in una variabile.

Invece, lo script si blocca sulla password di root @ ip: e si aspetta l'input, impedendo al ciclo di continuare a iterare.

Codice:

#!/bin/bash

usernames=( root admin Administrator '' guest Anonymous )
response=

while read ip; do
    for user in "${usernames[@]}"; do
        response="$(ssh -o StrictHostKeyChecking=no -o PreferredAuthentications=password -o PubkeyAuthentication=no $user@$ip)" 
        printf "The response is $response"
    done
done <ssh_telnet_open_ip_list

Modifica, il codice è stato migliorato e questo è quello che ho ora:

#!/bin/bash
printf "\nProbing SSH services:\n\n"
while read ip; do
    printf "Response from $ip:\n"
    ssh -v root@$ip -o "StrictHostKeyChecking=no" -o "PreferredAuthentications=publickey" -I /dev/null 2>&1 | \
        grep "debug1: Authentications that can continue" | \
        cut -d : -f 3
    echo "------------------------------------------"
done <ssh_telnet_open_ip_list.txt

Esempio di output:

Probing SSH services:

Response from ip:
 publickey,gssapi-with-mic,password
------------------------------------------
Response from ip:
------------------------------------------
Response from ip:
 publickey,password
------------------------------------------
Response from ip:
 publickey,gssapi-with-mic,password
------------------------------------------
Response from ip:
 publickey,gssapi-keyex,gssapi-with-mic,password
------------------------------------------
Response from ip:
 publickey,password

ecc ...

    
posta Fingers 18.11.2018 - 17:30
fonte

2 risposte

1

Il comando

ssh -v user@ip -o "PreferredAuthentications=publickey" -I /dev/null 2>&1 | \
    grep "debug1: Authentications that can continue" | \
    cut -d : -f 3

L'output

publickey,gssapi-keyex,gssapi-with-mic,keyboard-interactive,hostbased

Come funziona

  • Il comando SSH si connette, ma utilizza solo l'autenticazione a chiave pubblica, usando / dev / null come chiave
  • Il comando grep estrae la riga di log con le cipher supportate
  • Il comando cut estrae solo le cipher supportate
  • Poiché la connessione SSH non può essere effettuata senza chiave, si chiude, ritornando immediatamente dal comando

Come interpretare l'output

  • Se vedi keyboard-interactive , è probabile che l'autenticazione della password sia accettata
  • Se vedi publickey , l'autenticazione basata su chiave è accettata
risposta data 18.11.2018 - 19:48
fonte
0

In bash, avrai bisogno di un helper come sshpass per farlo. Puoi vedere questo dettagliato nella risposta di @ CSPei a Passa una password a ssh in puro bash su StackOverflow.

Probabilmente otterresti un'implementazione più pulita usando qualcosa come Paramiko in Python. La chiamata del cliente genererà un'eccezione più concisa per te:

exception paramiko.ssh_exception.BadAuthenticationType(explanation, types)

Exception raised when an authentication type (like password) is used, but the server isn’t allowing that type. (It may only allow public-key, for example.)

    
risposta data 18.11.2018 - 18:09
fonte

Leggi altre domande sui tag