Untitled

mail@pastecode.io avatar
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