sysadmin이 사용자의 단말기를 도청 할 수 있습니까?


17

컴퓨터에 로그인하면의 출력에서 ​​각 사용자의 의사 터미널 장치를 찾을 수 있습니다 w. sysadmin이기 때문에 사용자가 몰라도이 터미널을 도청 할 수 있습니까? 즉,이 터미널에서 수행되는 모든 작업을 내 터미널에서 출력하는 것으로보고 싶습니다.

다음 사항에 유의하십시오.

  • 이것은 사용자 활동을 모니터링하는 실제 사용 사례가 아닙니다. 시스템 감사 도구가 있다는 것을 알고 있습니다. 그것이 가능하다면 궁금합니다.
  • 나는 이 질문에 대해 알고 있으며 침습적 (사용자가 내가하고있는 일을 알고있을 것입니다) 또는 너무 많은 소음 ( strace해결책). 가장 가까운 솔루션은 사용을 제안하는 솔루션입니다 gdb. 그러나 이것은 단지 다른 터미널의 표준을 볼 수있게합니다.

내가 시도한 것

나는 이것을 터미널에서 시도했다.

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

이를 통해 사용자가 다른 의사 터미널에서 입력하는 각 문자를 볼 수 있습니다. 문제는 몇 문자마다 "건너 뛰기"입니다. 한 터미널 장치에는 하나의 불량 문자가 표시되지만 다른 장치에는 표시되지 않습니다. 또한 사용자의 유사 터미널 장치에서 명령이 실행되는 것을 방지합니다. 왜 이런 일이 발생하는지, 개선 방법이 있는지 잘 모르겠습니다.

내가보고 싶은 것

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

1
당신은 ttysnoop아마 또는 아마 peekfd.
n. '대명사'm.

답변:


11

터미널 에뮬레이터에서 의사 터미널의 마스터 측에 대한 fd입니다. 그 마스터 fd는 실제 터미널로가는 와이어를 시뮬레이션하는 것입니다. xterm그것에 쓰는 것은 당신이 누르는 키에서 생성 된 문자입니다. 읽은 내용이 표시됩니다.

예를 들어, 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

그런 다음 예를 들어 실행하십시오.

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'

물론 모니터하려는 터미널과 동일한 유형 및 크기의 터미널에서 실행하면 더 효과적입니다. 크기는 다음과 같습니다.

stty size < /dev/pts/that-terminal

터미널의 마스터 측에서 읽은 내용 xterm을 덤프 하므로 표시 echo되는 내용 의 로컬 을 포함하여 표시 되는 내용이 덤프 됩니다 .

-e read=4위입니다 strace무엇의 16 진 덤프 출력 xterm의 FD 4. 명령의 나머지 읽기는 실제 문자가 변환하는 것입니다. 나는 시도 peekfd -n -8 15173 4했지만 어떤 이유로 쓰여지고있는 것을주었습니다.

우리가 사용하고있는 -opost그 모든 것을, 그래서 우리는 터미널 모니터링에 사후 처리를 사용하지 않도록 xxd우리의 모니터링이 그래서, 슬레이브 측에 쓰기가 우리의 마스터 측에이 변화하게 xterm(가) 하나를 감시 같은 일을 가져옵니다. -echo모니터링되는 터미널의 응용 프로그램이 터미널에서 응답을 요청하는 이스케이프 시퀀스 (예 : 커서 위치 또는 터미널 유형 또는 창 제목을 요청하는 이스케이프 시퀀스)를 보내면 모니터링 xtermxterm의사 결정에 도움이됩니다. 회신하십시오. 우리는 그 지역의 반향을 원하지 않습니다.

또한 추적하여 무엇이 입력되고 있는지를 모니터링 할 수있다 write(대체 같은 FD에 시스템 호출 readwrite위). 를 누르면 Enter터미널 에뮬레이터가 LF가 아닌 CR 문자를 보냅니다. 또한 마스터 측에서 추적하기 때문에 사용자가 a<Backspace>b입력하면 터미널 장치가 표준 모드 인 경우에도 세 번의 키 입력이 모두 표시됩니다.

왜 작동하지 않는지에 관해서 :

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

터미널 장치에서 읽는 것은 사용자 입력을 읽고 있으며, 쓰는 것은 사용자에게 표시하는 것입니다.

