TLDR :セキュリティガードとしての仕事を辞め、独自の脆弱性スキャナーを作成した方法について。 
      
        
        
        
      
     そして、あなたはそれでお金を稼ぐことができます。 最後に、スキャナーのコードと仕様があります。 
誰が何を壊すか
はるか昔の1970年代には、インターネットはこのように見えました。
 
      彼にとっての主な脅威は、大企業のドキュメントとネットワークに最初にアクセスした研究者と愛好家でした。
それ以来、インターネットは大きく変わりました。 ネットワーク、サービス、およびWebアプリケーションへの攻撃が日常的に発生しています。 開発者と研究者は毎日、多くの脆弱性を発見しています。 並行して、何万ものサイトがハッキングされています。
これは、Kaspersky Labの攻撃マップにはっきりと現れています。 IDSトリガー、脆弱性スキャン、およびボットネット攻撃を表示します。 マップはこのような美しい写真のように見え、ロシアでのみ1日あたり数百万の攻撃を受けています。
 
      サイバー犯罪はアマチュアによって行われるのではなく、数十人の組織化されたグループによって行われます。 彼らは興味のないこれを行います。 これはビジネスです。 彼らは、モニターの前で夜に「BLACK K0d」を書く黒いフードの男ではありません。 これらは、世界のさまざまな国のオフィスで働く社会的に活動的な人々です。
私のキャリアは数年にわたり、ネットワーク境界のセキュリティとWebアプリケーションの保護を担当していました。 その期間の私の経験がもたらしたものについては、この記事で説明します。
テレコム、銀行、プロバイダー、または大企業の開発者である場合、特にセキュリティ担当者である場合、10〜15を超えるサイトを持つ会社のセキュリティはゴミ、地獄、死であることがわかります。
 状況を改善してみましょう。 彼らは、セキュリティはプロセスであると言います。 
      
        
        
        
      
     そして、多くのプロセスがあります。 
それらを簡単にリストしてください:
- 脅威管理
- 脆弱性管理
- リスク管理
- パッチ管理
- アイデンティティおよびアクセス管理
- セキュリティ警告
-  セキュリティプロバイダー管理 
      
 
 その他。
 記事に記載されている種は考慮しません、乾杯。 
      
        
        
        
      
     それらの多くがあり、利点は組織の規模、資産の種類、およびその重要度によって異なります。 
 中小企業にも利益をもたらすプロセスについてお話します。 
      
        
        
        
      
     数十万ルーブルの収益があるオンラインストアから、数十のデータセンターを持つ巨大企業まで。 
脆弱性検出
私たちをハッキングする方法があることを理解するために、攻撃者の目を通して自分自身を見てみましょう。
セキュリティ分析はいくつかの段階で構成されています。 各段階で、使用できる基本的なユーティリティセットを提供します。
-  どのIP、ドメイン、サブネットに関する情報を収集するかが目標です。 正面玄関をノックする代わりに、安全性の低いエントリポイントを見つけることをお勧めします。 
      
 
 dnsrecon, Fierce, Censys, reverse-PTR-lookup.
 
 
 
 
-  既知の脆弱性(CVE)のサービスの分析。 公共のエクスプロイトは彼らに共通です。 
      
 
 Vulners, exploit-DB, NIST, CVEdetails
 
 
 
 
-  弱いパスワードのサービスの分析。 
      
 
 potator, hydra
 
 
 
 
-   Webアプリケーションの脆弱性分析 
      
 
 Zap, Burp, w3af, Arachni
 
 
 
 
かっこいい
 いいよ  1つのサイトをチェックする方法とツールがあります。 
      
        
        
        
      
      1つのサービスをチェックして分析し、完全に把握するには1週間以上かかるのに数日かかります。 
かっこよくない
 問題は、複数のサービスがある場合があることです。 そして、例えば/ 20サブネット。 
      
        
        
        
      
      4096個のアドレス。 それぞれに65535個のサービスを設定できます。 クールじゃない。 
