ฉันจะอ่านอินพุตจากคีย์บอร์ดโฮสต์เมื่อเชื่อมต่อผ่าน SSH ได้อย่างไร


10

ขณะนี้ฉันกำลังทดลองกับเครื่องอ่านบัตร RFID ที่เลียนแบบแป้นพิมพ์ เมื่อคุณเชื่อมต่อการ์ดมันจะอ่านข้อมูลจากนั้นทำการจำลองการกดแป้นตามการกำหนดค่า

ฉันเชื่อมต่ออุปกรณ์นี้กับ Raspberry Pi และเชื่อมต่อกับ Raspberry Pi ผ่าน SSH

เห็นได้ชัดว่าเมื่อผู้อ่านเลียนแบบการกดแป้นพิมพ์พวกเขาลงจอดบน 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 ให้คุณสมบัติที่จะทำและฉันสงสัยว่ามีแอปดั้งเดิมที่มาพร้อมกับ dist comp ของ dest comp โดยค่าเริ่มต้น
barlop

1
@barlop: ดีฉันไม่คาดหวังว่ามันจะทำงานโดยไม่ได้รับสิทธิ์ superuser แน่นอนว่า
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 ของกระบวนการเข้าสู่ระบบ / 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

ต้องทำสิ่งนี้เมื่อเร็ว ๆ นี้สำหรับ Hackathon ดังนั้นฉันจึงคิดว่าฉันจะมีส่วนร่วมในสิ่งที่เราทำ

  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 ได้แล้ว จากภายในไพ ธ อนopen('filename','r')และโทร.read()หรือ.readline()ต่อไปเพื่อรับฟีดข้อมูลแป้นพิมพ์ตามที่มันเข้ามา

วิธีนี้เป็นวิธีที่ยอดเยี่ยมสำหรับเราเนื่องจากมันหลีกเลี่ยงการแยกวิเคราะห์แบบแป้นพิมพ์และเก็บบัฟเฟอร์ขนาดใหญ่ไว้โดยไม่มีรหัส

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.