컴퓨터에 로그인하면 w
. 시스템 관리자로서 사용자 몰래 이 단말기를 엿들을 수 있나요? 즉, 해당 터미널에서 수행된 모든 작업을 내 터미널의 출력으로 보고 싶습니다.
다음 사항에 유의하세요.
- 이는 사용자 활동을 모니터링하는 실제 사용 사례에는 적용되지 않습니다. 이 목적을 위한 시스템 감사 도구가 있다는 것을 알고 있습니다. 할 수 있는지 궁금합니다.
- 알아요이 문제
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
터미널 에뮬레이터에 표시되는 내용을 보려면 해당 터미널 에뮬레이터에서 의사 터미널 기본 측면의 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
fd 4 에서 읽은 strace
내용의 16진수 덤프를 출력합니다 xterm
. 나머지 명령은 이를 실제 문자로 변환하는 것입니다. 나는 시도했지만 peekfd -n -8 15173 4
어떤 이유로 쓰여진 것만 제공합니다.
-opost
모니터링 터미널에서 후처리를 비활성화하여 슬레이브 xxd
측에 기록된 모든 내용이 마스터 측에서 변경되지 않도록 하여 모니터링이 xterm
모니터링된 것과 동일한 결과를 얻도록 합니다. -echo
문제는 모니터링되는 터미널의 애플리케이션이 터미널로부터 응답을 요청하기 위해 이스케이프 시퀀스를 보내는 경우(예: 커서 위치, 터미널 유형 또는 창 제목을 요청하는 것), 이는 우리의 모니터링 xterm
과 xterm
의지 에 들어옵니다. 회신하다. 우리는 이런 일이 로컬에서 일어나는 것을 원하지 않습니다.
write
동일한 read
fd 에 대한 시스템 호출을 추적하여 입력 중인 내용(위 내용 대체)을 모니터링 할 수도 있습니다 write
. 를 누르면 Enter터미널 에뮬레이터가 LF 대신 CR 문자를 보냅니다. 또한 우리는 메인 측에서 추적하고 있기 때문에 사용자가 를 입력하면 a<Backspace>b
최종 장치가 표준 모드에 있더라도 3개의 키 입력이 모두 표시됩니다.
귀하의 것이 작동하지 않는 이유는 다음과 같습니다.
tee /dev/pts/user_pts </dev/pts/user_pts
터미널 장치에서 읽는 것은 사용자 입력을 읽는 것이고, 쓰는 것은 이를 사용자에게 표시하는 것입니다.
tee
터미널 장치에서 읽으라고 지시합니다 . 따라서 읽는 내용(사용자 입력)은 read
터미널에서 실행 중인 응용 프로그램에서 읽히지 않습니다(그 반대의 경우 tee
도 application
터미널 입력을 위해 경쟁하게 됩니다). 터미널 장치에 쓰는 것은 표시하기 위한 것이지 입력으로 다시 넣기 위한 것이 아닙니다. 당신이 할 때
echo test
( echo
stdout이 터미널임) 입력한 내용과 다릅니다 test
.
ioctl
문자를 다시 입력에 넣을 수 있는 ( ) 가 있는데 TIOCSTI
, 그래도 다시 넣을 수 있어서 작동하지 않습니다.뒤쪽에애플리케이션이 더 많은 내용을 읽었으므로 애플리케이션이 입력을 읽는 순서가 변경됩니다. 즉, 어쨌든 계속해서 다시 읽게 된다는 의미입니다.
답변2
운영 체제가 dtrace를 지원하는 경우 다음은 간단한 스크립트입니다.쉘 엿보기, 주어진 tty에 입력/인쇄된 모든 것을 모니터링할 수 있어야 합니다.
Linux를 실행하는 경우,티스눕비슷한 일이 이전에 수행되었지만 전제 조건으로 방해적인 구성이 필요했으며 현재 커널은 더 이상 이를 지원하지 않으므로 귀하의 경우에는 도움이 되지 않습니다. Linux, systemtap, ktap, 심지어 dtrace를 사용하여 동적 추적을 제공하려는 다소 진보된 시도가 있으므로 이를 연구할 수 있습니다.
편집하다:조심하다엿보기 FD, 매뉴얼 페이지에 다음과 같이 명시되어 있습니다.
실수:
아마 많이. 모니터링하고 있는 프로세스가 종료되더라도 놀라지 마십시오.
답변3
이 방법에는 일부 gdb와 tee가 포함됩니다. 아, 또한 socat을 사용하여 의사 터미널을 시뮬레이션합니다. 그것 없이도 작동하지만 사용자는 자신의 출력이 더 이상 터미널에 없다는 것을 알게 될 것입니다(vi와 같은 프로그램은 불평할 것입니다).
다음을 수행합니다.
- socat을 사용하여 자신을 pty로 노출하는 인터셉터를 만듭니다.
- 인터셉터는 $sys 터미널과 $usr 터미널의 스트림을 복사하는 tee에 연결됩니다.
- 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
}
답변4
X11 취약점을 보여주는 xkey.c라는 간단한 C 프로그램이 있습니다. Google에 알려 드리겠습니다. 이를 사용하여 사용자가 인식하지 못하는 사이에 xterm의 키 입력을 캡처할 수 있습니다.