GNU/Linux >> Belajar Linux >  >> Linux

Melewati perintah/skrip yang ditentukan di /etc/passwd

Asumsikan ada pintu belakang (mungkin tidak disengaja).

/etc/passwd default di stasiun kerja Sun pada awal 1990-an menyertakan entri seperti ini:

games::0:0:games:/nopath:/bin/false

Dengan kata lain, akun bernama 'permainan' tanpa kata sandi. Rupanya si jenius yang datang dengan ide ini tidak memiliki imajinasi, dan menetapkannya sebagai uid dan gid nol (yaitu akar dan roda). Secara umum, tidak apa-apa, karena direktori home tidak ada artinya dan shell disetel ke program yang selalu keluar dengan kegagalan. Selain itu, pengaturan default untuk setiap akses melalui jaringan -- telnet, rlogin, rcp, ftp -- telah diatur untuk mencegah akses oleh setiap uid dari nol. Ada entri passwd terpisah untuk root, dengan kata sandi, direktori home, dan shell yang disetel dengan benar.

Artinya, jika Anda mencoba masuk sebagai game, hal berikut akan terjadi:

  • Masuk sebagai game di konsol pada awalnya akan berhasil, tetapi kemudian menelurkan /bin/false shell, yang akan segera keluar.
  • Menggunakan telnet atau rlogin akan langsung menolak login. Bahkan jika berhasil, /bin/false shell akan segera berhenti.
  • FTP dan scp tidak menggunakan shell, tetapi keduanya dikonfigurasi untuk menolak akses ke uid zero, sehingga Anda tidak dapat masuk dengan cara ini.
  • Login GUI akan memulai layanan GUI default, termasuk pengelola jendela, klien jam, dan terminal. Yang terakhir akan segera keluar karena cangkang anaknya akan segera keluar. Jadi Anda akan mendapatkan layar kosong kecuali jam. (Lebih lanjut tentang ini di bawah...)
  • Jika Anda benar-benar memilikinya untuk masuk sebagai root, Anda harus melakukannya dari konsol, atau terlebih dahulu rlogin/telnet sebagai pengguna lain di mesin itu lalu su root . Either way menggunakan root passwd entri daripada game passwd entri, dan dengan demikian berfungsi sebagaimana seharusnya root bekerja.

Jadi akun game sepertinya selalu gagal, kecuali jika Anda melakukan login GUI. Dalam hal ini, satu-satunya yang muncul adalah jam. Namun, Anda dapat mengeklik kanan latar belakang untuk mendapatkan menu root, dengan daftar program yang disediakan pabrik yang biasanya disesuaikan sendiri oleh pengguna. (Menyesuaikan menu tidak berfungsi untuk akun game; saya tidak ingat persis mengapa.) Anda dapat mencoba membuka lebih banyak jendela terminal, yang semuanya akan gagal. Ada permainan puzzle (yang mungkin menjadi pendorong untuk akun tersebut sejak awal). Pilihan lain adalah keluar. Lalu ada alat debug grafis, dbxtool .

dbxtool adalah antarmuka grafis untuk dbx debugger simbolis, mirip dengan gdb hari ini . Menjadi nol uid, Anda dapat melampirkan dan mengontrol proses apa pun pada sistem, meskipun ini tidak berguna karena program yang disediakan oleh Sun dikompilasi tanpa simbol. Anda dapat meluncurkan sebuah shell, tetapi ini akan menggunakan SHELL Anda variabel lingkungan, yaitu /bin/false . Namun, Anda juga dapat mengubah variabel lingkungan! Ini berarti Anda bisa mendapatkan shell root dengan cara berikut:

  1. Masuk melalui GUI sebagai game, tanpa kata sandi.
  2. Klik kanan untuk membuka menu akar.
  3. Mulai dbxtool .
  4. setenv SHELL /bin/sh
  5. (Opsional) setenv HOME /
  6. Mulai shell dengan !
  7. Karena terminal tidak disetel, lakukan stty sane

Voila, root shell tanpa kata sandi!

Jadi, jangan berasumsi bahwa pengguna tidak dapat keluar dari shell yang tidak valid.


Anda tidak dapat melewati eksekusi skrip. Ini adalah login shell Anda , dan akan dimulai setiap kali Anda login. Dan sebagai login shell , akan mengeluarkan Anda setiap kali itu berakhir. Namun Anda dapat menggunakan keanehan, bug, dan ketidakkonsistenan pada shell login untuk keluar.

Satu hal yang dapat Anda lakukan adalah melarikan diri ke shell menggunakan opsi apa pun di menu. Jika menu memungkinkan Anda memulai vim , less , more atau beberapa perintah lain, secara teoritis Anda dapat membebaskan diri. Jika sysadmin berpengalaman, perintah tersebut akan menggunakan versi terbatasnya dan tidak akan berfungsi.


Saya ingat tantangan permainan di mana ada kasus serupa - shell menunjuk ke sesuatu yang hanya mencetak beberapa keluaran menggunakan lebih perintah, lalu mengakhiri sesi. Namun, sejak lebih fitur editor teks bawaan (dalam hal ini adalah vi), itu cukup untuk mengubah ukuran jendela terminal dari mana Anda terhubung sehingga lebih banyak yang diaktifkan, lalu menggunakannya untuk keluar dari shell.

Jadi, jawabannya tergantung pada apa yang dilakukan skrip Anda. Periksa pria halaman untuk setiap perintah yang Anda jalankan untuk menghindari kerentanan.


Linux
  1. Bagaimana Linux Menangani Beberapa Pemisah Jalur Berturut-turut (/home////username///file)?

  2. Bagaimana Cara Menulis Skrip Shell yang Bersumber Secara Otomatis Ke /etc/profile?

  3. Arti dari $? Dalam Skrip Shell?

  1. Membuat Script Bash Pertama, Tidak Bisa Mendapatkan Perintah Cd Untuk 'menempel.'?

  2. Menggunakan perintah passwd dari dalam skrip shell

  3. Menambahkan pengguna ke sudoer melalui skrip shell

  1. Mengapa pengguna mysql memiliki bash shell di /etc/passwd?

  2. Perbedaan Antara ~/.profile, ~/.bashrc, ~/.bash_profile, ~/.gnomerc, /etc/bash_bashrc, /etc/screenrc …?

  3. Jalankan skrip shell dari perintah docker-compose, di dalam container