Untitled
unknown
plain_text
a month ago
3.6 kB
3
Indexable
Never
#!/usr/bin/env python3 import random from scapy.all import * # Konfiguracja serwera sport = 2080 # Port, na którym serwer będzie nasłuchiwał # Przechwytywanie SYN w celu ustanowienia połączenia print(f"Serwer nasłuchuje na :{sport}...") syn_packet = sniff(filter=f"tcp and dst port {sport} and tcp[tcpflags] & tcp-syn != 0", count=1)[0] # Zainicjowanie połączenia, wysłanie SYN-ACK mss_value = 8152 # Typowa wartość MSS window_size = 8192 # Przykładowa wartość rozmiaru okna TCP wscale_value = 7 # Typowa wartość Window Scaling (skala okna) timestamp_value = 12345 # Przykładowy timestamp, zmień na odpowiedni # Zbiór opcji TCP: tcp_options = [ ('MSS', mss_value), # Ustawienie MSS #('SAckOK', ''), # Wsparcie dla SACK #('Timestamp', (timestamp_value, 0)), # Opcja Timestamp #('WScale', wscale_value) # Skalowanie okna TCP ] ip = IP(src=syn_packet[IP].dst, dst=syn_packet[IP].src, id=0, flags='DF') SYNACK = TCP(sport=sport, dport=syn_packet[TCP].sport, flags='SA', seq=555746166, ack=syn_packet[TCP].seq + 1, window=65120, options=tcp_options) send(ip/SYNACK) print("Wysłano SYN-ACK w odpowiedzi na SYN.") # Odbiór ACK od klienta w celu zakończenia ustanowienia połączenia ack_packet = sniff(filter=f"tcp and src {syn_packet[IP].src} and dst port {sport} and tcp[tcpflags] & tcp-ack != 0", count=1)[0] print("Połączenie nawiązane.") # Obsługa przychodzących danych while True: data_packet = sniff(filter=f"tcp and src {syn_packet[IP].src} and dst port {sport}", count=1, timeout=5) if data_packet: if data_packet[0][TCP].flags == 'FA': print("Got FIN packet.") break elif data_packet[0][TCP].flags == 'R': print("Got RST packet.") break elif data_packet[0][TCP].flags == 'P': print("Got PUSH packet.") elif data_packet[0].haslayer(Raw): received_data = data_packet[0][Raw].load.decode() print(f"Otrzymano dane: {repr(received_data)}") # Potwierdzenie danych (ACK) cur_ack = data_packet[0][TCP].seq + len(data_packet[0][Raw].load) cur_seq = data_packet[0][TCP].ack ACK = TCP(sport=sport, dport=syn_packet[TCP].sport, flags='A', seq=cur_seq, ack=cur_ack) send(ip/ACK) print("Wysłano ACK dla odebranych danych.") # Obsługa przychodzącego FIN od klienta fin_packet = sniff(filter=f"tcp and src {syn_packet[IP].src} and dst port {sport} and tcp[tcpflags] & tcp-fin != 0", count=1, timeout=5) if fin_packet: print("Odebrano FIN od klienta.") cur_ack = fin_packet[0][TCP].seq + 1 # Wysłanie ACK dla FIN FINACK = TCP(sport=sport, dport=syn_packet[TCP].sport, flags='A', seq=cur_seq, ack=cur_ack) send(ip/FINACK) print("Wysłano ACK dla FIN.") # Zamykanie połączenia przez wysłanie FIN FIN = TCP(sport=sport, dport=syn_packet[TCP].sport, flags='FA', seq=cur_seq, ack=cur_ack) FINACK = sr1(ip/FIN) if FINACK and FINACK[TCP].flags == 'A': print("Odebrano ACK dla naszego FIN. Połączenie zamknięte.") else: print("Nie odebrano ACK dla naszego FIN.") else: print("Brak odebranego FIN.") # Wysłanie RST w celu zresetowania połączenia print("Wysyłanie pakietu RST w celu zresetowania połączenia...") RST = TCP(sport=sport, dport=syn_packet[TCP].sport, flags='R', seq=cur_seq, ack=cur_ack) send(ip/RST) print("Pakiet RST został wysłany.") input("Press Enter to continue...")
Leave a Comment