Wenn ich bei einem Computer angemeldet bin, kann ich die Pseudo-Endgeräte aller Benutzer aus der Ausgabe von herausfinden w
. Kann ich als Sysadmin dieses Terminal abhören, ohne dass der Benutzer es merkt? Mit anderen Worten, ich möchte alles, was auf diesem Terminal ausgeführt wird, als Ausgabe auf meinem eigenen Terminal sehen.
Bitte beachten Sie Folgendes:
- Dies ist kein praktischer Anwendungsfall für die Überwachung von Benutzeraktivitäten: Ich bin mir bewusst, dass es dafür Systemüberwachungs-Tools gibt. Ich bin nur gespannt, ob es geht.
- Ich bin mir dieser Frage bewusst und es scheint nicht zu decken, wonach ich frage, da alle dort vorgeschlagenen Lösungen entweder invasiv sind (der Benutzer würde sich dessen bewusst sein, was ich tue) oder zu viel Lärm erzeugen (die)
strace
Lösung). Die eine Lösung, die nahe kommt, ist die, die die Verwendung vorschlägtgdb
. Damit sehe ich aber nur die stdout des anderen Terminals.
Was ich probiert habe
Ich habe das von meinem Terminal aus versucht:
tee /dev/pts/user_pts </dev/pts/user_pts
Dadurch kann ich jedes Zeichen sehen, das der Benutzer in das andere Pseudoterminal eingibt, während er es eingibt. Das Problem ist, alle paar Zeichen würde es "überspringen": Es würde ein Schurkenzeichen auf einem Endgerät zeigen, aber nicht das andere. Es verhindert auch die Ausführung von Befehlen vom Pseudo-Endgerät des Benutzers. Ich bin mir nicht sicher, warum dies geschieht und ob es einen Weg gibt, es zu verbessern.
Was ich gerne sehen würde
USER TERMINAL | MY TERMINAL
$ echo "Test" | # slick_command_here
Test | echo "Test"
$ | Test
quelle
ttysnoop
oder wahrscheinlichpeekfd
.Antworten:
Es ist der FD zur Masterseite des Pseudoterminals im Terminalemulator, den Sie überwachen möchten, wenn Sie sehen möchten, was darauf angezeigt wird. Dieser Master fd simuliert den Draht, der zu einem realen Anschluss führt. Was darauf
xterm
schreibt, sind die Zeichen, die aus der von Ihnen gedrückten Taste generiert werden. Was es davon liest, ist das, was es anzeigt.Zum Beispiel unter Linux:
Und dann zum Beispiel:
Natürlich funktioniert es besser, wenn Sie das auf einem Terminal ausführen, das den gleichen Typ und die gleiche Größe hat wie das, das Sie überwachen möchten. Sie können die Größe erhalten mit:
Das gibt aus, was von der Masterseite des Terminals gelesen wird
xterm
, also was dort angezeigt wird, einschließlich der lokalenecho
Eingabe.Das
-e read=4
obige dientstrace
dazu, einen Hexdump von dem auszugeben, wasxterm
auf seinem fd 4 steht. Der Rest des Befehls besteht darin, dies in die tatsächlichen Zeichen umzuwandeln. Ich habe es versucht,peekfd -n -8 15173 4
aber aus irgendeinem Grund gab es nur das, was geschrieben wurde.Wir
-opost
deaktivieren alle Nachbearbeitungen in unserem Überwachungsterminal, damit allexxd
Schreibvorgänge auf der Slave-Seite unverändert auf der Master-Seite ablaufen, sodass unsere Überwachungxterm
mit der überwachten identisch ist.-echo
Wenn die Anwendung im überwachten Terminal eine Escape-Sequenz sendet, die eine Antwort vom Terminal anfordert (z. B. diejenigen, die die Cursorposition oder den Terminaltyp oder den Fenstertitel anfordern), gelangt dies zu unserer Überwachungxterm
und unseremxterm
Testament antworte auch. Wir wollen kein lokales Echo davon.Sie können auch überwachen , was durch Verfolgen der getippt werden
write
Systemaufrufe zu gleichen fd (ersetzenread
mitwrite
oben). Beachten Sie, dass Enterder Terminalemulator beim Drücken von ein CR-Zeichen und nicht LF sendet. Da wir auf der Masterseite nachverfolgen, werdena<Backspace>b
alle 3 Tastenanschläge angezeigt, auch wenn sich das Endgerät im kanonischen Modus befindet, wenn der Benutzer tippt.Warum funktioniert deins nicht?
Beim Lesen vom Endgerät wird die Benutzereingabe gelesen, und beim Schreiben wird sie dem Benutzer angezeigt.
Sie möchten
tee
vom Endgerät lesen. Das, was es liest (die Benutzereingabe), wird also nichtread
von der / den Anwendung (en) im Terminal ausgeführt (und umgekehrt,tee
und dasapplication
kämpft um die Terminaleingabe). Schreiben auf das Endgerät, dient dort zur Anzeige, nicht zum Zurücklegen als Eingabe. Wenn Sie das tun(wobei
echo
stdout das Terminal ist), ist es nicht dasselbe, als ob Sie getippt hättentest
.Es gibt ein
ioctl
(TIOCSTI
) zum Zurücksetzen von Zeichen als Eingabe, aber selbst das würde nicht wirklich funktionieren, da Sie es nach dem Lesen der Anwendung zurücksetzen könnten , so dass sich die Reihenfolge ändert, in der die Anwendung Eingaben liest. das würde bedeuten, dass Sie es immer und immer wieder lesen würden.quelle
Wenn Ihr Betriebssystem dtrace unterstützt , sollten Sie mit einem einfachen Skript, shellsnoop , alles überwachen können, was auf einem bestimmten tty geschrieben / gedruckt ist.
Wenn Sie Linux verwenden, hat ttysnoop eine ähnliche Aktion ausgeführt , aber eine aufdringliche Konfiguration als Voraussetzung benötigt. AFAIK wird von den aktuellen Kernels sowieso nicht mehr unterstützt, was in Ihrem Fall keine Hilfe darstellt. Es gibt mehr oder weniger fortgeschrittene Versuche, eine dynamische Ablaufverfolgung mit Linux, systemtap, ktap und sogar dtrace bereitzustellen, damit Sie sie untersuchen können.
Edit: Vorsicht vor peekfd , die Manualpage besagt:
Bugs:
Wahrscheinlich viele. Seien Sie nicht überrascht, wenn der Prozess, den Sie überwachen, abbricht.
quelle
Dieser Ansatz beinhaltet ein wenig GDB und Tee. Ah, und es benutzt auch socat, um ein Pseudo-Terminal zu emulieren. Es könnte auch ohne funktionieren, aber der Benutzer wird bemerken, dass seine Ausgabe kein Terminal mehr ist (Programme wie vi werden sich beschweren).
Es macht Folgendes:
Mir ist aufgefallen, dass Bash zu schreiben scheint, was Sie in stderr eingeben. Ich bin mir nicht sicher, ob andere Programme dasselbe tun. In diesem Fall muss stdin nicht abgefangen werden.
Nennen Sie es wie folgt aus :
chmod +x /path/to/script; sudo /path/to/script <usr> <sys-adm>
.usr
undsys-adm
sind die Namen der Terminals, zum Beispiel/dev/pts/1
. So ein Beispielaufruf würde wie folgt aussehen:sudo /path/to/script /dev/pts/1 /dev/pts/2
. Sie können Ihr Terminal mit demtty
Befehl herausfinden . Und das Benutzerendgerät entweder mitw
oderps
.quelle
Es gibt ein einfaches C-Programm namens xkey.c, das die Exploits von X11 zeigt. Ich lasse dich googeln. Sie können die Tastenanschläge auf einem xterm erfassen, ohne dass der Benutzer davon Kenntnis hat.
quelle
xterm
genau.