przechwytywanie ruchu sieciowego - socket na Windows

0

Potrzebuję wykonać pewien projekt, w ramach którego m. in. muszę przechwycić ruch sieciowy i odpowiednio zinterpretować pakiety UDP/TCP.

Na podstawie danych z internetu spróbowałem takiego kodu:

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)
host = '192.168.0.100'
s.bind((host, 0))
while True:
   print(s.recvfrom(65536))

Ale nic się nie dzieje, konsola PyCham jest pusta. Próbowałem różne numery portów, na których coś się działo (wg. Wireshark).

Czy nie chodzi czasem o to, że powyższe nie zadziała na Windows? Tj. muszę użyć albo innego modułu, albo odpalić ten kod na Linux?

2

Lekcja na dziś: promiscuous mode

0

Prościej będzie to zrobić pod Linux, takie odnoszę wrażenie.

0

Udało się coś przechwycić (poniżej Wireshark):
screenshot-20220307182546.png

Jak mam rozumieć to co przyszło? Wiem, że adres MAC mojej karty sieciowej zaczyna się tak: 64:5d..., tylko nie widzę tego.

0

Rozparsuj to. Poczytaj o stosie TCP/IP i jakie tam ramki są, gdzie sa dane i jakie to dalej sa ramki. Wireshark pojazuje już rozparsowane i sformatowane dane.

0

Odnoszę wrażenie, że przechwyciłem nie to co myślę. Przecież ten adres MAC powinienem widzieć gołym okiem.

1

Pokaż pełen kod. Chętnie to sobie odpalę, sam wydłubuje się ostatnio w Pythona, ale moim zdaniem to jest inny problem. Bo Ty czytasz ramki TCP z tego co widzę albo sądzę, że to robisz. W ramce TCP nie ma adresu MAC.

0

Pytanie też co chcesz osiągnąć. Tutaj masz przykład jak snifować warstwę ARP gdzie faktycznie występują adresy fizyczne. Każda warstwa enkapsuluje kolejne warstwy protokołu w segmencie danych. ARP->IP->TCP/UDP->HTTP->WebDAV->Aplikacja. Ofc. to tylko przykład hierarchii. mogą być też inne, a pod ARP może być BGP jak lata to między datacenter różnymi.

https://stackoverflow.com/questions/24415294/python-arp-sniffing-raw-socket-no-reply-packets

1

Przecież ty słuchasz na TCP więc nie widzisz ramek niższej warstwy

1

No i to nie jest kwestia Pythona, ale zrozumienia stosu sieciowego. Tutaj masz garść informacji https://pl.wikipedia.org/wiki/Model_OSI Ja sto lat temu dorwałem "TCP/IP Network Administration" Craig Hunt i sporo z tego się nauczyłem. No i kurs CCNA od CISCO i praca z Wiresharkiem, ale tak, żeby dobrze zrozumieć stos sieciowy. Dopiero potem zabieraj się za kodowanie związane z sieciami.

0

Myślę, że po prostu nie do końca ogarniam jeszcze moduł socket. Dlatego szukam jakiejś dobrej książki (pytałem o nią w innym temacie). Widziałem już kilka wersji kodu: na Linux i Windows. Ewidentnie mi się poyebało trochę :)

W każdym razie coś już mam. Pozostało jeszcze dobrze wczytać się w manual i ustalić, jak skonfigurować ten socket, by dostać się do warstwy poniżej TCP.

Powyżej Wireshark, poniżej ten sam pakiet przechwycony w PyCharm. Numerki (w hex) zgadzają się.

screenshot-20220307221913.png

Ale jak wytłumaczyć tę różnicę?

screenshot-20220307223334.png

0

Nie wiem co Ci napisac. Weź w koncu deserializuj to do obiektu i bedziesz mual pakiet TCP. Do odczytu ARP dalem linka. Payload ARP to ramka IP. Payload IP to ramka TCP lub UDP. Serio kliknij te linki co podeslalem i poczytaj.

1

Ale gdzie ty widzisz jakąś różnicę? o_O Printujesz w pythonie to jako stringa to ci printowalne znaki zamienia na ASCII i tyle. Przecież 0x52 to jest właśnie literka R. Weź te dane enkoduj jakimś binascii.hexlify() to będziesz miał faktycznie hexy do porównania. To jest zupełny przypadek że python te nie-ascii znaki wypisuje jako escapowane hexcode, równie dobrze mógłby ci tam sypać jakieś chińskie znaczki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1