Zaloguj się bez uruchamiania bash_profile lub bashrc

75

Powiedzmy, że ktoś napisał coś na ich temat, .bashrcco uniemożliwia mu (lub jej) zalogowanie się przez ssh(tj. Logowanie ssh kończy się z powodu błędu w pliku). Czy istnieje jakikolwiek sposób, w jaki osoba ta mogłaby się zalogować bez jej wykonania (lub .bashrcponieważ jedna uruchamia drugą), lub w inny sposób usunąć / zmienić nazwę / unieważnić plik?

Załóżmy, że nie masz fizycznego dostępu do komputera, a jest to jedyne konto użytkownika z możliwością ssh.

Dla odniesienia: .bash_profileobejmuje .bashrc:

[[ -f ~/.bashrc ]] && . ~/.bashrc

Edycja: Rzeczy, których próbowałem:

ssh user@host "rm ~/.bashrc"

scp nothing user@host:/RAID/home/tom/.bashrc

ssh user@host  "/bin/bash --norc"

Wszyscy podają błąd:

/RAID/home/tom/.bashrc: line 16: /usr/local/bin/file: No such file or directory
/RAID/home/tom/.bashrc: line 16: exec: /usr/local/bin/file: cannot execute: No such file or directory
Tom Ritter
źródło
4
Twoje polecenie scp nie będzie działać, ponieważ scp odczyta również .bashrc podczas łączenia. Aby uniknąć problemu W przyszłości możesz dodać coś takiego jak [ -z "$PS1" ] && returnna początku ./bashrc. W ten sposób scp przestanie parsować .bashrc po pierwszym wierszu i będziesz mógł go zastąpić w nagłych przypadkach.
dalloliogm

Odpowiedzi:

24

Myślę, że twoje jedyne opcje to:

  • ssh jako inny użytkownik i su na swoim koncie;

  • użyj czegoś takiego jak ftp lub smbclient, jeśli odpowiednie usługi są włączone na hoście;

  • znajdź otwartą lukę w otwartej usłudze sieciowej i wykorzystaj ją :).

  • Poproś administratora o naprawienie problemu.

Larsks
źródło
4
„Załóżmy, że nie masz fizycznego dostępu do komputera, a jest to jedyne konto użytkownika z możliwością ssh.”
Dennis Williamson,
Idę tą drogą. Wyślę rozwiązanie po tym, jak je znajdę. Na szczęście mam kilka możliwości ataku.
Tom Ritter,
1
użyłem Filezilli do SFTP na moim serwerze i to mnie naprawiło. Dzięki bardzo, uratowałeś mnie. Miałem przez przypadek warunek „wyjście 1” w moim .bash_profile, co mnie zaskoczyło.
djangofan,
117

ssh -t username@hostname /bin/sh pracuje dla mnie.

użytkownik60069
źródło
Działa to dobrze - jest proste i zapewnia powłokę, której można użyć do rozwiązania problemu.
MT.
1
Próbuję to zrobić za pomocą aplikacji Secure Shell w Google Chrome ( chrome.google.com/webstore/detail/secure-shell/… ), ale nie mogę znaleźć sposobu / gdzie umieścić argumenty wiersza poleceń. Jakieś wskazówki?
Benj
2
To nie działa dla mnie (choć powinno tak być zgodnie ze stroną podręcznika). Lokalny host działa na Ubuntu 14.04.1 i jest Ubuntu 12.04.5 na zdalnym hoście. Nie mogę zsynchronizować rsync, ponieważ moja powłoka logowania to tcsh, a na zdalnym hoście drukuje śmieci (tcsh: Brak takiego pliku lub katalogu tcsh: Próbuję zacząć od „/ u / levy” - co, jak mi powiedziano, to dlatego, że katalog jest zamontowany przez NSF). Myślałem, że rozwiążę problem, omijając powłokę logowania, ale to nie działa.
Silvio Levy
2
Jeśli twoją domyślną powłoką jest csh / tcsh, zawsze będzie pozyskiwać twoje .cshrc/ .tcshrcnawet dla nieinteraktywnych powłok.
Brian Vandenberg,
Siedzę tutaj, śmiejąc się z mojej własnej głupoty, że doszedłem do tego punktu. Twoje rozwiązanie działało świetnie. Dziękuję bardzo za pomoc
druciarzowi w
36