はい、自動化されたソリューションがあります。 Qualys、Acunetix、Nessus、国内ベンダーがあります。 それらが良い点と悪い点の分析は、別の記事に残すことを提案します。
彼らは私の問題を解決しませんでした。 私はそれを修正する必要があると決めました。 彼は仕事を辞め、約1年間、彼と私の仲間は開発のために去りました。
脆弱性スキャナーの作成方法
取得したいシステムの要件から始めましょう。
- 偵察を行い、ターゲットドメインとIPを特定します
- ネットワーク境界を監視します。 範囲内に新しいアドレスが表示されるか、保護されたサイトにサブドメインが表示されると、彼は見ます
- 常にアドレスをチェックし、ネットワークポートの開閉を確認します
- 脆弱性と既知のバナー/ CPEエクスプロイトを見つけます
- 弱いパスワードを取得します
- アプリケーションとOSの構成エラーを見つけます
- CMSとそのプラグインの脆弱性を発見
- XSS、SQLi、XXE、RCE、LFI、RFI、および自動的に検索できるOWASP to 10のインタラクティブな検索
- 彼はこれを複数回行いますが、私のリソースを常にチェックし、新しい脆弱性が発生した場合に対応します
 ユーザーは、10以上のWebアプリケーションを使用する大規模なネットワーク範囲の所有者です。 
      
        
        
        
      
      Webの脆弱性、脆弱なパスワード、構成エラーの毎日の並列スキャンを提供し、数百のIPおよびWebサイトの発信エクスプロイトを表示する必要があります。 
このために、水平に拡張可能なシステムを使用します。 新しいノードと新しいタイプのスキャナーをその場で追加できます。 現在、スキャナーは7つのノードを使用し、ドイツとアメリカで相互作用する2つの場所に分割されています。 興味があれば、別の記事でこれについて書きます。
このようなスキャナーの書き方を考えました。 そのようなシステムをゼロから書くことはほとんど意味がないことに気付きました。 さまざまなプラットフォームの膨大な経験と理解、ネットワークフィンガープリントの独自のデータベース、CVEとそのエクスプロイトの独自のデータベース、およびWebアプリケーションのセキュリティ分析専用の巨大なシステムが必要でした。
製品ライセンスでこれが許可されている場合、オープンソースのプラクティスを使用することにしました。 クローズドソースですが、商用利用には無料のコンポーネントがあります。 自作およびフォークのオープンソースプロジェクトがかなりあります。
そのため、約20の異なるアプリケーションがあります。これらは、自動化されたペンテストのL3-L7レベルをカバーするために必要なコンポーネントです。
スキャナー用インターフェース
各スクリプト、PoCスプリット、またはバイナリは、スキャンに入るために異なるパラメーターを受け入れます。 あまり便利ではありません。 可能なスキャナーを起動するための統一フォーマットを取得したかった。
ターゲットを特定するために、考えられるスキャナーが知っておくべきことを考えました。 テーブルをコンパイルしました。
| チェックタイプ | 入力データ | 
|---|---|
| エクスプロイトおよびCVEデータベースとの統合 | ベンダー:製品:バージョン(CPE) | 
| サービスのPoCエクスプロイト | IP、ポート、CVE | 
| ブルチカ | IP、ポート、アプリケーション層プロトコル | 
| CMSスキャナー | ドメインポート | 
| Web脆弱性スキャナー | ドメインまたはIPポート | 
| PoC Webの脆弱性 | URI | 
| ポートスキャナー | IP | 
最初のnmapチェックと各ホストのCVEdetailsにアクセスするプラグインの後、そのようなオブジェクトのセットを取得します。 それらをメタデータと呼びます。
JSON表現:
            {             "cves": [],             "service": "mysql",             "protocol": "tcp",             "target": "example.com",             "time": "1513941789",             "product": "mysql",             "vendor": "mysql",             "version": "5.1.63-community",             "port": 3306,             "uri": ""           }
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
      
      Targetの各ポートについて、そのようなメタデータのセットを取得します。 ここで、この目的のためにどのスキャナーを使用したいかを理解する必要があります。
