Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
unix:rebonds_ssh_avec_expect [2008/07/25 15:08]
monsieurp
unix:rebonds_ssh_avec_expect [2010/01/12 13:29] (current)
Line 1: Line 1:
 +Je n'ai vu ce tips nul part. Pourtant, si je l'​aurais laché sur le chan, je me serais fait lyncher à coup de **VIEUX**, **ANTIQUE**,​ **ANTéDILUVIEN** et consort. (parce que c'est quand même vieux hein, faut se l'​avouer)
  
 +Donc le bouzin, il est à base d'​Expect,​ un language qui permet d'​interagir avec d'​autres programmes. J'​étais tombé sur le tips d'iMil avec netcat, bien mais pas cool si netcat n'est pas installé sur le serveur distant. Puis je voulais faire d'​autres rebonds, et en ne tapant qu'une seule commande.
 +Dans le cas qui nous intéresse, on va interagir avec ssh pour lui envoyer des séquences qu'on aurait du nous même taper au clavier.
 +
 +<​code>​
 +#​!/​usr/​bin/​expect -f
 +# des que la chaine de caractère attendu en retour est matché,
 +# on attend 1 seconde et on envoit notre chaine
 +set timeout 1 
 +# la 1ere commande qui est executée sur notre machine
 +# c'est le 1er saut
 +spawn ssh user@host1
 +# on "​attend"​ du shell qu'il nous renvoit la chaine "​assword"​
 +expect "​*?​assword :"
 +# on envoit notre pw, \r pour retour chariot
 +send -- "​MON_SUPER_PASS_EN_CLAIR\r"​
 +# le prompt
 +expect "​*05b\$ "
 +# 2eme saut
 +send -- "ssh user@host2\r"​
 +expect "​*?​assword :"
 +send -- "​MON_SUPER_PASS_EN_CLAIR\r"​
 +expect "​*05b\$ " ​
 +# 3eme saut
 +send -- "ssh user@host3\r"​
 +expect "​*?​assword :"
 +send -- "​MON_SUPER_PASS_EN_CLAIR\r"​
 +expect "​*05b\$ "
 +# expect nous rend la main 
 +interact ​
 +</​code>​
 +
 +OK, je vous vois venir, ce n'est pas du tout secure car on stocke les mots de passe en clair. Je n'ai pas dit que ça l'​était. Cependant, je m'en sers exclusivement sur MA machine. Donc, c'est un script qu'il ne faut pas laisser trainer de partout, qu'on se le dise.
 +
 +Une variante qui permet de faire la même chose, en spécifiant quelle machine vous souhaitez atteindre. Admettons que vous êtes dans le réseau A et que vous devez vous connecter à une machine du réseau B avant d'​atteindre une machine du réseau C.
 +
 +<​code>​
 +#​!/​usr/​bin/​expect -f
 +set timeout 2
 +set userhost [lrange $argv 0 0]
 +set password [lrange $argv 1 1]
 +# 1er saut
 +spawn ssh user@host1
 +expect "​*?​assword :"
 +send -- "​MON_SUPER_PASS_EN_CLAIR\r"​
 +expect "​*05b\$ "
 +# 2er saut
 +send -- "ssh $userhost\r"​
 +# si ssh nous demande de stocker la clé publique RSA/DSA, on répond oui
 +expect {
 +        "​*authenticity"​ {        ​
 +                send -- "​yes\r" ​
 +        }        ​
 +}
 +expect "​*?​assword :"
 +send -- "​$password\r"​
 +expect "​*05b\$ " ​
 +interact ​
 +</​code>​
 +
 +On enregistre ça dans un fichier qu'on appelle ssh-bound et qu'on chmod +x. 
 +La commande s'​utilise de la manière suivante: ssh-bound user@host password