jueves, 13 de febrero de 2025

Operadores en Python para Ingenieros de Redes: Guia de Estudio (7)

  • El tipo de dato Booleano (Bullion) en Python: Fue añadido para simplificar la evaluación de condiciones como verdaderas o falsas.
  • Subclase de la clase integer: La clase Booleana es una subclase de la clase integer, lo que permite realizar operaciones matemáticas con valores booleanos.
  • La función bool(): Esta función evalúa si un valor dado es verdadero o falso.
    • Funcionamiento: Al pasar un valor a la función bool(), esta determinará si el valor se considera True o False.
    • Valores True y False: La función bool() retornará uno de estos dos valores.
  • Todo en Python es un objeto: Todos los objetos en Python pueden ser evaluados como True o False.
  • Comparaciones en Python:
    • Se utiliza == para comparar valores, no un solo =.
    • El operador = se usa para la asignación de objetos.
  • Ejemplos de la función bool():
    • bool(1 + 1 == 2) retorna True.
    • bool(2 + 2 == 5) retorna False.
  • El valor None:
    • Es un valor especial en Python que siempre se evalúa como False.
    • Es útil para pruebas de condiciones donde se necesita un valor que sea consistentemente falso.
    • Importante: La palabra clave None debe escribirse con la primera letra en mayúscula.



  • Evaluación de cadenas y listas:
    • Una cadena como John se evalúa como True.
    • Una lista con elementos, como [15, "VLAN"], también se evalúa como True.
    • Una lista vacía, o el valor "nada", se evalúa como False.



  • Reglas de evaluación: Python sigue reglas específicas para determinar si los valores son True o False. Estas reglas son específicas para cada tipo de dato.
  • Evaluación de Cadenas como Booleanos:

    • En Python, las cadenas pueden ser evaluadas como valores booleanos (verdadero o falso).
    • Generalmente, todas las cadenas se evalúan como True, a menos que sean una cadena vacía.
  • Cadenas No Vacías:

    • Cualquier cadena que contenga al menos un carácter, como "John", "access list", "F", "5", "VLAN", o "abracadabra" se evaluará como True.
    • Esto significa que la mayoría de las cadenas que encuentres en tu código se considerarán verdaderas cuando se utilicen en contextos que requieran un valor booleano.
  • Cadenas Vacías:

    • Una cadena vacía ( "" ), es la única excepción y se evalúa como False.
    • Esto es fundamental para entender cómo Python interpreta las cadenas en condiciones o evaluaciones booleanas.
  • Ejemplos:

    • Si defines una variable access_list1 = "access list" y la pasas a una función que evalúa valores booleanos, retornará True.
    • Si defines una variable test_string = "" (una cadena vacía), la evaluación de esta variable retornará False.


  • Reglas Clave:

    • La regla principal es que cualquier cadena con contenido se evalúa como True.
    • Solo las cadenas vacías se evalúan como False.
  • Listas No Vacías:
    • Una lista que contiene al menos un elemento, independientemente del tipo de dato de los elementos (cadenas, enteros, otros tipos), se evaluará como True.
    • Ejemplos de listas que se evalúan como True: ['VLAN 5', 'VLAN 10', 'VLAN 15'], ['VLAN 20', 45, 5, 'VLAN 99'], ['', '', ''].
    • Es importante notar que incluso una lista que contiene cadenas vacías se evalúa como True porque la lista en sí no está vacía.


    • Lo que importa es si la lista tiene elementos, no el contenido de esos elementos.

  • Listas Vacías:
    • Una lista vacía ( [] ) es la única condición en la que una lista se evalúa como False.
    • Este comportamiento es similar al de las cadenas vacías.

  • Valores Booleanos de Otros Tipos de Datos:
    • Números no cero (enteros y flotantes) se evalúan como True
    • El valor 0 (cero) y 0.0 (cero punto cero) se evalúan como False
    • Estos valores también pueden ser incluidos en listas, pero no afectan la evaluación de la lista en sí misma; una lista con estos valores se evalúa como verdadera si la lista no está vacía.
      • Por ejemplo, una lista como [0, 0.0] se evaluará como True
