Po zalogowaniu się na maszynie mogę znaleźć pseudo-terminale każdego użytkownika na podstawie danych wyjściowych w
. Będąc sysadminem, czy mogę podsłuchiwać ten terminal bez wiedzy użytkownika? Innymi słowy, chciałbym, aby wszystko robiono na tym terminalu jako wyjście na moim własnym terminalu.
Uwaga:
- Nie jest to praktyczny przypadek użycia do monitorowania działań użytkownika: wiem, że istnieją do tego narzędzia do kontroli systemu. Jestem tylko ciekawy, czy da się to zrobić.
- Zdaję sobie sprawę z tego pytania i wydaje się, że nie obejmuje ono tego, o co pytam, ponieważ wszystkie rozwiązania sugerują, że są albo inwazyjne (użytkownik byłby świadomy tego, co robię), albo wytwarzają zbyt dużo hałasu (
strace
rozwiązanie). Jedynym zbliżającym się rozwiązaniem jest to, które sugeruje użyciegdb
. Ale to pozwala mi tylko zobaczyć stdout drugiego terminala.
Co próbowałem
Próbowałem tego z mojego terminalu:
tee /dev/pts/user_pts </dev/pts/user_pts
To pozwala mi zobaczyć każdy znak, który użytkownik wpisuje w drugim pseudo-terminalu podczas jego wpisywania. Problem polega na tym, że co kilka znaków „przeskakuje”: pokazywałby jeden nieuczciwy znak na jednym urządzeniu końcowym, ale nie na drugim. Zapobiega również wykonywaniu jakichkolwiek poleceń z pseudo terminala użytkownika. Nie jestem do końca pewien, dlaczego tak się dzieje i czy istnieje sposób, aby to poprawić.
Co chciałbym zobaczyć
USER TERMINAL | MY TERMINAL
$ echo "Test" | # slick_command_here
Test | echo "Test"
$ | Test
źródło
ttysnoop
lub prawdopodobniepeekfd
.Odpowiedzi:
Jest to fd po stronie master pseudo-terminala w emulatorze terminali, który chcesz monitorować, jeśli chcesz zobaczyć, co się na nim wyświetla. Ten master fd jest tym, co symuluje drut prowadzący do prawdziwego terminala. Co
xterm
pisze na nim jest postacie wygenerowane z klucza naciśnięcia. Odczytuje z niego to, co wyświetla.Na przykład w systemie Linux:
A następnie uruchom na przykład:
Oczywiście działa lepiej, jeśli uruchamiasz go w terminalu tego samego typu i wielkości, co ten, który próbujesz monitorować. Rozmiar można uzyskać za pomocą:
Że wysypisk co jest czytane przez
xterm
od strony głównego terminala, więc to, co jest wyświetlane tam, w tym lokalnejecho
, co jest wpisane.-e read=4
Powyżej jeststrace
do wyjścia hexdump coxterm
czyta na jego fd 4. spoczynku polecenia jest konwersja że do rzeczywistych postaci. Próbowałem,peekfd -n -8 15173 4
ale z jakiegoś powodu podałem tylko to, co zostało napisane.Używamy
-opost
do wyłączania przetwarzania końcowego w naszym terminalu monitorującym, aby wszystkoxxd
zapisywało po stronie podrzędnej, co czyni go niezmienionym po stronie nadrzędnej, dzięki czemu nasze monitorowaniexterm
jest takie samo jak monitorowane.-echo
jest tak, że jeśli aplikacja w monitorowanym terminalu wysyła sekwencję ucieczki, która żąda odpowiedzi z terminala (na przykład tych, które żądają pozycji kursora lub typu terminala lub tytułu okna), to przejdzie do naszego monitorowaniaxterm
i naszejxterm
woli odpowiedz również. Nie chcemy lokalnego echa tego.Można także monitorować to, co jest wpisane przez śledzenie
write
wywołań systemowych do tego samego fd (zamiastread
zwrite
wyżej). Zauważ, że po naciśnięciu Enteremulator terminala wysyła znak CR, a nie LF. Ponadto, ponieważ śledzimy po stronie wzorcowej, jeśli użytkownik wpiszea<Backspace>b
, zobaczymy wszystkie 3 naciśnięcia klawiszy, nawet jeśli urządzenie końcowe jest w trybie kanonicznym.Dlaczego twój nie działa:
Odczytywanie z urządzenia końcowego odczytuje dane wejściowe użytkownika, a zapisywanie na nim ma na celu wyświetlenie go użytkownikowi.
Mówisz
tee
czytać z urządzenia końcowego. Więc to, co odczytuje (dane wejściowe użytkownika), nie będzieread
przez aplikacje działające w terminalu (i odwrotnie,tee
i toapplication
będzie walczyć o dane wejściowe na terminalu). Zapis do urządzenia końcowego służy do wyświetlania, nie służy do umieszczania go z powrotem jako danych wejściowych. Kiedy to zrobisz(ze
echo
stdout jest terminalem), to nie to samo, co gdybyś pisałtest
.Istnieje funkcja
ioctl
(TIOCSTI
), aby wstawić znaki z powrotem jako dane wejściowe, ale nawet to nie zadziałałoby, ponieważ można je było umieścić z powrotem po aplikacji, ponieważ już przeczytało trochę więcej, więc zmieniłoby kolejność, w której aplikacja odczytuje dane wejściowe, i w dowolny sposób, oznaczałoby to, że czytałbyś go w kółko.źródło
Jeśli twój system operacyjny obsługuje dtrace, to prosty skrypt shellsnoop powinien umożliwiać monitorowanie wszystkiego , co napisano / wydrukowano na danym tty.
Jeśli używasz Linuksa, ttysnoop robił to samo, ale wymagał uciążliwej konfiguracji jako warunku wstępnego i nie jest już obsługiwany przez AFAIK z obecnymi jądrami, więc nie pomoże w twoim przypadku. Istnieją mniej lub bardziej zaawansowane próby zapewnienia dynamicznego śledzenia w systemie Linux, systemtap, ktap, a nawet dtrace, abyś mógł je zbadać.
Edycja: Uważaj na peekfd , jego strona podręcznika stanowi:
Błędy:
Prawdopodobnie dużo. Nie zdziw się, jeśli proces, który monitorujesz, umrze.
źródło
To podejście wymaga trochę gdb i tee. Ach, a także używa socat do emulacji pseudoterminalu. Bez niego może działać, ale użytkownik zauważy, że jego wyjście nie jest już terminalem (programy takie jak vi będą narzekać).
Wykonuje następujące czynności:
Zauważyłem, że bash wydaje się pisać to, co piszesz na stderr, nie jestem pewien, czy inne programy robią to samo. W takim przypadku stdin nie musi być przechwytywany.
Nazwijmy to tak:
chmod +x /path/to/script; sudo /path/to/script <usr> <sys-adm>
.usr
isys-adm
są to nazwy terminali, na przykład/dev/pts/1
. Tak więc próba połączenia będzie wyglądać następująco:sudo /path/to/script /dev/pts/1 /dev/pts/2
. Możesz znaleźć swój terminal za pomocątty
polecenia. I terminal użytkownika zw
lubps
.źródło
Istnieje prosty program C o nazwie xkey.c, który pokazuje exploity X11. Pozwolę ci google. Możesz przechwytywać naciśnięcia klawiszy na xtermie, używając tego, bez wiedzy użytkownika.
źródło
xterm
konkretnie.