In che modo l'SFTP non è basato su SSH?


9

Ho appena completato il wargame OverTheWire Bandit, livello 18 .

È stata una sorpresa. Ecco le istruzioni per questo livello.

La password per il livello successivo è memorizzata in un file Leggimi nella directory home. Sfortunatamente, qualcuno ha modificato .bashrc per disconnettersi quando si accede con SSH.

Stavo pensando a un modo per fare in modo che la shell salti l'approvvigionamento .bashrc. Ma prima di scoprire una soluzione, sono stato tentato di avviare semplicemente una connessione SFTP con il server. Non mi aspettavo che funzionasse. Ma lo ha fatto. E vorrei sapere perché. Pensavo che SFTP funzionasse su SSH.

Per chiarezza, quando inserisco SSH nel server, vengo espulso, come previsto.

ssh  sftp 

1
SFTP funziona su SSH. bash può anche funzionare su SSH. Ma SFTP non funziona su bash. (nota che sto usando "run over" liberamente) qui
user253751

Risposte:


13

Su bash in generale

Il design di Bash rispetto ai file di avvio è piuttosto peculiare. I carichi di bash .bashrcin due circostanze non correlate:

  • Quando è una shell interattiva, tranne quando è una shell di login (e tranne quando è invocata come sh). Questo è il motivo per cui in .bash_profilegenere si carica.bashrc .
  • Quando bash non è interattivo né una shell di login né invocato come, shma dato un comando da eseguire con -ced SHLVLè disinserito o inferiore o uguale a 1, e una delle seguenti condizioni è vera:

    • Se lo standard input è un socket. In pratica, ciò accade soprattutto quando viene invocato bash rshd, ovvero durante l'esecuzione rsh remotehost.example.com somecommand.
    • Se attivato in fase di compilazione (come nel caso di alcune distribuzioni, come Debian e derivati), se una delle variabili di ambiente SSH_CLIENTo SSH2_CLIENTè definita. In pratica, ciò significa che bash è invocato da sshd, cioè ssh remotehost.example.com somecommand.
      Se non sai come è stato compilato bash, puoi scoprire se questa opzione è stata impostata controllando se il binario contiene la stringa SSH_CLIENT:

      strings /bin/bash | grep SSH_CLIENT
      

Su SSH in generale

Quando si esegue un comando tramite il protocollo SSH, il comando viene passato sul filo come una stringa. La stringa viene eseguita dalla shell remota. Quando si esegue ssh example.com somecommand, se la shell di accesso dell'utente remoto è /bin/bash, viene eseguito il server SSH /bin/bash -c somecommand. Non è possibile ignorare la shell di accesso. Ciò consente shell di accesso limitate, ad esempio per consentire solo la copia dei file e non l'esecuzione generale dei comandi.

C'è un'eccezione: il protocollo SSH consente al client di richiedere un sottosistema specifico. Se il client richiede il sftpsottosistema, per impostazione predefinita il server OpenSSH richiama il programma /usr/lib/openssh/sftp-server(la posizione può variare) tramite la shell di accesso dell'utente. Ma può anche essere configurato per eseguire un server SFTP interno attraverso la linea

Subsystem sftp internal-sftp

nel sshd_configfile. Nel caso del server SFTP interno e solo in questo caso, la shell di accesso dell'utente viene ignorata.

Per questa sfida

Nel caso di OverTheWire Bandit 18, .bashrccontiene

…
# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac
…
echo 'Byebye !'
exit 0

Quindi puoi risolvere questo livello facendo tutto ciò che impedisce a bash di non essere interattivo.

Come hai scoperto, SFTP funziona.
Ma ssh bandit18@bandit.labs.overthewire.org cat readmefunzionerebbe anche.
Come sarebbe echo 'cat readme' | ssh bandit18@bandit.labs.overthewire.org.
E anche premendo Ctrl + C al momento giusto durante un login interattivo funzionerebbe: interromperebbe bash, quindi .bashrcnon verrebbe eseguito completamente. Bash impiega tempo macroscopico per avviarsi, quindi mentre questo non funziona in modo affidabile, può essere fatto in pratica.


2
Non credo che corre SFTP bash a tutti , non solo non interattiva.
user253751

@immibis Credo che tu abbia ragione a riguardo. Ho usato SFTP per scambiare file su un account utente che è stato configurato con alcune applicazioni come shell di accesso anziché come shell "reale".
Kasperd,

@immibis SFTP non esegue bash. Ma a meno che il server SFTP non sia interno, sshdesegue la shell di accesso dell'utente che viene eseguita sftp-server. Pertanto, se la shell di accesso non interpreta la stringa /usr/lib/openssh/sftp-servercome "esegui il comando /usr/lib/openssh/sftp-server", non è possibile utilizzare SFTP.
Gilles 'SO- smetti di essere malvagio'

5

L' .bashrcviene eseguito solo quando si avvia una shell.

Il server SSH può essere configurato per non avviare una shell per il protocollo SFTP fornendo il comando Subsystem internal-sftpnel sshd_configfile del server .

Congettura: è probabile che sia così configurato il wargame OverTheWire Bandit piuttosto che un adeguamento .bashrcperché altrimenti la stessa restrizione sshbloccherebbe anche il sftpcomando del server.


2
SFTP Esecuzione fa avviare una shell. Il demone SSH viene eseguito /path/to/shell -c /path/to/sftp-serverdove si /path/to/shelltrova la shell di accesso dell'utente. Se la shell di accesso dell'utente è bash, .bashrcpuò essere eseguita in base alla modalità di compilazione di bash. Viene sempre eseguito quando bash viene eseguito da rshd(sì, anche per una shell non interattiva, l'avvio di bash è strano) e un'opzione di compilazione si estende a sshd.
Gilles 'SO- smetti di essere malvagio' il

Sono andato a controllare. Buona supposizione, ma in realtà non è così sottile. L' exitin .bashrcviene eseguito solo se bash è interattiva.
Gilles 'SO- smetti di essere malvagio'

@Gilles, con Subsystem sftp internal-sftpe echo No.; exit 1nel mio non .bashrcho sshaccesso al server ma sftpfunziona ancora. (E poi ovviamente è potenzialmente possibile sovrascrivere o rimuovere le .bashrc. Autorizzazioni nonostante.) Il sshtentativo di connessione fallisce sia interattivo o meno. D'altra parte, se ho Subsystem sftp /usr/lib/openssh/sftp-serverquindi anche il servizio SFTP fallisce quando .bashrcè alterato.
roaima,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.