Comment écrire un scanner de vulnérabilité et gagner de l'argent sur les exploits

TLDR : À propos de la façon dont j'ai quitté mon emploi d'agent de sécurité et écrit mon propre scanner de vulnérabilité.
Et comment vous pouvez gagner de l'argent dessus. À la fin se trouvent des morceaux de code et de spécifications du scanner.


Qui et quoi se casse


Dans les années 1970, il y a longtemps, Internet ressemblait à ça.



La principale menace pour lui était les chercheurs et les passionnés qui ont été les premiers à accéder à la documentation et aux réseaux des grandes entreprises.


Depuis lors, Internet a beaucoup changé. Les attaques sur les réseaux, les services et les applications Web sont devenues un phénomène quotidien. Chaque jour, les développeurs et les chercheurs découvrent des dizaines de vulnérabilités. Parallèlement, des dizaines de milliers de sites sont piratés.


Ceci est clairement visible sur la carte d'attaque de Kaspersky Lab. Il affiche les déclencheurs IDS, les analyses de vulnérabilité et les attaques de botnet. La carte ressemble à une si belle image et elle n'a des millions d'attaques par jour qu'en Russie.




La cybercriminalité n'est pas le fait d'amateurs, mais de groupes organisés de dizaines de personnes. Ils le font par intérêt. C'est une affaire. Ce ne sont pas des gars à capuche noire écrivant "BLACK K0d" la nuit devant le moniteur. Ce sont des personnes socialement actives qui travaillent dans des bureaux dans différents pays du monde.


Ma carrière a été telle que pendant plusieurs années j'ai été responsable de la sécurité du périmètre du réseau et de la protection des applications web. À propos de ce que mes expériences de cette période ont abouti, je vais le dire dans cet article.


Si vous travaillez / avez travaillé dans une entreprise de télécommunications, une banque, un fournisseur ou si vous êtes développeur dans une grande entreprise, et surtout si vous êtes un responsable de la sécurité, alors vous savez que la sécurité dans une entreprise avec plus de 10 à 15 sites est une poubelle, un enfer, la mort.


Essayons d'améliorer la situation. Ils disent que la sécurité est un processus.
Et il y a beaucoup de processus.


Énumérez-les brièvement:


  • Gestion des menaces
  • Gestion des vulnérabilités
  • Gestion des risques
  • Gestion des correctifs
  • Gestion des identités et des accès
  • Sensibilisation à la sécurité
  • Gestion des fournisseurs de sécurité
    Et d'autres.

Nous ne prendrons pas en compte les espèces répertoriées dans l'article, applaudissements.
Ils sont nombreux et les avantages varient en fonction de la taille de l'organisation, des types d'actifs et de leur criticité.


Nous parlerons d'un processus qui profitera même aux petites entreprises.
D'une boutique en ligne avec des centaines de milliers de roubles de revenus à une énorme entreprise avec des dizaines de centres de données.


Détection de vulnérabilité


Afin de comprendre ce qu'il y a des façons de nous casser, regardons-nous à travers les yeux d'un attaquant.


L'analyse de sécurité comprend plusieurs étapes. Pour chaque étape, je vais vous donner un ensemble d'utilitaires de base que vous pouvez utiliser.


  • La collecte d'informations sur les IP, les domaines et les sous-réseaux est notre objectif. Au lieu de frapper à la porte d'entrée, il est préférable de trouver des points d'entrée moins sûrs.
    dnsrecon, Fierce, Censys, reverse-PTR-lookup. 
  • Analyse des services pour les vulnérabilités connues (CVE). Les exploits publics leur sont communs.
     Vulners, exploit-DB, NIST, CVEdetails 
  • Analyse des services pour les mots de passe faibles.
     potator, hydra 
  • Analyse de vulnérabilité des applications Web
     Zap, Burp, w3af, Arachni 

Cool


Ok cool. Nous avons un moyen et des outils pour vérifier 1 site.
Il faudra plusieurs jours pour vérifier + analyser un service, pour le comprendre à fond - une semaine ou plus.


