Có thể cho một sysadmin nghe lén thiết bị đầu cuối của người dùng của anh ấy / cô ấy không?


17

Khi đăng nhập vào máy, tôi có thể tìm ra (các) thiết bị đầu cuối giả của người dùng từ đầu ra của w. Là một sysadmin, tôi có thể nghe lén thiết bị đầu cuối này mà không cần người dùng biết không? Nói cách khác, tôi muốn xem mọi thứ được thực hiện trên thiết bị đầu cuối này là đầu ra trên thiết bị đầu cuối của riêng tôi.

Xin lưu ý những điều sau:

  • Đây không phải là trường hợp sử dụng thực tế để giám sát các hoạt động của người dùng: Tôi biết có các công cụ kiểm toán hệ thống cho việc đó. Tôi chỉ tò mò nếu nó có thể được thực hiện.
  • Tôi biết câu hỏi này và dường như nó không bao gồm những gì tôi đang hỏi vì tất cả các giải pháp được đề xuất đều có xâm lấn (người dùng sẽ nhận thức được những gì tôi đang làm) hoặc tạo ra quá nhiều tiếng ồn ( stracegiải pháp). Một giải pháp gần gũi là giải pháp gợi ý sử dụng gdb. Nhưng điều này chỉ cho phép tôi thấy thiết bị đầu cuối của thiết bị đầu cuối khác.

Những gì tôi đã cố gắng

Tôi đã thử điều này từ thiết bị đầu cuối của tôi:

tee /dev/pts/user_pts </dev/pts/user_pts

Điều này cho phép tôi xem từng ký tự mà người dùng nhập vào thiết bị đầu cuối giả khác khi họ nhập nó. Vấn đề là, cứ vài ký tự, nó sẽ "bỏ qua": nó sẽ hiển thị một ký tự giả mạo trên một thiết bị đầu cuối chứ không phải cái kia. Nó cũng ngăn chặn việc thực hiện bất kỳ lệnh nào từ thiết bị đầu cuối giả của người dùng. Tôi không thực sự chắc chắn tại sao điều này xảy ra và liệu có cách nào để cải thiện nó hay không.

Những gì tôi muốn thấy

USER TERMINAL        |    MY TERMINAL
$ echo "Test"        |    # slick_command_here
Test                 |    echo "Test"
$                    |    Test

1
Bạn muốn ttysnoophoặc có thể peekfd.
n. 'đại từ' m.

Câu trả lời:


11

Đó là fd cho phía chủ của thiết bị đầu cuối giả trong trình giả lập thiết bị đầu cuối mà bạn muốn theo dõi nếu bạn muốn xem những gì được hiển thị trên đó. Fd chính đó là những gì mô phỏng dây đi đến một thiết bị đầu cuối thực sự. Những gì xtermviết trên đó là các ký tự được tạo từ phím bạn nhấn. Những gì nó đọc từ nó là những gì nó hiển thị.

Chẳng hạn, trên Linux:

$ lsof -ac xterm /dev/ptmx
COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
xterm   15173 chazelas    4u   CHR    5,2      0t0 2131 /dev/ptmx

Và sau đó chạy ví dụ:

stty -echo -opost
strace -e read -e read=4 -p15173 2>&1 | stdbuf -o0 sh -c '
  grep "^ |" | cut -b11-60 | tr -d " " | xxd -r -p'

Tất nhiên, nó hoạt động tốt hơn nếu bạn chạy nó trong một thiết bị đầu cuối cùng loại và kích cỡ như thiết bị bạn đang cố gắng theo dõi. Bạn có thể nhận được kích thước với:

stty size < /dev/pts/that-terminal

Đó là bãi gì được đọc bởi xtermtừ phía chủ nhân của các thiết bị đầu cuối, vì vậy những gì được hiển thị ở đó, bao gồm cả các địa phương echovề những gì đang được gõ.

-e read=4trên là straceđể xuất ra một hexdump của những gì xtermđọc trên fd của nó 4. Phần còn lại của lệnh là để chuyển đổi nó thành các ký tự thực tế. Tôi đã cố gắng peekfd -n -8 15173 4nhưng vì một số lý do chỉ đưa ra những gì được viết.

Chúng tôi đang sử dụng -opostđể vô hiệu hóa bất kỳ quá trình xử lý hậu kỳ nào trong thiết bị đầu cuối giám sát của mình, để mọi thứ xxdghi vào phía nô lệ làm cho nó không thay đổi về phía chủ của chúng tôi, để việc giám sát của chúng tôi xtermcó được điều tương tự như giám sát. -echolà để nếu ứng dụng trong thiết bị đầu cuối được giám sát gửi một chuỗi thoát yêu cầu câu trả lời từ thiết bị đầu cuối (chẳng hạn như ứng dụng yêu cầu vị trí con trỏ hoặc loại thiết bị đầu cuối hoặc tiêu đề cửa sổ), điều đó sẽ đi đến giám sát xtermcủa chúng tôi và xtermý chí của chúng tôi trả lời là tốt Chúng tôi không muốn một tiếng vang địa phương về điều đó.

Bạn cũng có thể theo dõi những gì đang được gõ bằng cách truy tìm các writecuộc gọi hệ thống đến cùng fd đó (thay thế readbằng writeở trên). Lưu ý rằng khi nhấn Enter, trình giả lập thiết bị đầu cuối sẽ gửi một ký tự CR, không phải là LF. Ngoài ra, vì chúng tôi đang theo dõi ở phía chính, nếu người dùng gõ a<Backspace>b, chúng tôi sẽ thấy tất cả 3 tổ hợp phím ngay cả khi thiết bị đầu cuối ở chế độ chính tắc.

Về lý do tại sao bạn không làm việc:

