Czy istnieje łatwe narzędzie wiersza poleceń do wykrywania pojedynczego polecenia w systemie Linux?


11

Bardzo bym chciał, gdyby istniało jedno narzędzie wiersza poleceń do wykrywania pojedynczego polecenia w systemie Linux. coś takiego sniff dumpfile command, abyś mógł po prostu uruchomić polecenie, które chcesz sniffować w terminalu i uzyskać zrzut pakietów gdzie indziej.

Chciałbym zrzucić / zapisać / zobaczyć tylko ruch sieciowy pojedynczego polecenia, które wprowadzam, a nie cały ruch TCP w moim pojedynczym interfejsie sieciowym. Gdybym więc był zalogowany na komputerze, a IRC działał w tle, i tak zrobiłem sniff somefile wget http://www.google.com, chciałbym zobaczyć cały ruch sieciowy, jaki zrobiła komenda wget, aby pobrać http://www.google.com . Nie chcę, aby „jakiś czas” powodował, że ruch sieciowy IRC dezorientuje.

Istnieje wiele poleceń linux / unix, które akceptują inne polecenia i robią coś innego. Z sudo(uruchom jako superużytkownik), nicezmień niezły poziom, trickle(ogranicz przepustowość polecenia)


1
Co dokładnie chcesz zrobić? Czy chcesz sprawdzić, czy określone polecenie jest uruchomione? Czy chcesz wąchać ruch w sieci? Ponieważ użycie wyrażenia „sniffing pakietu” nie ma dla mnie żadnego sensu ...
wzzrd

wzzrd, patrz pytanie rozszerzone
Rory

Odpowiedzi:


10

Nic nie wiem, ale teoretycznie nie powinno być trudno uzyskać coś podobnego. Strace może służyć do przechwytywania połączeń sieciowych.

# strace -f -e trace=network -s 10000 /usr/bin/command arguments

To da ci informacje o danych wysyłanych między jądrem a procesem. Wynik działania strace nie jest dokładnie tym, czego byś chciał. Jednak strace używa syscall ptrace do przechwytywania wywołań systemowych. Może być możliwe napisanie programu, który będzie wyświetlał dane nieco bardziej użytecznie.

Alternatywnie możesz przechwycić ładne przydatne gniazdo, powiązać i odsłuchać wywołania systemowe. Może być możliwe napisanie małego programu, który używał ptrace do tych wywołań i libpcap, aby dynamicznie zmieniać filtr przechwytywania za każdym razem, gdy otwierane jest nowe gniazdo.


Byłoby świetnie, gdyby wypisał coś, co Wireshark mógłby odczytać.
Brad Gilbert

Pamiętaj, że opisana powyżej ścieżka jest dokładna dla Solaris (i ewentualnie innych komercyjnych Unices). W Linuksie strace jest śledzeniem wywołań systemowych, podobnym w działaniu i danych wyjściowych do kratownicy w systemie Solaris lub tusc w systemie HP-UX.
James F

1
Opisałem strace w systemie Linux.
David Pashley


4

Spróbuj Wireshark - polecenie będzie tshark

  • tshark pozwala wybrać filtry ruchu wychwyconego z interfejsu
  • użyj innych narzędzi, takich jak debian lsof, aby zidentyfikować rodzaj komunikacji wykonywanej przez twoją zainteresowaną aplikację.

Czy naprawdę chcesz po prostu LSOF?


Nie sądzę, aby istniało narzędzie, które dynamicznie filtruje całą komunikację związaną z procesem. Możesz jednak spróbować śledzić komunikację procesową za pomocą takich narzędzi, lsofa gdy masz dobry filtr, który może odizolować komunikację tego procesu od całego ruchu w twoim systemie, możesz uzyskać prawidłowe przechwytywanie.

Na przykład przy wgetzwykle docelowym adresie IP różni się od innego ruchu związanego z procesem. Nawet jeśli weźmiesz coś takiego, skypedocelowy zakres portów jest zwykle ustalony dla instancji.


To trochę przypomina zasadę nieoznaczoności. Zazwyczaj możesz wiedzieć, co przechodzi przez zestaw ścieżek komunikacyjnych (z filtrem sniffera filtrującym zidentyfikowaną grupę przepływów) lub gdzie tworzone są różne łącza komunikacyjne (z lsof).

Naprawdę chciałbym wiedzieć, czy można zrobić jedno i drugie dla aplikacji. Myślę, że to powinno być wykonalne. Ale nie widziałem jeszcze żadnego narzędzia, które to robi.


lsof jest niesamowity, ale wolałbym zobaczyć, co robi / wysyła / odbiera.
Rory

4

Naucz się korzystać z wyrażeń filtrujących.

Chociaż nie zrobi to fantazyjnych śladów, o które prosisz.

Pozwoli ci to usunąć prawie wszystkie „mylące rzeczy jak IRC” z przechwytywania.