Pas cool


Le problème est que nous pouvons avoir plus d'un service. Et par exemple / 20 sous-réseau.
4096 adresses. Chacun peut avoir 65535 services. Pas cool.


Oui, il existe des solutions automatisées. Qualys, Acunetix, Nessus, il y a des vendeurs nationaux. Analyse de ce qu'ils sont bons et mauvais, je propose de partir pour un autre article.


Ils n'ont pas résolu mes problèmes. J'ai décidé que je devais le réparer. Il a quitté son emploi et pendant environ un an, lui et mes camarades sont partis pour le développement.


Comment écrire un scanner de vulnérabilité


Commençons par les exigences du système que nous voulions obtenir:


  • Effectue des reconnaissances et localise les domaines cibles et l'IP
  • Surveille le périmètre du réseau. Il voit quand une nouvelle adresse apparaît dans la plage ou un sous-domaine apparaît sur le site protégé
  • Vérifie constamment les adresses, voit quand les ports réseau s'ouvrent et se ferment
  • Recherche les vulnérabilités et les exploits de bannière / CPE bien connus
  • Récupère les mots de passe faibles
  • Recherche les erreurs de configuration des applications et du système d'exploitation
  • Trouve les vulnérabilités dans CMS et leurs plugins
  • Recherche de manière interactive XSS, SQLi, XXE, RCE, LFI, RFI et ceux de OWASP à 10 qui peuvent être recherchés automatiquement
  • Il le fait plus d'une fois, mais vérifie constamment mes ressources et réagit si de nouvelles vulnérabilités surviennent

Les utilisateurs sont propriétaires de vastes étendues de réseau, c'est-à-dire de ceux avec 10 applications Web ou plus.
Il est nécessaire de fournir une analyse parallèle quotidienne des vulnérabilités Web, des mots de passe faibles, des erreurs de configuration et d'afficher les exploits sortants pour des centaines d'IP et de sites Web.


Pour ce faire, utilisez un système évolutif horizontalement. Vous pouvez y ajouter de nouveaux nœuds et de nouveaux types de scanners à la volée. Désormais, le scanner utilise 7 nœuds et est divisé en 2 emplacements interactifs en Allemagne et aux États-Unis. Si vous êtes intéressé, nous écrirons à ce sujet dans un autre article.


Nous avons réfléchi à la façon d'écrire un tel scanner. Nous avons réalisé que l'écriture à partir de zéro d'un tel système n'a guère de sens. Cela nécessitait une vaste expérience et compréhension des différentes plates-formes, sa propre base de données des empreintes digitales du réseau, sa propre base de données de CVE et d'exploits pour eux, et un énorme système dédié à l'analyse de la sécurité des applications Web.


Lorsque la licence du produit le permet, nous avons décidé d'utiliser des développements open source. Certains composants sont de source fermée, mais gratuits pour une utilisation commerciale. Il existe de nombreux projets open-source et auto-écrits.


Nous avons donc environ 20 applications différentes, qui sont les composants nécessaires pour couvrir les niveaux L3-L7 pour le pentest automatisé.


Interface pour scanner


Chaque script, fractionnement PoC ou binaire accepte différents paramètres pour démarrer l'analyse. Pas très pratique. Je voulais obtenir un format unifié pour lancer n'importe quel scanner possible.


Nous avons réfléchi à ce que tout scanner possible doit savoir pour identifier la cible. Compilé une table.


Vérifier le typeEntrer les données
Intégration avec les bases de données exploit et CVEFournisseur: Produit: Version (CPE)
Exploitation PoC pour le serviceIP, port, CVE
BrutilkaIP, port, protocole de couche application
Scanner CMSPort de domaine
Scanner de vulnérabilité WebDomaine ou port IP
Vulnérabilités Web PoCURI
Scanner de portIP

Après une vérification initiale de nmap et un plugin qui accède à CVEdetails pour chaque hôte, nous obtenons un ensemble de ces objets. Nous les appelons métadonnées.


Représentation JSON:


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

