Jak mogę przechwycić ruch sieciowy z jednego procesu?

92

Chciałbym zbadać ruch sieciowy obsługiwany przez pojedynczy proces, ale proste przechwytywanie sieci nie będzie działać, ponieważ mam do czynienia z tak zajętym systemem (wiele innych ruchów odbywa się w tym samym czasie). Czy istnieje sposób na izolowanie tcpdumplub wiresharkprzechwytywanie ruchu sieciowego pojedynczego określonego procesu? (Używanie netstatjest niewystarczające.)

Kees Cook
źródło

Odpowiedzi:

21

Rzeczywiście istnieje sposób, używając filtrów Wireshark . Ale nie można filtrować bezpośrednio według nazwy procesu lub PID (ponieważ nie są to wielkości sieciowe).

Najpierw powinieneś dowiedzieć się, jakie protokoły i porty są używane przez twój proces ( polecenie netstat w poprzednim komentarzu działa dobrze).

Następnie użyj Wireshark, aby odfiltrować port wejściowy (lub wyjściowy) z tym, który właśnie pobrałeś. To powinno odizolować przychodzący i wychodzący ruch Twojego procesu.

OpenNingia
źródło
6
W przypadku prostego połączenia jest to możliwe, ale muszę śledzić DNS, HTTP itp., Które pędzą w przeszłość, więc nie ma prostego sposobu na użycie netstati proste filtry przechwytywania sieci na ruchliwym komputerze.
Kees Cook
Ok, porty publiczne HTTP i DNS są używane przez wiele aplikacji, ale odpowiadający im port prywatny jest unikalny. Dlaczego więc nie spróbujesz filtrować według prywatnego portu?
OpenNingia,
Ponieważ szybkie małe żądania nie będą widoczne netstat; Będę w stanie złapać tylko długotrwałe połączenia. :(
Kees Cook
co jeśli proces używa dynamicznych portów w czasie wykonywania, to nie będziesz w stanie używać statycznych filtrów portów
The Unix Janitor
Myślę, że masz tutaj najlepszą odpowiedź ... Niestety narzędzie do wykrywania sieci działa na najniższym poziomie stosu sieciowego, próbując złapać wszystko, zupełnie nie zdaje sobie sprawy z procesów działających w systemie operacyjnym. Bardzo trudno byłoby dowiedzieć się, skąd pochodzi określone połączenie. Sniffer pakietów może w końcu ustalić (poprzez numer portu) identyfikator procesu, ale nie może dowiedzieć się, który proces wykonał wyszukiwanie DNS, ponieważ jest to całkowicie niezależne (najprawdopodobniej jest to stos sieciowy jądra, który wywołał wywołanie). Ale dzięki filtrowaniu i zatrzymywaniu innych procesów powinieneś być w stanie osiągnąć swój cel.
Huygens,
134

Aby rozpocząć i monitorować nowy proces:

strace -f -e trace=network -s 10000 PROCESS ARGUMENTS

Aby monitorować istniejący proces ze znanym PID:

strace -p $PID -f -e trace=network -s 10000
  • -f jest przeznaczony do „śledzenia nowych procesów”
  • -e definiuje filtr
  • -s ustawia limit ciągów na więcej niż 32
  • -p pobiera identyfikator procesu, aby dołączyć
Clausi
źródło
2
Jest to przydatne, ponieważ można z niego korzystać bez uprawnień roota lub specjalnych uprawnień (w niektórych dystrybucjach Linuksa zresztą - w Ubuntu możesz potrzebować specjalnych uprawnień).
Robin Green
1
Jest to również przydatne, ponieważ można go uruchomić z uruchomionym już procesem i jest dostępny na praktycznie każdym urządzeniu z systemem Linux.
zakmck
53

Wiem, że ten wątek jest trochę stary, ale myślę, że może to pomóc niektórym z was:

Jeśli twoje jądro na to pozwala, przechwytywanie ruchu sieciowego pojedynczego procesu można bardzo łatwo uruchomić, uruchamiając wspomniany proces w izolowanej sieciowej przestrzeni nazw i używając wireshark (lub innych standardowych narzędzi sieciowych) również we wspomnianej przestrzeni nazw.

Konfiguracja może wydawać się nieco złożona, ale gdy ją zrozumiesz i zapoznasz się z nią, znacznie ułatwi ci to pracę.

Aby to zrobić:

  • utwórz testową przestrzeń nazw sieci:

    ip netns add test
    
  • utwórz parę wirtualnych interfejsów sieciowych (veth-a i veth-b):

    ip link add veth-a type veth peer name veth-b
    
  • zmień aktywną przestrzeń nazw interfejsu veth-a:

    ip link set veth-a netns test
    
  • skonfiguruj adresy IP wirtualnych interfejsów:

    ip netns exec test ifconfig veth-a up 192.168.163.1 netmask 255.255.255.0
    ifconfig veth-b up 192.168.163.254 netmask 255.255.255.0
    
  • skonfiguruj routing w testowej przestrzeni nazw:

    ip netns exec test route add default gw 192.168.163.254 dev veth-a
    
  • aktywuj ip_forward i ustal regułę NAT, aby przekazywać ruch przychodzący z utworzonej przestrzeni nazw (musisz dostosować interfejs sieciowy i adres IP SNAT):

    echo 1 > /proc/sys/net/ipv4/ip_forward
    iptables -t nat -A POSTROUTING -s 192.168.163.0/24 -o <your internet interface, e.g. eth0> -j SNAT --to-source <your ip address>
    

    (Jeśli wolisz, możesz także użyć reguły MASQUERADE)

  • wreszcie możesz uruchomić proces, który chcesz przeanalizować w nowej przestrzeni nazw, a także wireshark:

    ip netns exec test thebinarytotest
    ip netns exec test wireshark
    

    Będziesz musiał monitorować interfejs veth-a.

felahdab
źródło
4
Świetny pomysł, ale uważaj na „ograniczenia”. Ponieważ jest to osobna przestrzeń nazw, nie można komunikować się z procesami lokalnymi w domyślnej przestrzeni nazw przy użyciu adresów sprzężenia zwrotnego lub gniazd domeny UNIX. Ten ostatni wpływa na komunikację przez D-Bus.
Lekensteyn,
@Lekensteyn nadal można używać gniazd domeny unix w sieciowych przestrzeniach nazw afaik. System plików nie jest przez nich izolowany.
randunel
1
@ randunel Powinienem być bardziej precyzyjny. Chciałem powiedzieć, że do gniazd domeny uniksowej w „abstrakcyjnej przestrzeni nazw gniazd” (która nie korzysta z systemu plików) nie można uzyskać bezpośredniego dostępu między sieciowymi przestrzeniami nazw. Aby obejść ten problem, możesz użyć serwera proxy, takiego jaksocat .
Lekensteyn
Jakiego adresu IP używasz z --to-sourceargumentem iptables? Czy to adres IP interfejsu, który przekazujesz do -oopcji, adres IP, który tworzysz, czy ??? Próbowałem wersję maskarady, że nie potrzeba --to-source, jak opisano tutaj , i to działa!
ntc2
3
Wszystko to wydaje się wymagać dostępu do roota.
simplegamer
15
netstat -taucp | grep <pid or process name>

To pokaże połączenia, które tworzy aplikacja, w tym używany port.

Oli
źródło
8
To pokazałoby połączenia, które istnieją w tej chwili, ale nie dostarczy dziennika samego ruchu.
Kees Cook
1
Nie jestem pewien co do komentarza Kees Cook. Prosta komenda netstat pokazuje na chwilę informacje o połączeniach, ale z flagą -c co sekundę dostajesz migawkę tego stanu (patrz 'man netstat'). Może nie ma całego ruchu, ale nie jest unikalną migawką połączeń.
tremendows,
3
Jestem pewien. To nie uchwyci całego ruchu sieciowego procesu.
Reinier Post,
Przydało się to do ustalenia, który numer portu jest blokowany przez wewnętrzną zaporę. Pokazuje SYN TCP (wraz z adresem docelowym i numerem portu) wysyłanym przez polecenie, które uruchomiłem.
Anthony Geoghegan
11

Pomysł: czy można powiązać aplikację z innym adresem IP? Jeśli tak, możesz użyć zwykłych podejrzanych ( tcpdump itp.)

Narzędzia dla aplikacji, które nie są w stanie powiązać z innym adresem IP:

http://freshmeat.net/projects/fixsrcip

fixsrcipjest narzędziem do wiązania wychodzących gniazd klienta TCP i UDP ( IPv4 ) z określonymi źródłowymi adresami IP na hostach z wieloma bazami

http://freshmeat.net/projects/force_bind

force_bindpozwala na wymuszenie powiązania dla określonego adresu IP i / lub portu. Działa zarówno z IPv4, jak i IPv6 .

Clausi
źródło
Większość aplikacji nie obsługuje określania ich źródłowego adresu IP, ale w rzeczywistości może to być możliwe przy użyciu kontenera z CLONE_NEWNET, ale nie CLONE_NEWNS.
Kees Cook
Możesz też utworzyć sieć nazw sieciowych i uruchomić w niej swoją aplikację www.evolware.org/?p=293
Flint
9

Doszedłem do podobnego problemu i udało mi się go rozwiązać na podstawie tej odpowiedzi autorstwa ioerror , używając NFLOG, jak opisano tutaj :

# iptables -A OUTPUT -m owner --uid-owner 1000 -j CONNMARK --set-mark 1
# iptables -A INPUT -m connmark --mark 1 -j NFLOG --nflog-group 30 
# iptables -A OUTPUT -m connmark --mark 1 -j NFLOG --nflog-group 30 
# dumpcap -i nflog:30 -w uid-1000.pcap

Następnie możesz utworzyć uruchamianie danego procesu z konta użytkownika, które nie robi nic innego - i voila, właśnie odizolowałeś i przechwyciłeś ruch z jednego procesu.

Chciałem tylko wysłać wiadomość z powrotem na wypadek, gdyby pomógł komukolwiek.

szymon
źródło
6

Napisałem aplikację C, która robi to, co opisano w świetnej odpowiedzi powyżej felahdab!

Zobacz tutaj: repozytorium nsntrace github

Jonas Danielsson
źródło
To fajnie, ale myślę, że fajnie byłoby podać więcej szczegółów na temat tego, jak je zdobyć i używać :)
Zanna
Dzięki! Podałem link do repozytorium github, które zawiera plik README.md, który zawiera instrukcje użycia i przykłady, oraz instrukcje pobierania!
Jonas Danielsson
5