Dodatkowo bardzo przydatna jest znajomość składni filtra, aby w przyszłości móc ją szybko znaleźć.


2

W szczególności w przypadku przeglądarki internetowej / strony internetowej coś takiego jak wtyczka Firebug dla Firefoksa może dostarczyć Ci niektórych informacji, których szukasz: http://getfirebug.com/net.html

W przypadku bardziej ogólnych aplikacji może być konieczne użycie polecenia netstat do identyfikacji portów używanych przez aplikację, a następnie Wireshark / tshark / dtrace z filtrem, aby przechwycić tylko ten ruch. Jednak nie jedna odpowiedź, której szukasz ...


1

Jeden pomysł, wypróbuj VMWare

-setup vm
-konfiguruj ten vm, aby używał określonego interfejsu
-sniff na tym interfejsie z hosta (to jest jak człowiek w środku ataku)

Jeśli wyodrębnisz, jakie aplikacje sieciowe działają na tym vm, być może otrzymasz odpowiedź

Wydaje mi się, że bardziej idealnym rozwiązaniem jest robienie tego, co robi VMWare, jeśli chodzi o sposób, w jaki wybiera interfejs do rozmowy. Myślę, że jego magia pochodzi z modułów jądra, których używa, w tym przypadku prawdopodobnie z modułu jądra vmnet.

O ile wiem, aplikacje nie wiedzą, o którym interfejsie rozmawiają i wierzę, że jest to zgodne z projektem; nie powinni się martwić o takie rzeczy.

Co więcej,
być może program już istnieje, nie wiem. Ale jeśli jeden został napisany, możesz nazwać go nettrace (na przykład), a użycie może być podobne

interfejs programu nettrace

następnie wąchaj używany interfejs i dodaj trasy (może robi to automatycznie) do twojego prawdziwego interfejsu


tak, byłoby to możliwe. Byłoby jednak świetnie, gdyby było do tego proste i szybkie narzędzie.
Rory

Może czas na to proste narzędzie? Zastanawiam się, czy byłoby to tak trudne, prawdopodobnie mod vmnet mógłby być dobrym punktem wyjścia (choć nie wiem, czy pojawią się problemy z licencjonowaniem). Być może (hack) po prostu użyj mod vmnet. Wiem, że często interesują mnie takie pytania.
rev

1

Zakładając, że jesteś jedyną osobą próbującą połączyć się z Google w tym czasie, pomyślałbym, że coś takiego powinno wystarczyć:

tcpdump -w <outfile> -i <interface> tcp dst host www.google.com and dst port 80

Jeśli nie jesteś jedynym połączeniem próbującym połączyć się z Google na urządzeniu, to jeśli możesz zidentyfikować adres IP / port, z którego się łączysz, możesz również określić port src / src ip.

Identyfikacja portu src może stanowić problem, chyba że możesz określić go na dowolnym kliencie, którego używasz. Nie jestem pewien, czy możesz z wget.

Podejrzewam, że możesz podać porty zarówno src, jak i dst, netcatwięc jeśli naprawdę interesowałeś się google, możesz wykonać GET (ręcznie) przez netcat.

Oczywiście strona podręcznika da ci szczegóły


1

Strona podręcznika tcpdump i wiele stron internetowych zawiera szczegółowe przykłady filtrów, a nawet kilka repozytoriów online wyrażeń filtrów tcpdump. Powinien być w stanie zrobić prawie wszystko, o czym marzysz, zakładając, że wiesz coś o ruchu w sieci (źródło, miejsce docelowe, porty, protokoły itp.) Poza tym, co program go generuje.

Jeśli pracujesz na serwerze lub urządzeniu bez głowy, zawsze możesz poprosić tcpdump o napisanie pliku zrzutu, a następnie otwarcie go w Wireshark na stacji roboczej i uzyskanie zaawansowanego filtrowania i interfejsu graficznego.


Erm, które przełączenie na komendę tcpdump ograniczyłoby ją do pojedynczej aplikacji generującej ruch?
Milan Babuškov

1

Być może ten skrypt zrobi co chcesz z odpowiednimi modyfikacjami polecenia tshark:

#!/bin/bash

# Start tshark in the background before we run the commsnd to be sniffed.
# Add more options to tshark, as appropriate to your command....
setsid tshark  -w dump -i eth0 tcp port 8080 >/dev/null 2>&1  &

sleep 2

wget www.google.com

# tshark keeps running if you don't kill it. 
# This kills all other tsharks that may be running.
pkill -9 tshark

Przeczytaj plik zrzutu później:

tshark -r dump

Przechwytujesz port 8080, ale generujesz ruch na porcie 80; to nie zrobi dokładnie tego, co zamierzasz.
James F

James: Mój serwer proxy łączy się z 8080, tak uruchomiłem skrypt. Powinienem to zmienić 80 na potrzeby tego postu.
Nie teraz,

0

Dtrace powinien na to pozwolić, chociaż nie wiem, czy jest już w Linuksie.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.