{"id":20196253,"url":"https://github.com/arkregiel/raw-socket-network-sniffer","last_synced_at":"2026-06-10T05:31:17.264Z","repository":{"id":128715942,"uuid":"474480966","full_name":"arkregiel/Raw-Socket-Network-Sniffer","owner":"arkregiel","description":"Python network sniffer using raw socket","archived":false,"fork":false,"pushed_at":"2023-07-02T17:40:36.000Z","size":54,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-10T08:59:28.887Z","etag":null,"topics":["network-programming","networking","packet-sniffer","python","python3","sniffer","socket-programming"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/arkregiel.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-03-26T22:29:56.000Z","updated_at":"2023-07-08T04:33:02.000Z","dependencies_parsed_at":"2024-11-14T07:15:09.348Z","dependency_job_id":null,"html_url":"https://github.com/arkregiel/Raw-Socket-Network-Sniffer","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/arkregiel/Raw-Socket-Network-Sniffer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arkregiel%2FRaw-Socket-Network-Sniffer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arkregiel%2FRaw-Socket-Network-Sniffer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arkregiel%2FRaw-Socket-Network-Sniffer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arkregiel%2FRaw-Socket-Network-Sniffer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/arkregiel","download_url":"https://codeload.github.com/arkregiel/Raw-Socket-Network-Sniffer/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arkregiel%2FRaw-Socket-Network-Sniffer/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34139178,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-10T02:00:07.152Z","response_time":89,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["network-programming","networking","packet-sniffer","python","python3","sniffer","socket-programming"],"created_at":"2024-11-14T04:22:48.327Z","updated_at":"2026-06-10T05:31:17.249Z","avatar_url":"https://github.com/arkregiel.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Sniffer sieciowy z użyciem surowych gniazd (Linux)\r\n\r\nImplementacja sniffera sieciowego bazującego na surowych gniazdach, który przechwytuje ramki i przedstawia część informacji (np. źródłowy i docelowy adres MAC, źródłowy i docelowy adres IPv4, źródłowy i docelowy port) w postaci czytelnej dla człowieka. Tego typu oprogramowanie pozwala zaobserwować zastosowanie teoretycznego modelu TCP/IP w praktyce\r\n\r\nZ uwagi na wykorzystanie surowego gniazda, program należy uruchamiać z opcją `sudo`\r\n\r\n```\r\n$ sudo python main.py\r\n```\r\n\r\n```\r\nsposób użycia:\r\n\r\n\t$ sudo python main.py -i \u003cinterface\u003e [options]\r\n\r\nopcje:\r\n\r\n\t-h --help\t\t\twyświetla tę pomoc\r\n\t-i --interface=\u003cinterface\u003e\tinterfejs, z którym powiązać gniazdo\r\n\t-v --verbose\t\t\twyświetlanie danych na ekran\r\n\t-o --outputfile=\u003cfilename\u003e\tplik, do którego zapisać dane\r\n\t-d --dump\t\t\tczy zrzucać surowe przechwycone dane do pliku\r\n\r\nprzykład:\r\n\r\n$ sudo python main.py -i wlan0 --verbose -o captured.txt\r\n```\r\n\r\nNa chwilę obecną program obsługuje tylko protokoły:\r\n\r\n- IPv4\r\n- ARP\r\n- ICMP\r\n- UDP\r\n- TCP\r\n- DNS\r\n- DHCP\r\n\r\n## PacketSniffer\r\n\r\n### Dissector.py\r\n\r\nW tym pliku znajdują się następujące klasy, próbujące odwzorować strukturę nagłówka danego protokołu:\r\n\r\n- `EthernetHeader`\r\n- `IPHeader`\r\n- `ARPHeader`\r\n- `ICMPHeader`\r\n- `TCPHeader`\r\n- `UDPHeader`\r\n- `DNSHeader`\r\n- `DHCPHeader`\r\n\r\nJako parametr konstruktora każda z tych klas przyjmuje bufor rozpoczynający się nagłówkiem danego protokołu i tworzy jego strukturę, podobnie jak w języku C dzięki modułowi `ctypes`\r\n\r\n```c\r\n/* struktura naglowka ARP w C */\r\nstruct arpheader {\r\n    u_int16_t htype;\r\n    u_int16_t ptype;\r\n    u_char hlen;\r\n    u_char plen;\r\n    u_int16_t oper; \r\n    u_char sha[6]; \r\n    u_char spa[4]; \r\n    u_char tha[6];\r\n    u_char tpa[4];\r\n};\r\n```\r\n\r\n```py\r\nfrom ctypes import *\r\n\r\nclass ARPHeader(Structure):\r\n    _fields_ = [\r\n        ('htype', c_uint16),\r\n        ('ptype', c_uint16),\r\n        ('hlen', c_ubyte),\r\n        ('plen', c_ubyte),\r\n        ('oper', c_uint16),\r\n        ('sha', c_ubyte * 6),\r\n        ('spa', c_ubyte * 4),\r\n        ('tha', c_ubyte * 6),\r\n        ('tpa', c_ubyte * 4)\r\n    ]\r\n```\r\n\r\nPrzykładowo\r\n\r\n```python\r\nip_header = Dissector.IPHeader(buf)\r\n```\r\n\r\nStruktura `ctypes` klasy `IPHeader` mapuje pierwsze 20 bajtów otrzymanego bufora na _przyjazny_ nagłówek IP (w pozostałych klasach jest analogicznie dla innych protokołów)\r\n\r\nW tym samym pliku jest również funkcja `service_lookup`, która na podstawie podanych portów zgaduje, jaka usługa jest uruchomiona\r\n\r\n```python\r\ndef service_lookup(src_port, dst_port=-1):\r\n    \"\"\"Zgaduje usługę za pomocą używanych numerów portów\"\"\"\r\n    port_to_service_map = {\r\n        20: 'FTP (data transfer)',\r\n        21: 'FTP (command)',\r\n        22: 'SSH',\r\n        23: 'Telnet',\r\n        25: 'SMTP',\r\n        43: 'WHOIS',\r\n        49: 'TACACS',\r\n        53: 'DNS',\r\n        80: 'HTTP',\r\n        88: 'Kerberos',\r\n        110: 'POP3',\r\n        143: 'IMAP',\r\n        161: 'SNMP',\r\n        162: 'SNMP (trap)',\r\n        443: 'HTTPS',\r\n    }\r\n\r\n    if src_port in port_to_service_map.keys():\r\n        return port_to_service_map[src_port]\r\n    elif dst_port in port_to_service_map.keys():\r\n        return port_to_service_map[dst_port]\r\n    else:\r\n        return 'Unknown'\r\n```\r\n\r\nZ tej funkcji korzystają klasy `TCPHeader` oraz `UDPHeader`\r\n\r\n### Sniffer.py\r\n\r\nW tym pliku znajduje się klasa `Sniffer` odpowiedzialna za funkcjonalność narzędzia. Wykorzystuje klasy z modułu `Dissector.py` do przedstawiania przechwyconych danych w czytelnej dla człowieka formie\r\n\r\n```python\r\nsniffer = Sniffer(\"eth0\", verbose=True, output_file='captured.txt', dump=False)\r\n```\r\n\r\nKonstruktor przujmuje argumenty:\r\n\r\n- `interface` - NIC, z którego będą przechwytywane ramki (argument obowiązkowy)\r\n- `verbose` - czy wypisywać wyniki na stdout (opcjonalne, domyślnie `True`)\r\n- `output_file` - plik, do którego zapisać wyniki (opcjonalne, domyślnie `None`)\r\n- `dump` - czy zrzucać surowe przechwycone dane (opcjonalne, domyślnie `True`)\r\n\r\nW metodzie `__init__` jest tworzone _surowe gniazdo_, które następnie zostaje powiązane z podanym interfejsem\r\n\r\nfunkcja `socket` z modułu `socket` przyjmuje argumenty:\r\n\r\n- rodzina `socket.AF_PACKET`\r\n- typ `socket.SOCK_RAW`\r\n- stała `ETH_P_ALL` (wszystkie protokoły)\r\n\r\nKlasa `Sniffer` zawiera metody:\r\n\r\n- `hexdump(self, buffer)`\r\n    - Tworzy zrzut szesnastkowy z otrzymanej ramki\r\n- `start_sniffing(self)`\r\n    - rozpoczyna przechwytywanie pakietów\r\n    - przełącza kartę sieciową w tryb mieszany (_promiscuous_)\r\n    - przechwytuje ramki i przekazuje je do dalszej analizy\r\n    - aby zatrzymać przechwytywanie należy nacisnąć _**Ctrl + C**_\r\n- `promisc_mode(self, enable=True)`\r\n    - jeśli parametr `enable` jest prawdą, przełącza kartę w tryb mieszany\r\n    - jeśli `False`, wyłącza tryb mieszany\r\n- `stop_sniffing(self)`\r\n    - wyłącza tryb mieszany na interfejsie\r\n- `dissect_eth(self, frame)`\r\n    - z otrzymanej ramki tworzy obiekt `Dissector.EthernetHeader` i określa protokół warstwy wyższej\r\n- `dissect_ip(self, ip_header, packet)`\r\n    - z otrzymanego pakietu IP tworzy obiekt `Dissector.IPHeader` i określa protokół warstwy wyżej\r\n    - w przypadku warstwy transportowej (TCP, UDP) określa usługę\r\n- `dissect_app_layer(self, service, segment)`\r\n    - na podstawie argumentu `service` określa protokół warstwy aplikacji i przetwarza jego dane\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farkregiel%2Fraw-socket-network-sniffer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Farkregiel%2Fraw-socket-network-sniffer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farkregiel%2Fraw-socket-network-sniffer/lists"}