Untitled
unknown
plain_text
a year ago
3.6 kB
9
Indexable
#!/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...")
Editor is loading...
Leave a Comment