Actualiser DHCP2.py
This commit is contained in:
@@ -1,56 +1,67 @@
|
|||||||
from scapy.all import Ether, IP, UDP, BOOTP, DHCP, sendp, sniff, RandMAC
|
from scapy.all import Ether, IP, UDP, BOOTP, DHCP, sendp, sniff, RandMAC
|
||||||
import random
|
import random
|
||||||
|
|
||||||
# Configuration des paramètres DHCP
|
# Configuration du serveur DHCP
|
||||||
DHCP_SERVER_IP = "192.168.1.10" # L'adresse IP du serveur DHCP
|
DHCP_SERVER_IP = "192.168.1.10" # Adresse IP du serveur DHCP
|
||||||
DHCP_POOL_START = "192.168.1.100" # Début de la plage d'adresses
|
DHCP_POOL_START = "192.168.1.100" # Début de la plage d'adresses
|
||||||
DHCP_POOL_END = "192.168.1.200" # Fin de la plage d'adresses
|
DHCP_POOL_END = "192.168.1.200" # Fin de la plage d'adresses
|
||||||
SUBNET_MASK = "255.255.255.0"
|
SUBNET_MASK = "255.255.255.0"
|
||||||
ROUTER_IP = "192.168.1.2" # Adresse du routeur
|
ROUTER_IP = "192.168.1.1" # Adresse IP du routeur
|
||||||
DNS_IP = "192.168.1.2" # Adresse du serveur DNS
|
DNS_IP = "192.168.1.1" # Adresse IP du serveur DNS
|
||||||
LEASE_TIME = 86400 # Durée de location en secondes
|
LEASE_TIME = 86400 # Durée du bail (en secondes)
|
||||||
|
allocated_ips = {} # Pour stocker les adresses IP allouées avec leurs MACs
|
||||||
|
|
||||||
allocated_ips = set() # Pour suivre les adresses IP attribuées
|
|
||||||
|
|
||||||
|
# Générer une adresse IP dans la plage DHCP
|
||||||
def generate_ip():
|
def generate_ip():
|
||||||
# Générer une adresse IP dans la plage DHCP
|
|
||||||
while True:
|
while True:
|
||||||
ip = f"192.168.1.{random.randint(100, 200)}"
|
ip = f"192.168.1.{random.randint(100, 200)}"
|
||||||
if ip not in allocated_ips:
|
if ip not in allocated_ips.values(): # Éviter la réutilisation d'une IP allouée
|
||||||
allocated_ips.add(ip)
|
|
||||||
return ip
|
return ip
|
||||||
|
|
||||||
def generate_dhcp_offer(pkt):
|
|
||||||
if pkt.haslayer(DHCP) and pkt[DHCP].options[0][1] == 1: # Discover
|
|
||||||
client_mac = pkt[Ether].src
|
|
||||||
offered_ip = generate_ip()
|
|
||||||
|
|
||||||
# Construction de la réponse DHCP Offer
|
# Fonction pour extraire une option DHCP par clé
|
||||||
dhcp_offer = (
|
def get_option(dhcp_options, key):
|
||||||
Ether(dst=client_mac, src=RandMAC()) /
|
for i in dhcp_options:
|
||||||
IP(src=DHCP_SERVER_IP, dst='255.255.255.255') /
|
if i[0] == key:
|
||||||
UDP(sport=67, dport=68) /
|
return i[1]
|
||||||
BOOTP(op=2, yiaddr=offered_ip, siaddr=DHCP_SERVER_IP, chaddr=client_mac) /
|
return None
|
||||||
DHCP(options=[
|
|
||||||
("message-type", "offer"),
|
|
||||||
("server_id", DHCP_SERVER_IP),
|
|
||||||
("lease_time", LEASE_TIME),
|
|
||||||
("subnet_mask", SUBNET_MASK),
|
|
||||||
("router", ROUTER_IP),
|
|
||||||
("dns", DNS_IP),
|
|
||||||
("end")
|
|
||||||
])
|
|
||||||
)
|
|
||||||
sendp(dhcp_offer, iface='eth0', verbose=False) # Remplacez 'eth0' par votre interface
|
|
||||||
|
|
||||||
def generate_dhcp_ack(pkt):
|
|
||||||
if pkt.haslayer(DHCP) and pkt[DHCP].options[0][1] == 3: # Request
|
|
||||||
client_mac = pkt[Ether].src
|
|
||||||
requested_ip = pkt[DHCP].options[2][1] # Adresse IP demandée
|
|
||||||
|
|
||||||
# Construction de la réponse DHCP ACK
|
# Générer une réponse DHCP Offer
|
||||||
|
def send_dhcp_offer(packet):
|
||||||
|
client_mac = packet[Ether].src
|
||||||
|
offered_ip = generate_ip()
|
||||||
|
allocated_ips[client_mac] = offered_ip # Allouer l'adresse IP au client
|
||||||
|
|
||||||
|
# Construire et envoyer la réponse DHCP Offer
|
||||||
|
dhcp_offer = (
|
||||||
|
Ether(src=RandMAC(), dst=client_mac) /
|
||||||
|
IP(src=DHCP_SERVER_IP, dst='255.255.255.255') /
|
||||||
|
UDP(sport=67, dport=68) /
|
||||||
|
BOOTP(op=2, yiaddr=offered_ip, siaddr=DHCP_SERVER_IP, chaddr=client_mac) /
|
||||||
|
DHCP(options=[
|
||||||
|
("message-type", "offer"),
|
||||||
|
("server_id", DHCP_SERVER_IP),
|
||||||
|
("lease_time", LEASE_TIME),
|
||||||
|
("subnet_mask", SUBNET_MASK),
|
||||||
|
("router", ROUTER_IP),
|
||||||
|
("name_server", DNS_IP),
|
||||||
|
("end")
|
||||||
|
])
|
||||||
|
)
|
||||||
|
sendp(dhcp_offer, iface='ens33', verbose=False) # Utilisation de ens33
|
||||||
|
|
||||||
|
|
||||||
|
# Générer une réponse DHCP Ack
|
||||||
|
def send_dhcp_ack(packet):
|
||||||
|
client_mac = packet[Ether].src
|
||||||
|
requested_ip = get_option(packet[DHCP].options, 'requested_addr')
|
||||||
|
|
||||||
|
if requested_ip in allocated_ips.values() and allocated_ips[client_mac] == requested_ip:
|
||||||
|
# Construire et envoyer la réponse DHCP Ack
|
||||||
dhcp_ack = (
|
dhcp_ack = (
|
||||||
Ether(dst=client_mac, src=RandMAC()) /
|
Ether(src=RandMAC(), dst=client_mac) /
|
||||||
IP(src=DHCP_SERVER_IP, dst='255.255.255.255') /
|
IP(src=DHCP_SERVER_IP, dst='255.255.255.255') /
|
||||||
UDP(sport=67, dport=68) /
|
UDP(sport=67, dport=68) /
|
||||||
BOOTP(op=2, yiaddr=requested_ip, siaddr=DHCP_SERVER_IP, chaddr=client_mac) /
|
BOOTP(op=2, yiaddr=requested_ip, siaddr=DHCP_SERVER_IP, chaddr=client_mac) /
|
||||||
@@ -60,15 +71,35 @@ def generate_dhcp_ack(pkt):
|
|||||||
("lease_time", LEASE_TIME),
|
("lease_time", LEASE_TIME),
|
||||||
("subnet_mask", SUBNET_MASK),
|
("subnet_mask", SUBNET_MASK),
|
||||||
("router", ROUTER_IP),
|
("router", ROUTER_IP),
|
||||||
("dns", DNS_IP),
|
("name_server", DNS_IP),
|
||||||
("end")
|
("end")
|
||||||
])
|
])
|
||||||
)
|
)
|
||||||
sendp(dhcp_ack, iface='eth0', verbose=False) # Remplacez 'eth0' par votre interface
|
sendp(dhcp_ack, iface='ens33', verbose=False) # Utilisation de ens33
|
||||||
|
print(f"IP {requested_ip} allouée à {client_mac}")
|
||||||
|
|
||||||
def start_dhcp_server():
|
|
||||||
print("Démarrage du serveur DHCP...")
|
|
||||||
sniff(filter="udp and (port 67 or port 68)", prn=lambda x: generate_dhcp_offer(x) if x.haslayer(DHCP) and x[DHCP].options[0][1] == 1 else generate_dhcp_ack(x), store=0)
|
|
||||||
|
|
||||||
|
# Gérer les paquets DHCP reçus
|
||||||
|
def handle_dhcp_packet(packet):
|
||||||
|
if DHCP in packet:
|
||||||
|
dhcp_message_type = packet[DHCP].options[0][1]
|
||||||
|
|
||||||
|
# Correspondance avec DHCP Discover
|
||||||
|
if dhcp_message_type == 1:
|
||||||
|
print(f"DHCP Discover reçu de {packet[Ether].src}")
|
||||||
|
send_dhcp_offer(packet)
|
||||||
|
|
||||||
|
# Correspondance avec DHCP Request
|
||||||
|
elif dhcp_message_type == 3:
|
||||||
|
print(f"DHCP Request reçu de {packet[Ether].src}")
|
||||||
|
send_dhcp_ack(packet)
|
||||||
|
|
||||||
|
# Correspondance avec d'autres paquets (ex. DHCP Release, Decline)
|
||||||
|
else:
|
||||||
|
print(f"Autre paquet DHCP de {packet[Ether].src}")
|
||||||
|
|
||||||
|
|
||||||
|
# Démarrer le serveur DHCP
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
start_dhcp_server()
|
print("Serveur DHCP en cours d'exécution...")
|
||||||
|
sniff(filter="udp and (port 67 or port 68)", prn=handle_dhcp_packet, store=0, iface='ens33')
|
||||||
|
|||||||
Reference in New Issue
Block a user