Como escrever um scanner de vulnerabilidades e ganhar dinheiro com explorações

TLDR : Sobre como deixei meu emprego como segurança e escrevi meu próprio scanner de vulnerabilidades.
E como você pode ganhar dinheiro com isso. No final, estão pedaços de código e especificação do scanner.


Quem e o que quebra


Nos anos 70, há muito tempo, a Internet era assim.



A principal ameaça para ele foram os pesquisadores e entusiastas que foram os primeiros a chegar à documentação e redes de grandes corporações.


Desde então, a Internet mudou muito. Ataques em redes, serviços e aplicativos da Web tornaram-se uma ocorrência diária. Todos os dias, desenvolvedores e pesquisadores encontram dezenas de vulnerabilidades. Paralelamente, dezenas de milhares de sites estão sendo invadidos.


Isso é claramente visível no mapa de ataques da Kaspersky Lab. Ele exibe disparadores de IDS, verificações de vulnerabilidades e ataques de botnets. O mapa parece uma imagem tão bonita e possui milhões de ataques por dia apenas na Rússia.




O cibercrime não é praticado por amadores, mas por grupos organizados de dezenas de pessoas. Eles fazem isso por interesse. Isto é um negócio. Eles não são caras de capuz preto escrevendo "BLACK K0d" à noite em frente ao monitor. São pessoas socialmente ativas trabalhando em escritórios em diferentes países do mundo.


Minha carreira foi tal que, durante vários anos, fui responsável pela segurança do perímetro da rede e pela proteção de aplicativos da web. Sobre o que minhas experiências daquele período resultaram, contarei neste artigo.


Se você trabalha / trabalha em uma empresa de telecomunicações, banco, provedor ou é desenvolvedor de uma grande empresa e, especialmente, se é um responsável pela segurança, sabe que a segurança em uma empresa com mais de 10 a 15 sites é lixo, inferno, morte.


Vamos tentar melhorar a situação. Eles dizem que a segurança é um processo.
E há muitos processos.


Liste-os brevemente:


  • Gerenciamento de ameaças
  • Gerenciamento de vulnerabilidades
  • Gerenciamento de riscos
  • Gerenciamento de patches
  • Gerenciamento de Identidade e Acesso
  • Consciência de segurança
  • Gerenciamento de Provedor de Segurança
    E outros

Não consideraremos esses tipos no artigo, felicidades.
Existem muitos deles, e os benefícios variam dependendo do tamanho da organização, tipos de ativos e sua criticidade.


Falaremos sobre um processo que beneficiará até pequenas empresas.
De uma loja on-line com centenas de milhares de rublos de receita, a uma grande corporação com dezenas de data centers.


Detecção de vulnerabilidades


Para entender o que há maneiras de nos quebrar, vamos nos olhar através dos olhos de um invasor.


A análise de segurança consiste em várias etapas. Para cada estágio, darei um conjunto básico de utilitários que você pode usar.


  • Reunir informações sobre quais IPs, domínios e sub-redes é nosso objetivo. Em vez de bater na porta da frente, é melhor encontrar pontos de entrada menos seguros.
    dnsrecon, Fierce, Censys, reverse-PTR-lookup. 
  • Análise de serviços para vulnerabilidades conhecidas (CVE). Explorações públicas são comuns para eles.
     Vulners, exploit-DB, NIST, CVEdetails 
  • Análise de serviços para senhas fracas.
     potator, hydra 
  • Análise de vulnerabilidade de aplicativos da web
     Zap, Burp, w3af, Arachni 

Cool


Ok legal. Temos uma maneira e ferramentas para verificar um site.
Levará vários dias para verificar + analisar um serviço, para descobrir completamente - uma semana ou mais.


Não é legal


O problema é que podemos ter mais de um serviço. E por exemplo / 20 sub-rede.
4096 endereços. Cada um pode ter 65535 serviços. Não é legal.


Sim, existem soluções automatizadas. Qualys, Acunetix, Nessus, existem fornecedores nacionais. Analisando o que são bons e ruins, proponho deixar para outro artigo.


Eles não resolveram meus problemas. Decidi que precisava corrigi-lo. Ele deixou o emprego e, por cerca de um ano, ele e meus companheiros partiram para o desenvolvimento.


Como escrever um scanner de vulnerabilidades


Vamos começar com os requisitos para o sistema que queríamos obter:


  • Realiza reconhecimento e localiza domínios de destino e IP
  • Monitora o perímetro da rede. Ele vê quando um novo endereço aparece no intervalo ou um subdomínio aparece no site protegido
  • Verifica constantemente endereços, vê quando as portas de rede abrem e fecham
  • Detecta vulnerabilidades e explorações conhecidas de banner / CPE
  • Pega senhas fracas
  • Localiza erros de configuração do aplicativo e do SO
  • Localiza vulnerabilidades no CMS e seus plugins
  • Localiza interativamente XSS, SQLi, XXE, RCE, LFI, RFI e os do OWASP para 10 que podem ser pesquisados ​​automaticamente
  • Ele faz isso mais de uma vez, mas verifica constantemente meus recursos e reage se surgirem novas vulnerabilidades

Os usuários são proprietários de grandes intervalos de rede, ou seja, aqueles com 10 ou mais aplicativos da web.
É necessário fornecer varredura paralela diária de vulnerabilidades na web, senhas fracas, erros de configuração e mostrar explorações de saída para centenas de ip e sites.