To jest brudny hack, ale sugerowałbym przekierowanie lub cel dziennika z iptables dla danego UID. na przykład:

iptables -t nat -A OUTPUT -p tcp -m owner --uid-owner $USER -m tcp -j LOG 
iptables -t nat -A OUTPUT -p udp -m owner --uid-owner $USER -m udp -j LOG 

Warto również przyjrzeć się czegoś takiego jak „--log-tcp-sekwencja”, „--log-tcp-options”, „--log-ip-options”, „--log-uid” dla tego celu dziennika . Podejrzewam, że to pomoże ci jedynie przetworzyć plik PCAP, który zawiera mnóstwo innych danych.

Cel NFLOG może być przydatny, jeśli chcesz oflagować pakiety, a następnie pewne otagowane pakiety zostaną wysłane przez gniazdo netlink do wybranego procesu. Zastanawiam się, czy byłoby to przydatne do zhakowania czegoś przy użyciu Wireshark i konkretnej aplikacji działającej jako konkretny użytkownik?

ioerror
źródło
ale to działa tylko dla towarzyskich, a co z przyjazdem?
resultsway
5

Możesz spróbować tracedump - http://mutrics.iitis.pl/tracedump

Robi dokładnie to, co chcesz, możesz podać identyfikator procesu lub uruchomić program.

