Làm cách nào tôi có thể đọc dữ liệu nhập từ bàn phím máy chủ khi được kết nối qua SSH?


10

Tôi hiện đang thử nghiệm với đầu đọc thẻ RFID mô phỏng bàn phím. Khi bạn kết nối một thẻ, nó sẽ đọc dữ liệu từ nó và sau đó mô phỏng tổ hợp phím theo cấu hình.

Tôi đã kết nối thiết bị này với Raspberry Pi và kết nối với Raspberry Pi thông qua SSH.

Rõ ràng, khi người đọc bây giờ mô phỏng tổ hợp phím, họ sẽ truy cập vào tty cục bộ của Pi (chứ không phải trong phiên SSH của tôi). Vì vậy, tôi đang có một thời gian khó khăn để có được đầu vào đó ngay bây giờ.

Cuối cùng, tôi sẽ viết một phần mềm để xử lý đầu vào, nhưng với mục đích gỡ lỗi và phát triển, sẽ rất hữu ích khi lấy đầu vào bàn phím trong phiên SSH của tôi.

Tôi đã thử như sau

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

Điều này mang lại một số đầu ra khi tôi kết nối thẻ, nhưng đó không phải là điều tôi mong đợi. Có vẻ như đó sẽ là dữ liệu đầu vào thô. Tôi rất thích lấy các khóa làm giá trị có thể đọc được.

Dữ liệu đang được đọc từ /dev/inputthiết bị có ý nghĩa hơn một chút khi đưa nó qua 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

Đó phải là đầu vào:7643fa46


Nếu tôi hiểu câu hỏi của bạn, tôi đoán rằng theo nghĩa kỹ thuật, nó có rất ít liên quan đến ssh và bạn muốn một loại keylogger nào đó có thể được viết bằng C, chạy trên máy tính đích và sau đó bạn truy vấn nó khi bạn ssh đến máy tính đích.
barlop

@barlop: Nếu tôi phải làm điều đó để đạt được những gì tôi muốn, thì đó không phải là điều tôi muốn làm. Tôi sẽ phải viết "một cái gì đó" để thực sự lấy đầu vào cuối cùng, tôi chỉ hy vọng một cách tiếp cận nhanh chóng cho phép tôi kiểm tra thiết lập này trong trạng thái hiện tại.
Der Hochstapler

Sẽ là một rủi ro bảo mật đáng kinh ngạc nếu ssh cung cấp một tính năng để làm điều đó và tôi nghi ngờ có một ứng dụng gốc được đóng gói với bản phân phối của số phận theo mặc định.
barlop

1
@barlop: Chà, tôi không hy vọng nó hoạt động mà không có đặc quyền siêu người dùng, đó là điều chắc chắn.
Der Hochstapler

Câu trả lời:


7

Kịch bản hack này cùng hoạt động với tôi bây giờ:

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

Nó sử dụng python-evdev để đọc /dev/input/foovà chuyển đổi rất bẩn thỉu chúng thành các giá trị có thể đọc được.

Đây là những gì tôi nhận được khi chạy tập lệnh và kết nối thẻ với đầu đọc:

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

3

Đây là một cách hack đơn giản để làm cho nó hoạt động dễ dàng cho đến lần khởi động tiếp theo, giả sử bạn có các đặc quyền cần thiết.

Sử dụng lệnh sau cho thấy tất cả các quy trình đang chạy trên máy tính

ps -ef

Để tìm ra PID của quá trình đăng nhập / getty từ nơi bàn phím hiện đang đọc, chúng ta có thể chuyển kết quả của chức năng này thông qua grep.

ps -ef | grep tty

Bạn có thể thấy một cái gì đó như

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

Lưu ý số trong cột thứ hai - đó là PID. Và cột thứ sáu, đó là nơi bàn phím.

Để tạm dừng quá trình đó, hãy sử dụng lệnh sau (thay thế số cho bất cứ điều gì PID của bạn)

kill -stop 23698

Bây giờ, bạn có thể đọc tty từ nơi các phím bàn phím đang đến (tty được hiển thị trong lệnh ps)

cat /dev/ttyO0

Các catsẽ đọc mãi mãi, xuất ra bất cứ điều gì được nhập trên bàn phím, cho đến khi bạn giết nó.

Khi bạn đã hoàn tất và muốn trở lại hoạt động bình thường, bạn có thể tiếp tục chức năng bàn phím với

kill -cont 23698

Tất nhiên điều đó phác thảo ý tưởng chung. Bạn có thể sử dụng chương trình của riêng bạn để đọc từ tty.


Khi tôi giết tiến trình / sbin / getty, nó sẽ tự động khởi động lại
davidgyoung

1

Phải làm điều này gần đây cho một Hackathon, vì vậy tôi nghĩ rằng tôi sẽ đóng góp những gì chúng ta đã làm.

  1. Thiết lập autologin làm root trên tty1 (thiết bị đầu cuối chính nơi thiết bị bàn phím đang bỏ đầu vào của nó). Mục wiki Arch Linux có hướng dẫn tốt. Khởi động lại để có được nó để đăng nhập.

  2. Sao chép nguồn của một chương trình nhỏ được gọi là 'ttyEcho'. Một bản sao có thể được tìm thấy ở đây , nhưng một tìm kiếm Google mang đến nhiều hơn nữa. Chương trình này cho phép bạn lặp lại các lệnh đến một thiết bị đầu cuối khác. Biên dịch trên máy đích.

  3. Bây giờ chúng tôi có thể chạy bất cứ thứ gì trên / dev / tty1, chúng tôi chỉ có thể ./ttyEcho -n /dev/tty1 'cat > buffer'lấy mọi thứ đầu vào trên tty1 để được thêm vào một tệp. Thay vì tạo một tệp đang mở rộng, mkfifo buffertrước tiên hãy sử dụng để tạo một tệp đặc biệt chỉ là một ống có tên - hàng đợi FIFO chỉ được hỗ trợ bởi bộ nhớ.

  4. Từ phiên SSH của bạn, bây giờ bạn có thể chỉ tail -f filenameđể xem tất cả đầu vào bàn phím trên tty1. Từ bên trong python, open('filename','r')và tiếp tục gọi .read()hoặc .readline()vào nó để lấy nguồn cấp dữ liệu bàn phím khi nó đến.

Phương pháp này rất tốt cho chúng tôi vì nó tránh được việc phân tích cú pháp bàn phím và giữ một bộ đệm dữ liệu lớn đẹp mà không cần bất kỳ mã nào.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.