당신은 이야기하고 tee, 단말 장치에서 읽을 수 있습니다. 따라서 읽은 것 (사용자 입력)은 read터미널에서 실행되는 응용 프로그램 ( tee및 그 반대로 )이 아니며 application터미널 입력을 위해 싸울 것입니다. 터미널 장치에 쓰는 것은 거기에 표시하기위한 것이며 입력으로 다시 넣는 것이 아닙니다. 당신이 할 때

echo test

( echostdout이 터미널 인 경우) 입력 한 것과 동일하지 않습니다 test.

이 인 ioctl( TIOCSTI) 넣어 문자 입력으로 백업하지만, 심지어 정말 일이 다시 넣을 수 없습니다 때문에 이후에 이미 좀 더 읽기로 응용 프로그램이 입력을 읽고 순서를 변경 할 수 있도록, 응용 프로그램, 그리고 어떤 식 으로든, 그것은 당신이 그것을 반복해서 읽을 것이라는 것을 의미합니다.


1
+1 설명 및 외부 도구를 사용하지 않습니다. 나는 당신의 대답의 많은 부분을 이해하기 위해 약간의 독서를해야 할 것이지만, 그것이 내가 원하는 것의 선을 따른다고 생각합니다.
Joseph R.

5

OS가 dtrace를 지원하는 경우 간단한 스크립트 shellsnoop 은 주어진 tty에서 입력 / 인쇄 된 모든 것을 모니터링 할 수 있어야합니다.

Linux를 실행하는 경우 ttysnoop 은 비슷한 작업을 수행했지만 사전 요구 사항으로 침입 구성이 필요했으며 AFAIK는 현재 커널에서 더 이상 지원되지 않으므로 귀하의 경우에는 도움이되지 않습니다. Linux, systemtap, ktap 및 dtrace를 사용하여 동적 추적을 제공하려는 고급 시도가 다소 많으므로 조사 할 수 있습니다.

편집 : peekfd 조심 , 매뉴얼 페이지 상태 :

버그 :

아마 많이. 모니터링하는 프로세스가 죽어도 놀라지 마십시오.


3

이 접근법에는 약간의 gdb와 티가 포함됩니다. 아, 그리고 그것은 또한 의사 터미널을 모방하기 위해 socat을 사용합니다. 그것 없이는 작동 할 수 있지만, 사용자는 자신의 출력이 더 이상 터미널이 아니라는 것을 알 수 있습니다 (vi와 같은 프로그램은 불평합니다).

다음을 수행합니다.

  1. socat을 사용하여 인터셉터를 작성하십시오.
  2. 인터셉터는 $ sys 터미널과 $ usr 터미널 모두에서 스트림을 복제하는 티에 연결됩니다.
  3. Gdb는 $ usr 터미널 대신 인터셉터를 가리 키도록 stdout / stderr 파일 디스크립터를 대체하는 데 사용됩니다.

bash는 stderr에 입력 한 내용을 쓰는 것으로 나타났습니다. 다른 프로그램이 동일한 지 확실하지 않습니다. 이 경우 stdin을 가로 챌 필요가 없습니다.

다음과 같이 호출하십시오 chmod +x /path/to/script; sudo /path/to/script <usr> <sys-adm>. usr그리고 sys-adm예를 들면, 단말의 명칭은,이다 /dev/pts/1. 따라서 샘플 호출은 다음과 같습니다 sudo /path/to/script /dev/pts/1 /dev/pts/2. tty명령으로 터미널을 찾을 수 있습니다 . 상기 사용자 단말과 하나 w또는 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

X11의 악용을 보여주는 xkey.c라는 간단한 C 프로그램이 있습니다. 나는 당신에게 구글을 보자. 사용자가이를 모르는 상태에서이를 사용하여 xterm에서 키 입력을 캡처 할 수 있습니다.


실제로 터미널 에뮬레이터와 무관 한 솔루션을 원했습니다.
Joseph R.

xkey는 X 디스플레이에서 키 입력을 제공합니다. 그것은 모든 xterm과 키보드 입력이 필요한 다른 유틸리티입니다.
unxnut

권리. 나는 당신이 xterm구체적으로 의미한다고 생각했습니다 .
Joseph R.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.