Przechwytywanie TCP / IP i UDP może być wykonane przy użyciu tcpdump
/ dumpcap
i tworzy plik pcap / pcapng, który można przekazać do Wireshark w celu dalszej analizy. Czy istnieje podobne narzędzie dla nazwanych gniazd domeny Unix? (Ogólne rozwiązanie, które działa dla gniazd abstrakcyjnych, również byłoby fajne.)
strace
ponieważ-nie jest wystarczające, filtrowanie gniazd we / wy domenowych systemu Unix nie jest proste. Serwer proxy używający socat
lub podobny nie jest również odpowiedni, ponieważ celem jest pasywna analiza istniejących otwartych programów.
Jak mogę uzyskać przechwytywanie pakietów, którego mogę używać w Wireshark do analizy? Przykładowe aplikacje protokołu to X11 (Xorg, moja bieżąca aplikacja) i cURL / PHP (HTTP). Widziałem CONFIG_UNIX_DIAG
opcję w jądrze Linuksa, czy to się przyda?
źródło
-nolisten tcp
, nie ma gniazda TCP. Jeśli wszystko się nie powiedzie, prawdopodobnie powrócę do korzystania z xscope lub twojej schludnej sztuczki + sztuczki text2pcap. Nadal byłbym zainteresowany ogólnym przechwytywaniem gniazd Unix (tylko dla danych, a nie danych z kanału bocznego).Odpowiedzi:
Od jądra Linux v4.2-rc5 nie jest możliwe przechwytywanie bezpośrednio przy użyciu interfejsów używanych przez libpcap. libpcap wykorzystuje domenę specyficzną dla Linuksa
AF_PACKET
(aliasPF_PACKET
), która pozwala jedynie przechwytywać dane dla danych przechodzących przez „urządzenie sieciowe ” (takie jak interfejsy Ethernet).Nie ma interfejsu jądra do przechwytywania z
AF_UNIX
gniazd. Standardowe przechwyty Ethernet mają nagłówek Ethernet ze źródłem / miejscem docelowym itp. Gniazda uniksowe nie mają takiego fałszywego nagłówka, a rejestr typów nagłówków w warstwie łącza nie zawiera niczego związanego z tym.Podstawowymi punktami wejścia dla danych są
unix_stream_recvmsg
iunix_stream_sendmsg
dlaSOCK_STREAM
(SOCK_DGRAM
iSOCK_SEQPACKET
mają podobnie nazwane funkcje). Dane są buforowanesk->sk_receive_queue
i wunix_stream_sendmsg
funkcji nie ma kodu, który ostatecznie prowadziłby do wywołaniatpacket_rcv
funkcji dla przechwytywania pakietów. Zobacz tę analizę osgx na SO, aby uzyskać więcej szczegółowych informacji na temat wewnętrznych funkcji przechwytywania pakietów w ogóle.Wracając do pierwotnego pytania dotyczącego
AF_UNIX
monitorowania gniazd, jeśli interesują Cię głównie dane aplikacji, masz kilka opcji:strace
i przechwytuj możliwe połączenia systemowe, które wykonują operacje we / wy. Istnieje wiele z nichread
,pread64
,readv
,preadv
,recvmsg
i wiele więcej ... zobacz @ Stéphane Chazelas przykładxterm
. Wadą tego podejścia jest to, że najpierw musisz znaleźć deskryptor pliku, a następnie nadal możesz przegapić wywołania systemowe. Z funkcją strace możesz korzystać-e trace=file
w większości z nich (pread
jest objęty-e trace=desc
, ale prawdopodobnie nie jest używany w gniazdach uniksowych przez większość programów).unix_stream_recvmsg
,unix_stream_sendmsg
(lubunix_dgram_*
lubunix_seqpacket_*
) w jądrze i wysyłają dane, gdzieś. Możesz użyć SystemTap do ustawienia takich punktów śledzenia, oto przykład monitorowania wiadomości wychodzących. Wymaga obsługi jądra i dostępności symboli debugowania .Aktywny (działa tylko w przypadku nowych procesów):
Użyj proxy, który również zapisuje pliki. Możesz sam napisać szybki multiplekser lub zhakować coś takiego, który również generuje plik pcap (uważaj na ograniczenia, na przykład
AF_UNIX
może przekazać deskryptory plików,AF_INET
nie może):Sugerowana
CONFIG_UNIX_DIAG
opcja nie jest tu niestety pomocna, można jej użyć tylko do zbierania statystyk, a nie pobierania danych w czasie rzeczywistym (patrz linux / unix_diag.h ).Niestety w tej chwili nie ma idealnych wskaźników dla gniazd domeny Unix, które produkują pcaps (o ile mi wiadomo). Idealnie byłby format libpcap, który ma nagłówek zawierający PID źródłowy / docelowy (jeśli jest dostępny), a następnie opcjonalne dodatkowe dane (poświadczenia, deskryptory plików) i wreszcie dane. Bez tego najlepszym, co można zrobić, jest śledzenie syscall.
Dodatkowe informacje (dla zainteresowanego czytelnika), oto kilka śladów wstecznych (nabytych z łamaniem GDB
unix_stream_*
irbreak packet.c:.
Linux w QEMU i socat na głównym Linuksie 4.2-rc5):źródło
Napisałem narzędzie do przechwytywania i zrzucania ruchu na gniazdach domeny unix. Służy
bpf/kprobe
do sondowania funkcji jądraunix_stream_sendmsg
i zrzucania ruchu do przestrzeni użytkownika.Narzędzie zależy od
bcc
, więc musiszbcc
najpierw zainstalować .Przykładowy przebieg:
źródło