W jaki sposób SFTP nie jest oparty na SSH?

9

Właśnie ukończyłem grę wojenną OverTheWire Bandit, poziom 18 .

To była niespodzianka. Oto instrukcje dla tego poziomu.

Hasło do następnego poziomu jest przechowywane w pliku readme w katalogu głównym. Niestety ktoś zmodyfikował plik .bashrc, aby wylogować Cię podczas logowania za pomocą SSH.

Myślałem o sposobie, by skorupka pomijała pozyskiwanie .bashrc. Ale zanim znalazłem rozwiązanie, miałem ochotę po prostu nawiązać połączenie SFTP z serwerem. Nie spodziewałem się, że to zadziała. Ale tak się stało. I chciałbym wiedzieć dlaczego. Myślałem, że SFTP działa na SSH.

Dla jasności, kiedy SSH do serwera, jestem wyrzucany, zgodnie z oczekiwaniami.


źródło
1
SFTP działa na SSH. bash może również działać przez SSH. Ale SFTP nie działa po bashu. (zauważ, że używam tutaj luźno „przejechania”)
użytkownik253751

Odpowiedzi:

13

Ogólnie o bashu

Projekt Bash w odniesieniu do plików startowych jest dość osobliwy. Obciążenia bash .bashrcw dwóch niepowiązanych okolicznościach:

  • Gdy jest to powłoka interaktywna, z wyjątkiem sytuacji, gdy jest to powłoka logowania (i z wyjątkiem sytuacji, gdy jest wywoływana jako sh). Dlatego .bash_profilezwykle ładuje.bashrc .
  • Gdy bash nie jest interaktywny ani nie jest powłoką logowania ani nie jest wywoływany, ponieważ shotrzymał polecenie wykonania z -ci SHLVLjest nieustawiony lub mniejszy lub równy 1, i spełniony jest jeden z poniższych warunków:

    • Jeśli standardowe wejście jest gniazdem. W praktyce dzieje się tak głównie wtedy, gdy wywoływany jest bash rshd, tj. Podczas działania rsh remotehost.example.com somecommand.
    • Jeśli aktywowany w czasie kompilacji (co ma miejsce w niektórych dystrybucjach, takich jak Debian i pochodne), jeśli jedna ze zmiennych środowiskowych SSH_CLIENTlub SSH2_CLIENTjest zdefiniowana. W praktyce oznacza to, że bash jest wywoływany przez sshd, tj ssh remotehost.example.com somecommand.
      Jeśli nie wiesz, jak skompilowano bash, możesz dowiedzieć się, czy ta opcja została ustawiona, sprawdzając, czy plik binarny zawiera ciąg SSH_CLIENT:

      strings /bin/bash | grep SSH_CLIENT
      

Ogólnie o SSH

Gdy wykonujesz polecenie za pomocą protokołu SSH, polecenie jest przekazywane przez przewód jako ciąg znaków. Ciąg jest wykonywany przez zdalną powłokę. Po uruchomieniu ssh example.com somecommand, jeśli jest to powłoka logowania użytkownika zdalnego /bin/bash, działa serwer SSH /bin/bash -c somecommand. Nie ma możliwości ominięcia powłoki logowania. Pozwala to na ograniczone powłoki logowania, na przykład, aby umożliwić tylko kopiowanie plików, a nie ogólne wykonywanie poleceń.

Jest jeden wyjątek: protokół SSH pozwala klientowi zażądać określonego podsystemu. Jeśli klient zażąda sftppodsystemu, wówczas serwer OpenSSH domyślnie wywołuje program /usr/lib/openssh/sftp-server(lokalizacja może się różnić) za pośrednictwem powłoki logowania użytkownika. Ale można go również skonfigurować do uruchamiania wewnętrznego serwera SFTP przez linię

Subsystem sftp internal-sftp

w sshd_configpliku. W przypadku wewnętrznego serwera SFTP i tylko w tym przypadku powłoka logowania użytkownika jest pomijana.

Do tego wyzwania

W przypadku OverTheWire Bandit 18 .bashrczawiera

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

Możesz więc rozwiązać ten poziom, robiąc wszystko, co powoduje, że bash nie jest interaktywny.

Jak odkryłeś, SFTP działa.
Ale ssh [email protected] cat readmeteż by działało.
Jak można echo 'cat readme' | ssh [email protected].
I naciśnięcie Ctrl + C w odpowiednim czasie podczas interaktywnego logowania również działałoby: przerwałoby bash, więc .bashrcnie zostałoby całkowicie wykonane. Uruchomienie Bash zajmuje czas makroskopowy, więc chociaż nie działa to niezawodnie, można to zrobić w praktyce.

Gilles „SO- przestań być zły”
źródło
2
Nie sądzę, że SFTP w ogóle uruchamia bash , nie tylko nieinteraktywnie.
user253751
@immibis Uważam, że masz rację. Użyłem SFTP do wymiany plików na koncie użytkownika, które zostało skonfigurowane z jakąś aplikacją jako powłoka logowania, a nie „prawdziwa” powłoka.
kasperd
@immibis SFTP nie uruchamia bash. Ale chyba, że ​​serwer SFTP jest wewnętrzny, sshduruchamia powłokę logowania użytkownika, która działa sftp-server. Dlatego jeśli powłoka logowania nie interpretuje ciągu /usr/lib/openssh/sftp-serverjako „uruchom polecenie /usr/lib/openssh/sftp-server”, nie możesz użyć SFTP.
Gilles „SO- przestań być zły”
5

.bashrcJest wykonywany tylko podczas uruchamiania powłoki.

Serwer SSH można skonfigurować tak, aby nie uruchamiał powłoki protokołu SFTP, podając polecenie Subsystem internal-sftpw sshd_configpliku serwera .

Przypuszczenie: prawdopodobnie tak właśnie jest skonfigurowana gra wojenna OverTheWire Bandit, a nie dostosowanie, .bashrcponieważ w przeciwnym razie to samo ograniczenie sshzablokowałoby również sftppolecenie serwera.

roaima
źródło
2
Uruchomienie SFTP nie uruchamia powłoki. Demon SSH działa /path/to/shell -c /path/to/sftp-servertam, gdzie /path/to/shelljest powłoka logowania użytkownika. Jeśli powłoka logowania użytkownika to bash, .bashrcmoże zostać wykonana w zależności od sposobu kompilacji bash. Jest on zawsze wykonywany, gdy wykonywany jest bash rshd(tak, nawet dla powłoki nieinteraktywnej, uruchomienie bash jest dziwne), a opcja kompilacji rozszerza to na sshd.
Gilles „SO- przestań być zły”
Poszedłem i sprawdziłem. Zgaduję, ale w rzeczywistości nie jest tak subtelny. exitW .bashrcjest wykonywana tylko wtedy, gdy bash jest interaktywny.
Gilles „SO- przestań być zły”
@Gilles, z Subsystem sftp internal-sftpi echo No.; exit 1w moim .bashrcotrzymuję żadnego sshdostępu do serwera, ale sftpnadal działa. (I wtedy oczywiście możliwe jest zastąpienie lub usunięcie .bashrcuprawnień. Niezależnie od tego.) sshPróba połączenia kończy się niepowodzeniem, niezależnie od tego, czy jest interaktywna. Z drugiej strony, jeśli tak, Subsystem sftp /usr/lib/openssh/sftp-serverto usługa SFTP również zawiedzie, gdy .bashrcjest zniekształcona.
roaima