¿Cómo puedo leer la entrada del teclado del host cuando estoy conectado a través de SSH?


10

Actualmente estoy experimentando con un lector de tarjetas RFID que emula un teclado. Cuando conecta una tarjeta, leerá datos de ella y luego emulará las pulsaciones de teclas según la configuración.

He conectado este dispositivo a una Raspberry Pi y me he conectado a la Raspberry Pi a través de SSH.

Obviamente, cuando el lector ahora emula las pulsaciones de teclas, aterrizan en el tty local de Pi (y no en mi sesión SSH). Así que estoy teniendo dificultades para llegar a esa entrada en este momento.

En última instancia, escribiré una pieza de software para manejar la entrada, pero para fines de depuración y desarrollo, sería bastante útil obtener la entrada del teclado en mi sesión SSH.

Probé lo siguiente

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

Lo que da algo de salida cuando conecto una tarjeta, pero no es lo que esperaba. Parece que serían datos de entrada sin procesar. Me encantaría obtener las claves como valores legibles.

Los datos que se leen desde el /dev/inputdispositivo tienen un poco más de sentido cuando se canalizan 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

Esa debería haber sido la entrada:7643fa46


si entiendo su pregunta, supongo que en el sentido técnico, tiene muy poco que ver con ssh, y querría algún tipo de keylogger tal vez escrito en C, ejecutándose en la computadora de destino, y luego lo consulta cuando ssh a la computadora de destino.
barlop

@barlop: Si tuviera que hacer eso para lograr lo que quiero, entonces no es lo que quiero hacer. Tendré que escribir "algo" para obtener la entrada al final, solo esperaba un enfoque rápido que me permitiera probar esta configuración en su estado actual.
Der Hochstapler

sería un riesgo de seguridad sorprendente si ssh proporcionara una función para hacerlo, y dudo que haya una aplicación nativa incluida con la distribución de la compilación de destino de forma predeterminada.
barlop

1
@barlop: Bueno, no espero que funcione sin privilegios de superusuario, eso es seguro.
Der Hochstapler

Respuestas:


8

Este script pirateado funciona para mí por ahora:

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

Utiliza python-evdev para leer /dev/input/fooy los convierte de manera muy sucia en valores legibles.

Esto es lo que obtengo cuando ejecuto el script y conecto una tarjeta al lector:

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

4

Aquí hay un truco simple para que funcione fácilmente hasta el próximo arranque, suponiendo que tenga los privilegios necesarios.

El uso del siguiente comando muestra todos los procesos que se ejecutan en la computadora

ps -ef

Para encontrar el PID del proceso de inicio de sesión / getty desde donde se lee actualmente el teclado, podemos pasar los resultados de esta función a través de grep.

ps -ef | grep tty

Podrías ver algo como

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

Tome nota del número en la segunda columna: ese es el PID. Y la sexta columna, que es donde está el teclado.

Para detener ese proceso, use el siguiente comando (sustituyendo el número por el que sea su PID)

kill -stop 23698

Ahora, puede leer el tty de donde provienen las teclas del teclado (tty se muestra en el comando ps)

cat /dev/ttyO0

Se catleerá para siempre, generando lo que se ingrese en el teclado, hasta que lo elimine.

Cuando haya terminado y desee volver al comportamiento normal, puede reanudar la función del teclado con

kill -cont 23698

Por supuesto, eso resume la idea general. Puedes usar tu propio programa para leer desde el tty.


Cuando
elimino el

2

Tuve que hacer esto recientemente para un Hackathon, así que pensé que contribuiría con lo que terminamos haciendo.

  1. Configure el inicio de sesión automático como root en tty1 (el terminal principal donde el dispositivo de teclado está volcando su entrada). La entrada wiki de Arch Linux tiene buenas instrucciones. Reinicie para iniciar sesión.

  2. Copie la fuente de un pequeño programa conocido como 'ttyEcho'. Aquí se puede encontrar una copia , pero una búsqueda en Google trae muchos más. Este programa le permite hacer eco de comandos a otro terminal. Compilar en la máquina de destino.

  3. Ahora que podemos ejecutar lo que sea en / dev / tty1, solo podemos ./ttyEcho -n /dev/tty1 'cat > buffer'hacer que todo lo ingresado en tty1 se agregue a un archivo. En lugar de crear un archivo cada vez más amplio, use mkfifo bufferprimero para generar un archivo especial que es solo una tubería con nombre, una cola FIFO que está respaldada solo por la memoria.

  4. Desde su sesión SSH ahora puede tail -f filenamever todas las entradas de teclado en tty1. Desde Python, open('filename','r')y sigue invocando .read()o .readline()en él para obtener la alimentación de los datos del teclado a medida que ingresa.

Este método fue excelente para nosotros ya que evita el análisis del código de escaneo del teclado y mantiene un gran búfer de datos sin ningún código.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.