Cuando inicie sesión en una máquina, puedo averiguar los dispositivos pseudo-terminales de cada usuario a partir de la salida de w
. Siendo un administrador de sistemas, ¿es posible que escuche a escondidas este terminal sin que el usuario lo sepa? En otras palabras, me gustaría ver todo lo que se hace en este terminal como salida en mi propio terminal.
Tenga en cuenta lo siguiente:
- Este no es un caso de uso práctico para monitorear las actividades de los usuarios: soy consciente de que existen herramientas de auditoría del sistema para eso. Tengo curiosidad por saber si se puede hacer.
- Soy consciente de esta pregunta y no parece cubrir lo que estoy preguntando, ya que todas las soluciones sugeridas son invasivas (el usuario estaría al tanto de lo que estoy haciendo) o producen demasiado ruido (el
strace
solución). La única solución que se acerca es la que sugiere usargdb
. Pero esto solo me permite ver stdout de la otra terminal.
Lo que he intentado
Intenté esto desde mi terminal:
tee /dev/pts/user_pts </dev/pts/user_pts
Esto me permite ver cada carácter que el usuario escribe en el otro pseudo-terminal a medida que lo escribe. El problema es que, cada pocos caracteres, se "saltaría": mostraría un carácter falso en un dispositivo terminal pero no en el otro. También evita la ejecución de cualquier comando desde el dispositivo pseudo terminal del usuario. No estoy muy seguro de por qué sucede esto y si hay una manera de mejorarlo.
Lo que me gustaria ver
USER TERMINAL | MY TERMINAL
$ echo "Test" | # slick_command_here
Test | echo "Test"
$ | Test
fuente
ttysnoop
o probablementepeekfd
.Respuestas:
Es el fd al lado maestro del pseudo-terminal en el emulador de terminal que desea monitorear si desea ver lo que se muestra en él. Ese maestro fd es lo que simula el cable que va a un terminal real. Lo que
xterm
escribe en él son los caracteres generados a partir de la tecla que presiona. Lo que lee de él es lo que muestra.Por ejemplo, en Linux:
Y luego ejecuta por ejemplo:
Por supuesto, funciona mejor si lo ejecuta en un terminal del mismo tipo y tamaño que el que está tratando de monitorear. Puedes obtener el tamaño con:
Que vuelca lo que se leen por
xterm
el lado del maestro de la terminal, así que lo que se muestra allí, incluyendo los localesecho
de lo que se está tecleando.Lo
-e read=4
anterior es parastrace
generar un volcado hexadecimal de lo que sexterm
lee en su fd 4. El resto del comando es convertir eso a los caracteres reales. Lo intentépeekfd -n -8 15173 4
pero por alguna razón eso solo dio lo que se estaba escribiendo.Estamos utilizando
-opost
para deshabilitar cualquier procesamiento posterior en nuestro terminal de monitoreo, de modo que todo lo que sexxd
escribe en el lado esclavo no cambie a nuestro lado maestro, de modo que nuestro monitoreoxterm
obtenga lo mismo que el monitoreado.-echo
es para que si la aplicación en el terminal monitoreado envía una secuencia de escape que solicita una respuesta del terminal (como las que solicitan la posición del cursor o el tipo de terminal o título de la ventana), que se abrirá paso a nuestro monitoreoxterm
y nuestraxterm
voluntad responde también. No queremos un eco local de eso.También puede monitorear lo que se está escribiendo al rastrear las
write
llamadas del sistema a ese mismo fd (reemplaceread
con elwrite
anterior). Tenga en cuenta que al presionar Enter, el emulador de terminal envía un carácter CR, no LF. Además, dado que estamos rastreando en el lado maestro, si el usuario escribea<Backspace>b
, veremos las 3 pulsaciones de teclas incluso si el dispositivo terminal está en modo canónico.En cuanto a por qué el tuyo no funciona:
Leer desde el dispositivo terminal es leer la entrada del usuario, y escribir en ella es mostrarla al usuario.
Estás diciendo
tee
que leas desde el dispositivo terminal. Entonces, lo que lee (la entrada del usuario) no seráread
por las aplicaciones que se ejecutan en el terminal (y viceversa,tee
y esoapplication
luchará por la entrada del terminal). Escribir en el dispositivo terminal es para mostrarlo allí, no para volverlo a poner como entrada. Cuando tu lo hagas(con
echo
stdout como terminal), no es lo mismo que si hubiera escritotest
.Hay un
ioctl
(TIOCSTI
) para volver a colocar los caracteres como entrada, pero incluso eso no funcionaría realmente porque podría volver a ponerlo después de la aplicación, ya que ya se leyó un poco más, por lo que cambiaría el orden en que la aplicación está leyendo la entrada, y de cualquier manera, eso significaría que lo leerías una y otra vez.fuente
Si su sistema operativo es compatible con dtrace, ese simple script, shellsnoop , debería permitirle monitorear todo lo escrito / impreso en un tty dado.
Si está ejecutando Linux, ttysnoop solía hacer algo similar, pero necesitaba una configuración intrusiva como requisito previo y AFAIK ya no es compatible con los núcleos actuales de todos modos, por lo que no ayudará en su caso. Hay intentos más o menos avanzados para proporcionar un seguimiento dinámico con Linux, systemtap, ktap e incluso dtrace para que pueda investigarlos.
Editar: Cuidado con peekfd , su página de manual dice:
Loco:
Probablemente muchos. No se sorprenda si el proceso que está monitoreando muere.
fuente
Este enfoque implica un poco de gdb y tee. Ah, y también usa socat para emular un pseudo-terminal. Podría funcionar sin él, pero el usuario notará que su salida ya no es una terminal (los programas como vi se quejarán).
Hace lo siguiente:
Me di cuenta de que bash parece escribir lo que escribes en stderr, no estoy seguro de si otros programas hacen lo mismo. Si ese es el caso, stdin no tiene que ser interceptado.
Llamarlo así:
chmod +x /path/to/script; sudo /path/to/script <usr> <sys-adm>
.usr
ysys-adm
son los nombres de los terminales, por ejemplo/dev/pts/1
,. Por lo que una llamada de ejemplo sería el siguiente:sudo /path/to/script /dev/pts/1 /dev/pts/2
. Puedes encontrar tu terminal con eltty
comando. Y el terminal de usuario conw
ops
.fuente
Hay un programa simple en C llamado xkey.c para mostrar los exploits de X11. Te dejaré googlearlo. Puede capturar las pulsaciones de teclas en un xterm usando esto sin que el usuario lo sepa.
fuente
xterm
específicamente.