Miałem ten sam problem i jakoś byłem w stanie go rozwiązać. Użyłem ssh, aby uzyskać dostęp do systemu, i nacisnąłem i przytrzymałem Ctrl + c, jak tylko się zalogowałem. Wtedy ~ / .bashrc nie został odczytany i mogłem go zmodyfikować.

Miyashin
źródło
11
Byłem sceptyczny, ale tak naprawdę działa ...
rmobis
To jest genialne!
user1747134,
Właściwie działa ... dzięki! Inne metody nigdy nie działały dla mnie.
Zzzach ...
na Macu z tylko .bash_profile, to zadziałało dla mnie :)
AnneTheAgile
OMG, myślałem, że przeszukałem cały Internet, a potem postanowiłem spróbować i to jest jedyny sposób, który działa dla mnie! Dzięki!
Jiahao Cai,
21

Użyłem opublikowanego CVE do wykonania polecenia jako root poprzez interfejs sieciowy w zainstalowanym oprogramowaniu do monitorowania sieci. rm /RAID/home/tom/.bashrc

Następnie mogłem się zalogować i svn cofnąć wprowadzone zmiany.

Tom Ritter
źródło
11
To jest jednocześnie niesamowite i nieudane.
MikeyB
1
@TomRitter: Proszę podać ᴄᴠᴇ odniesienie.
user2284570,
1
Było w starej wersji kaktusów, więc chyba, że ​​używasz 8-letniego oprogramowania, nie sądzę, żeby ci to pomogło. A jeśli używasz 8-letniego oprogramowania, nie mogę ci pomóc. ;)
Tom Ritter
15

Musisz a) rozpocząć bash bez sourceani jednego, ~/.bashrcani ~/.bash_profileb) ponieważ taka powłoka nie byłaby pełną powłoką logowania / nie miałaby dołączonego tty , zmusza ssh do dołączenia tty :

ssh -t user@host bash --norc --noprofile
Christian Krause
źródło
3
To działa, ale pamiętaj, że nie pojawi się zwykły monit, tylko pusty ekran. spróbuj lsprzekonać się, że jesteś w :). Zauważ też, że użyje tego dumbterminu, więc dla mnie nano nie działa
Ciprian Tomoiagă,
7

Nie masz szczęścia.

Wszystkie polecenia ssh uruchamiają powłokę logowania. ssh $COMMANDdziała $SHELL -c $COMMAND, scpdziała $SHELL -c /path/to/sftp-server, zwykły sshpo prostu uruchamia twoją powłokę.

Tobu
źródło
3
Dotyczy to również sftp - nawet podsystemy SSH są najwyraźniej wykonywane z poziomu powłoki.
lxgr
Z mojego doświadczenia wynika, że ​​masz rację, nawet jeśli strona podręcznika ssh mówi: „Jeśli podano polecenie, jest ono wykonywane na zdalnym hoście zamiast powłoki logowania”. Jednak plakat był w stanie rozwiązać problem przy użyciu najwyżej ocenianej odpowiedzi (nazwa hosta ssh / bin / sh). Co daje?
Silvio Levy
@Silvio, odpowiedź OP jest taka, że ​​użył exploita niezwiązanego z SSH.
Tobu,
Dobrze. Ktoś zgłosił sukces z najwyżej ocenianą odpowiedzią i pośpiesznie założyłem, że to PO. Chciałbym, żeby to zadziałało - mam podobną sytuację, chociaż to po prostu denerwujące, nie okaleczające. (Zobacz mój komentarz pod najwyżej ocenianą odpowiedzią powyżej.)
Silvio Levy
6

Żadna z powyższych odpowiedzi nie może ominąć powłoki logowania ssh. Możesz przekazać pełny wiersz poleceń, aby uruchomić zdalną powłokę w celu przetworzenia polecenia i ustawienia środowiska pracy dla polecenia. Po to są powłoki i to jest sposób uniksowy. Miałbyś różnego rodzaju problemy ze zgodnością, gdybyś próbował uruchomić coś bez powłoki. Podobnie, próba C-control powinna zrobić to samo, co wywołanie wyjścia, czyli zachowania, którego próbujesz uniknąć. Jeśli bash będzie kontynuował błąd. Dlaczego ludzie ciągle mówią, że strona podręcznika mówi coś innego, trzeba to zacytować, ponieważ na mojej stronie podręcznika nic takiego nie ma.

