Saat masuk ke mesin, saya bisa mengetahui perangkat terminal semu masing-masing pengguna dari output w
. Menjadi sysadmin, mungkinkah saya menguping terminal ini tanpa pengguna sadari? Dengan kata lain, saya ingin melihat semua yang dilakukan di terminal ini sebagai output di terminal saya sendiri.
Harap perhatikan hal berikut:
- Ini bukan untuk kasus penggunaan praktis memantau aktivitas pengguna: Saya tahu ada alat audit sistem untuk itu. Saya hanya ingin tahu apakah itu bisa dilakukan.
- Saya menyadari pertanyaan ini dan sepertinya tidak mencakup apa yang saya tanyakan karena semua solusi yang disarankan ada invasif (pengguna akan menyadari apa yang saya lakukan) atau menghasilkan terlalu banyak suara (yang
strace
larutan). Satu solusi yang mendekati adalah solusi yang menyarankan penggunaangdb
. Tapi ini hanya membuat saya melihat stdout dari terminal lain.
Apa yang saya coba
Saya mencoba ini dari terminal saya:
tee /dev/pts/user_pts </dev/pts/user_pts
Ini memungkinkan saya untuk melihat setiap karakter yang diketik pengguna di terminal semu lainnya saat mereka mengetiknya. Masalahnya adalah, setiap beberapa karakter, itu akan "melompati": itu akan menunjukkan satu karakter jahat pada satu perangkat terminal tetapi tidak yang lain. Ini juga mencegah eksekusi perintah apa pun dari perangkat terminal semu pengguna. Saya tidak begitu yakin mengapa ini terjadi dan apakah ada cara untuk memperbaikinya.
Apa yang ingin saya lihat
USER TERMINAL | MY TERMINAL
$ echo "Test" | # slick_command_here
Test | echo "Test"
$ | Test
sumber
ttysnoop
atau mungkinpeekfd
.Jawaban:
Ini adalah fd ke sisi master terminal pseudo di emulator terminal yang ingin Anda pantau jika Anda ingin melihat apa yang ditampilkan di dalamnya. Itu tuan fd yang mensimulasikan kawat yang masuk ke terminal nyata. Yang
xterm
tertulis di dalamnya adalah karakter yang dihasilkan dari tombol yang Anda tekan. Apa yang dibaca dari itu adalah apa yang ditampilkannya.Misalnya, di Linux:
Dan kemudian jalankan misalnya:
Tentu saja, ini bekerja lebih baik jika Anda menjalankannya di terminal dengan tipe dan ukuran yang sama dengan yang Anda coba pantau. Anda bisa mendapatkan ukuran dengan:
Bahwa kesedihan apa yang dibaca oleh
xterm
dari sisi master terminal, sehingga apa yang ditampilkan di sana, termasuk lokalecho
dari apa yang sedang diketik.Di
-e read=4
atas adalah untukstrace
menampilkan hexdump dari apa yangxterm
dibaca pada fd 4. Sisa dari perintah ini adalah untuk mengkonversi itu ke karakter yang sebenarnya. Saya mencobapeekfd -n -8 15173 4
tetapi untuk beberapa alasan yang hanya memberikan apa yang sedang ditulis.Kami menggunakan
-opost
untuk menonaktifkan post-processing di terminal pemantauan kami, sehingga semuanyaxxd
menulis ke sisi pendukung membuatnya tidak berubah ke sisi master kami, sehingga pemantauan kamixterm
mendapatkan hal yang sama dengan yang dipantau.-echo
sedemikian sehingga jika aplikasi di terminal yang dipantau mengirimkan urutan pelarian yang meminta jawaban dari terminal (seperti yang meminta posisi kursor atau jenis terminal atau judul jendela), itu akan membuat jalannya ke pemantauanxterm
danxterm
kehendak kita. balas juga. Kami tidak ingin gema lokal itu.Anda juga dapat memantau apa yang sedang diketik dengan melacak
write
panggilan sistem ke fd yang sama (gantiread
dengan yang diwrite
atas). Perhatikan bahwa setelah ditekan Enter, emulator terminal mengirimkan karakter CR, bukan LF. Juga, karena kita menelusuri di sisi master, jika tipe penggunaa<Backspace>b
, kita akan melihat semua 3 penekanan tombol bahkan jika perangkat terminal dalam mode kanonik.Mengapa milik Anda tidak berfungsi:
Membaca dari perangkat terminal adalah membaca input pengguna, dan menulis untuk itu untuk menampilkannya kepada pengguna.
Anda menyuruh
tee
membaca dari perangkat terminal. Jadi yang terbaca (input pengguna) tidak akanread
oleh aplikasi yang berjalan di terminal (dan sebaliknya,tee
dan ituapplication
akan memperjuangkan input terminal). Menulis ke perangkat terminal, adalah untuk tampilan di sana, bukan untuk meletakkannya kembali di sana sebagai input. Saat kamu melakukan(dengan
echo
stdout menjadi terminal), itu bukan hal yang sama seperti jika Anda mengetiktest
.Ada
ioctl
(TIOCSTI
) untuk menempatkan karakter kembali sebagai input, tetapi bahkan itu tidak akan berhasil karena Anda bisa mengembalikannya setelah aplikasi seperti yang sudah dibaca lagi, sehingga akan mengubah urutan aplikasi membaca input, dan dengan cara apa pun, itu berarti Anda akan membacanya berulang kali.sumber
Jika OS Anda mendukung dtrace, skrip sederhana itu, shellsnoop , akan memungkinkan Anda untuk memantau semua yang diketik / dicetak pada tty yang diberikan.
Jika Anda menjalankan Linux, ttysnoop digunakan untuk melakukan hal serupa tetapi membutuhkan konfigurasi yang mengganggu sebagai prasyarat dan AFAIK tidak lagi didukung dengan kernel saat ini, jadi tidak akan membantu dalam kasus Anda. Ada lebih atau kurang upaya maju untuk menyediakan penelusuran dinamis dengan Linux, systemtap, ktap dan bahkan dtrace sehingga Anda dapat menyelidikinya.
Sunting: Waspadalah terhadap peekfd , halaman manualnya menyatakan:
Bug:
Mungkin banyak. Jangan kaget jika proses yang Anda monitor mati.
sumber
Pendekatan ini melibatkan sedikit gdb dan tee. Ah, dan itu juga menggunakan socat untuk meniru pseudo-terminal. Ini bisa berfungsi tanpanya, tetapi pengguna akan memperhatikan bahwa outputnya bukan lagi terminal (program seperti vi akan mengeluh).
Ini melakukan hal berikut:
Saya perhatikan bahwa bash sepertinya menulis apa yang Anda ketikkan ke stderr, saya tidak yakin apakah program lain melakukan hal yang sama. Jika itu masalahnya, stdin tidak harus dicegat.
Sebut saja seperti ini:
chmod +x /path/to/script; sudo /path/to/script <usr> <sys-adm>
.usr
dansys-adm
adalah nama-nama terminal, misalnya/dev/pts/1
,. Jadi panggilan sampel akan terlihat seperti ini:sudo /path/to/script /dev/pts/1 /dev/pts/2
. Anda dapat mengetahui terminal Anda dengantty
perintah. Dan terminal pengguna baik denganw
ataups
.sumber
Ada program C sederhana yang disebut xkey.c untuk menunjukkan eksploitasi X11. Saya akan membiarkan Anda google itu. Anda dapat menangkap penekanan tombol pada xterm menggunakan ini tanpa pengguna menyadarinya.
sumber
xterm
secara khusus.