El método append se utiliza para añadir un elemento al final de una lista. Este método es muy útil para construir listas dinámicamente, añadiendo elementos uno a uno durante la ejecución del código.
Ejemplo de uso de append:

.


Vemos ahora cómo Python evalúa tuplas, diccionarios y conjuntos en contextos booleanos, similar a cómo lo hace con listas. Estos conceptos son importantes en la automatización de redes para escribir código más eficiente y legible [conversación].

Evaluación de Veracidad/Falsedad

En Python, los tipos de datos pueden ser evaluados como True o False basándose en si contienen o no elementos.

  • Tuplas
    • Una tupla no vacía es evaluada como True.
      mi_tupla = ("VLAN 1", "VLAN 2")
      print(bool(mi_tupla))  # Output: True
      
    • Una tupla vacía es evaluada como False.
      mi_tupla_vacia = ()
      print(bool(mi_tupla_vacia))  # Output: False
      
  • Diccionarios
    • Un diccionario no vacío es evaluado como True.
      mi_diccionario = {"version": "15.6", "obtain": 200, "platform": "Cisco_iOS"}
      print(bool(mi_diccionario))  # Output: True
      
    • Un diccionario vacío es evaluado como False.
      mi_diccionario_vacio = {}
      print(bool(mi_diccionario_vacio))  # Output: False
      
    • Un diccionario con claves y valores vacíos (ej. cadenas vacías) se considera no vacío y se evalúa como True.
      mi_diccionario_con_vacios = {"key": "", "value": ""}
      print(bool(mi_diccionario_con_vacios)) # Output: True
      
  • Conjuntos (Sets)
    • Un conjunto no vacío se evalúa como True.
      mi_set = {1, 2, 5, 7}
      print(bool(mi_set))  # Output: True
      
    • Un conjunto vacío se evalúa como False. Para inicializar un conjunto vacío, se debe usar set() en lugar de {}, ya que las llaves se utilizan para crear diccionarios.
      mi_set_vacio = set()
      print(bool(mi_set_vacio))  # Output: False

  • Lógica del Operador and
    • El operador and evalúa múltiples condiciones y devuelve True solo si todas las condiciones son verdaderas.
    • Si alguna de las condiciones es False, el operador and devuelve False.
      • Esta lógica se puede entender mejor con una analogía binaria:
        • 1 representa True
        • 0 representa False

1 and 1 resulta en 1 (True).

1 and 0 resulta en 0 (False).

0 and 0 resulta en 0 (False).


Strings:
Un string no vacío se evalúa como True. 

mi_string1 = "John" 

mi_string2 = "" 

print(bool(mi_string1)) # Output: True 

print(bool(mi_string2)) # Output: False

Cuando se usa el operador and, si una variable es False, la evaluación resulta en False. 

print(mi_string1 and mi_string2) # Output: False

Múltiples Condiciones: 

El operador and no se limita a dos condiciones, puede evaluar múltiples condiciones. 

nombre1 = "John" 

nombre2 = "Dave" 

nombre3 = "Michelle" 

nombre4 = "Ryan"

print(nombre1 and nombre2 and nombre3 and nombre4) # Output: True

Si cambiamos una variable a un valor vacío, la evaluación completa resulta en False: 

nombre1 = "John" 

nombre2 = "" 

nombre3 = "Michelle" 

nombre4 = "Ryan" 

print(nombre1 and nombre2 and nombre3 and nombre4) # Output: False


Listas: Una lista vacía se evalúa como False. 

mi_nombre = "John" 

mi_apellido = "Rambo" 

mi_lista = [] 

print(mi_nombre and mi_apellido and mi_lista) # Output: False

Ejemplos Prácticos con and

Verificación de Versión y Plataforma: 

Se pueden combinar múltiples condiciones para verificar que un dispositivo cumpla con ciertos criterios antes de ejecutar una acción. 




