Cómo escribir un escáner de vulnerabilidades y ganar dinero con exploits

TLDR : sobre cómo dejé mi trabajo como guardia de seguridad y escribí mi propio escáner de vulnerabilidades.
Y cómo puedes ganar dinero con eso. Al final hay piezas de código y especificación del escáner.


Quién y qué se rompe


En la década de 1970, hace mucho tiempo, Internet se veía así.



La principal amenaza para él fueron los investigadores y entusiastas que fueron los primeros en acceder a la documentación y las redes de las grandes corporaciones.


Desde entonces, Internet ha cambiado mucho. Los ataques a redes, servicios y aplicaciones web se han convertido en una ocurrencia diaria. Todos los días, los desarrolladores e investigadores encuentran docenas de vulnerabilidades. Paralelamente, decenas de miles de sitios están siendo pirateados.


Esto es claramente visible en el mapa de ataque de Kaspersky Lab. Muestra disparadores IDS, escaneos de vulnerabilidad y ataques de botnet. El mapa se ve como una imagen tan hermosa y tiene millones de ataques por día solo en Rusia.




El cibercrimen no es hecho por aficionados, sino por grupos organizados de docenas de personas. Hacen esto por interés. Esto es un negocio No son tipos con capuchas negras que escriben "BLACK K0d" por la noche frente al monitor. Estas son personas socialmente activas que trabajan en oficinas en diferentes países del mundo.


Mi carrera fue tal que durante varios años fui responsable de la seguridad del perímetro de la red y la protección de las aplicaciones web. Sobre lo que resultaron mis experiencias de ese período, lo contaré en este artículo.


Si trabajaste / trabajaste en una empresa de telecomunicaciones, un banco, un proveedor o eres un desarrollador en una gran empresa, y especialmente si eres una persona de seguridad, entonces sabes que la seguridad en una empresa con más de 10-15 sitios es basura, infierno, muerte.


Intentemos mejorar la situación. Dicen que la seguridad es un proceso.
Y hay muchos procesos.


Enumere brevemente:


  • Gestión de amenazas
  • Gestión de vulnerabilidades
  • Gestión de riesgos
  • Gestión de parches
  • Gestión de identidad y acceso
  • Reconocimiento de seguridad
  • Gestión de proveedores de seguridad
    Y otros

No consideraremos las especies enumeradas en el artículo, saludos.
Hay muchos de ellos, y los beneficios varían según el tamaño de la organización, los tipos de activos y su importancia.


Hablaremos sobre un proceso que beneficiará incluso a las pequeñas empresas.
Desde una tienda en línea con cientos de miles de rublos de ingresos, hasta una gran corporación con docenas de centros de datos.


Detección de vulnerabilidad


Para entender cuáles son las formas de descifrarnos, echemos un vistazo a nosotros mismos a través de los ojos de un atacante.


El análisis de seguridad consta de varias etapas. Para cada etapa, le daré un conjunto básico de utilidades que puede usar.


  • Nuestro objetivo es recopilar información sobre qué IP, dominios, subredes. En lugar de llamar a la puerta principal, es mejor encontrar puntos de entrada menos seguros.
    dnsrecon, Fierce, Censys, reverse-PTR-lookup. 
  • Análisis de servicios para vulnerabilidades conocidas (CVE). Las hazañas públicas son comunes para ellos.
     Vulners, exploit-DB, NIST, CVEdetails 
  • Análisis de servicios para contraseñas débiles.
     potator, hydra 
  • Análisis de vulnerabilidad de aplicaciones web.
     Zap, Burp, w3af, Arachni 

Genial


Ok, genial Tenemos una manera y herramientas para verificar 1 sitio.
Tomará varios días verificar + analizar un servicio, resolverlo a fondo, una semana o más.


No genial


El problema es que podemos tener más de un servicio. Y por ejemplo / 20 subred.
4096 direcciones. Cada uno puede tener 65535 servicios. No es genial


Sí, hay soluciones automatizadas. Qualys, Acunetix, Nessus, hay vendedores nacionales. Análisis de lo que son buenos y malos, propongo dejar para otro artículo.


No resolvieron mis problemas. Decidí que necesito arreglarlo. Renunció a su trabajo y durante aproximadamente un año él y mis camaradas se fueron al desarrollo.


Cómo escribir un escáner de vulnerabilidades


