Dalam hal apa SFTP tidak berdasarkan SSH?

9

Saya baru saja menyelesaikan wargame OverTheWire Bandit, level 18 .

Itu mengejutkan. Berikut adalah instruksi untuk level ini.

Kata sandi untuk tingkat berikutnya disimpan dalam file readme di direktori home. Sayangnya, seseorang telah memodifikasi .bashrc untuk mengeluarkan Anda saat Anda masuk dengan SSH.

Saya sedang memikirkan cara agar shell skip sourcing .bashrc. Tetapi sebelum saya menemukan solusi, saya tergoda untuk hanya memulai koneksi SFTP dengan server. Saya tidak berharap itu berhasil. Tapi itu terjadi. Dan saya ingin tahu mengapa. Saya pikir SFTP melebihi SSH.

Untuk kejelasan, ketika saya SSH ke server, saya dikeluarkan, seperti yang diharapkan.


sumber
1
SFTP tidak menjalankan SSH. bash juga bisa melindas SSH. Tapi SFTP tidak menabrak bash. (perhatikan bahwa saya menggunakan "
lompati

Jawaban:

13

Di pesta secara umum

Desain Bash sehubungan dengan file startup agak aneh. Bash memuat .bashrcdalam dua keadaan yang tidak terkait:

  • Ketika itu adalah shell interaktif, kecuali ketika itu adalah shell login (dan kecuali ketika itu dipanggil sebagai sh). Inilah sebabnya mengapa .bash_profilebiasanya memuat.bashrc .
  • Ketika bash tidak interaktif atau shell login atau dipanggil shtetapi diberi perintah untuk dieksekusi dengan -cdan SHLVLtidak disetel atau kurang atau sama dengan 1, dan salah satu dari berikut ini benar:

    • Jika input standar adalah soket. Dalam praktiknya, ini sebagian besar terjadi ketika bash dipanggil oleh rshd, yaitu ketika berjalan rsh remotehost.example.com somecommand.
    • Jika diaktifkan pada waktu kompilasi (yang merupakan kasus pada beberapa distribusi, seperti Debian dan turunannya), jika salah satu variabel lingkungan SSH_CLIENTatau SSH2_CLIENTdidefinisikan. Dalam praktiknya, ini berarti bahwa bash dipanggil oleh sshd, yaitu ssh remotehost.example.com somecommand.
      Jika Anda tidak tahu bagaimana bash dikompilasi, Anda dapat mengetahui apakah opsi ini disetel dengan memeriksa apakah biner berisi string SSH_CLIENT:

      strings /bin/bash | grep SSH_CLIENT
      

Pada SSH secara umum

Ketika Anda menjalankan perintah melalui protokol SSH, perintah tersebut dilewatkan melalui kawat sebagai string. String dijalankan oleh shell jarak jauh. Ketika Anda menjalankan ssh example.com somecommand, jika shell login pengguna jarak jauh adalah /bin/bash, server SSH berjalan /bin/bash -c somecommand. Tidak ada cara untuk memotong shell login. Ini memungkinkan shell login terbatas, misalnya hanya memperbolehkan penyalinan file dan bukan eksekusi perintah umum.

Ada satu pengecualian: protokol SSH memungkinkan klien untuk meminta subsistem tertentu. Jika klien meminta sftpsubsistem, maka secara default server OpenSSH memanggil program /usr/lib/openssh/sftp-server(lokasi mungkin bervariasi) melalui shell login pengguna. Tetapi juga dapat dikonfigurasi untuk menjalankan server SFTP internal melalui saluran

Subsystem sftp internal-sftp

dalam sshd_configfile. Dalam kasus server SFTP internal, dan hanya dalam kasus ini, shell login pengguna dilewati.

Untuk tantangan ini

Dalam kasus OverTheWire Bandit 18, .bashrcberisi

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

Jadi, Anda dapat menyelesaikan level ini dengan melakukan apa pun yang menyebabkan bash tidak bersifat interaktif.

Ketika Anda menemukan, SFTP berfungsi.
Tetapi ssh [email protected] cat readmejuga akan berhasil.
Seperti yang akan echo 'cat readme' | ssh [email protected].
Dan menekan Ctrl + C pada waktu yang tepat selama login interaktif juga akan berfungsi: itu akan mengganggu bash, jadi .bashrcitu tidak akan sepenuhnya dieksekusi. Bash membutuhkan waktu makroskopis untuk memulai, jadi sementara ini tidak bekerja dengan andal, itu bisa dilakukan dalam praktek.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
2
Saya tidak berpikir SFTP menjalankan bash sama sekali , bukan hanya non-interaktif.
user253751
@ Imibis Saya yakin Anda benar tentang itu. Saya telah menggunakan SFTP untuk bertukar file pada akun pengguna yang dikonfigurasi dengan beberapa aplikasi sebagai shell login daripada shell "nyata".
kasperd
@immibis SFTP tidak menjalankan bash. Tetapi kecuali server SFTP internal, sshdjalankan shell login pengguna yang berjalan sftp-server. Oleh karena itu, jika shell login tidak mengartikan string /usr/lib/openssh/sftp-serversebagai "jalankan perintah /usr/lib/openssh/sftp-server", Anda tidak dapat menggunakan SFTP.
Gilles 'SANGAT berhenti menjadi jahat'
5

The .bashrchanya dijalankan ketika Anda mulai shell.

Server SSH dapat dikonfigurasi untuk tidak memulai shell untuk protokol SFTP dengan memberikan perintah Subsystem internal-sftpdi file server sshd_config.

Dugaan: kemungkinan ini adalah bagaimana wargame OverTheWire Bandit sebenarnya dikonfigurasi daripada penyesuaian .bashrckarena jika tidak, pembatasan yang sama untuk sshjuga akan memblokir sftpperintah server.

roaima
sumber
2
Menjalankan SFTP tidak memulai shell. Daemon SSH berjalan di /path/to/shell -c /path/to/sftp-servermana /path/to/shellshell login pengguna. Jika shell login pengguna adalah bash, maka .bashrcdapat dijalankan tergantung pada bagaimana bash dikompilasi. Itu selalu dieksekusi ketika bash dieksekusi oleh rshd(ya, bahkan untuk shell non-interaktif, startup bash aneh) dan opsi waktu kompilasi memperpanjang ini menjadi sshd.
Gilles 'SANGAT berhenti menjadi jahat'
Saya pergi dan memeriksa. Tebakan bagus, tetapi kenyataannya tidak terlalu halus. The exitdalam .bashrchanya dijalankan jika bash adalah interaktif.
Gilles 'SO- stop being evil'
@Gilles, dengan Subsystem sftp internal-sftpdan echo No.; exit 1di saya, .bashrcsaya tidak mendapatkan sshakses ke server tetapi sftpmasih berfungsi. (Dan tentu saja itu berpotensi untuk menimpa atau menghapus .bashrc. Izin terlepas.) Upaya sshkoneksi gagal baik interaktif atau tidak. Di sisi lain, jika saya miliki Subsystem sftp /usr/lib/openssh/sftp-servermaka layanan SFTP juga gagal ketika .bashrchancur.
roaima
4

sftp menggunakan kredensial yang sama, tetapi tidak menjalankan shell interaktif pada mesin jarak jauh.

Administrator dapat mencegah pengguna sftp dari menjalankan ssh, misalnya, seperti yang dijelaskan dalam Cara membatasi pengguna untuk SFTP saja, bukan SSH

Thomas Dickey
sumber