Domain Generation Algorithms
En este artículo vamos a analizar una técnica que emplean la mayoría de la botnets modernas [1] para localizar a sus servidores de Comando y Control (C2), los denominados Algoritmos de Generación de Dominios o DGAs (Domain Generation Algorithms, en inglés) [1].
Domain Generation Algorithms (DGAs) por
Los DGAs no son más que algoritmos que generan de una manera pseudoaleatoria una lista de dominios DNS válidos, y que normalmente van cambiando en el tiempo. Cada familia de software malicioso (malware) tiene su propio algoritmo, y utilizan esa lista de dominios para que los miembros de la botnet puedan contactar con sus servidores de Comando y Control, sin que sea posible bloquear sus comunicaciones o que las fuerzas de seguridad tomen el control del mismo. Por ejemplo, la versión 5.33 de la herramienta CCleaner se comprometió con un malware, que usaba un DGA que genera un dominio nuevo cada mes, de la siguiente forma:
ab1145b758c30[.]com
ab890e964c34[.]com
ab3d685a0c37[.]com
aba40ed1a73[.]com
Pero antes de analizar en más detalle cómo funcionan las DGAs y cómo detectarlas, es importante comprender el porqué, su razón de ser, y así entender qué tipo de amenazas las emplean.
Los DGAs no son más que algoritmos que generan de una manera pseudoaleatoria una lista de dominios DNS válidos, y que normalmente van cambiando en el tiempo
Pongamos por un momento en la piel de un atacante (botmaster) que está construyendo una botnet, por ejemplo, para lanzar ataques de denegación de servicio distribuido (DDoS), enviar mensajes de spam, usarla de proxy para realizar otros ciberataques, utilizarla para instalar otro malware que robe la información de los usuarios, o incluso para alquilarla a otros grupos criminales. Las botnets suelen tener miles o hasta cientos de miles de equipos bajo su control, y normalmente funcionan durante meses u años. Pero para que sean útiles para el atacante, éste debe ser capaz de enviarles órdenes a sus bots. Por ejemplo, la dirección de la víctima a la que realizar un ataque de DDoS o para indicar el nuevo módulo del malware que deben instalar. Para ello, el mecanismo de comunicación más habitual de las botnets actuales (dado que la mayoría de los bots están detrás de firewalls/NATs que solo permite conexiones salientes hacia Internet), consiste en que los bots se conectan a uno o más servidores de Comando y Control (C&C o C2) centralizados, que suelen estar bajo el control directo del atacante (botmaster), y permiten recibir información de los bots de la botnet y enviarles órdenes (Figura 1).
Pero ¿Cómo puede saber un bot que acaba de infectar un equipo dónde están los C2 con los que tiene que contactar? En las primeras botnets, el código malicioso que infectaba los equipos incluía la dirección IP o, más habitualmente, el nombre de dominio DNS de los servidores de C2 de la botnet. El problema para el botmaster es que las botnets solían ser víctimas de su propio éxito. En cuanto una botnet crecía en tamaño y/o realizaba más ataques, empezaba a ser de interés para los investigadores y las fuerzas de seguridad, que empezaban a analizar muestras de las mismas, y aunque las direcciones de los servidores C2 solían estar ofuscadas, mediante ingeniería inversa o analizando su tráfico de red era posible obtenerlas. Una vez identificados los servidores de C2 de una botnet, era posible filtrarlos, pedir al proveedor de DNS o de hosting que los dé de baja, o incluso tomar el control de los mismos (e.g. configurando los dominios DNS para que apunten a direcciones IP de la policía en lugar del atacante). Si los bots no pueden ponerse en contacto con sus servidores de C2, no pueden realizar más ataques, o si estos están controlados por la policía pueden ordenar a los bots que se desactiven (con un comando o enviando una actualización que inutiliza al malware). En cualquier caso, si los servidores de C2 se comprometen, toda la botnet se viene abajo.
Los DGAs son la respuesta de los atacantes a este problema. Dado que los botmasters asumen que tarde o temprano alguien analizará el código de sus bots (al fin y al cabo, las botnets intentan propagarse lo máximo posible). En lugar de utilizar una lista estática con las direcciones de los servidores de C2, las botnets modernas emplean una lista dinámica, que va cambiando periódicamente. De esta forma, si los investigadores o las fuerzas de seguridad identifican las direcciones de los C2 actuales y las filtran o eliminan de algún modo, pasado un tiempo los bots intentarán conectarse a otras direcciones, de forma que el atacante puede recuperar el control de la botnet. De hecho, la gran mayoría de las botnets actuales [3] utilizan DGAs [4].
Este objetivo defensivo de los atacantes explica la génesis y las principales características de los DGAs modernos. En particular, las botnets modernas suelen emplear algoritmos de DGA que generan cientos de dominios DNS que cambian cada poco tiempo (e.g., cada día o semana, aunque algunos algoritmos cambian incluso cada hora). Los bots utilizan la fecha del equipo para alimentar un algoritmo pseudoaleatorio que genera la lista dinámica de dominios de ese día. Luego intenta resolver y contactar secuencialmente con cada uno de ellos (o un subconjunto aleatorio de los mismos, para que no sea tan fácil obtener la lista completa), hasta que alguno de ellos responda, o se conecta a los últimos servidores C2 conocidos.
El mecanismo de comunicación más habitual de las botnets actuales consiste en que los bots se conectan a uno o más servidores de Comando y Control (C&C o C2) centralizados, que suelen estar bajo el control directo del atacante (botmaster), y permiten recibir información de los bots de la botnet y enviarles órdenes
Sin embargo, el uso de múltiples dominios parece contraintuitivo. Al fin y al cabo, al usar más dominios parece más sencillo que la policía pueda comprometer alguno de ellos. De hecho, los investigadores suelen registrar dominios de DGA conocidos para estudiar el tamaño y alcance las botnets, simplemente registrando todas las direcciones IP que se ponen en contacto con ellos [5]. Aunque no pueden hacerse pasar por el servidor C2 del botmaster puesto que las botnets más avanzadas [2] suelen emplear algún tipo de criptografía asimétrica para que los bots puedan autenticar a los servidores de C2 (i.e., los bots conocen la clave pública del botmaster, que es el único que tiene la clave privada asociada).
Sin embargo, el uso de muchos dominios de corta duración crea una gran asimetría en los costes de operación. Para controlar la botnet en cada periodo de tiempo el botmaster solo necesita registrar un dominio (normalmente se emplean dominios comunes y baratos, o proveedores de DNS dinámico gratuitos), mientras que la policía debería comprar cientos de dominios cada día para garantizar que los bots nunca puedan ponerse en contacto con los servidores de C2.
Por otro lado, el tráfico de red de los bots que implementan algoritmos de DGA es muy característico:
- Centenares de consultas DNS a dominios de primer nivel inexistentes (i.e. respuestas DNS NXDOMAIN).
- Largos y con aspecto aleatorio.
- Y, aunque esto ha ido cambiando con el tiempo, los DGAs son bastante ruidosos.
Por ello los DGAs solo se emplean en botnets o campañas masivas de larga duración en los que el sigilo no es fundamental. Me sorprendería mucho que el malware de un APT (Advanced Persistent Threat) financiado por un estado utilizase un DGA para contactar con sus servidores de C2 (en su lugar suelen emplear sitios web legítimos comprometidos).
Los primeros algoritmos de DGAs eran muy sencillos. Muchos de ellos, como Bamital [6], simplemente aplicaban una función hash a la fecha actual y un contador, y concatenaban al resultado un TLD (Top Level Domain) barato (e.g. .info, .org, .co.cc, .cz.cc). Los dominios resultantes (e.g. cd8f66549913a78c5a8004c82bcf6b01[.]info) tenían un tamaño largo, fijo, y solo utilizaban caracteres hexadecimales, por lo que era muy poco probable que ya estuviesen registrados, pero eran muy fáciles de identificar (e.g. con una expresión regular).
Para complicar su detección, los algoritmos de DGA han ido evolucionando. Algunos de ellos emplean adicionalmente una semilla, que cambia en cada campaña, por lo que, si se analiza la muestra de malware de una campaña, no se puede obtener la lista de dominios de C2 del resto de campañas. Otros, ni siquiera permiten anticiparse, puesto que en lugar de la fecha utilizan otra información no predecible, como los trending topics del día de Twitter [5].
Además, los dominios generados suelen tener longitudes variables (o añaden subdominios como www), ser más cortos y emplean un alfabeto más amplio. De hecho empieza a haber algoritmos de DGA que generan secuencias aleatorias "pronunciables" (e.g. kemocujufys[.]eu), alternando vocales y consonantes, o incluso algunos que se generan mezclando palabras completas de diccionarios (e.g. electricquestion[.]ru), que los hacen aún más difíciles de identificar.
Afortunadamente, los investigadores de seguridad han conseguido realizar la ingeniería inversa de un gran número de algoritmos de DGA [7] [8], y hasta proporcionan la lista de dominios que van a emplear cada día [4], de forma que se puedan identificar o bloquear de manera preventiva los DGAs conocidos. Para la detección de dominios DGAs “desconocidos”, se están investigando un gran número de algoritmos basados en técnicas de Machine Learning y Deep Learning, que permiten distinguir los dominios DGA aleatorios de los dominios legítimos, e incluso clasificar a que familia de malware pertenece un dominio dado [9].
Referencia
[1] D. Plohmann, K. Yakdan, M. Klatt, J. Bader y E. Gerhards-Padilla, «A Comprehensive Measurement Study of Domain Generating Malware,» de 25th USENIX Security Symposium, Austin, TX, 2016.
[2] P. Wang, S. Sparks y C. C. Zou, «An Advanced Hybrid Peer-to-Peer Botnet,» IEEE Transactions on Dependable and Secure Computing, vol. 7, nº 2, pp. 113-127, Abril-Junio 2010.
[3] IBM, «X-Force Exchange: Botnets más comunes,» [En línea]. Available: https://exchange.xforce.ibmcloud.com/botnet/. [Último acceso: 03 10 2021].
[4] Network Security Research Lab at 360, «DGA Families,» [En línea]. Available: https://data.netlab.360.com/dga/. [Último acceso: 03 10 2021].
[5] B. Stone-Gross, M. Cova, L. Cavallaro, B. Gilbert, M. Szydlowski, R. Kemmerer, C. Kruegel y G. Vigna, «Your Botnet is My Botnet: Analysis of a Botnet Takeover,» de 16th ACM conference on Computer and Communications Security (CCS'09), 2009.
[6] P. Krysiuk y V. Thakur, «Trojan.Bamital,» Symatec, 2013.
[7] J. Bader, «Domain Generation Algorithms,» [En línea]. Available: https://github.com/baderj/domain_generation_algorithms. [Último acceso: 03 10 2021].
[8] D. Plohmann, «DGA archive,» Fraunhofer FKIE, [En línea]. Available: https://dgarchive.caad.fkie.fraunhofer.de/. [Último acceso: 03 10 2021].
[9] J. Trost, «Getting Started with DGA Domain Detection Research,» 16 07 2019. [En línea]. Available: https://jason-trost.medium.com/getting-started-with-dga-domain-detection-research-89af69213257. [Último acceso: 05 10 2021].