tee /dev/pts/user_pts </dev/pts/user_pts

Đọc từ thiết bị đầu cuối là đọc đầu vào của người dùng và viết cho thiết bị đó là để hiển thị cho người dùng.

Bạn đang nói teeđể đọc từ thiết bị đầu cuối. Vì vậy, những gì nó đọc (đầu vào của người dùng) sẽ không phải là read(các) ứng dụng đang chạy trong thiết bị đầu cuối (và ngược lại, teevà điều đó applicationsẽ chiến đấu cho đầu vào thiết bị đầu cuối). Viết cho thiết bị đầu cuối, là để hiển thị ở đó, nó không phải là để đặt nó trở lại đó làm đầu vào. Khi bạn làm

echo test

(với echothiết bị xuất chuẩn là thiết bị đầu cuối), nó không giống như khi bạn gõ test.

Có một ioctl( TIOCSTI) để đặt lại các ký tự làm đầu vào, nhưng ngay cả điều đó sẽ không thực sự hoạt động vì bạn có thể đặt lại sau ứng dụng như đã đọc thêm, vì vậy nó sẽ thay đổi thứ tự ứng dụng đang đọc đầu vào, và bằng mọi cách, điều đó có nghĩa là bạn sẽ đọc đi đọc lại.


1
+1 Để giải thích và không sử dụng các công cụ bên ngoài. Tôi sẽ cần đọc một chút để hiểu nhiều phần trong câu trả lời của bạn, nhưng tôi cảm thấy đó là những gì tôi muốn.
Joseph R.

5

Nếu hệ điều hành của bạn hỗ trợ dtrace, thì một tập lệnh đơn giản, shellsnoop , sẽ cho phép bạn giám sát mọi thứ được gõ / in trên một tty nhất định.

Nếu bạn đang chạy Linux, ttysnoop đã từng làm một việc tương tự nhưng cần một cấu hình xâm nhập như một điều kiện tiên quyết và AFAIK không còn được hỗ trợ với các nhân hiện tại vì vậy sẽ không giúp ích gì trong trường hợp của bạn. Có nhiều hoặc ít nỗ lực nâng cao để cung cấp theo dõi động với Linux, systemtap, ktap và thậm chí dtrace để bạn có thể điều tra chúng.

Chỉnh sửa: Cẩn thận với peekfd , trang hướng dẫn của nó nêu:

Lỗi:

Có lẽ rất nhiều. Đừng ngạc nhiên nếu quá trình bạn đang theo dõi chết.


3

Cách tiếp cận này liên quan đến một chút gdb và tee. Ah, và nó cũng sử dụng socat để giả lập một thiết bị đầu cuối giả. Nó có thể hoạt động mà không có nó, nhưng người dùng sẽ nhận thấy rằng đầu ra của anh ấy / cô ấy không còn là thiết bị đầu cuối (các chương trình như vi sẽ phàn nàn).

Nó làm như sau:

  1. Tạo một thiết bị đánh chặn, sử dụng socat, nó lộ ra như một pty.
  2. Thiết bị chặn được kết nối với tee, sao chép luồng trong cả thiết bị đầu cuối $ sys và thiết bị đầu cuối $ usr.
  3. Gdb được sử dụng để thay thế các bộ mô tả tệp stdout / stderr để trỏ đến bộ chặn thay vì thiết bị đầu cuối $ usr.

Tôi nhận thấy rằng bash dường như viết những gì bạn gõ vào stderr, tôi không chắc các chương trình khác có làm như vậy không. Nếu đó là trường hợp, stdin không cần phải bị chặn.

Gọi nó như thế này : chmod +x /path/to/script; sudo /path/to/script <usr> <sys-adm>. usrsys-admlà tên của các thiết bị đầu cuối, ví dụ , /dev/pts/1. Vì vậy, một cuộc gọi mẫu sẽ như thế này : sudo /path/to/script /dev/pts/1 /dev/pts/2. Bạn có thể tìm ra thiết bị đầu cuối của bạn với ttylệnh. Và thiết bị đầu cuối người dùng có whoặc ps.

#!/bin/sh

[ "$1" ] || exit 1
[ "$2" ] || exit 1

usr=$1
sys=$2
utty=${1#/dev/}

ps -e -o tty= -o pid= -o user= | { 
    found_it=

    while read -r tty pid_sh owner; do
        if [ "$utty" = "$tty" ]; then
            found_it=y
            break;
        fi
    done

    [ "$found_it" ] || exit 1

    tmp=$(mktemp)
    tmp_gdb=$(mktemp)

    trap 'rm "$tmp" "$tmp_gdb"' EXIT

    socat PTY,link="$tmp",echo=0,raw,openpty,user="$owner",mode=0600 SYSTEM:"tee $sys > $usr"      &

    printf 'call dup2(open("%s", 1), 1)\ncall dup2(open("%s", 1), 2)
            detach\nquit\n' "$tmp" "$tmp" > "$tmp_gdb"
    gdb -p "$pid_sh" -x "$tmp_gdb" >/dev/null 2>&1 &

    wait
}

2

Có một chương trình C đơn giản gọi là xkey.c để hiển thị các khai thác của X11. Tôi sẽ cho bạn google nó. Bạn có thể chụp các tổ hợp phím trên xterm bằng cách sử dụng mà không cần người dùng biết về nó.


Tôi đã hy vọng cho một giải pháp giả lập thiết bị đầu cuối thực sự.
Joseph R.

xkey sẽ cung cấp cho bạn tổ hợp phím trên màn hình X. Đó sẽ là tất cả các xterms và bất kỳ tiện ích nào khác cần nhập bàn phím.
unxnut

Đúng. Tôi nghĩ bạn có nghĩa là xtermcụ thể.
Joseph R.
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.