Dodatkowo, w większości systemów linuxowych, podanie / bin / sh NIE NIC, ponieważ jest to tylko dowiązanie symboliczne do bash!

Chcesz przetestować? Dodaj instrukcje „echo” do .bashrc i .profile i zobacz, które z nich jest uruchomione. Zrobiłem. Oto wyniki.

ssh user@hostwykona .bash_profile ssh user@host /bin/bashwykona .bashrc, ale uważa, że ​​jest nieinteraktywny (bez pytania). ssh -t user@host /bin/bashwykonuje .bashrc dwa razy ... raz przy logowaniu, raz dla przekazanej komendy, więc określenie KAŻDEJ powłoki zawsze uruchamia pierwszą. ssh -T user@hostjest tym samym, co brak podania -T lub -t w ogóle.

Teraz, jeśli zauważysz, MÓJ system nie uruchamia obu plików, tylko jednego lub drugiego. Ale oryginalny plakat ma linię w .bash_profile z uruchomionym .bashrc, więc .bashrc zawsze uruchomi się bez względu na wszystko. Nie powinienem tam umieszczać tej linii! Gdyby ta linia nie istniała, nie miałbyś problemu.

Musisz znaleźć inną drogę lub administratora. Po to są administratorzy.

Evan Langlois
źródło
Kilka dobrych punktów; nie wykonywalny przekazywane jako polecenie może pomóc, jak to wyjaśnić, ale na nieco punkt sporny: jeśli /bin/sh nie dostać się do wykonania po pierwsze, by pomóc, ponieważ atakujących nie ładować ~/.bashrcprzy wywołaniu jako sh. Ta odpowiedź jest nadzbiorem twojej drugiej odpowiedzi, więc usuń drugą.
mklement
3

Coś jak:

ssh host "/bin/bash --norc"

co wydaje się działać, ale zauważ, że PS1 nie jest ustawiony, więc będziesz pisać polecenia bez monitu.

Ma to tę zaletę, że jest nieniszczące.

Dennis Williamson
źródło
1
To nie działa, najpierw próbował udanego logowania, ale nie może się zalogować, a zatem nie może uruchomić bash --norc
Tom Ritter
2

próbować

echo ^C | ssh <hostname> ' rm .bashrc'

^ C jest control-v, a następnie c

użytkownik161180
źródło
1
W moim systemie jest ctrl-v i ctrl-c. W każdym razie dzięki! :)
mzuther
2
ssh -t user@host "bash --norc --noprofile -c '/bin/rm .bashrc'"
wytten
źródło
To działało dla mnie w bardzo ograniczonym środowisku, kiedy nic nie działało. Musiałem podać pełną ścieżkę do .bashrc.
zbeekman
1

Mashing Ctrl-C działa tak długo, jak długo możesz dostać Ctrl-C przed wyjściem .bashrc. Niestety może to być trudne, jeśli exitjest wczesne .bashrc.

Możesz wstawić ctrl-C tak szybko, jak to możliwe, przesyłając bezpośrednio do ssh:

{ echo ^C; cat /dev/tty; } | ssh -tt user@host

Zauważ, że ^Cjest napisane jak ctrl-V, a następnie ctrl-C.

To potokuje pojedynczy klawisz Ctrl-C, a następnie sygnał wejściowy z terminala sterującego, a jednocześnie -ttwymusza przydzielenie terminalu psuedo. Wszystko to daje ci (nieco zniekształconą) powłokę na zdalnej maszynie, omijając przy tym jak najwięcej .bashrc.

Chris
źródło
0

Możesz spróbować zastąpić .bash_profilepusty plik za pomocą scppolecenia. Z tego, co zalogowałem, scp używa nieinteraktywnego loginu, który nie czyta .bash_profile.