Condición de No-Ejecución: Si cualquiera de las condiciones evaluadas con and es False, el bloque de código condicional no se ejecuta. 



Uso en Automatización: El operador and es fundamental para asegurar que todas las condiciones necesarias se cumplen antes de realizar una acción, como recargar un dispositivo o actualizar una política.


Consideraciones Adicionales

El operador and evalúa las expresiones de izquierda a derecha, deteniéndose tan pronto como encuentra una condición False.
Se pueden combinar diferentes tipos de datos en las evaluaciones con el operador and.
Es crucial entender la evaluación booleana de los distintos tipos de datos para utilizar el operador and de manera efectiva.
El operador and se puede usar para validar que todos los valores requeridos son True, antes de ejecutar una acción especifica.
Conclusión


El operador and es una herramienta poderosa en Python para la toma de decisiones lógicas, especialmente útil en la automatización de redes. Permite verificar que todas las condiciones necesarias se cumplen antes de ejecutar una acción. Al comprender su funcionamiento y aplicarlo correctamente, se pueden escribir scripts más robustos y fiables.

Ejemplos practicos con NOT:

  • El operador NOT invierte la veracidad o falsedad de un valor. Si un valor es verdadero, el operador NOT lo cambiará a falso, y viceversa.

  • Ejemplo en Python:

    • Si name = "John" entonces bool(name) es verdadero.
    • not name invertirá ese valor a falso.
    • Si my_list = [] (una lista vacía) entonces bool(my_list) es falso.
    • not my_list invertirá ese valor a verdadero.


  • Uso del operador NOT en código Python:

    • El operador NOT puede hacer que el código sea más corto y conciso.
    • Es útil en pruebas de condiciones en automatización de redes.
  • Ejemplo de uso con una lista de protocolos:

    • Se crea una lista de protocolos: my_list_of_protocols = ["Rep", "EIGRP", "OSPF", "ISIS"].
    • Se verifica si "BGP" está presente en la lista.
    • Sin el operador NOT, la declaración ("BGP" in my_list_of_protocols) retorna False porque BGP no está en la lista.
    • Al usar el operador NOT, not ("BGP" in my_list_of_protocols) retorna True.
    • En este caso, se imprime el mensaje "no path vector protocols are present".



    • Si se cambia la lista para incluir "BGP", la declaración ("BGP" in my_list_of_protocols) retorna True.
    • Al usar el operador NOT, not ("BGP" in my_list_of_protocols) retorna False.
    • En este caso, se imprime el mensaje "path vector detected".
  • El operador NOT no es estrictamente necesario, pero puede hacer que el código sea más limpio y fácil de leer.

  • Recomendación: Familiarizarse con el uso del operador NOT para escribir código Python más eficiente.

martes, 4 de febrero de 2025

ICMP y la Seguridad de Redes

 

ICMP y la Seguridad de Redes

Introducción a ICMP

  • ICMP (Internet Control Message Protocol) es un protocolo de la capa 3. A menudo se pasa por alto en el mundo del escaneo de redes.
  • No es tan complicado como otros protocolos, y tiene encabezados de paquetes más cortos.
  • A pesar de su simplicidad, ICMP tiene usos críticos y es tan importante como TCP o UDP.
  • Es compatible tanto con IPv4 como con IPv6.

Estructura de un Paquete ICMP

  • El encabezado de ICMP es de solo 8 bytes de largo, y los primeros 4 bytes son la parte principal.
  • El byte de desplazamiento 0 es el tipo de mensaje.
  • Los tipos y códigos de ICMP son esenciales para entender la comunicación en la capa 3.
  • No incluye un número de puerto.


