
Qué es el Fuzzing de Redes?
El fuzzing de redes es una técnica automática o semi-automática para detectar errores de software. Consiste en probar entradas correctas e incorrectas al azar para detectar vulnerabilidades en el software.
Como siempre queda bien decir cifras y meter miedo, yo no voy a ser menos. Así que ahí va:
Según Forbes Advisor, hubo 2,365 ciberataques en 2023 con 343,338,964 víctimas.
Ahora ya puedes decir que has leído un post de ciberseguridad serio.
Bueno. Aquí es donde el fuzzing nos echa un cable para intentar no ser parte de las estadísticas.
La idea es encontrar vulnerabilidades antes de que los atacantes puedan aprovecharse de ellas. Así, te da una ventaja para arreglar los problemas antes de que se conviertan en algo grave.
Por qué es Importante el Fuzzing de Redes en la Seguridad de Redes
El fuzzing es como un simulacro de incendio. Identifica y corrige vulnerabilidades de seguridad antes de que puedan ser explotadas, proporcionando una medida proactiva para protegerse contra brechas de seguridad. Ayuda a mantener tu red segura y protegida. Es una forma más para luchar contra las amenazas de ciberseguridad, reduciendo el riesgo de brechas de seguridad y proporcionando una capa externa de seguridad a la infraestructura. Sin duda, es una parte crucial de cualquier estrategia de seguridad de red.
Cosas Básicas de las Técnicas de Fuzzing
El fuzzing testing consiste en proporcionar entradas válidas e inválidas al software para obtener respuestas. El objetivo es hacer que el software falle. Después ya veremos si es una vulnerabilidad o no.
Así que aquí tienes los conceptos básicos de las pruebas de fuzzing:
- Campos de entrada: El fuzzing comienza proporcionando entradas válidas e inválidas para probar el software. Puede usar herramientas manuales o automatizadas para este propósito.
- Mutación: El fuzzing implica alterar los datos de entrada para producir nuevos casos de prueba. Se puede alterar el formato, la longitud o el contenido de los datos para lograr la mutación.
- Automatización: El fuzzing incluye procesos automatizados, ejecutando el software con una gran cantidad de casos de prueba para identificar vulnerabilidades de seguridad.
- Monitoreo: El fuzzing también monitorea comportamientos inesperados durante las pruebas, como bloqueos, cuelgues o fugas de memoria.
Buenas prácticas para el Fuzzing
El fuzzing testing implica varios pasos, como:
Fallos Comunes que no debes Cometer
Sí, se me fue un poco la mano con esto de los dibujitos. Pero es que me encantan :)
Scapy y su Relevancia en la Seguridad de Redes
Scapy es una herramienta escrita en Python y está especializada en crear tráfico de red de muy bajo nivel de forma sencilla. Hacer fuzzing con Scapy es muy sencillo y potente. Con unas pocas líneas de código puedes crear paquetes de red personalizados y probar la robustez de los protocolos de red.
Fuzzing de Protocolos Usando Scapy
Una de las cosas para las que más se usa Scapy es para hacer fuzzing de protocolos de red. Para empezar con Scapy, primero debes instalarlo usando pip:
$ pip install scapy
Una vez instalado puedes usar Scapy para crear paquetes. Por ejemplo, para crear un paquete ICMP simple, puedes usar el siguiente código:
from scapy.all import *
ip = IP(dst="192.168.1.1")
icmp = ICMP()
packet = ip/icmp
response = sr1(packet, timeout=2, verbose=0)
if response:
print(f"Source IP: {response[IP].src}")
print(f"Source Port: {response[IP].sport}")
else:
print("No response received")
Para realizar el fuzzing de protocolos, puedes modificar el paquete cambiando sus campos o añadiendo nuevos. Por ejemplo, para hacer fuzzing del campo tipo ICMP, puedes usar el siguiente código:
from scapy.all import *
ip = IP(dst="192.168.1.1")
icmp = ICMP(type=RandShort()) # Random ICMP type value
packet = ip/icmp
response = sr1(packet, timeout=2, verbose=0)
if response:
print(f"Source IP: {response[IP].src}")
print(f"Source Port: {response[IP].sport}")
else:
print("No response received")
En este ejemplo, cambiamos el campo tipo ICMP a un valor aleatorio entre 0 y 255 usando la función RandShort(). Enviando un gran número de paquetes con diferentes valores, puedes probar la robustez del protocolo de red e identificar comportamientos extraños.
Conceptos de Fuzzing: Una Forma pésima de Hacer Fuzzing y la Correcta
En la seguridad de redes, el fuzzing es un método para determinar cuán confiables son los protocolos de red. Consiste en bombardear un sistema con una gran cantidad de datos incorrectos, inesperados o aleatorios para intentar causar comportamientos inesperados, como bloqueos o cuelgues. El objetivo es encontrar vulnerabilidades en el software, servicios o dispositivos antes de que actores maliciosos puedan aprovecharse de ellas.
El fuzzing se puede hacer de dos maneras: la incorrecta y la correcta. Enviar paquetes de datos arbitrarios a un sistema sin estructura o objetivo es un método pobre. Es poco probable que esta técnica encuentre vulnerabilidades y puede incluso llevar a falsos positivos. Las técnicas de fuzzing correctas implican entender el protocolo de red bajo prueba y crear paquetes que exploten posibles fallos. Este enfoque tiene más probabilidades de identificar debilidades y proporcionar información útil.
Si quieres hacer fuzzing bien, en lugar de hacer chapuzas, tienes que tener en cuenta que has de interpretar los resultados.
Ejemplos de Scripts de Fuzzing Simples y Cómo Interpretar sus Resultados
Aquí tienes un ejemplo de un script de fuzzing simple usando Scapy.
from scapy.all import *
# Define the target IP address and port number
target_ip = "192.168.1.1"
target_port = 80
# Define the number of packets to send
num_packets = 100
# Define the fuzzing function
def fuzz(packet):
# Modify the payload of the packet with random data
payload = "A" * (packet.len - 28)
return IP(dst=target_ip)/TCP(sport=RandShort(), dport=target_port)/payload
# Send the fuzzed packets
for i in range(num_packets):
packet = IP(dst=target_ip)/TCP(sport=RandShort(), dport=target_port)
fuzzed_packet = fuzz(packet)
send(fuzzed_packet)
# Analyze the results
answered_packets = sr1(IP(dst=target_ip)/TCP(dport=target_port), timeout=5, verbose=0)
if answered_packets:
print(f"Received response from {answered_packets[IP].src}:{answered_packets[TCP].sport}")
else:
print("No response received")
Este script envía varios paquetes TCP a una dirección IP y puerto objetivo con una carga útil aleatoria. La función sr1()
se usa para recibir una respuesta del objetivo, si la hay. Si se recibe una respuesta, se imprime la dirección IP y el número de puerto de origen.
Para interpretar el resultado, puedes buscar cualquier comportamiento inesperado en la respuesta, como bloqueos o cuelgues. Si no se recibe respuesta, puede indicar que el objetivo no está respondiendo a los paquetes de fuzzing o que los paquetes no se están enviando correctamente.