Laurent Etiemble
źródło
Chyba że (hipotetycznie) źle pamiętam strukturę katalogów i nie daje mi to błędu, to nie działa - scp uruchamia również pliki.
Tom Ritter,
1
Ludzie nie zdają sobie sprawy, że scp nie jest niczym specjalnym; jest to po prostu kolejna komenda uruchamiana przez ssh - co oznacza prawie wszystko, co dzieje się podczas interaktywnej sesji ssh, również dzieje się z scp.
larsks,
co z sftp, afaik to podsystem ssh.
allo
0

Możesz także po prostu usunąć plik bashrc:

ssh <hostname> rm ~/.bashrc
sybreon
źródło
Problem leży w pliku .bash_profile, a nie w bashrc.
Laurent Etiemble,
1
To nie działa - najpierw próbuje powłoki i kończy się niepowodzeniem.
Tom Ritter,
0

Jeśli system jest skonfigurowany normalnie, plik .bash_profile nie zostanie uruchomiony dla powłoki nieinteraktywnej (takiej jak uruchomienie polecenia).

Ponieważ stwierdzasz, że problem występuje w pliku .bash_profile, spróbuj usunąć go z drogi:

ssh user@host "mv ~/.bash_profile ~/.bash_profile_broken"
Lockie
źródło
Nie sądziłem, że sposób, w jaki pliki zostały połączone, ma znaczenie - .bash_profile zawiera .bashrc = (Dodałem więcej informacji.
Tom Ritter
1
Ale to, co sugeruje Lockie - co potwierdza strona podręcznika bash - to, że nieinteraktywna powłoka nie uruchomi ani .bashrc, ani .bash_profile. Jednak nawet po przekazaniu poleceń w wierszu poleceń ssh (jak w tym przykładzie) bash jest nadal uruchamiany jako „interaktywna” powłoka, co oznacza, że ​​odczyta plik .bashrc. To dobry pomysł, ale niestety ssh nie będzie współpracować.
larsks
0

UH = „użytkownik @ host”; ssh $ UH 'mv ~ / .bashrc ~ / letmein'; ssh $ UH

Proszę nie wycinać i biegać, zmiana useri host, a następnie edytować letmeini zapisać jako.bashrc

SpiesInOrbit
źródło
0

Uznanie dla użytkownika 60069, zadziałało dla mnie, ale używam specyficznego dla powłoki pliku startowego .bashrc, więc logowanie dla mnie za pomocą / bin / sh zadziałało.

Jeśli jednak znajdujesz się w sytuacji „brak szczęścia”, oferuję to rozwiązanie oparte na rozwiązaniach user60069 i Dennis W:

ssh -t you@host  /bin/bash --noprofile  --norc

Dennis W zaoferował opcję --norc, która, jak ktoś powiedział, nie działała dla nich.

Uruchom „man bash” lub „man (twoja powłoka)”, aby wyświetlić opcje wyłączenia plików startowych. Musisz użyć odrażającej powłoki na czas potrzebny do rozwiązania problemu.

Jim
źródło
0

Innym sposobem zalogowania się na serwer jest bez profilu, znajdź poniżej polecenia
ssh -t user@host bash --noprofile

W przypadku AWS używającego pliku pem i żadnego innego użytkownika
ssh -ti "YOUR-PEM-FILE-NAME.pem" ec2-user@YOUR-IP-ADDRESS bash --noprofile

Mam nadzieję że to pomoże!

Krutarth Shah
źródło
-1

Z sugestii i odpowiedzi podanych powyżej powiedziałbym, że nie są to pliki .bashrc ani .bash_profile. Również ssh manpage mówi, że jeśli podasz polecenie do wykonania, twoje pliki profilu nie zostaną odczytane.

Proponuję spróbować wykonać inną powłokę logowania (ksh? Csh? Sh?) Niż ścieżka bezwzględna; również uważaj, że może to być zupełnie inny problem (quota? wykonać i odczytać uprawnienia do katalogu domowego?), więc podejście boczne byłoby lepsze. Czy możesz poprosić innego użytkownika o wykonanie ls -la $YOUR_HOME_DIRi przesłanie Ci wyniku?

lorenzog
źródło