Usos de ICMP en la Seguridad de Redes

  • Identificación de la Red: ICMP ayuda a identificar switches y otros dispositivos en la red.
  • Mapeo de Red: Permite mapear la red, tanto interna como externamente, y ayuda a construir mejores patrones de ruta.
  • Herramientas de Análisis de Red: ICMP se traduce directamente en herramientas comunes para el análisis de redes, como ping y traceroute.
  • Traceroute: Esta herramienta utiliza ICMP para determinar las rutas que toman los paquetes a través de una red. Por ejemplo, traceroute google.com utiliza ICMP para rastrear la ruta. En Windows, se utiliza el comando tracert -4 google.com para obtener la respuesta de traceroute para IPv4.
  • Detección de Hosts: Se utiliza para verificar qué hosts están activos en una red.
  • Descubrimiento de Routers: ICMP también se usa para el descubrimiento de routers en redes Juniper.
  • Mensajes de Error: ICMP se utiliza para enviar mensajes de error, como "host inalcanzable".

ICMP y el Análisis de Paquetes

  • Filtrado en Wireshark: Se pueden utilizar filtros en Wireshark para centrarse solo en el tráfico ICMP usando ip.proto == 1 o escribir icmp
  • Análisis de la Carga Útil (Payload) ICMP: La carga útil de un paquete ICMP se puede analizar para obtener información adicional sobre la comunicación.
  • Tipos de ICMP Un tipo común de ICMP es el "echo ping request", con un valor hexadecimal de 0x08. Si se detecta un destino inalcanzable, el tipo de ICMP sera 3.
Mensaje de puerto inacesible

  • Checksum: Se puede verificar el checksum del payload ICMP para garantizar la integridad de los datos.
  • Secuencia de Eventos: ICMP proporciona información sobre la secuencia de eventos que ocurren durante la comunicación. Estos incluyen un identificador y un número de secuencia, que se utilizan para identificar de forma única las solicitudes y emparejarlas con las respuestas.



Ejemplo Práctico
Consideremos un host Linux que envía dos pings a 192.168.238.2 y otros dos a 69.21.118.171. Podríamos ver lo siguiente:
Identificador 47, Secuencia 1 (ping a 192.168.238.2)
Identificador 47, Secuencia 2 (ping a 192.168.238.2)
Identificador 48, Secuencia 1 (ping a 69.21.118.171)
Identificador 48, Secuencia 2 (ping a 69.21.118.171)

En contraste, un host Windows 10 enviando los mismos pings:
Identificador 1, Secuencia 1 (ping a 192.168.238.2)
Identificador 1, Secuencia 2 (ping a 192.168.238.2)
Identificador 1, Secuencia 3 (ping a 69.21.118.171)
Identificador 1, Secuencia 4 (ping a 69.21.118.171)

En combinación con el identificador, el número de secuencia ayuda a determinar si algún paquete se ha perdido o si se han recibido respuestas fuera de orden

  • Windows 10, el número de secuencia siempre creciente puede ser menos útil para distinguir entre conversaciones, pero aún sirve para el seguimiento de mensajes en general, siendo importante para detectar retransmisiones o pérdidas
  • Relación con otros protocolos: Dentro de la respuesta ICMP, es posible encontrar información de otros protocolos como IGMP, IGRP, GRE, OSPF, etc.


Variedad de Payloads en ICMP

  • Diversidad de Sistemas Operativos: Los payloads de los mensajes ICMP echo varían significativamente según el sistema operativo e incluso entre aplicaciones que se ejecutan en el mismo sistema. Esta diversidad es importante para los analistas de red porque puede ayudar a identificar el tipo de sistema que está enviando los mensajes ICMP.

  • Payloads por Defecto:

    • Linux: Generalmente, los sistemas Linux utilizan un payload que incluye una marca de tiempo, seguida de una secuencia de valores hexadecimales incrementales, comenzando desde 0x10.
    • Windows: Los sistemas Windows, en contraste, suelen utilizar una secuencia de caracteres ASCII incrementales, comenzando con la letra "a" y continuando hasta la "w", luego repitiendo "a" hasta "i".


  • Importancia de los Payloads por Defecto: Es fundamental que los analistas comprendan los payloads predeterminados y el comportamiento normal de los sistemas en su entorno de red. Esto permite detectar sistemas o aplicaciones que puedan ser anómalos o maliciosos. Por ejemplo, si en una red exclusivamente Windows se detectan payloads con el formato hexadecimal incremental típico de Linux, esto podría ser una señal de alerta.

