Script qui installe [strike]une backdoor[/strike] une clef SSH et un pont autossh sur la machine.
À n’utiliser que pour la maintenance ! Ce genre de pont serait très facilement repérable, de toute façon. Je l’utilise pour mes amis chez qui j’installe des linuxboxes.
[code]#!/bin/sh
SM (SSH Maintenance) v 1.0
Script d’installation d’une clef ssh
Configuration pour créer un pont ssh (-R) automatiquement
afin de permettre un accès root sur la machine cible.
VERSION=1.0
Define your own default vars
DEFAULT_HOST=mon-hote-par-defaut.com
DEFAULT_USER=user-maintenance # Mon user par défaut
DEFAULT_PORT=65500 # Ce que vous voulez
Error codes
SSH_ERROR=10
BAD_PARAMS=11
print_title()
{
sleep 0.5
echo “\033[1;31m* $1\033[0m”
}
usage()
{
cat <<_USAGE
Usage : basename $0
[-i]
-h Afficher cette aide.
-t, --test-only
Teste uniquement les connexions et affiche les comman-
des à effectuer pour la mise en place d’un tunnel
SSH.
-i, --install
Installation. Modification de ~/.ssh/config en local,
de ~/.ssh/authorized_keys sur le serveur distnat, et
ajout du script init.
_USAGE
}
get_info()
{
print_title “Installation d’un pont SSH vers un serveur distant”
echo -n "Hôte cible ($DEFAULT_HOST) : "
read HOST
[ -z "$HOST" ] && HOST=$DEFAULT_HOST
echo -n "Utilisateur ($DEFAULT_USER) : "
read USER
[ -z "$USER" ] && USER=$DEFAULT_USER
echo -n "Commentaire (Défaut : 'hostname') : "
read COMMENT
[ -z "$COMMENT" ] && COMMENT=`hostname`
echo -n "Port à ouvrir sur l'hôte distant ($DEFAULT_PORT) : "
read REMOTE_PORT
[ -z "$REMOTE_PORT" ] && REMOTE_PORT=$DEFAULT_PORT
}
gen_key()
{
print_title “Création de la clef SSH"
ssh-keygen -t rsa -q -C “$COMMENT - port ouvert : $REMOTE_PORT” -f rsa_id
KEY=”$USER_$HOST.key"
PUBKEY="$KEY.pub"
mv -v rsa_id ~/.ssh/$KEY
mv -v rsa_id.pub ~/.ssh/$PUBKEY
}
configure_localhost()
{
print_title "Configuration de la machine locale"
if [ -z $BOOL_INSTALL ]; then
{
echo -n "Configuration automatique de $HOME/.ssh/config (o/N) ? "
read BOOL
}
else
{
BOOL=Y
}
fi
if [ "$BOOL" = "Y" -o "$BOOL" = "y" -o "$BOOL" = "O" -o "$BOOL" = "o" ]; then
{
echo "Modification du fichier ~/.ssh/config"
cat >> ~/.ssh/config <<EOF
Host $HOST
Hostname $HOST
Port 22
User $USER
IdentityFile ~/.ssh/$KEY
EOF
}
fi
echo "TODO : rajouter un script ssh -R $REMOTE_PORT:localhost:$HOST $USER@$HOST"
}
install_remote_key()
{
print_title "Installation de la clef sur le serveur distant"
if [ -z $BOOL_INSTALL ]; then
{
echo -n "Se connecter au serveur distant pour copier la clef (o/N) ? "
unset BOOL
read BOOL
}
else
{
BOOL=Y
}
fi
if [ "$BOOL" = "Y" -o "$BOOL" = "y" -o "$BOOL" = "O" -o "$BOOL" = "o" ]; then
{
echo "Clef publique exportée : $(cat ~/.ssh/$PUBKEY)"
echo "ssh $USER@$HOST ..."
ssh $USER@$HOST "echo \"$(cat ~/.ssh/$PUBKEY)\" >> ~/.ssh/authorized_keys"
[ $? -ne 0 ] && print_title "Erreur SSH. Abandon." && exit $SSH_ERROR
echo "... Installation réussie !"
}
fi
}
connection_test()
{
print_title "Test de la connexion : Vous ne devriez pas avoir à taper de mot de passe."
ssh $USER@$HOST “test 1”
[ $? -ne 0 ] && echo "Erreur SSH. Abandon." && exit $SSH_ERROR
echo "Test OK !"
}
test_only()
{
print_title "Simulation."
cat <<SIMULATION
Pour mettre en place le tunnel SSH vers le serveur distant :
- Créer des clefs SSH avec
~$ ssh-keygen -t rsa -q -C “$COMMENT - port ouvert : $REMOTE_PORT” -f rsa_id
- Déplacer les clefs (et les renommer sous un nom parlant, ex. ~/.ssh/$HOST_$USER) vers le répertoire ~/.ssh/
- Ajouter la configuration sur localhost (~/.ssh/config) :
Host $HOST
Hostname $HOST
Port 22
User $USER
IdentityFile ~/.ssh/MA_CLEF_PRIVÉE
- Ajouter la clef publique (~/.ssh/MA_CLEF_PRIVÉE.pub) sur l’hôte distant dans ~/.ssh/authorized_keys
- Tester que le pont fonctionne bien :
~$ ssh -R $REMOTE_PORT:localhost:22 $USER@$HOST
- Ajouter un script de démarrage ou un cron (nécessite autossh) :
~$ screen -dmS autossh autossh -R $REMOTE_PORT:localhost:22 $USER@$HOST
SIMULATION
exit 0;
}
main()
if [ $# -ge “1” ]; then
{
for i in seq 1 $#
; do
{
case $1 in
-i | --install) BOOL_INSTALL=“1”;;
-t | --test-only) DO_NOTHING=“1”;;
-h | --help) usage;;
*) echo “$1 : Mauvais argument”; usage; exit $BAD_PARAMS ;;
esac
shift
}
done
}
fi
sleep 0.5
echo “\033[1;32mSSH Maintenance version $VERSION\033[0m”
Test-only case : tells the user.
[ ! -z $DO_NOTHING ] && echo “Test-only : Mode de simulation seule.”
Get the vars : HOST, USER and COMMENT
get_info
Test only
[ ! -z $DO_NOTHING ] && test_only
Generate the RSA keys to install on localhost and remote host.
gen_key
Configure the local machine to automatically make a bridge.
configure_localhost
Install the RSA key on remote host
install_remote_key
Testing the connection
connection_test
exit 0;[/code]
Vous remarquerez que ce n’est pas fini. En réalité lorsque je dois faire une install’, je télécharge le script depuis le client, je lance l’install’ et à la fin on me dit quoi rajouter, ce que je fais en root pour le screen autossh.