pjf
źródło
1
Fajny projekt, ale ... „Tracedump działa obecnie tylko na 32-bitowych hostach Linux” - niestety to dla mnie zabija.
gertvdijk
4

Spróbuj uruchomić proces jesteś zainteresowany pod strace :

strace ping www.askubuntu.com

Dostarczy ci bardzo szczegółowych informacji o tym, co robi twój proces. Ponieważ proces może otworzyć dowolne porty w dowolnym miejscu, za pomocą predefiniowanego filtra możesz coś przeoczyć.

Innym podejściem byłoby użycie zredukowanej maszyny wirtualnej lub maszyny testowej w sieci i umieszczenie na niej procesu osobno. Następnie możesz po prostu użyć Wireshark, aby złapać wszystko z tego komputera. Będziesz prawie pewien, że przechwytywany ruch będzie istotny.

The Unix Janitor
źródło
Dodanie „-e trace = network” przycina niektóre dane wyjściowe, kosztem utraty danych, które faktycznie są zapisywane w sieci. Jeśli zależy ci tylko na „liczbie otwartych gniazd” lub podobnym, to wszystko ułatwia.
dannysauer
3

Opierając się na odpowiedzi autorstwa ioerror , podejrzewam, że możesz użyć, iptables --uid-owneraby ustawić znacznik na ruchu, a następnie możesz poprosić wireshark o przechwycenie tylko ruchu z tym znacznikiem. Możesz być w stanie użyć DSCP (marker usług różnicowych), id przepływu lub markera qos.

W rzeczywistości można użyć tego do wysłania tych pakietów z innego interfejsu, a następnie przechwycenia tylko na tym interfejsie.

poolie
źródło
-1

może iptables i ulog mogą działać? Nie, że mam dokładny przepis, ale myślę, że iptables może dopasować procesy, po dopasowaniu możesz użyć uloga.


źródło
3
Niestety iptables -m owner --pid-owner $PIDzostał usunięty w Linuksie 2.6.14: ftp.kernel.org/pub/linux/kernel/v2.6/ChangeLog-2.6.14
Kees Cook
-1

Myślę, że możesz utworzyć skrypt powłoki, który będzie przechodził przez wykonanie polecenia netstat i zalogowanie go do pliku tekstowego. Coś w stylu (bardzo szorstkie kroki):

echo "press q to quit"
while [ <q is not pressed>]
do
    `netstat -taucp | grep <pid or process name> 1>>logfile.txt`
done

Nie jestem programistą, więc nie mogę tego dopracować. Ale ktoś tutaj może zacząć od miejsca, w którym skończyłem i stworzyć dla ciebie działający skrypt.

ocynowana
źródło
Nie wystarczająco dobre. Chodzi o to, aby przechwycić cały ruch sieciowy, a nie tylko to, co dzieje się aktywne w chwili, gdy się sprawdzasz.
Reinier Post,