Payloads Inusuales y su Significado

  • Aplicaciones Específicas: Algunas aplicaciones pueden utilizar payloads no estándar para el tráfico ICMP echo. Por ejemplo, se han observado payloads extraños, pero no maliciosos, como los de Microsoft Outlook Autodiscover y Microsoft Telemetry Data.

  • Ejemplos de Payloads Inusuales:

    • Microsoft Outlook Autodiscover: Puede enviar payloads que contienen la palabra "Running".
    • Microsoft Telemetry Data: Envía mensajes con payloads muy cortos (2 bytes) y valores TTL (Time to Live) inusuales (30).
    • Tunelización SSH: Algunos payloads pueden ser usados para tunelizar otros protocolos, como SSH, sobre ICMP echo/echo reply. Esto es una clara señal de actividad sospechosa.
  • Actividad Maliciosa:

    • Aplicaciones maliciosas y canales de comando y control (C2) pueden utilizar ICMP echo/echo reply con payloads no estándar para comunicarse o pasar desapercibidos. Un payload inusual en un mensaje ICMP podría indicar la presencia de malware o una conexión de un C2, lo cual requiere una investigación adicional.


ICMP Echo Reply

  • Similitud con el Echo Request: En general, un mensaje ICMP echo reply debe tener un payload idéntico al del mensaje echo original. La única excepción son los casos en los que haya timestamps, que deberían ser actualizados en la respuesta.
  • Diferencias por Sistema Operativo: Como vimos en la conversación anterior, al enviar un mensaje ICMP tipo 8 con código 4, los sistemas Linux responden cambiando el tipo a 0 y manteniendo el código en 4, mientras que Windows cambia ambos valores a 0. Esta diferencia de implementación puede ser usada para identificar el sistema operativo, aunque no sea un cambio en el payload.

Mensajes ICMP de Tiempo Excedido (Time Exceeded)

  • Estos mensajes tienen el tipo 11.
  • Se utilizan para informar al emisor cuando un paquete no puede llegar a su destino debido a un problema de tiempo de vida (TTL) o tiempo de reensamblaje de fragmentos.
  • Hay dos códigos posibles:
    • Código 0: "Tiempo de vida excedido en tránsito". Se envía cuando el campo TTL de un paquete IP llega a cero, y el sistema descarta el paquete. Esto puede suceder en un enrutador o en el host de destino.
    • Código 1: "Tiempo de reensamblaje de fragmentos excedido". Se envía cuando un host no recibe todos los fragmentos de un paquete fragmentado antes de que se agote el tiempo de espera. El primer fragmento debe haberse recibido para que se envíe este mensaje.
  • Los campos 4 a 7 del encabezado ICMP no se utilizan en estos mensajes y permanecen en cero.
  • La carga útil incluye el encabezado IP y al menos los primeros 64 bits del paquete que causó el error.
  • El comando tracert de Windows utiliza mensajes de tiempo excedido para descubrir la ruta que siguen los paquetes hacia un destino. Aumenta el TTL en cada serie de paquetes ICMP echo, y al llegar a cada enrutador, este decrementa el valor TTL del paquete hasta que llega a 0 y genera un error de tipo tiempo excedido de código 0.

