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.
Jawaban:
Di pesta secara umum
Desain Bash sehubungan dengan file startup agak aneh. Bash memuat
.bashrc
dalam dua keadaan yang tidak terkait:sh
). Inilah sebabnya mengapa.bash_profile
biasanya memuat.bashrc
.Ketika bash tidak interaktif atau shell login atau dipanggil
sh
tetapi diberi perintah untuk dieksekusi dengan-c
danSHLVL
tidak disetel atau kurang atau sama dengan 1, dan salah satu dari berikut ini benar:rshd
, yaitu ketika berjalanrsh 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_CLIENT
atauSSH2_CLIENT
didefinisikan. Dalam praktiknya, ini berarti bahwa bash dipanggil olehsshd
, yaitussh 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
: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
sftp
subsistem, 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 salurandalam
sshd_config
file. Dalam kasus server SFTP internal, dan hanya dalam kasus ini, shell login pengguna dilewati.Untuk tantangan ini
Dalam kasus OverTheWire Bandit 18,
.bashrc
berisiJadi, Anda dapat menyelesaikan level ini dengan melakukan apa pun yang menyebabkan bash tidak bersifat interaktif.
sumber
sshd
jalankan shell login pengguna yang berjalansftp-server
. Oleh karena itu, jika shell login tidak mengartikan string/usr/lib/openssh/sftp-server
sebagai "jalankan perintah/usr/lib/openssh/sftp-server
", Anda tidak dapat menggunakan SFTP.The
.bashrc
hanya dijalankan ketika Anda mulai shell.Server SSH dapat dikonfigurasi untuk tidak memulai shell untuk protokol SFTP dengan memberikan perintah
Subsystem internal-sftp
di file serversshd_config
.Dugaan: kemungkinan ini adalah bagaimana wargame OverTheWire Bandit sebenarnya dikonfigurasi daripada penyesuaian
.bashrc
karena jika tidak, pembatasan yang sama untukssh
juga akan memblokirsftp
perintah server.sumber
/path/to/shell -c /path/to/sftp-server
mana/path/to/shell
shell login pengguna. Jika shell login pengguna adalah bash, maka.bashrc
dapat dijalankan tergantung pada bagaimana bash dikompilasi. Itu selalu dieksekusi ketika bash dieksekusi olehrshd
(ya, bahkan untuk shell non-interaktif, startup bash aneh) dan opsi waktu kompilasi memperpanjang ini menjadisshd
.exit
dalam.bashrc
hanya dijalankan jika bash adalah interaktif.Subsystem sftp internal-sftp
danecho No.; exit 1
di saya,.bashrc
saya tidak mendapatkanssh
akses ke server tetapisftp
masih berfungsi. (Dan tentu saja itu berpotensi untuk menimpa atau menghapus.bashrc
. Izin terlepas.) Upayassh
koneksi gagal baik interaktif atau tidak. Di sisi lain, jika saya milikiSubsystem sftp /usr/lib/openssh/sftp-server
maka layanan SFTP juga gagal ketika.bashrc
hancur.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
sumber