Para fazer isso, use um sistema escalável horizontalmente. Você pode adicionar novos nós e novos tipos de scanners rapidamente. Agora, o scanner usa 7 nós e é dividido em 2 locais de interação na Alemanha e nos EUA. Se estiver interessado, escreveremos sobre isso em outro artigo.


Pensamos em como escrever um scanner assim. Percebemos que escrever do zero esse sistema faz pouco sentido. Exigiu vasta experiência e entendimento de diferentes plataformas, sua própria base de impressões digitais de rede, sua própria base de CVE e explorações para elas, e um enorme sistema dedicado à análise da segurança de aplicativos da Web.


Onde a licença do produto permite, decidimos usar desenvolvimentos de código aberto. Existem componentes de código fechado, mas gratuitos para uso comercial. Existem alguns projetos de código aberto auto-escritos e de bifurcação.


Portanto, temos cerca de 20 aplicações diferentes, que são os componentes necessários para cobrir os níveis de L3-L7 para o pentest automatizado.


Interface para scanner


Cada script, PoC dividido ou binário, aceita parâmetros diferentes para iniciar a verificação. Não é muito conveniente. Eu queria obter um formato unificado para iniciar qualquer scanner possível.


Pensamos no que qualquer possível scanner precisa saber para identificar o alvo. Compilou uma mesa.


Tipo de verificaçãoDados de entrada
Integração com bancos de dados de exploração e CVEFornecedor: Produto: Versão (CPE)
Exploração de PoC para serviçoIP, porta, CVE
BrutilkaIP, porta, protocolo da camada de aplicação
Scanner CMSPorta do domínio
Verificador de vulnerabilidades da WebPorta de domínio ou IP
Vulnerabilidades na Web do PoCURI
Scanner portuárioIP

Após uma verificação inicial do nmap e um plug-in que acessa os detalhes do CVE para cada host, obtemos um conjunto desses objetos. Nós os chamamos de metadados.


Representação 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 porta no Target, obtemos um conjunto desses metadados. Agora você precisa entender qual dos nossos scanners deseja trabalhar para esse fim.


Todos os scanners têm um pai - ScanManager, o que o torna elegante:


 product(scanners, metadata_as_list) 

É preciso todos os serviços e, para cada um deles, verifica todos os scanners possíveis.
Cada scanner fornece uma função que determina se deseja trabalhar com esse alvo.


Vamos falar sobre o que é o scanner.
Três opções foram consideradas:


  • Implemente cada scanner como um microsserviço que suporta nosso RPC
  • Implemente cada scanner como um serviço e use um barramento de mensagens comum
  • Terceira opção

Mas somos muito preguiçosos e percebemos que, no caso das duas primeiras opções, além dos próprios scanners, será necessária alguma outra infraestrutura para implantação, gravação de RPC e captura de bugs desse RPC. Além disso, queríamos escrever tudo em Python.


Tentamos várias soluções. Analisamos projetos semelhantes de gerenciamento de scanner, como Yandex Molly e Minion da Mozilla. Vimos como o w3af, o Zap, funciona. Burp tem uma arquitetura de plugins muito interessante.


Decidimos que cada scanner deveria ser implementado como uma função serializável em python. Isso permitirá que você os armazene diretamente no rabbit-mq, ​​entregue rapidamente em diferentes nós, execute atomicamente. Podemos adicionar novos scanners sem precisar criar e compartilhar aplicativos. De fato, temos um serviço para execução distribuída e assíncrona de funções em python.


Formato do Scanner


O scanner lançado em nossa plataforma deve ser um objeto herdado da classe base do scanner.


Qualquer scanner deve aceitar um objeto do tipo Metadados como objetos de entrada e retorno do tipo Vulnerabilidade.


 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 vulnerabilidade


A próxima tarefa que enfrentamos foi criar um formato unificado no qual possamos armazenar a saída de qualquer scanner. Quer se trate de um harvester da web, um diretório brutilka ou uma exploração do PoC em cache do memcached.


Decidimos não cercar nossos próprios formatos, mas usar o padrão da indústria - o formato CVE. Enriquecemos o CVE com metadados para nossa vulnerabilidade, facilitando o armazenamento e a recuperação. Para armazenar dados específicos do scanner, adicione o campo do corpo. Quais teclas do corpo devem ser exibidas na interface da web são determinadas pelo Scanner.


 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 

Tentamos dar aos autores dos scanners liberdade máxima na implementação.
E nós convidamos você a participar do desenvolvimento.


Como ganhar dinheiro com explorações.


Queremos que as pessoas interessadas em segurança, autores de utilitários e scripts, pesquisadores tenham a oportunidade de monetizar absolutamente legalmente os resultados de seu trabalho.


O scanner é chamado METASCAN. Se você possui seus próprios scripts ou explorações de PoC em um dia, ou talvez você seja o autor do scanner. Envie-nos os módulos no formato Scanner para david.ordyan@metascan.ru!


Pagaremos uma remuneração mensal aos autores dos módulos e anunciaremos a aceitação dos módulos até 30 de novembro.
Vamos testá-los executando nossa base de clientes em mais de 2000 sites e contando o número de detecções.


Os autores dos três primeiros scanners pelo número de vulnerabilidades encontradas receberão:


  • 31 337 rublos para o 1º lugar.
  • 13.370 rublos para o 2º e 3º lugar.

Além disso, ofereceremos a eles que concluam contratos e recebam uma recompensa por usar seus scanners mensalmente, até encontrarem vulnerabilidades.


Após novembro, expandiremos o programa de recebimento de scanners.


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


Exemplos e código aparecerão aqui

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


All Articles