Comencemos con los requisitos para el sistema que queríamos obtener:


  • Realiza reconocimientos y localiza dominios de destino e ip
  • Monitorea el perímetro de la red. Él ve cuando aparece una nueva dirección en el rango o aparece un subdominio en el sitio protegido
  • Comprueba constantemente las direcciones, ve cuándo se abren y cierran los puertos de red
  • Encuentra vulnerabilidades y conocidos exploits de banner / CPE
  • Recoge contraseñas débiles
  • Encuentra errores de configuración de aplicaciones y SO
  • Encuentra vulnerabilidades en CMS y sus complementos
  • Encuentra interactivamente XSS, SQLi, XXE, RCE, LFI, RFI y los de OWASP a 10 que se pueden buscar automáticamente
  • Lo hace más de una vez, pero comprueba constantemente mis recursos y reacciona si surgen nuevas vulnerabilidades.

Los usuarios son propietarios de grandes rangos de red, es decir, aquellos con 10 o más aplicaciones web.
Es necesario proporcionar una exploración paralela diaria de vulnerabilidades web, contraseñas débiles, errores de configuración y mostrar exploits salientes para cientos de ip y sitios web.


Para hacer esto, use un sistema escalable horizontalmente. Puede agregar nuevos nodos y nuevos tipos de escáneres sobre la marcha. Ahora el escáner utiliza 7 nodos y está dividido en 2 ubicaciones interactivas en Alemania y EE. UU. Si está interesado, escribiremos sobre esto en otro artículo.


Pensamos en cómo escribir un escáner de este tipo. Nos dimos cuenta de que escribir desde cero un sistema así no tiene mucho sentido. Se requirió una vasta experiencia y comprensión de diferentes plataformas, su propia base de huellas digitales de red, su propia base de CVE y exploits para ellas, y un gran sistema dedicado al análisis de la seguridad de las aplicaciones web.


Cuando la licencia del producto lo permite, decidimos utilizar desarrollos de código abierto. Hay componentes de código cerrado, pero gratuitos para uso comercial. Hay bastantes proyectos de código abierto autoescritas y bifurcadas.


Entonces, tenemos alrededor de 20 aplicaciones diferentes, que son los componentes necesarios para cubrir los niveles L3-L7 para el pentest automatizado.


Interfaz para escáner


Cada script, división PoC o binario acepta diferentes parámetros para comenzar a escanear. No muy conveniente Quería obtener un formato unificado para iniciar cualquier posible escáner.


Pensamos en lo que cualquier posible escáner necesita saber para identificar el objetivo. Compiló una mesa.


Comprobar tipoDatos de entrada
Integración con exploit y bases de datos CVEVendedor: Producto: Versión (CPE)
PoC explotar para el servicioIP, puerto, CVE
BrutilkaIP, puerto, protocolo de capa de aplicación
Escáner CMSPuerto de dominio
Escáner de vulnerabilidad webDominio o puerto IP
Vulnerabilidades web de PoCURI
Escáner de puertosIP

Después de una comprobación inicial de nmap y un complemento que accede a CVEdetails para cada host, obtenemos un conjunto de dichos objetos. Los llamamos metadatos.


Representación JSON:


            {             "cves": [],             "service": "mysql",             "protocol": "tcp",             "target": "example.com",             "time": "1513941789",             "product": "mysql",             "vendor": "mysql",             "version": "5.1.63-community",             "port": 3306,             "uri": ""           } 

Para cada puerto en Target, obtenemos un conjunto de metadatos. Ahora debe comprender cuál de nuestros escáneres desea trabajar para este propósito.


Todos los escáneres tienen un padre: ScanManager, lo que lo hace elegante:


 product(scanners, metadata_as_list) 

Toma todos los servicios y para cada uno de ellos verifica todos los escáneres posibles.
Cada escáner proporciona una función que determina si desea trabajar con dicho objetivo.


Hablemos sobre qué es el escáner.
Se consideraron tres opciones:


  • Implemente cada escáner como un microservicio que admita nuestro RPC
  • Implemente cada escáner como un servicio y use un bus de mensajes común
  • Tercera opción

Pero somos muy vagos y nos dimos cuenta de que en el caso de las dos primeras opciones, además de los escáneres, también necesitará algún tipo de infraestructura de implementación, escribir RPC, detectar errores de este RPC. Además, queríamos escribir todo en Python.


Intentamos varias soluciones. Analizamos proyectos similares de gestión de escáneres, como Yandex Molly y Minion de Mozilla. Vimos cómo funciona w3af, Zap. Burp tiene una arquitectura de plugin muy interesante.


Decidimos que cada escáner debería implementarse como una función serializable en python. Esto le permitirá almacenarlos directamente en rabbit-mq, ​​entregarlos rápidamente a diferentes nodos y ejecutarlos atómicamente. Podemos agregar nuevos escáneres sin tener que crear y compartir aplicaciones. De hecho, obtuvimos un servicio para la ejecución distribuida y asincrónica de funciones en python.


Formato de escáner


El escáner lanzado en nuestra plataforma debe ser un objeto heredado de la clase base del escáner.


