Для системного администратора действительно ли возможно подслушать терминалы его пользователей?

Завися, какую программу Вы используете для теста, удостоверьтесь, что вывод установлен на pcm4/5. Возможно, что это пытается произвести аудио по HDMI соединение на Вашей видеокарте. Первые 3 записи являются аудио на видеокарте. Можно также проверить, чтобы видеть, регулируется ли громкость достаточно высоко.

17
13.04.2017, 15:36
4 ответа

Это - 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 производить hexdump какой xterm чтения на его fd 4. Остальная часть команды должна преобразовать это в фактические символы. Я попробовал peekfd -n -8 15173 4 но по некоторым причинам который только дал то, что писалось.

Мы используем -opost отключить любую последующую обработку в нашем контрольном терминале, так, чтобы все xxd записи ведомой стороне делают это неизменным нашей основной стороне, так, чтобы наш контроль xterm получает то же самое как контролируемое. -echo то, так, чтобы, если приложение в контролируемом терминале отправляет escape-последовательность, которая запрашивает ответ от терминала (такого как те, которые запрашивают позицию курсора или терминальный тип или заголовок окна), который пробьется к нашему контролю xterm и наш xterm ответит также. Мы не хотим локальное эхо этого.

Вы могли также контролировать то, что вводится путем трассировки write системные вызовы того же самого fd (замена read с write выше). Обратите внимание, что после нажатия Enter, эмулятор терминала отправляет символ CR, не LF. Кроме того, так как мы прослеживаем на основной стороне, если пользователь вводит a<Backspace>b, мы будем видеть все 3 нажатий клавиш, даже если оконечное устройство будет в каноническом режиме.

Относительно того, почему Ваш не работает:

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

Чтение из оконечного устройства читает ввод данных пользователем и пишет в него, должен отобразить его пользователю.

Вы говорите tee читать из оконечного устройства. Таким образом, то, что это читает (ввод данных пользователем) не будет read приложением (приложениями), работающим в терминале (и vis стих, tee и это application будет бороться за терминальный вход). Пишущий в оконечное устройство, для дисплея там, это не для откладывания его там, как введено. Когда Вы делаете

echo test

echoтак как stdout является терминалом), это не то же самое, как будто Вы ввели test.

Существует ioctl (TIOCSTI) для откладывания символов, как введено, но даже который действительно не работал бы, потому что Вы могли отложить его после приложения, как уже считано еще немного, таким образом, это изменит порядок, приложение читает вход и любой путь, который означал бы, чтение его много раз.

11
27.01.2020, 19:47
  • 1
    +1 Для объяснения и для того, чтобы не использовать внешние инструменты. Я должен буду сделать немного чтения для понимания многих частей ответа, но я чувствую, что это вроде того, что я хочу. Выполнение –  Joseph R. 04.08.2013, 02:12

Если Ваша ОС поддерживает dtrace, что простой сценарий, shellsnoop, должен позволить Вам контролировать, все вводило/печатало на данном tty.

При выполнении Linux ttysnoop раньше делал подобную вещь, но нуждался в навязчивой конфигурации как в предпосылке и не является AFAIK, более поддерживаемым с текущими ядрами так или иначе, так не поможет в случае. Там более или менее совершенствуются попытки предоставить динамической трассировке Linux, systemtap, ktap и даже dtrace, таким образом, Вы могли бы исследовать их.

Править: Остерегайтесь peekfd, его страница руководства указывает:

Ошибки:

Вероятно, партии. Не удивляйтесь, умирает ли процесс, который Вы контролируете.

5
27.01.2020, 19:47

Этот подход включает немного gdb и мишени. А-ч, и это также использует socat для эмуляции псевдотерминала. Это могло работать без него, но пользователь заметит, что его вывод больше не является терминалом (программы как vi будут жаловаться).

Это делает следующее:

  1. Создайте перехватчик, с помощью socat, который выставляет себя как имущество.
  2. Перехватчик подключен к мишени, которая копирует потоки и в терминале $sys и в терминале $usr.
  3. Gdb используется для замены stdout/stderr дескрипторов файлов для указания на перехватчик вместо терминала $usr.

Я заметил, что удар, кажется, пишет то, что Вы вводите к 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
}
3
27.01.2020, 19:47

Существует простая программа C, названная xkey.c для показа использования X11. Я позволю Вам погуглить его. Можно получить нажатия клавиш на xterm, использующем это без пользователя, являющегося знающим об этом.

2
27.01.2020, 19:47
  • 1
    , я надеялся на агностическое эмулятором терминала решение на самом деле. –  Joseph R. 04.08.2013, 20:46
  • 2
    xkey даст, Вы нажимаете на X дисплеях. Это будет всем xterms и любой другой утилитой, которой нужен ввод с клавиатуры. –  unxnut 04.08.2013, 21:02
  • 3
    Право. Я думал, что Вы имели в виду xterm конкретно. –  Joseph R. 04.08.2013, 21:12

Теги

Похожие вопросы