Bagaimana saya bisa membaca input dari keyboard host ketika terhubung melalui SSH?

10

Saat ini saya sedang bereksperimen dengan pembaca kartu RFID yang mengemulasi keyboard. Saat Anda menyambungkan kartu, itu akan membacakan data darinya dan kemudian mengemulasi penekanan tombol sesuai dengan konfigurasi.

Saya telah menghubungkan perangkat ini ke Raspberry Pi dan terhubung ke Raspberry Pi melalui SSH.

Jelas, ketika pembaca sekarang meniru penekanan tombol, mereka mendarat di tty lokal Pi (dan tidak dalam sesi SSH saya). Jadi saya mengalami kesulitan untuk mendapatkan input itu sekarang.

Pada akhirnya, saya akan menulis perangkat lunak untuk menangani input, tetapi untuk tujuan debugging dan pengembangan, akan sangat membantu untuk mendapatkan input keyboard di sesi SSH saya.

Saya mencoba yang berikut ini

sudo cat /dev/input/by-id/usb-HID_OMNIKEY_5127_CK_01010053423438303000835748112531-event-kbd

Yang memang memberikan beberapa output ketika saya menghubungkan kartu, tetapi bukan itu yang saya harapkan. Sepertinya itu akan menjadi data input mentah. Saya ingin mendapatkan kunci sebagai nilai yang dapat dibaca.

Data yang sedang dibaca dari /dev/inputperangkat lebih masuk akal saat disalurkan melalui hexdump:

pi@raspberrypi ~ $ sudo cat /dev/input/by-id/usb-HID_OMNIKEY_5127_CK_01010053423438303000835748112531-event-kbd | hexdump
0000000 eef8 5138 219a 0008 0004 0004 0024 0007
0000010 eef8 5138 21ad 0008 0001 0008 0001 0000
0000020 eef8 5138 21b3 0008 0000 0000 0000 0000
0000030 eef8 5138 6019 0008 0004 0004 0024 0007
0000040 eef8 5138 602a 0008 0001 0008 0000 0000
0000050 eef8 5138 602f 0008 0000 0000 0000 0000
0000060 eef8 5138 9e97 0008 0004 0004 0023 0007
0000070 eef8 5138 9eab 0008 0001 0007 0001 0000
0000080 eef8 5138 9eb1 0008 0000 0000 0000 0000
0000090 eef8 5138 dd18 0008 0004 0004 0023 0007
00000a0 eef8 5138 dd26 0008 0001 0007 0000 0000
00000b0 eef8 5138 dd2b 0008 0000 0000 0000 0000
00000c0 eef8 5138 1b9a 0009 0004 0004 0021 0007
00000d0 eef8 5138 1baf 0009 0001 0005 0001 0000
00000e0 eef8 5138 1bb4 0009 0000 0000 0000 0000
00000f0 eef8 5138 5a15 0009 0004 0004 0021 0007
0000100 eef8 5138 5a24 0009 0001 0005 0000 0000
0000110 eef8 5138 5a29 0009 0000 0000 0000 0000
0000120 eef8 5138 989e 0009 0004 0004 0020 0007
0000130 eef8 5138 98b3 0009 0001 0004 0001 0000
0000140 eef8 5138 98b9 0009 0000 0000 0000 0000
0000150 eef8 5138 d71d 0009 0004 0004 0020 0007
0000160 eef8 5138 d72b 0009 0001 0004 0000 0000
0000170 eef8 5138 d730 0009 0000 0000 0000 0000
0000180 eef8 5138 15a1 000a 0004 0004 0009 0007
0000190 eef8 5138 15b5 000a 0001 0021 0001 0000
00001a0 eef8 5138 15bb 000a 0000 0000 0000 0000
00001b0 eef8 5138 541e 000a 0004 0004 0009 0007
00001c0 eef8 5138 542d 000a 0001 0021 0000 0000
00001d0 eef8 5138 5432 000a 0000 0000 0000 0000
00001e0 eef8 5138 92a3 000a 0004 0004 0004 0007
00001f0 eef8 5138 92b8 000a 0001 001e 0001 0000
0000200 eef8 5138 92be 000a 0000 0000 0000 0000
0000210 eef8 5138 d123 000a 0004 0004 0004 0007
0000220 eef8 5138 d131 000a 0001 001e 0000 0000
0000230 eef8 5138 d136 000a 0000 0000 0000 0000
0000240 eef8 5138 0fab 000b 0004 0004 0021 0007
0000250 eef8 5138 0fbf 000b 0001 0005 0001 0000
0000260 eef8 5138 0fc5 000b 0000 0000 0000 0000
0000270 eef8 5138 4e22 000b 0004 0004 0021 0007
0000280 eef8 5138 4e31 000b 0001 0005 0000 0000
0000290 eef8 5138 4e36 000b 0000 0000 0000 0000
00002a0 eef8 5138 8ca5 000b 0004 0004 0023 0007
00002b0 eef8 5138 8cb9 000b 0001 0007 0001 0000
00002c0 eef8 5138 8cbe 000b 0000 0000 0000 0000
00002d0 eef8 5138 cb2b 000b 0004 0004 0023 0007
00002e0 eef8 5138 cb3a 000b 0001 0007 0000 0000
00002f0 eef8 5138 cb40 000b 0000 0000 0000 0000

