TLDR : Wie ich meinen Job als Sicherheitsbeamter kündigte und meinen eigenen Schwachstellenscanner schrieb.
Und wie Sie damit Geld verdienen können. Am Ende befinden sich Teile des Scannercodes und der Spezifikation.
Wer und was bricht
In den 1970er Jahren, vor langer Zeit, sah das Internet so aus.

Die Hauptbedrohung für ihn waren die Forscher und Enthusiasten, die als erste an die Dokumentation und Netzwerke großer Unternehmen gelangten.
Seitdem hat sich das Internet stark verändert. Angriffe auf Netzwerke, Dienste und Webanwendungen sind an der Tagesordnung. Jeden Tag finden Entwickler und Forscher Dutzende von Schwachstellen. Parallel dazu werden Zehntausende von Websites gehackt.
Dies ist auf der Angriffskarte von Kaspersky Lab deutlich sichtbar. Es zeigt IDS-Trigger, Schwachstellen-Scans und Botnet-Angriffe an. Die Karte sieht aus wie ein wunderschönes Bild und hat nur in Russland Millionen von Angriffen pro Tag.

Cyberkriminalität wird nicht von Amateuren begangen, sondern von organisierten Gruppen von Dutzenden von Menschen. Sie tun dies aus Interesse. Das ist ein Geschäft. Es sind keine Typen in schwarzen Kapuzen, die nachts "BLACK K0d" vor dem Monitor schreiben. Dies sind sozial aktive Menschen, die in Büros in verschiedenen Ländern der Welt arbeiten.
Meine Karriere war so, dass ich mehrere Jahre für die Sicherheit des Netzwerkumfangs und den Schutz von Webanwendungen verantwortlich war. Über die Erfahrungen aus dieser Zeit werde ich in diesem Artikel berichten.
Wenn Sie in einer Telekommunikation, einer Bank, einem Anbieter oder einem Entwickler in einem großen Unternehmen arbeiten, und insbesondere wenn Sie eine Sicherheitsperson sind, wissen Sie, dass Sicherheit in einem Unternehmen mit mehr als 10 bis 15 Standorten Müll, Hölle, Tod ist.
Versuchen wir, die Situation zu verbessern. Sie sagen, dass Sicherheit ein Prozess ist.
Und es gibt viele Prozesse.
Listen Sie sie kurz auf:
- Bedrohungsmanagement
- Schwachstellenmanagement
- Risikomanagement
- Patch-Verwaltung
- Identity & Acess Management
- Sicherheitsbewusstsein
- Verwaltung von Sicherheitsanbietern
Und andere.
Wir werden die im Artikel aufgeführten Arten nicht berücksichtigen, Prost.
Es gibt viele davon, und die Vorteile hängen von der Größe des Unternehmens, den Arten von Assets und ihrer Kritikalität ab.
Wir werden über einen Prozess sprechen, von dem auch kleine Unternehmen profitieren werden.
Von einem Online-Shop mit Hunderttausenden Rubel Umsatz bis zu einem riesigen Unternehmen mit Dutzenden von Rechenzentren.
Erkennung von Sicherheitslücken
Um zu verstehen, wie es Möglichkeiten gibt, uns zu knacken, betrachten wir uns selbst mit den Augen eines Angreifers.
Die Sicherheitsanalyse besteht aus mehreren Phasen. Für jede Phase werde ich einen grundlegenden Satz von Dienstprogrammen angeben, die Sie verwenden können.
- Es ist unser Ziel, Informationen darüber zu sammeln, welche IPs, Domänen und Subnetze es sind. Anstatt an die Haustür zu klopfen, ist es besser, weniger sichere Einstiegspunkte zu finden.
dnsrecon, Fierce, Censys, reverse-PTR-lookup.
- Analyse von Diensten auf bekannte Schwachstellen (CVE). Öffentliche Exploits sind für sie üblich.
Vulners, exploit-DB, NIST, CVEdetails
- Analyse von Diensten für schwache Passwörter.
potator, hydra
- Schwachstellenanalyse von Webanwendungen
Zap, Burp, w3af, Arachni
Cool
Ok cool. Wir haben einen Weg und Werkzeuge, um 1 Site zu überprüfen.
Es wird mehrere Tage dauern, einen Service zu überprüfen und zu analysieren, um ihn gründlich herauszufinden - eine Woche oder länger.
Nicht cool
Das Problem ist, dass wir möglicherweise mehr als einen Dienst haben. Und zum Beispiel / 20 Subnetz.
4096 Adressen. Jeder kann 65535 Dienste haben. Nicht cool.
Ja, es gibt automatisierte Lösungen. Qualys, Acunetix, Nessus, es gibt inländische Anbieter. Analyse, was sie gut und was schlecht sind, schlage ich vor, für einen anderen Artikel zu verlassen.
Sie haben meine Probleme nicht gelöst. Ich entschied, dass ich es reparieren muss. Er kündigte seinen Job und für ungefähr ein Jahr gingen er und meine Kameraden zur Entwicklung.
So schreiben Sie einen Schwachstellenscanner
Beginnen wir mit den Anforderungen für das System, das wir erhalten wollten:
- Führt Aufklärung durch und lokalisiert Zieldomänen und IP
- Überwacht den Netzwerkumfang. Er sieht, wenn eine neue Adresse im Bereich oder eine Subdomain am geschützten Standort angezeigt wird
- Überprüft ständig Adressen und sieht, wann Netzwerkports geöffnet und geschlossen werden
- Findet Schwachstellen und bekannte Banner- / CPE-Exploits
- Nimmt schwache Passwörter auf
- Findet Anwendungs- und Betriebssystemkonfigurationsfehler
- Findet Schwachstellen in CMS und deren Plugins
- Findet interaktiv XSS, SQLi, XXE, RCE, LFI, RFI und die von OWASP bis 10, die automatisch durchsucht werden können
- Er tut dies mehr als einmal, überprüft jedoch ständig meine Ressourcen und reagiert, wenn neue Schwachstellen auftreten
Benutzer sind Eigentümer großer Netzwerkbereiche, dh solcher mit 10 oder mehr Webanwendungen.
Es ist notwendig, täglich parallel nach Web-Schwachstellen, schwachen Passwörtern und Konfigurationsfehlern zu suchen und ausgehende Exploits für Hunderte von IP-Adressen und Websites anzuzeigen.
Verwenden Sie dazu ein horizontal skalierbares System. Sie können im laufenden Betrieb neue Knoten und neue Scannertypen hinzufügen. Jetzt verwendet der Scanner 7 Knoten und ist in 2 interagierende Standorte in Deutschland und den USA unterteilt. Bei Interesse werden wir darüber in einem anderen Artikel schreiben.
Wir haben darüber nachgedacht, wie man einen solchen Scanner schreibt. Wir haben erkannt, dass das Schreiben eines solchen Systems von Grund auf wenig Sinn macht. Es erforderte umfassende Erfahrung und Verständnis für verschiedene Plattformen, eine eigene Datenbank mit Netzwerkfingerabdrücken, eine eigene Datenbank mit CVE und Exploits für diese sowie ein riesiges System zur Analyse der Sicherheit von Webanwendungen.
Wo die Produktlizenz dies zulässt, haben wir uns für Open Source-Entwicklungen entschieden. Es gibt Komponenten, die Closed Source sind, aber für den kommerziellen Gebrauch kostenlos sind. Es gibt einige selbst geschriebene Open-Source-Projekte.
Wir haben also ungefähr 20 verschiedene Anwendungen, die die Komponenten sind, die erforderlich sind, um die L3-L7-Niveaus für den automatisierten Pentest abzudecken.
Schnittstelle für Scanner
Jedes Skript, jeder PoC-Split oder jede Binärdatei akzeptiert unterschiedliche Parameter, um den Scanvorgang zu starten. Nicht sehr praktisch. Ich wollte ein einheitliches Format für den Start eines möglichen Scanners.
Wir haben darüber nachgedacht, was ein möglicher Scanner wissen muss, um das Ziel zu identifizieren. Eine Tabelle zusammengestellt.
Typ prüfen | Daten eingeben |
---|
Integration in Exploit- und CVE-Datenbanken | Anbieter: Produkt: Version (CPE) |
PoC-Exploit für den Service | IP, Port, CVE |
Brutilka | IP-, Port- und Anwendungsschichtprotokoll |
CMS-Scanner | Domänenport |
Web Vulnerability Scanner | Domäne oder IP-Port |
Sicherheitslücken im PoC-Web | URI |
Port-Scanner | IP |
Nach einer ersten nmap-Prüfung und einem Plugin, das für jeden Host auf CVEdetails zugreift, erhalten wir eine Reihe solcher Objekte. Wir nennen sie Metadaten.
JSON-Darstellung:
{ "cves": [], "service": "mysql", "protocol": "tcp", "target": "example.com", "time": "1513941789", "product": "mysql", "vendor": "mysql", "version": "5.1.63-community", "port": 3306, "uri": "" }
Für jeden Port auf Target erhalten wir einen Satz solcher Metadaten. Jetzt müssen Sie verstehen, welche unserer Scanner für diesen Zweck arbeiten möchten.
Alle Scanner haben einen übergeordneten ScanManager, der ihn elegant macht:
product(scanners, metadata_as_list)
Es nimmt alle Dienste in Anspruch und überprüft für jeden von ihnen alle möglichen Scanner.
Jeder Scanner bietet eine Funktion, die bestimmt, ob er mit einem solchen Ziel arbeiten möchte.
Lassen Sie uns darüber sprechen, was der Scanner ist.
Drei Optionen wurden in Betracht gezogen:
- Implementieren Sie jeden Scanner als Microservice, der unseren RPC unterstützt
- Implementieren Sie jeden Scanner als Dienst und verwenden Sie einen gemeinsamen Nachrichtenbus
- Dritte Option
Wir sind jedoch sehr faul und haben festgestellt, dass Sie bei den ersten beiden Optionen neben den Scannern selbst auch eine Art Bereitstellungsinfrastruktur benötigen, die RPC schreibt und Fehler dieses RPC abfängt. Außerdem wollten wir alles in Python schreiben.
Wir haben verschiedene Lösungen ausprobiert. Wir haben uns ähnliche Scanner-Management-Projekte wie Yandex Molly und Minion von Mozilla angesehen. Wir haben uns angesehen, wie w3af, Zap funktioniert. Burp hat eine sehr interessante Plugin-Architektur.
Wir haben beschlossen, dass jeder Scanner als serialisierbare Funktion in Python implementiert werden soll. Auf diese Weise können Sie sie direkt in rabbit-mq speichern, schnell an verschiedene Knoten liefern und atomar ausführen. Wir können neue Scanner hinzufügen, ohne Anwendungen erstellen und freigeben zu müssen. Tatsächlich haben wir einen Dienst für die verteilte und asynchrone Ausführung von Funktionen auf Python erhalten.
Der auf unserer Plattform gestartete Scanner sollte ein Objekt sein, das von der Scanner-Basisklasse geerbt wurde.
Jeder Scanner sollte ein Objekt vom Typ Metadaten als Eingabe- und Rückgabeobjekte vom Typ Vulnerability akzeptieren.
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)
Die nächste Aufgabe bestand darin, ein einheitliches Format zu erstellen, in dem wir die Ausgabe jedes Scanners speichern können. Egal, ob es sich um einen Web-Harvester, eine Verzeichnis-Brutilka oder einen zwischengespeicherten PoC-Exploit handelt.
Wir haben uns entschieden, nicht unsere eigenen Formate zu fechten, sondern den Industriestandard zu verwenden - das CVE-Format. Wir bereichern CVE mit den Metadaten unserer Sicherheitsanfälligkeit zum einfachen Speichern und Abrufen. Fügen Sie das Körperfeld hinzu, um scannerspezifische Daten zu speichern. Welche Tasten des Körpers in der Weboberfläche angezeigt werden sollen, wird vom Scanner festgelegt.
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):
Wir haben versucht, den Autoren von Scannern maximale Freiheit bei der Implementierung zu geben.
Und wir laden Sie ein, sich an der Entwicklung zu beteiligen.
Wie man mit Exploits Geld verdient.
Wir möchten, dass Menschen, die an Sicherheit interessiert sind, Autoren von Dienstprogrammen und Skripten sowie Forscher die Möglichkeit haben, die Ergebnisse ihrer Arbeit absolut legal zu monetarisieren.
Der Scanner heißt METASCAN. Wenn Sie über eigene Skripte oder eintägige PoC-Exploits verfügen oder selbst der Autor des Scanners sind. Senden Sie uns die Module im Scannerformat an david.ordyan@metascan.ru!
Wir zahlen den Autoren der Module monatlich eine Vergütung und geben die Annahme der Module bis zum 30. November bekannt.
Wir werden sie testen, indem wir unseren Kundenstamm an mehr als 2000 Standorten durchlaufen und die Anzahl der Erkennungen zählen.
Die Autoren der ersten drei Scanner erhalten nach Anzahl der gefundenen Schwachstellen:
- 31 337 Rubel für den 1. Platz.
- 13.370 Rubel für den 2. und 3. Platz.
Außerdem bieten wir ihnen an, Verträge abzuschließen und eine Belohnung für die monatliche Verwendung ihrer Scanner zu erhalten, bis sie Schwachstellen finden.
Nach November werden wir das Programm für den Empfang von Scannern erweitern.
Schreiben Sie an david.ordyan@metascan.ru oder TG https://t.me/METASCAN
BB8E 3D9B 04FF 70C9 A260 CD45 E0BF 4EB4 9838 A7EC
Beispiele und Code werden hier angezeigt