Jak odczytać dane wejściowe z klawiatury hosta po połączeniu przez SSH?

10

Obecnie eksperymentuję z czytnikiem kart RFID, który emuluje klawiaturę. Po podłączeniu karty odczytuje z niej dane, a następnie emuluje naciśnięcia klawiszy zgodnie z konfiguracją.

Podłączyłem to urządzenie do Raspberry Pi i podłączyłem się do Raspberry Pi przez SSH.

Oczywiście, kiedy czytelnik teraz emuluje naciśnięcia klawiszy, lądują na lokalnym tty Pi (a nie w mojej sesji SSH). Trudno mi teraz dostać się do tych informacji.

Ostatecznie napiszę oprogramowanie do obsługi danych wejściowych, ale dla celów debugowania i programowania przydatne byłoby uzyskanie danych wejściowych z klawiatury podczas mojej sesji SSH.

Próbowałem następujące

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

Który ma dać jakieś wyjście po podłączeniu karty, ale to nie to, co by się było spodziewać. Wygląda na to, że byłyby to surowe dane wejściowe. Chciałbym otrzymać klucze jako czytelne wartości.

Dane, które są odczytywane z /dev/inputurządzenia, mają trochę więcej sensu podczas przepuszczania 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

To powinno być dane wejściowe:7643fa46

Der Hochstapler
źródło
jeśli rozumiem twoje pytanie, zgaduję, że w sensie technicznym ma to bardzo niewiele wspólnego z ssh, i chciałbyś, aby jakiś keylogger był napisany w C, działający na komputerze docelowym, a następnie zapytałeś go kiedy ssh do komputera docelowego.
barlop,
@barlop: Gdybym musiał to zrobić , aby osiągnąć to, czego chcę, to nie jest to, co chcę zrobić. Będę musiał napisać „coś”, aby ostatecznie pobrać dane wejściowe, miałem tylko nadzieję na szybkie podejście, które pozwoli mi przetestować tę konfigurację w jej obecnym stanie.
Der Hochstapler,
byłoby niesamowitym zagrożeniem bezpieczeństwa, gdyby ssh zapewniło taką możliwość, i wątpię, aby domyślnie była dostępna natywna aplikacja z dystrybucją dest comp.
barlop,
1
@barlop: Cóż, nie spodziewam się, że będzie działać bez uprawnień administratora, to na pewno.
Der Hochstapler,

Odpowiedzi:

8

Ten zhakowany razem skrypt działa teraz dla mnie:

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 ] )

Używa python-evdev do odczytu /dev/input/fooi bardzo brudnie konwertuje je na czytelne wartości.

Oto co otrzymuję po uruchomieniu skryptu i podłączeniu karty do czytnika:

pi@raspberrypi ~ $ python test.py
7
6
4
3
f
a
4
6
Der Hochstapler
źródło
4

Oto prosty hack, który sprawi, że będzie działał łatwo do następnego rozruchu, przy założeniu, że masz wymagane uprawnienia.

Użycie następującego polecenia pokazuje wszystkie procesy uruchomione na komputerze

ps -ef

Aby znaleźć PID procesu logowania / getty, z którego obecnie odczytywana jest klawiatura, możemy przekazać wyniki tej funkcji przez grep.

ps -ef | grep tty

Możesz zobaczyć coś takiego

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

Zwróć uwagę na liczbę w drugiej kolumnie - jest to PID. I szósta kolumna, w której znajduje się klawiatura.

Aby zatrzymać ten proces, użyj następującego polecenia (podstawiając numer na dowolny identyfikator PID)

kill -stop 23698

Teraz możesz odczytać tty, skąd pochodzą klawisze klawiatury (tty jest pokazane w poleceniu ps)

cat /dev/ttyO0

catOdczyta zawsze, wyprowadzanie, co jest wpisane na klawiaturze, aż go zabić.

Kiedy skończysz i chcesz wrócić do normalnego zachowania, możesz wznowić funkcję klawiatury za pomocą

kill -cont 23698

Oczywiście zarysowuje to ogólny pomysł. Możesz użyć własnego programu do czytania z tty.

użytkownik277209
źródło
Kiedy zabijam proces / sbin / getty, automatycznie uruchamia się ponownie
davidgyoung
2

Musiałem to zrobić ostatnio dla Hackathonu, więc pomyślałem, że wrócę do tego, co skończymy.

  1. Ustaw autologin jako root na tty1 (głównym terminalu, na którym klawiatura wyrzuca dane wejściowe). Na wejście Arch Linux Wiki ma dobre instrukcje. Uruchom ponownie, aby się zalogować.

  2. Skopiuj źródło małego programu znanego jako „ttyEcho”. Jeden egzemplarz można znaleźć tutaj , ale wyszukiwarka Google zawiera wiele innych. Ten program umożliwia echo poleceń do innego terminala. Kompiluj na maszynie docelowej.

  3. Teraz, gdy możemy uruchomić cokolwiek na / dev / tty1, możemy po prostu ./ttyEcho -n /dev/tty1 'cat > buffer'uzyskać wszystko, co wejdzie na tty1, aby dodać do pliku. Zamiast tworzyć ciągle rozwijany plik, użyj mkfifo buffernajpierw do wygenerowania specjalnego pliku, który jest tylko nazwanym potokiem - kolejką FIFO, która jest zabezpieczona tylko pamięcią.

  4. Z sesji SSH możesz teraz po prostu tail -f filenameoglądać całą klawiaturę na tty1. Z poziomu Pythona open('filename','r')i kontynuuj wywoływanie .read()lub .readline()na nim, aby uzyskać dostęp do danych klawiatury, jak tylko się pojawi.

Ta metoda była dla nas świetna, ponieważ pozwala uniknąć parsowania klawiatury i utrzymuje ładny duży bufor danych bez żadnego kodu.

Marc J
źródło