Comment puis-je lire les entrées du clavier des hôtes lorsque je suis connecté via SSH?


10

J'expérimente actuellement avec un lecteur de cartes RFID qui émule un clavier. Lorsque vous connectez une carte, elle en lit les données, puis émule les frappes en fonction de la configuration.

J'ai connecté cet appareil à un Raspberry Pi et connecté au Raspberry Pi via SSH.

De toute évidence, lorsque le lecteur émule maintenant les touches, ils atterrissent sur le terminal local du Pi (et non dans ma session SSH). J'ai donc du mal à accéder à cette entrée en ce moment.

En fin de compte, je vais écrire un logiciel pour gérer l'entrée, mais à des fins de débogage et de développement, il serait très utile d'obtenir l'entrée du clavier dans ma session SSH.

J'ai essayé ce qui suit

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

Ce qui donne une sortie lorsque je connecte une carte, mais ce n'est pas ce à quoi je m'attendais. Il semble que ce serait des données d'entrée brutes. J'aimerais obtenir les clés sous forme de valeurs lisibles.

Les données qui sont lues à partir de l' /dev/inputappareil ont un peu plus de sens lors de leur acheminement 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

Cela aurait dû être l'entrée:7643fa46


si je comprends votre question, je suppose que dans le sens technique, cela a très peu à voir avec ssh, et vous voudriez peut-être une sorte de keylogger écrit en C, fonctionnant sur l'ordinateur de destination, puis vous l'interrogez lorsque vous vous connectez à l'ordinateur de destination.
barlop

@barlop: Si je devais faire cela pour réaliser ce que je veux, ce n'est pas ce que je veux faire. Je vais devoir écrire "quelque chose" pour saisir réellement l'entrée à la fin, j'espérais juste une approche rapide qui me permettrait de tester cette configuration dans son état actuel.
Der Hochstapler

ce serait un risque de sécurité incroyable si ssh fournissait une fonctionnalité pour le faire, et je doute qu'il y ait une application native fournie avec la distribution de la comp dest par défaut.
barlop

1
@barlop: Eh bien, je ne m'attends pas à ce que cela fonctionne sans privilèges de superutilisateur, c'est sûr.
Der Hochstapler

Réponses:


8

Ce script piraté fonctionne pour moi pour l'instant:

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

Il utilise python-evdev pour lire /dev/input/fooet les convertit très mal en valeurs lisibles.

Voici ce que j'obtiens lorsque j'exécute le script et connecte une carte au lecteur:

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

4

Voici un hack simple pour le faire fonctionner facilement jusqu'au prochain démarrage, en supposant que vous disposez des privilèges requis.

L'utilisation de la commande suivante affiche tous les processus en cours d'exécution sur l'ordinateur

ps -ef

Pour trouver le PID du processus de connexion / getty à partir duquel le clavier est actuellement lu, nous pouvons passer les résultats de cette fonction via grep.

ps -ef | grep tty

Vous pourriez voir quelque chose comme

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

Prenez note du nombre dans la deuxième colonne - c'est le PID. Et la sixième colonne, où se trouve le clavier.

Pour arrêter ce processus, utilisez la commande suivante (en substituant le numéro à votre PID)

kill -stop 23698

Maintenant, vous pouvez lire le tty d'où proviennent les touches du clavier (tty est affiché dans la commande ps)

cat /dev/ttyO0

Le catlira pour toujours, produisant tout ce qui est entré sur le clavier, jusqu'à ce que vous le tuiez.

Lorsque vous avez terminé et que vous souhaitez revenir à un comportement normal, vous pouvez reprendre la fonction clavier avec

kill -cont 23698

Bien sûr, cela décrit l'idée générale. Vous pouvez utiliser votre propre programme pour lire à partir du tty.


Quand je tue le processus / sbin / getty, il redémarre automatiquement
davidgyoung

2

J'ai dû le faire récemment pour un Hackathon, alors j'ai pensé que je contribuerais ce que nous avons fini par faire.

  1. Configurez la connexion automatique en tant que root sur tty1 (le terminal principal sur lequel le clavier claque son entrée). L' entrée wiki d'Arch Linux contient de bonnes instructions. Redémarrez pour le connecter.

  2. Copiez la source d'un petit programme appelé «ttyEcho». Un exemplaire peut être trouvé ici , mais une recherche Google en fait apparaître bien d'autres. Ce programme vous permet d'écho des commandes vers un autre terminal. Compilez sur la machine cible.

  3. Maintenant que nous pouvons exécuter tout sur / dev / tty1, nous ne pouvons tout simplement ./ttyEcho -n /dev/tty1 'cat > buffer'pour obtenir l' entrée de tout sur tty1 à ajouter à un fichier. Au lieu de créer un fichier en constante expansion, utilisez d' mkfifo bufferabord pour générer un fichier spécial qui n'est qu'un canal nommé - une file d'attente FIFO qui est uniquement sauvegardée par la mémoire.

  4. Depuis votre session SSH, vous pouvez maintenant simplement tail -f filenameregarder toutes les saisies au clavier sur tty1. Depuis python, open('filename','r')continuez d'appeler .read()ou .readline()d'y accéder pour obtenir le flux de données du clavier au fur et à mesure.

Cette méthode était excellente pour nous, car elle évite l'analyse du code du clavier et conserve un joli grand tampon des données sans aucun code.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.