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 tipo | Datos de entrada |
---|
Integración con exploit y bases de datos CVE | Vendedor: Producto: Versión (CPE) |
PoC explotar para el servicio | IP, puerto, CVE |
Brutilka | IP, puerto, protocolo de capa de aplicación |
Escáner CMS | Puerto de dominio |
Escáner de vulnerabilidad web | Dominio o puerto IP |
Vulnerabilidades web de PoC | URI |
Escáner de puertos | IP |
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.
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)
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):
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í