Mensajes ICMP de Destino Inalcanzable (Destination Unreachable)

  • Estos mensajes tienen el tipo 3.
  • Se envían cuando un destino no está disponible, ya sea el host, el puerto o el protocolo.
  • Existen muchos códigos asignados a este tipo de mensaje, del 1 al 15. Estos incluyen notificaciones cuando un puerto o protocolo no está disponible, o cuando el host o red son inalcanzables.
  • El código 4 se utiliza cuando se necesita fragmentar un paquete, pero el bit "no fragmentar" (Don't Fragment - DF) está activado.
  • Al igual que los mensajes de tiempo excedido, estos mensajes no utilizan los bytes de la posición 4 a la 7 del encabezado ICMP y la carga útil incluye el encabezado IP y los primeros 64 bits del paquete original.



Relevancia para el Monitoreo y la Seguridad

  • Los mensajes de error ICMP, como los de tiempo excedido y destino inalcanzable, pueden ser utilizados para el reconocimiento de la red. Por ejemplo, un escaneo de puertos y protocolos puede revelar información sobre los servicios en ejecución de un sistema.
  • Los mensajes de destino inalcanzable podrían revelar información sutil, como el hecho de que un sistema está activo y responde.
  • Es importante entender que tanto tcpdump como tshark pueden obtener resultados diferentes al analizar los mensajes de error ICMP debido a cómo procesan los encabezados de la carga útil. Tshark incluye los encabezados de la carga útil en las búsquedas de filtros, mientras que tcpdump no.
  • Estos mensajes de error pueden revelar información sensible, como direcciones IP internas que no deberían ser visibles desde el exterior.
  • Se pueden utilizar para mapear hosts y redes, identificando enrutadores mediante mensajes de tipo tiempo excedido y servicios no disponibles con mensajes de destino inalcanzable.
  • En condiciones normales, los mensajes ICMP no se deben enviar en respuesta a otros mensajes de error ICMP, paquetes de difusión o fragmentos que no sean el inicial.

Existen ciertas condiciones en las que no se deben enviar mensajes ICMP. Estas condiciones se establecen para evitar bucles de mensajes de error, tráfico innecesario y posibles ataques de denegación de servicio. Aquí están las condiciones principales:

  • En respuesta a otro mensaje de error ICMP: No se debe enviar un mensaje de error ICMP como respuesta a otro mensaje de error ICMP. Esto se hace para evitar un bucle infinito de mensajes de error entre dos hosts. Por ejemplo, si un host recibe un mensaje de "puerto inalcanzable" y trata de responder con otro mensaje de error, se podría generar una cadena sin fin de errores entre los hosts.
  • A una dirección de broadcast de destino: No se deben enviar mensajes de error ICMP en respuesta a un paquete IP con una dirección de broadcast de destino. Si se enviara un paquete UDP a una dirección de broadcast, múltiples hosts podrían responder con errores de "puerto inalcanzable", creando tráfico innecesario en la red.
  • Desde una dirección de origen de broadcast o loopback: No se deben enviar mensajes de error ICMP en respuesta a paquetes con una dirección de origen de broadcast o loopback. Generalmente, los paquetes con estas direcciones de origen son maliciosos y enviar mensajes de error podría llevar a un ataque de denegación de servicio.
  • A fragmentos que no sean el fragmento inicial (offset 0): Solo el fragmento inicial o con offset 0 de un paquete fragmentado debe generar un mensaje de error ICMP. Los fragmentos subsiguientes solo contienen datos, y no tienen el encabezado de protocolo necesario para asociar el error al paquete original.
  • Condiciones temporales: Los mensajes ICMP deben enviarse solo para condiciones no transitorias, es decir, problemas que no es probable que se resuelvan por sí solos. Problemas como corrupción de datos en tránsito no son reportados por ICMP ya que se consideran transitorios y se resuelven si el paquete se envía nuevamente.
  • Paquetes con checksum incorrecto: No se debe enviar un mensaje ICMP de error cuando se recibe un paquete con un checksum incorrecto.

Es importante tener en cuenta que estas condiciones están definidas en el RFC 1122. Estas reglas ayudan a asegurar que los mensajes ICMP se utilicen de manera efectiva y evitar problemas de red.

ICMPv6 

ICMPv6 presenta cambios sustanciales en comparación con ICMP en IPv4. Aquí están las características principales de ICMPv6:

  • Funcionalidades Adicionales: ICMPv6 incluye funcionalidades adicionales como el Protocolo de Descubrimiento de Vecinos (NDP) y funciones de membresía de grupos multicast (MLD).

    • Protocolo de Descubrimiento de Vecinos (NDP): NDP reemplaza a ARP y ofrece funciones para descubrir nodos en la red local, determinar la alcanzabilidad de los nodos y detectar cambios en las direcciones de la capa de enlace. NDP también permite detectar direcciones IP duplicadas en la misma red y posibilita que los hosts soliciten direcciones de routers y que los routers anuncien su presencia.
    • Multicast Listener Discovery (MLD): MLD se incorpora a ICMPv6 para determinar los receptores multicast en un enlace. Las direcciones y funcionalidades multicast se usan más en IPv6 que en IPv4.
  • Cambios en los Tipos de Mensajes: Los valores de tipo de los mensajes ICMP han cambiado significativamente en ICMPv6.

    • Mensajes de error: Tienen valores de tipo entre 0 y 127 y no se deben bloquear.
    • Mensajes informativos: Tienen valores de tipo entre 128 y 255 y pueden bloquearse de manera más segura tanto en la entrada como en la salida.
    • ICMP Echo request: Tipo 128.
    • ICMP Echo reply: Tipo 129.
  • Checksum: A diferencia de ICMP en IPv4, el cálculo de la suma de comprobación en ICMPv6 incluye el pseudo-encabezado. Esto es porque IPv6 no incluye un checksum en el encabezado IP, por lo que se requiere el pseudo-encabezado para el checksum de ICMPv6.

  • Organización de Tipos de Mensajes: Los rangos de tipo están diseñados de tal manera que el bit de orden superior indica si el mensaje es de error (0) o informativo (1).

  • Número de protocolo: ICMPv6 tiene el número de protocolo 58.

En resumen, ICMPv6 no solo mantiene las funciones básicas de ICMP como el reporte de errores y los intercambios de información, sino que también integra nuevas funciones para adaptarse a las necesidades de IPv6. Los cambios más notables son la inclusión de NDP y MLD, la modificación de los tipos de mensajes y el cambio en el cálculo del checksum. Estos cambios hacen que ICMPv6 sea más robusto y funcional en el contexto de las redes IPv6.

lunes, 3 de febrero de 2025

Analisis de bloqueo de página WEB

 




Durante un tiempo me he preguntado como se bloquean las página que comparten ficheros que incumplen con alguna norma legislativa. En este caso se trata de mejortorrent una web que contenía enlaces de ficheros torrent que permitían la descarga ilegal de software y películas. Normalmente el bloqueo a las páginas WEBs se suele hacer a nivel de DNS, pero en este caso veremos un caso diferente ya que seguramente el servidor ha sido intervenido. A continuación, analizaremos el flujo de conexión del equipo con la dirección IP 192.168.18.141 al sitio web mejortorrent.com y cómo finalmente es redirigido a a.policia.es. Este análisis se basa en  este archivo mejortorrent.pcap y a continuación se detalla cada paso del proceso.

1. Resolución de DNS

El proceso comienza con la resolución de DNS para obtener la dirección IP de mejortorrent.com.

  • Paquete 1 y 2: El cliente (192.168.18.141) envía consultas DNS al servidor DNS (212.166.210.80) para resolver tanto la dirección IPv4 (tipo A) como la dirección IPv6 (tipo AAAA) de mejortorrent.com.
  • Paquete 3 y 4: El servidor DNS responde que no hay una dirección IPv6 disponible, pero proporciona la dirección IPv4 69.16.230.165.



2. Establecimiento de la Conexión TCP

Una vez obtenida la dirección IP, el cliente inicia una conexión TCP con el servidor.

  • Paquete 5: El cliente envía un paquete SYN al servidor mejortorrent.com en el puerto 443 (HTTPS).
  • Paquete 7: El servidor responde con un paquete SYN-ACK.
  • Paquete 8: El cliente confirma la conexión con un paquete ACK.

Operadores en Python para Ingenieros de Redes: Guia de Estudio (7)

El tipo de dato Booleano (Bullion) en Python: Fue añadido para simplificar la evaluación de condiciones como verdaderas o falsas. Subclase...