Cualquier escáner debe aceptar un objeto de tipo Metadatos como entrada y devolver objetos de tipo Vulnerabilidad.


 class Scanner(object):   name = "scanner_base"   vuln_type = "default_vuln_type"   user_options = {}   Vulnerability_body_fields_to_web_interface = []   def __init__(self, opts, target, metadata):       self.metadata = metadata       self.opts = opts       self.target = target   @staticmetod   def circuit(Metadata):       '''         .            Metadata.             CVE.       '''       return [Vulnerability(), Vulnerability()]   def check_start_condition(self):       '''        ,    Target          True,    .    False.       '''       return True   class ScannerError(Exception):       def __init__(self, value):           self.value = value       def __str__(self):           return repr(self.value) 

Formato de vulnerabilidad


La siguiente tarea que enfrentamos fue crear un formato unificado en el que podamos almacenar la salida de cualquier escáner. Ya sea un recolector web, un directorio brutilka o un exploit PoC memcached.


Decidimos no cercar nuestros propios formatos, sino utilizar el estándar de la industria: el formato CVE. Enriquecemos CVE con metadatos para nuestra vulnerabilidad para un fácil almacenamiento y recuperación. Para almacenar datos específicos del escáner, agregue el campo del cuerpo. Scanner determina qué teclas del cuerpo deben mostrarse en la interfaz web.


 class Vulnerability(object):   '''           body     .   '''   def __init__(self, target, port, scanner, text, VulnerabilityTypes, Score, protocol,                UpdateDate=None, scan_date=None, Complexity=None, Access=None, CWEID=None, Authentication=None,                Integ=None, PublishDate=None, Conf=None, ofExploits=0, Avail=None,                CVEID=None, references=None, GainedAccessLevel=None, false_positive=False,                fixed=None, body=None):       scan_date = scan_date if scan_date is not None else calendar.timegm(gmtime())       references = references or []       body = body or {}       self.name = self.construct_cve_name(VulnerabilityTypes, protocol, target, port, credentials, uri, params)       self.data = {           "target" : target,           "port" : int(port),           "Scanner": scanner,           "Scan_date": scan_date,           "Name": name,           "UpdateDate": UpdateDate,           "VulnerabilityTypes": VulnerabilityTypes,           "Complexity": Complexity,           "text": text,           "Access": Access,           "CWEID": CWEID,           "Hash": sha1(self.name.encode('utf-8')).hexdigest(),           "Authentication": Authentication,           "Integ": Integ,           "PublishDate": PublishDate,           "Conf": Conf,           "ofExploits": ofExploits,           "Score": Score,           "Avail": Avail,           "CVEID": CVEID,           "References": references,           "GainedAccessLevel": GainedAccessLevel,           "FalsePositive": false_positive,           "Fixed": fixed,           "Body": body       }   @staticmethod   def construct_cve_name(VulnerabilityTypes, protocol, target, port, credentials, uri, params):       # vuln_type:host:port:protocol:credentials:uri:params       return "{}:{}:{}:{}:{}:{}:{}".format(           VulnerabilityTypes,           target,           port,           protocol,           credentials,           uri,           params)   def __str__(self):       return self.data   def __repr__(self):       return self.name 

Intentamos dar a los autores de escáneres la máxima libertad de implementación.
Y te invitamos a participar en el desarrollo.


Cómo ganar dinero con las hazañas.


Queremos que las personas interesadas en la seguridad, los autores de utilidades y scripts, los investigadores, tengan la oportunidad de monetizar legalmente los resultados de su trabajo.


El escáner se llama METASCAN. Si tiene sus propios scripts o exploits PoC de 1 día, o tal vez usted mismo es el autor del escáner. ¡Envíenos los módulos en formato de escáner a david.ordyan@metascan.ru!


Pagaremos una remuneración a los autores de los módulos mensualmente y anunciaremos la aceptación de los módulos hasta el 30 de noviembre.
Los probaremos a través de nuestra base de clientes en más de 2000 sitios y contando el número de detecciones.


Los autores de los primeros tres escáneres por el número de vulnerabilidades encontradas recibirán:


  • 31 337 rublos para el 1er lugar.
  • 13,370 rublos para el segundo y tercer lugar.

Y también les ofreceremos que les ofrezcamos celebrar contratos y recibir una recompensa por usar sus escáneres mensualmente, hasta que encuentren vulnerabilidades.


Después de noviembre, ampliaremos el programa para recibir escáneres.


Escriba a david.ordyan@metascan.ru o TG https://t.me/METASCAN
BB8E 3D9B 04FF 70C9 A260 CD45 E0BF 4EB4 9838 A7EC


Ejemplos y código aparecerán aquí

Source: https://habr.com/ru/post/es427625/


All Articles