Como posso ler a entrada do teclado do host quando conectado via SSH?


10

Atualmente, estou experimentando um leitor de cartão RFID que emula um teclado. Quando você conecta um cartão, ele lê os dados e emula as teclas pressionadas de acordo com a configuração.

Conectei este dispositivo a um Raspberry Pi e ao Raspberry Pi via SSH.

Obviamente, quando o leitor agora emula as teclas digitadas, ele pousa no tty local do Pi (e não na minha sessão SSH). Então, estou tendo dificuldades para acessar essa entrada agora.

Por fim, escreverei um software para lidar com a entrada, mas para fins de depuração e desenvolvimento, seria bastante útil obter a entrada do teclado na minha sessão SSH.

Eu tentei o seguinte

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

O que dá alguma saída quando eu conecto uma placa, mas não é o que eu esperava. Parece que isso seria dados de entrada brutos. Eu adoraria obter as chaves como valores legíveis.

Os dados que estão sendo lidos a partir do /dev/inputdispositivo fazem um pouco mais de sentido ao canalizá-los 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

Essa deveria ter sido a entrada:7643fa46


se eu entendi sua pergunta, acho que, no sentido técnico, isso tem muito pouco a ver com ssh, e você gostaria de algum tipo de keylogger talvez escrito em C, rodando no computador de destino e depois consultá-lo quando você ssh no computador de destino.
barlop

@ Barlop: Se eu tivesse que fazer isso para conseguir o que eu quero, então não é o que eu quero fazer. Terei que escrever "algo" para realmente capturar a entrada no final. Estava apenas esperando uma abordagem rápida que me permitisse testar essa configuração em seu estado atual.
Der Hochstapler

seria um risco de segurança incrível se o ssh fornecesse um recurso para fazê-lo, e duvido que exista um aplicativo nativo incluído na distribuição do comp dest.
barlop

1
@ Barlop: Bem, não espero que funcione sem privilégios de superusuário, isso é certo.
Der Hochstapler /

Respostas:


8

Este script cortado juntos funciona para mim por enquanto:

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

Ele usa python-evdev para ler /dev/input/fooe os converte de maneira muito suja em valores legíveis.

É isso que recebo quando executo o script e conecto um cartão ao leitor:

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

4

Aqui está um truque simples para fazê-lo funcionar facilmente até a próxima inicialização, supondo que você tenha os privilégios necessários.

O uso do comando a seguir mostra todos os processos em execução no computador

ps -ef

Para encontrar o PID do processo de login / getty de onde o teclado está atualmente lido, podemos passar os resultados dessa função pelo grep.

ps -ef | grep tty

Você poderia ver algo como

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

Anote o número na segunda coluna - que é o PID. E a sexta coluna, onde é o teclado.

Para interromper esse processo, use o seguinte comando (substituindo o número por qualquer que seja o seu PID)

kill -stop 23698

Agora, você pode ler o tty de onde as teclas do teclado estão vindo (tty é mostrado no comando ps)

cat /dev/ttyO0

O catirá ler para sempre, produzindo o que for digitado no teclado, até que você o mate.

Quando terminar, e desejar retornar ao comportamento normal, você poderá retomar a função do teclado com

kill -cont 23698

Claro que isso descreve a ideia geral. Você pode usar seu próprio programa para ler o tty.


Quando eu matar o sbin / getty / processo, é auto reinicia
davidgyoung

2

Tive que fazer isso recentemente para um Hackathon, então achei que contribuiria com o que acabamos fazendo.

  1. Configure o login automático como raiz no tty1 (o terminal principal em que o dispositivo do teclado está descartando sua entrada). A entrada wiki do Arch Linux possui boas instruções. Reinicie para fazer o login.

  2. Copie a fonte de um pequeno programa conhecido como 'ttyEcho'. Uma cópia pode ser encontrada aqui , mas uma pesquisa no Google traz muito mais. Este programa permite eco de comandos para outro terminal. Compile na máquina de destino.

  3. Agora que podemos executar o que quer que seja em / dev / tty1, podemos apenas fazer ./ttyEcho -n /dev/tty1 'cat > buffer'com que tudo que seja inserido no tty1 seja adicionado a um arquivo. Em vez de criar um arquivo em constante expansão, use mkfifo bufferprimeiro para gerar um arquivo especial que é apenas um pipe nomeado - uma fila FIFO que é suportada apenas pela memória.

  4. A partir da sua sessão SSH, agora você pode tail -f filenameassistir apenas a todas as entradas do teclado no tty1. No python, open('filename','r')continue ligando .read()ou .readline()para obter o feed dos dados do teclado conforme eles chegam.

Esse método foi ótimo para nós, pois evita a análise de scancode do teclado e mantém um bom e grande buffer de dados sem nenhum código.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.