Je viens de terminer le jeu de guerre OverTheWire Bandit, niveau 18 .
Ce fut une surprise. Voici les instructions pour ce niveau.
Le mot de passe pour le niveau suivant est stocké dans un fichier lisez -moi dans le répertoire principal. Malheureusement, quelqu'un a modifié .bashrc pour vous déconnecter lorsque vous vous connectez avec SSH.
Je réfléchissais à un moyen de faire en sorte que le shell saute l'approvisionnement .bashrc
. Mais avant de trouver une solution, j'ai été tenté de simplement démarrer une connexion SFTP avec le serveur. Je ne m'attendais pas à ce que ça marche. Mais ça l'a fait. Et j'aimerais savoir pourquoi. Je pensais que SFTP fonctionne sur SSH.
Pour plus de clarté, lorsque je SSH sur le serveur, je suis expulsé, comme prévu.
Réponses:
Sur bash en général
La conception de Bash en ce qui concerne les fichiers de démarrage est plutôt particulière. Bash charges
.bashrc
dans deux circonstances indépendantes:sh
). C'est pourquoi.bash_profile
se charge généralement.bashrc
.Lorsque bash n'est pas interactif ni un shell de connexion ni invoqué en tant que
sh
mais donné une commande à exécuter avec-c
etSHLVL
est non défini ou inférieur ou égal à 1, et l'une des conditions suivantes est vraie:rshd
, c'est-à-dire lors de l'exécutionrsh remotehost.example.com somecommand
.Si activé au moment de la compilation (ce qui est le cas sur certaines distributions, telles que Debian et dérivés), si l'une des variables d'environnement
SSH_CLIENT
ouSSH2_CLIENT
est définie. En pratique, cela signifie que bash est invoqué parsshd
, c'est-à-diressh remotehost.example.com somecommand
.Si vous ne savez pas comment bash a été compilé, vous pouvez savoir si cette option a été définie en vérifiant si le binaire contient la chaîne
SSH_CLIENT
:Sur SSH en général
Lorsque vous exécutez une commande via le protocole SSH, la commande est transmise sur le câble sous forme de chaîne. La chaîne est exécutée par le shell distant. Lorsque vous exécutez
ssh example.com somecommand
, si le shell de connexion de l'utilisateur distant est/bin/bash
, le serveur SSH s'exécute/bin/bash -c somecommand
. Il n'y a aucun moyen de contourner le shell de connexion. Cela permet des shells de connexion restreints, par exemple pour autoriser uniquement la copie de fichiers et non l'exécution générale de commandes.Il existe une exception: le protocole SSH permet au client de demander un sous-système spécifique. Si le client demande le
sftp
sous - système, par défaut, le serveur OpenSSH invoque le programme/usr/lib/openssh/sftp-server
(l'emplacement peut varier) via le shell de connexion de l'utilisateur. Mais il peut également être configuré pour exécuter un serveur SFTP interne via la lignedans le
sshd_config
fichier. Dans le cas du serveur SFTP interne, et seulement dans ce cas, le shell de connexion de l'utilisateur est contourné.Pour ce défi
Dans le cas d'OverTheWire Bandit 18,
.bashrc
contientVous pouvez donc résoudre ce niveau en faisant tout ce qui empêche bash d'être interactif.
la source
sshd
exécute le shell de connexion de l'utilisateur qui s'exécutesftp-server
. Par conséquent, si le shell de connexion n'interprète pas la chaîne/usr/lib/openssh/sftp-server
comme «exécutez la commande/usr/lib/openssh/sftp-server
», vous ne pouvez pas utiliser SFTP.Le
.bashrc
n'est exécuté que lorsque vous démarrez un shell.Le serveur SSH peut être configuré pour ne pas démarrer un shell pour le protocole SFTP en fournissant la commande
Subsystem internal-sftp
dans lesshd_config
fichier du serveur .Conjecture: il est probable que c'est ainsi que le wargame OverTheWire Bandit est réellement configuré plutôt qu'un ajustement
.bashrc
car sinon la même restriction pourssh
bloquerait également lasftp
commande du serveur.la source
/path/to/shell -c /path/to/sftp-server
où se/path/to/shell
trouve le shell de connexion de l'utilisateur. Si le shell de connexion de l'utilisateur est bash, il.bashrc
peut être exécuté selon la façon dont bash a été compilé. Il est toujours exécuté lorsque bash est exécuté parrshd
(oui, même pour un shell non interactif, le démarrage de bash est bizarre) et une option de compilation étend cela àsshd
.exit
en.bashrc
est exécutée seulement si bash est interactif.Subsystem sftp internal-sftp
etecho No.; exit 1
dans mon.bashrc
je n'ai passsh
accès au serveur mais çasftp
marche toujours. (Et bien sûr, il est potentiellement possible d'écraser ou de supprimer les.bashrc
autorisations. Nonobstant.) Lassh
tentative de connexion échoue, qu'elle soit interactive ou non. D'un autre côté, si je l'ai,Subsystem sftp /usr/lib/openssh/sftp-server
le service SFTP échoue également lorsqu'il.bashrc
est modifié.sftp utilise les mêmes informations d'identification, mais n'exécute pas de shell interactif sur la machine distante.
Un administrateur peut empêcher un utilisateur sftp d'exécuter ssh, par exemple, comme décrit dans Comment restreindre les utilisateurs à SFTP uniquement au lieu de SSH
la source