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.
Odpowiedzi:
Ogólnie o bashu
Projekt Bash w odniesieniu do plików startowych jest dość osobliwy. Obciążenia bash
.bashrc
w dwóch niepowiązanych okolicznościach:sh
). Dlatego.bash_profile
zwykle ładuje.bashrc
.Gdy bash nie jest interaktywny ani nie jest powłoką logowania ani nie jest wywoływany, ponieważ
sh
otrzymał polecenie wykonania z-c
iSHLVL
jest nieustawiony lub mniejszy lub równy 1, i spełniony jest jeden z poniższych warunków:rshd
, tj. Podczas działaniarsh 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_CLIENT
lubSSH2_CLIENT
jest zdefiniowana. W praktyce oznacza to, że bash jest wywoływany przezsshd
, tjssh 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
: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
sftp
podsystemu, 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ęw
sshd_config
pliku. 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
.bashrc
zawieraMożesz więc rozwiązać ten poziom, robiąc wszystko, co powoduje, że bash nie jest interaktywny.
źródło
sshd
uruchamia powłokę logowania użytkownika, która działasftp-server
. Dlatego jeśli powłoka logowania nie interpretuje ciągu/usr/lib/openssh/sftp-server
jako „uruchom polecenie/usr/lib/openssh/sftp-server
”, nie możesz użyć SFTP..bashrc
Jest 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-sftp
wsshd_config
pliku serwera .Przypuszczenie: prawdopodobnie tak właśnie jest skonfigurowana gra wojenna OverTheWire Bandit, a nie dostosowanie,
.bashrc
ponieważ w przeciwnym razie to samo ograniczeniessh
zablokowałoby równieżsftp
polecenie serwera.źródło
/path/to/shell -c /path/to/sftp-server
tam, gdzie/path/to/shell
jest powłoka logowania użytkownika. Jeśli powłoka logowania użytkownika to bash,.bashrc
może zostać wykonana w zależności od sposobu kompilacji bash. Jest on zawsze wykonywany, gdy wykonywany jest bashrshd
(tak, nawet dla powłoki nieinteraktywnej, uruchomienie bash jest dziwne), a opcja kompilacji rozszerza to nasshd
.exit
W.bashrc
jest wykonywana tylko wtedy, gdy bash jest interaktywny.Subsystem sftp internal-sftp
iecho No.; exit 1
w moim.bashrc
otrzymuję żadnegossh
dostępu do serwera, alesftp
nadal działa. (I wtedy oczywiście możliwe jest zastąpienie lub usunięcie.bashrc
uprawnień. Niezależnie od tego.)ssh
Pró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-server
to usługa SFTP również zawiedzie, gdy.bashrc
jest zniekształcona.sftp używa tych samych danych logowania, ale nie uruchamia interaktywnej powłoki na zdalnym komputerze.
Administrator może uniemożliwić użytkownikowi sftp uruchomienie ssh, np. Zgodnie z opisem w Ograniczanie użytkowników tylko do SFTP zamiast SSH
źródło