Acabei de completar o jogo de guerra OverTheWire Bandit, nível 18 .
Isso foi uma surpresa. Aqui estão as instruções para este nível.
A senha do próximo nível é armazenada em um arquivo leia-me no diretório doméstico. Infelizmente, alguém modificou .bashrc para desconectá-lo quando você faz login com SSH.
Eu estava pensando em uma maneira de fazer o shell pular a fonte .bashrc
. Mas antes de descobrir uma solução, fiquei tentado a simplesmente iniciar uma conexão SFTP com o servidor. Eu não esperava que funcionasse. Mas sim. E eu gostaria de saber o porquê. Eu pensei que o SFTP atropela o SSH.
Para maior clareza, quando eu SSH no servidor, sou expulso, como esperado.
Respostas:
Na festança em geral
O design do Bash em relação aos arquivos de inicialização é bastante peculiar. O Bash é carregado
.bashrc
em duas circunstâncias não relacionadas:sh
). É por isso que.bash_profile
normalmente carrega.bashrc
.Quando o bash não é interativo, nem um shell de login, nem invocado,
sh
mas recebe um comando para executar com-c
eSHLVL
é desabilitado ou menor ou igual a 1, e uma das seguintes opções é verdadeira:rshd
, ou seja, durante a execuçãorsh remotehost.example.com somecommand
.Se ativado em tempo de compilação (que é o caso de algumas distribuições, como Debian e derivativos), se uma das variáveis de ambiente
SSH_CLIENT
ouSSH2_CLIENT
estiver definida. Na prática, isso significa que o bash é invocado porsshd
, iessh remotehost.example.com somecommand
.Se você não souber como o bash foi compilado, poderá descobrir se essa opção foi configurada verificando se o binário contém a sequência
SSH_CLIENT
:No SSH em geral
Quando você executa um comando através do protocolo SSH, o comando é passado pela conexão como uma sequência. A cadeia é executada pelo shell remoto. Quando você executa
ssh example.com somecommand
, se o shell de logon do usuário remoto estiver/bin/bash
, o servidor SSH será executado/bin/bash -c somecommand
. Não há como ignorar o shell de login. Isso permite shells de login restritos, por exemplo, para permitir apenas a cópia de arquivos e não a execução geral de comandos.Há uma exceção: o protocolo SSH permite que o cliente solicite um subsistema específico. Se o cliente solicitar o
sftp
subsistema, por padrão, o servidor OpenSSH chama o programa/usr/lib/openssh/sftp-server
(a localização pode variar) por meio do shell de login do usuário. Mas também pode ser configurado para executar um servidor SFTP interno através da linhano
sshd_config
arquivo No caso do servidor SFTP interno, e somente nesse caso, o shell de logon do usuário é ignorado.Para este desafio
No caso do OverTheWire Bandit 18,
.bashrc
contémAssim, você pode resolver esse nível fazendo qualquer coisa que faça com que o bash não seja interativo.
fonte
sshd
execute o shell de login do usuário que é executadosftp-server
. Portanto, se o shell de login não interpretar a string/usr/lib/openssh/sftp-server
como "execute o comando/usr/lib/openssh/sftp-server
", você não poderá usar o SFTP.O
.bashrc
é executado apenas quando você inicia um shell.O servidor SSH pode ser configurado para não iniciar um shell para o protocolo SFTP, fornecendo o comando
Subsystem internal-sftp
nosshd_config
arquivo do servidor .Conjectura: é provável que seja assim que o jogo de guerra do OverTheWire Bandit esteja realmente configurado, e não um ajuste,
.bashrc
porque, caso contrário, a mesma restrição parassh
também bloquearia osftp
comando do servidor.fonte
/path/to/shell -c /path/to/sftp-server
onde/path/to/shell
está o shell de login do usuário. Se o shell de login do usuário for bash, ele.bashrc
poderá ser executado dependendo de como o bash foi compilado. É sempre executado quando o bash é executado porrshd
(sim, mesmo para um shell não interativo, a inicialização do bash é estranha) e uma opção em tempo de compilação estende isso parasshd
.exit
in.bashrc
só é executado se o bash for interativo.Subsystem sftp internal-sftp
eecho No.; exit 1
no meu.bashrc
eu não tenhossh
acesso ao servidor, massftp
ainda funciona. (E, é claro, é potencialmente possível substituir ou remover as.bashrc
permissões. Não obstante.) Assh
tentativa de conexão falha, seja interativa ou não. Por outro lado, se eu tiverSubsystem sftp /usr/lib/openssh/sftp-server
, o serviço SFTP também falhará quando.bashrc
for mutilado.O sftp usa as mesmas credenciais, mas não executa um shell interativo na máquina remota.
Um administrador pode impedir que um usuário sftp execute ssh, por exemplo, conforme descrito em Como restringir usuários apenas ao SFTP, em vez de SSH
fonte