Łatwy sposób na „edycję” ruchu przychodzącego z hosta TCP (Linux)

9

Muszę wprowadzić niewielką modyfikację ruchu przychodzącego ze znanego hosta TCP: port, zanim proces obsługujący połączenie pobierze strumień.

Na przykład niech 192.168.1.88 będzie hostem zdalnym, na którym działa serwer WWW.
Potrzebuję tego, gdy proces na moim hoście lokalnym odbiera dane z 192.168.1.88:80 (np. Przeglądarki), najpierw zmienia się dane, zastępując text-Aje text-Bnastępującymi:

  • 127.0.0.1: ... łączy się z 192.168.1.88:80
  • 127.0.0.1: ... wysyła na 192.168.1.88:80:

    GET /
    
  • 192.168.1.88:80 wysyła do 127.0.0.1: ...:

    HTTP/1.0 200 OK
    Content-Type: text/plain
    
    Some text-A, some other text
    
  • Te dane są w pewien sposób przechwycone przez system i przekazane do programu, którego wynikiem jest:

    HTTP/1.0 200 OK
    Content-Type: text/plain
    
    Some text-B, some other text
    
  • system przekazuje tak zmienione dane do obsługi procesu 127.0.0.1: ... tak, jakby pochodziły z 192.168.1.88:80.

Zakładając, że mam sposób dokonywania tych zmian na podstawie strumienia ( sedna przykład), jaki jest najłatwiejszy sposób na wstępne przetworzenie przychodzącego strumienia tcp?

Myślę, że wymagałoby to zaangażowania iptables, ale nie jestem w tym zbyt dobry.

Pamiętaj, że aplikacja powinna działać z oryginalnym hostem, więc skonfigurowanie serwera proxy nie jest rozwiązaniem.

etuardu
źródło
Czy te żądania HTTP?
wielomian
Twoje pytanie nie jest wystarczająco jasne. Musisz podać więcej szczegółów.
Khaled
1
Nie możesz tego zrobić na poziomie pakietu. Jeden pakiet może zawierać „tekst-”, a następny może zawierać „A”. Będziesz musiał opracować niewidzialny serwer proxy zgodny z protokołem. (Musisz postępować zgodnie z protokołem, ponieważ jeśli pojawi się „text-” i jest on częścią „text-A”, musisz poczekać na następny fragment, zanim go przekażesz, inaczej filtr nie zadziała. Ale jeśli to koniec logicznej wiadomości, nie możesz czekać, bo będziesz czekać wiecznie.) Wierzę, że nie ma łatwego sposobu, aby to zrobić.
David Schwartz
Istnieją już stanowe systemy kontroli pakietów, które mogą np. Przepisywać ruch FTP, aby działał w NAT. To jest miejsce, od którego można zacząć.
pjc50,
Potrzebuję go przede wszystkim do pracy z odpowiedzią http, ale byłoby dobrze, gdyby działał na dowolnej warstwie aplikacji.
etuardu

Odpowiedzi:

21

Używaj proxy i netables.

iptables -t nat -D PREROUTING -s yourhost -d desthost -p tcp --dport 80 -j REDIRECT --to 10101

Następnie uruchomić:

netsed tcp 10101 desthost 80 s/text-A/text-B

NetSED to małe i poręczne narzędzie przeznaczone do zmiany w czasie rzeczywistym zawartości pakietów przesyłanych przez sieć. Jest to naprawdę przydatne do zmiany pakietów sieciowych, fałszowania lub manipulacji. NetSED obsługuje:

  • audytowanie czarnej skrzynki - za każdym razem, gdy dwie lub więcej zastrzeżonych skrzynek komunikuje się za pomocą jakiegoś nieudokumentowanego protokołu. Wymuszając zmiany w trwających transmisjach, będziesz mógł sprawdzić, czy badana aplikacja może być uznana za bezpieczną.

  • eksperymenty z generowaniem fuzzów, testy integralności - za każdym razem, gdy przeprowadzasz testy stabilności aplikacji, aby zobaczyć, jak dba ona o integralność danych;

  • inne typowe przypadki użycia: oszukańcze transfery, filtrowanie treści, konwersja protokołów - wszystko, co najlepiej odpowiada twojemu zadaniu.

dfc
źródło
To naprawdę proste i fajne.
mbrownnyc
Nie wiedziałem netsed, że pasuje prawie idealnie do moich celów. Jedyne, czego nie rozumiem, to jak skonfigurować „lokalny przezroczysty serwer proxy” (patrz pytanie). Być może powinienem skonfigurować inny (wirtualny) interfejs sieciowy, aby to uzyskać. Nawiasem mówiąc, na razie jest to najbardziej satysfakcjonująca odpowiedź.
etuardu
Czy używasz ogólnego jądra dystrybucji? Jeśli jesteś iptables, obsługa prawdopodobnie jest już wkompilowana. Aby skonfigurować przezroczysty serwer proxy, wystarczy podać odpowiednie dane dla swojego hosta / portów. Spójrz na plik Readme i sprawdź, czy zawiera on niektóre szczegóły. silikonu.homelinux.org/git/netsed.git/blob_plain/HEAD:/README
dfc
Myślałem, że netnet będzie działał tylko na jednym pakiecie na raz? Jeśli więc żądanie HTTP zostanie podzielone na dwa pakiety, wyrażenie regularne dla podstawienia nie będzie pasować, a żądanie zostanie przekazane do serwera bez modyfikacji.
paulos
1
ok teraz, na wypadek, gdyby ktoś tego potrzebował: nie dlatego, że w pełni to rozumiem, ale dla faktycznej modyfikacji pakietów WYJĄTKOWYCH (czego operacja NIE chciała robić), będziesz musiał zmodyfikować OUTPUT, nie PREROUTING. Również -Dopcja miała być -A dla mnie. także dla -jopcji musiałem użyć DNAT --to-destination (ip) lub REDIRECT --to-port. Wreszcie, NIE mogłem naprawić błędu segmentacji netsed. patrz także: ubuntuforums.org/showthread.php?t=2337389
phil294
3

iptables+ użycie libnetfilter_qu to kolejna opcja, która zrobi to, co chcesz:

„... [reinject] zmodyfikowane pakiety do podsystemu jądra nfnetlink_queue.”

Zapewni to największą elastyczność, ponieważ to od Ciebie zależy kodowanie oprogramowania.

Dostępne jest również opakowanie Pythona .

mbrownnyc
źródło
2
Przykładowa aplikacja korzystająca z netfilter_queue: github.com/rgerganov/nfqsed
rgerganov