Apakah mungkin bagi sysadmin untuk menguping di terminal penggunanya?

17

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 stracelarutan). Satu solusi yang mendekati adalah solusi yang menyarankan penggunaan gdb. 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
Joseph R.
sumber
1
Anda inginkan ttysnoopatau mungkin peekfd.
n. 'kata ganti' m.

Jawaban:

11

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 xtermtertulis di dalamnya adalah karakter yang dihasilkan dari tombol yang Anda tekan. Apa yang dibaca dari itu adalah apa yang ditampilkannya.

Misalnya, di Linux:

$ lsof -ac xterm /dev/ptmx
COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
xterm   15173 chazelas    4u   CHR    5,2      0t0 2131 /dev/ptmx

Dan kemudian jalankan misalnya:

stty -echo -opost
strace -e read -e read=4 -p15173 2>&1 | stdbuf -o0 sh -c '
  grep "^ |" | cut -b11-60 | tr -d " " | xxd -r -p'

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:

stty size < /dev/pts/that-terminal

Bahwa kesedihan apa yang dibaca oleh xtermdari sisi master terminal, sehingga apa yang ditampilkan di sana, termasuk lokal echodari apa yang sedang diketik.

Di -e read=4atas adalah untuk stracemenampilkan hexdump dari apa yang xtermdibaca pada fd 4. Sisa dari perintah ini adalah untuk mengkonversi itu ke karakter yang sebenarnya. Saya mencoba peekfd -n -8 15173 4tetapi untuk beberapa alasan yang hanya memberikan apa yang sedang ditulis.

Kami menggunakan -opostuntuk menonaktifkan post-processing di terminal pemantauan kami, sehingga semuanya xxdmenulis ke sisi pendukung membuatnya tidak berubah ke sisi master kami, sehingga pemantauan kami xtermmendapatkan hal yang sama dengan yang dipantau. -echosedemikian 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 pemantauan xtermdan xtermkehendak kita. balas juga. Kami tidak ingin gema lokal itu.

Anda juga dapat memantau apa yang sedang diketik dengan melacak writepanggilan sistem ke fd yang sama (ganti readdengan yang di writeatas). Perhatikan bahwa setelah ditekan Enter, emulator terminal mengirimkan karakter CR, bukan LF. Juga, karena kita menelusuri di sisi master, jika tipe pengguna a<Backspace>b, kita akan melihat semua 3 penekanan tombol bahkan jika perangkat terminal dalam mode kanonik.

Mengapa milik Anda tidak berfungsi:

tee /dev/pts/user_pts </dev/pts/user_pts

Membaca dari perangkat terminal adalah membaca input pengguna, dan menulis untuk itu untuk menampilkannya kepada pengguna.

Anda menyuruh teemembaca dari perangkat terminal. Jadi yang terbaca (input pengguna) tidak akan readoleh aplikasi yang berjalan di terminal (dan sebaliknya, teedan itu applicationakan memperjuangkan input terminal). Menulis ke perangkat terminal, adalah untuk tampilan di sana, bukan untuk meletakkannya kembali di sana sebagai input. Saat kamu melakukan

echo test

(dengan echostdout menjadi terminal), itu bukan hal yang sama seperti jika Anda mengetik test.

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.

Stéphane Chazelas
sumber
1
+1 Untuk penjelasan dan untuk tidak menggunakan alat eksternal. Saya perlu sedikit membaca untuk memahami banyak bagian dari jawaban Anda, tetapi saya merasa itu sesuai dengan apa yang saya inginkan.
Joseph R.
5

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.

Jlliagre
sumber
3

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:

  1. Buat interseptor, menggunakan socat, yang memperlihatkan dirinya sebagai pty.
  2. Interceptor terhubung ke tee, yang menduplikasi aliran di terminal $ sys, dan terminal $ usr.
  3. Gdb digunakan untuk menggantikan deskriptor file stdout / stderr untuk menunjuk ke interceptor alih-alih terminal $ usr.

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>. usrdan sys-admadalah 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 dengan ttyperintah. Dan terminal pengguna baik dengan watau ps.

#!/bin/sh

[ "$1" ] || exit 1
[ "$2" ] || exit 1

usr=$1
sys=$2
utty=${1#/dev/}

ps -e -o tty= -o pid= -o user= | { 
    found_it=

    while read -r tty pid_sh owner; do
        if [ "$utty" = "$tty" ]; then
            found_it=y
            break;
        fi
    done

    [ "$found_it" ] || exit 1

    tmp=$(mktemp)
    tmp_gdb=$(mktemp)

    trap 'rm "$tmp" "$tmp_gdb"' EXIT

    socat PTY,link="$tmp",echo=0,raw,openpty,user="$owner",mode=0600 SYSTEM:"tee $sys > $usr"      &

    printf 'call dup2(open("%s", 1), 1)\ncall dup2(open("%s", 1), 2)
            detach\nquit\n' "$tmp" "$tmp" > "$tmp_gdb"
    gdb -p "$pid_sh" -x "$tmp_gdb" >/dev/null 2>&1 &

    wait
}
Eduardo A. Bustamante López
sumber
2

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.

unxnut
sumber
Sebenarnya saya berharap untuk solusi terminal-emulator-agnostik.
Joseph R.
xkey akan memberi Anda penekanan tombol pada tampilan X. Itu akan menjadi semua xterms dan utilitas lain yang membutuhkan input keyboard.
unxnut
Baik. Saya pikir maksud Anda xtermsecara khusus.
Joseph R.