Pour chaque port sur Target, nous obtenons un ensemble de telles métadonnées. Vous devez maintenant comprendre lequel de nos scanners souhaite travailler à cette fin.


Tous les scanners ont un parent - ScanManager, ce qui le rend élégant:


 product(scanners, metadata_as_list) 

Il prend tous les services et vérifie pour chacun d'eux tous les scanners possibles.
Chaque scanner fournit une fonction qui détermine s'il souhaite travailler avec une telle cible.


Parlons de ce qu'est le scanner.
Trois options ont été envisagées:


  • Implémentez chaque scanner comme un microservice qui prend en charge notre RPC
  • Implémentez chaque scanner en tant que service et utilisez un bus de messages commun
  • Troisième option

Mais nous sommes très paresseux et avons réalisé que dans le cas des deux premières options, en plus des scanners eux-mêmes, vous aurez également besoin d'une sorte d'infrastructure de déploiement, d'écriture de RPC, de capture de bogues de ce RPC. De plus, nous voulions tout écrire en Python.


Nous avons essayé plusieurs solutions. Nous avons examiné des projets de gestion de scanners similaires, tels que Yandex Molly et Minion de Mozilla. Nous avons examiné le fonctionnement de w3af, Zap. Burp a une architecture de plugin très intéressante.


Nous avons décidé que chaque scanner devrait être implémenté en tant que fonction sérialisable en python. Cela vous permettra de les stocker directement dans rabbit-mq, ​​de les livrer rapidement à différents nœuds, de les exécuter atomiquement. Nous pouvons ajouter de nouveaux scanners sans avoir à créer et partager des applications. En fait, nous avons obtenu un service pour l'exécution distribuée et asynchrone de fonctions sur python.


Format du scanner


Le scanner lancé sur notre plateforme doit être un objet hérité de la classe de base Scanner.


Tout analyseur doit accepter un objet de type Métadonnées comme entrée et renvoyer des objets de type Vulnérabilité.


 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) 

Format de vulnérabilité


La tâche suivante à laquelle nous avons été confrontés a été de créer un format unifié dans lequel nous pouvons stocker la sortie de n'importe quel scanner. Que ce soit un moissonneur web, un répertoire brutilka ou un exploit PoC memcached.


Nous avons décidé de ne pas clôturer nos propres formats, mais d'utiliser le standard de l'industrie - le format CVE. Nous enrichissons CVE avec les métadonnées de notre vulnérabilité pour un stockage et une récupération faciles. Pour stocker des données spécifiques au scanner, ajoutez le champ du corps. Les touches du corps qui doivent être affichées dans l'interface Web sont déterminées par 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 

Nous avons essayé de donner aux auteurs de scanners une liberté de mise en œuvre maximale.
Et nous vous invitons à participer au développement.


Comment gagner de l'argent sur les exploits.


Nous voulons que les personnes intéressées par la sécurité, les auteurs d'utilitaires et de scripts, les chercheurs aient la possibilité de monétiser de manière absolument légale les résultats de leurs travaux.


Le scanner s'appelle METASCAN. Si vous avez vos propres scripts ou exploits PoC d'un jour, ou peut-être êtes-vous l'auteur du scanner. Envoyez-nous les modules au format Scanner à david.ordyan@metascan.ru!


Nous verserons une rémunération mensuelle aux auteurs des modules et annoncerons l'acceptation des modules jusqu'au 30 novembre.
Nous les testerons en parcourant notre clientèle sur plus de 2000 sites et en comptant le nombre de détections.


Les auteurs des trois premiers scanners selon le nombre de vulnérabilités trouvées recevront:


  • 31 337 roubles pour la 1ère place.
  • 13 370 roubles pour les 2e et 3e places.

Et nous proposerons également de leur proposer de conclure des contrats et de recevoir une récompense mensuelle pour l'utilisation de leurs scanners, jusqu'à ce qu'ils découvrent des vulnérabilités.


Après novembre, nous élargirons le programme de réception des scanners.


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


Des exemples et du code apparaîtront ici

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


All Articles