Как я могу прочитать ввод с клавиатуры хоста при подключении через SSH?


10

В настоящее время я экспериментирую с устройством считывания карт RFID, которое имитирует клавиатуру. Когда вы подключаете карту, она считывает данные с нее, а затем эмулирует нажатия клавиш в соответствии с конфигурацией.

Я подключил это устройство к Raspberry Pi и подключился к Raspberry Pi через SSH.

Очевидно, что когда читатель теперь эмулирует нажатия клавиш, они приземляются на локальном tty Pi (а не на моем сеансе SSH). Так что сейчас мне сложно добраться до этого.

В конце концов, я напишу часть программного обеспечения для обработки ввода, но для целей отладки и разработки было бы весьма полезно получить ввод с клавиатуры в моем сеансе SSH.

Я попробовал следующее

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

Что делает дать некоторый вывод при подключении карты, но это не то , что я ожидал бы. Кажется, что это были бы необработанные входные данные. Я хотел бы получить ключи в качестве читаемых значений.

Данные, считываемые с /dev/inputустройства, имеют немного больше смысла при передаче по ним 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

Это должно было быть входом:7643fa46


если я понимаю ваш вопрос, я бы предположил, что в техническом смысле он имеет очень мало общего с ssh, и вы захотите какой-нибудь кейлоггер, возможно написанный на C, работающий на конечном компьютере, и затем вы запросите его когда вы ssh к конечному компьютеру.
Barlop

@ barlop: Если бы мне пришлось сделать это, чтобы достичь того, чего я хочу, то это не то, что я хочу сделать. Мне нужно будет написать «что-то», чтобы на самом деле получить ввод, в конце концов, я просто надеялся на быстрый подход, который позволил бы мне проверить эту настройку в ее текущем состоянии.
Der Hochstapler

было бы поразительно рисковать безопасностью, если бы ssh предоставлял такую ​​возможность, и я сомневаюсь, что по умолчанию есть встроенное приложение, связанное с дистрибутивом dest comp.
Бароп

1
@ barlop: Ну, я не ожидаю, что это будет работать без привилегий суперпользователя, это точно.
Der Hochstapler

Ответы:


8

Этот взломанный скрипт работает для меня сейчас:

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

Он использует python-evdev для чтения /dev/input/fooи очень грязно преобразует их в читаемые значения.

Вот что я получаю, когда запускаю скрипт и подключаю карту к ридеру:

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

4

Вот простой способ взломать его до следующей загрузки, если у вас есть необходимые привилегии.

Использование следующей команды показывает все процессы, запущенные на компьютере

ps -ef

Чтобы найти PID процесса login / getty, с которого в данный момент читается клавиатура, мы можем передать результаты этой функции через grep.

ps -ef | grep tty

Вы могли видеть что-то вроде

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

Обратите внимание на число во втором столбце - это PID. И шестой столбец, где находится клавиатура.

Чтобы остановить этот процесс, используйте следующую команду (подстановка номера для того, что бы ни был ваш PID)

kill -stop 23698

Теперь вы можете прочитать tty, откуда поступают клавиши клавиатуры (tty отображается в команде ps)

cat /dev/ttyO0

catБудет читать навсегда, выводя все , что вводится на клавиатуре, пока не убьете его.

Когда вы закончите и хотите вернуться к нормальному поведению, вы можете возобновить функцию клавиатуры с помощью

kill -cont 23698

Конечно, это обрисовывает в общих чертах общую идею. Вы можете использовать свою собственную программу для чтения из tty.


Когда я убиваю процесс / sbin / getty, он автоматически перезапускается
davidgyoung

2

Я должен был сделать это недавно для хакатона, поэтому я решил внести свой вклад в то, что мы в итоге сделали.

  1. Настройте autologin в качестве пользователя root на tty1 (основной терминал, куда устройство ввода данных вводит данные). В вики-записи Arch Linux есть хорошие инструкции. Перезагрузитесь, чтобы войти в систему.

  2. Скопируйте исходный код небольшой программы, известной как ttyEcho. Одна копия может быть найдена здесь , но поиск Google выявляет намного больше. Эта программа позволяет вам выводить команды на другой терминал. Компиляция на целевой машине.

  3. Теперь, когда мы можем запустить что угодно в / dev / tty1, мы можем просто ./ttyEcho -n /dev/tty1 'cat > buffer'получить все входные данные для tty1 для добавления в файл. Вместо того чтобы создавать постоянно расширяющийся файл, используйте mkfifo bufferсначала для создания специального файла, который является просто именованным каналом - очередь FIFO, которая поддерживается только памятью.

  4. С вашего SSH сеанса вы теперь можете просто tail -f filenameнаблюдать за всем вводом с клавиатуры на tty1. Изнутри python open('filename','r')и продолжайте звонить .read()или звонить .readline()по нему, чтобы получить поток данных клавиатуры, когда они поступают.

Этот метод был очень полезен для нас, поскольку он позволяет избежать синтаксического анализа клавиатуры и сохраняет большой большой буфер данных без какого-либо кода.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.