Itu seharusnya menjadi input:7643fa46

Der Hochstapler
sumber
jika saya mengerti pertanyaan Anda, saya kira itu dalam arti teknis, itu sangat sedikit hubungannya dengan ssh, dan Anda ingin beberapa jenis keylogger mungkin ditulis dalam C, berjalan di komputer tujuan, dan kemudian Anda menanyakannya ketika Anda ssh ke komputer tujuan.
barlop
@barlop: Jika saya harus melakukan itu untuk mencapai apa yang saya inginkan, maka itu bukan yang ingin saya lakukan. Saya harus menulis "sesuatu" untuk benar-benar mengambil input pada akhirnya, saya hanya berharap untuk pendekatan cepat yang akan memungkinkan saya untuk menguji pengaturan ini dalam keadaan saat ini.
Der Hochstapler
itu akan menjadi risiko keamanan yang luar biasa jika ssh menyediakan fitur untuk melakukannya, dan saya ragu ada aplikasi asli yang dibundel dengan distro dest comp secara default.
barlop
1
@barlop: Yah, saya tidak berharap itu berfungsi tanpa hak pengguna super, itu sudah pasti.
Der Hochstapler

Jawaban:

8

Script yang diretas bersama ini berfungsi untuk saya untuk saat ini:

import string

from evdev import InputDevice
from select import select

keys = "X^1234567890XXXXqwertzuiopXXXXasdfghjklXXXXXyxcvbnmXXXXXXXXXXXXXXXXXXXXXXX"
dev = InputDevice('/dev/input/by-id/usb-HID_OMNIKEY_5127_CK_01010053423438303000835748112531-event-kbd')

while True:
   r,w,x = select([dev], [], [])
   for event in dev.read():
        if event.type==1 and event.value==1:
                print( keys[ event.code ] )

Ini menggunakan python-evdev untuk membaca dari /dev/input/foodan sangat kotor mengubahnya menjadi nilai yang dapat dibaca.

Ini yang saya dapatkan ketika saya menjalankan skrip dan menghubungkan kartu ke pembaca:

pi@raspberrypi ~ $ python test.py
7
6
4
3
f
a
4
6
Der Hochstapler
sumber
4

Ini adalah hack sederhana untuk membuatnya bekerja dengan mudah sampai boot berikutnya, dengan asumsi Anda memiliki hak istimewa yang diperlukan.

Menggunakan perintah berikut ini menunjukkan semua proses yang berjalan di komputer

ps -ef

Untuk menemukan PID dari proses login / getty dari tempat keyboard saat ini dibaca, kita dapat meneruskan hasil fungsi ini melalui grep.

ps -ef | grep tty

Anda bisa melihat sesuatu seperti

root     23698     1  0 18:17 ttyO0    00:00:00 /sbin/getty -L ttyO0 115200 vt102

Perhatikan nomor di kolom kedua - itu adalah PID. Dan kolom keenam, di situlah keyboard berada.

Untuk menghentikan proses itu, gunakan perintah berikut (mengganti nomor untuk apa pun PID Anda)

kill -stop 23698

Sekarang, Anda dapat membaca tty dari mana tombol keyboard berasal (tty ditampilkan dalam perintah ps)

cat /dev/ttyO0

The catakan membaca selamanya, keluaran apa pun yang dimasukkan pada keyboard, sampai Anda membunuhnya.

Setelah selesai, dan ingin kembali ke perilaku normal, Anda dapat melanjutkan fungsi keyboard dengan

kill -cont 23698

Tentu saja itu menguraikan gagasan umum. Anda dapat menggunakan program Anda sendiri untuk membaca dari tty.

pengguna277209
sumber
Ketika saya mematikan proses / sbin / getty, itu otomatis restart
davidgyoung
2

Harus melakukan ini baru-baru ini untuk Hackathon, jadi saya pikir saya akan berkontribusi apa yang akhirnya kami lakukan.

  1. Atur autologin sebagai root pada tty1 (terminal utama tempat perangkat keyboard membuang inputnya). The Arch Linux wiki entri memiliki petunjuk yang baik. Nyalakan ulang untuk membuatnya masuk.

  2. Salin sumber program kecil yang dikenal sebagai 'ttyEcho'. Satu salinan dapat ditemukan di sini , tetapi pencarian Google menampilkan lebih banyak. Program ini memungkinkan Anda untuk mengulang perintah ke terminal lain. Kompilasi pada mesin target.

  3. Sekarang kita bisa menjalankan apa pun di / dev / tty1, kita hanya bisa ./ttyEcho -n /dev/tty1 'cat > buffer'mendapatkan semua input pada tty1 untuk ditambahkan ke file. Alih-alih membuat file yang terus meluas, gunakan mkfifo bufferdulu untuk menghasilkan file khusus yang hanya berupa pipa bernama - antrian FIFO yang hanya didukung oleh memori.

  4. Dari sesi SSH Anda, Anda sekarang tail -f filenamedapat menonton semua input keyboard di tty1. Dari dalam python, open('filename','r')dan terus panggil .read()atau .readline()di atasnya untuk mendapatkan umpan data keyboard saat masuk.

Metode ini sangat bagus untuk kita karena menghindari penguraian keyboard scancode, dan menyimpan buffer data yang besar dan bagus tanpa kode apa pun.

Marc J
sumber