すべてのスキャナーには親があります-ScanManager、それはそれをエレガントにします:
 product(scanners, metadata_as_list)
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
      
       それはすべてのサービスを取り、それらのそれぞれのためにすべての可能なスキャナーをチェックします。 
      
        
        
        
      
     各スキャナーは、そのようなターゲットで動作するかどうかを決定する機能を提供します。 
 スキャナーとは何かについて話しましょう。 
      
        
        
        
      
     次の3つのオプションが検討されました。 
- RPCをサポートするマイクロサービスとして各スキャナーを実装します
- 各スキャナーをサービスとして実装し、共通のメッセージバスを使用する
- 3番目のオプション
しかし、私たちは非常に怠け者であり、最初の2つのオプションの場合、スキャナー自体に加えて、展開、RPCの作成、このRPCのバグのキャッチに何らかのインフラストラクチャも必要になることに気付きました。 さらに、すべてをPythonで書きたかったのです。
いくつかの解決策を試しました。 Yandex MollyやMozillaのMinionなど、同様のスキャナー管理プロジェクトを検討しました。 Zapのw3afの仕組みを調べました。 Burpには非常に興味深いプラグインアーキテクチャがあります。
各スキャナーは、pythonでシリアル化可能な関数として実装することにしました。 これにより、それらを直接rabbit-mqに保存し、異なるノードに迅速に配信し、アトミックに実行できます。 アプリケーションを構築して共有することなく、新しいスキャナーを追加できます。 実際、Pythonで関数の分散および非同期実行のサービスを取得しました。
スキャナーフォーマット
プラットフォームで起動されるスキャナーは、Scanner基本クラスから継承されたオブジェクトである必要があります。
スキャナーは、入力としてメタデータ型のオブジェクトを受け入れ、脆弱性型のオブジェクトを返す必要があります。
 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)
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
      
      脆弱性の形式
私たちが直面した次のタスクは、スキャナーの出力を保存できる統一フォーマットを作成することでした。 Webハーベスタ、ディレクトリbrutilka、またはmemcached PoCエクスプロイトなどです。
独自の形式をフェンスするのではなく、業界標準であるCVE形式を使用することにしました。 ストレージと検索を容易にするために、脆弱性のメタデータでCVEを強化します。 スキャナー固有のデータを保存するには、bodyフィールドを追加します。 本体のどのキーを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
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
      
       スキャナーの作成者に最大限の実装の自由を与えようとしました。 
      
        
        
        
      
     そして、開発に参加することを勧めます。 
エクスプロイトでお金を稼ぐ方法。
セキュリティに興味のある人、ユーティリティとスクリプトの作者、研究者に、自分の仕事の結果を絶対的に合法的に収益化する機会を与えてほしい。
スキャナーはMETASCANと呼ばれます。 独自のスクリプトまたは1日間のPoCエクスプロイトがある場合、またはあなた自身がスキャナーの作成者である場合があります。 モジュールをスキャナー形式でdavid.ordyan@metascan.ruに送ってください!
 モジュールの作成者に月単位で報酬を支払い、11月30日までモジュールの承認を発表します。 
      
        
        
        
      
      2000以上のサイトでクライアントベースを実行し、検出数をカウントすることにより、それらをテストします。 
発見された脆弱性の数による最初の3つのスキャナーの作成者は以下を受け取ります。
- 1位には31 337ルーブル。
- 2位と3位に13,370ルーブル。
また、脆弱性が見つかるまで、契約を締結し、スキャナーを毎月使用することに対する報酬を受け取るように提供します。
11月以降、スキャナーを受け取るためのプログラムを拡張します。
  david.ordyan@metascan.ruまたはTG https://t.me/METASCANに書き込みます 
      
        
        
        
      
      BB8E 3D9B 04FF 70C9 A260 CD45 E0BF 4EB4 9838 A7EC