mihari 1.1.1 → 1.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/README.md +8 -1
 - data/docker/Dockerfile +1 -1
 - data/lib/mihari.rb +2 -0
 - data/lib/mihari/analyzers/binaryedge.rb +4 -0
 - data/lib/mihari/analyzers/otx.rb +74 -0
 - data/lib/mihari/analyzers/passive_dns.rb +2 -1
 - data/lib/mihari/analyzers/shodan.rb +4 -0
 - data/lib/mihari/analyzers/spyse.rb +77 -0
 - data/lib/mihari/analyzers/urlscan.rb +5 -1
 - data/lib/mihari/cli.rb +25 -0
 - data/lib/mihari/config.rb +6 -0
 - data/lib/mihari/errors.rb +1 -0
 - data/lib/mihari/retriable.rb +2 -2
 - data/lib/mihari/version.rb +1 -1
 - data/mihari.gemspec +4 -2
 - data/renovate.json +5 -0
 - metadata +37 -6
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 512d3ee8179279b931bd9510c652693ead1108ead99c823e26880e2a75234b24
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 81946c213ef30712644637e8ea5e01bea36956aad077ed37bdac60d0adf71f19
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: d6e8b1e9a8791aebfe042de31b1f895fce4bc20d26a417672eaf4dafa83319f2cfb407ee635fe004f70a9d78441c43398c0af79cde01b3bb39bdcfb1dfd9e0c3
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: '09ad98242f96474358908d68ef24f2f8711206b698499d18419346004a853ed5cace40df63e1055e82444e43ac9160fa02fc40d0a662d7a17d290a0dee13fb50'
         
     | 
    
        data/README.md
    CHANGED
    
    | 
         @@ -67,9 +67,11 @@ Mihari supports the following services by default. 
     | 
|
| 
       67 
67 
     | 
    
         
             
            - [DN Pedia](https://dnpedia.com/)
         
     | 
| 
       68 
68 
     | 
    
         
             
            - [dnstwister](https://dnstwister.report/)
         
     | 
| 
       69 
69 
     | 
    
         
             
            - [Onyphe](https://onyphe.io)
         
     | 
| 
      
 70 
     | 
    
         
            +
            - [OTX](https://otx.alienvault.com/)
         
     | 
| 
       70 
71 
     | 
    
         
             
            - [PassiveTotal](https://community.riskiq.com/)
         
     | 
| 
       71 
72 
     | 
    
         
             
            - [SecurityTrails](https://securitytrails.com/)
         
     | 
| 
       72 
73 
     | 
    
         
             
            - [Shodan](https://shodan.io)
         
     | 
| 
      
 74 
     | 
    
         
            +
            - [Spyse](https://spyse.com)
         
     | 
| 
       73 
75 
     | 
    
         
             
            - [urlscan.io](https://urlscan.io)
         
     | 
| 
       74 
76 
     | 
    
         
             
            - [VirusTotal](http://virustotal.com)
         
     | 
| 
       75 
77 
     | 
    
         
             
            - [ZoomEye](https://zoomeye.org)
         
     | 
| 
         @@ -89,6 +91,7 @@ Commands: 
     | 
|
| 
       89 
91 
     | 
    
         
             
              mihari http_hash                            # Cross search with search engines by a hash of an HTTP response (SHA256, MD5 and MurmurHash3)
         
     | 
| 
       90 
92 
     | 
    
         
             
              mihari import_from_json                     # Give a JSON input via STDIN
         
     | 
| 
       91 
93 
     | 
    
         
             
              mihari onyphe [QUERY]                       # Onyphe datascan search by a query
         
     | 
| 
      
 94 
     | 
    
         
            +
              mihari otx [IP|DOMAIN]                      # OTX lookup by an IP or domain
         
     | 
| 
       92 
95 
     | 
    
         
             
              mihari passive_dns [IP|DOMAIN]              # Cross search with passive DNS services by an ip or domain
         
     | 
| 
       93 
96 
     | 
    
         
             
              mihari passive_ssl [SHA1]                   # Cross search with passive SSL services by an SHA1 certificate fingerprint
         
     | 
| 
       94 
97 
     | 
    
         
             
              mihari passivetotal [IP|DOMAIN|EMAIL|SHA1]  # PassiveTotal lookup by an ip, domain, email or SHA1 certificate fingerprint
         
     | 
| 
         @@ -97,6 +100,7 @@ Commands: 
     | 
|
| 
       97 
100 
     | 
    
         
             
              mihari securitytrails [IP|DOMAIN|EMAIL]     # SecurityTrails lookup by an ip, domain or email
         
     | 
| 
       98 
101 
     | 
    
         
             
              mihari securitytrails_domain_feed [REGEXP]  # SecurityTrails new domain feed search by a regexp
         
     | 
| 
       99 
102 
     | 
    
         
             
              mihari shodan [QUERY]                       # Shodan host search by a query
         
     | 
| 
      
 103 
     | 
    
         
            +
              mihari spyse [QUERY]                        # Spyse search by a query
         
     | 
| 
       100 
104 
     | 
    
         
             
              mihari ssh_fingerprint [FINGERPRINT]        # Cross search with search engines by an SSH fingerprint (e.g. dc:14:de:8e:d7:c1:15:43:23:82:25:81:d2:59:e8:c0)
         
     | 
| 
       101 
105 
     | 
    
         
             
              mihari status                               # Show the current configuration status
         
     | 
| 
       102 
106 
     | 
    
         
             
              mihari urlscan [QUERY]                      # urlscan search by a given query
         
     | 
| 
         @@ -116,7 +120,7 @@ You can get aggregated results by using the following commands. 
     | 
|
| 
       116 
120 
     | 
    
         | 
| 
       117 
121 
     | 
    
         
             
            | Command         | Desc.                                                                                                   |
         
     | 
| 
       118 
122 
     | 
    
         
             
            |-----------------|---------------------------------------------------------------------------------------------------------|
         
     | 
| 
       119 
     | 
    
         
            -
            | passive_dns     | Passive DNS lookup with CIRCL passive DNS, PassiveTotal, Pulsedive, SecurityTrails and VirusTotal 
     | 
| 
      
 123 
     | 
    
         
            +
            | passive_dns     | Passive DNS lookup with CIRCL passive DNS, OTX, PassiveTotal, Pulsedive, SecurityTrails and VirusTotal  |
         
     | 
| 
       120 
124 
     | 
    
         
             
            | passive_ssl     | Passive SSL lookup with CIRCL passive SSL and PassiveTotal                                              |
         
     | 
| 
       121 
125 
     | 
    
         
             
            | reverse_whois   | Revese Whois lookup with PassiveTotal and SecurityTrails                                                |
         
     | 
| 
       122 
126 
     | 
    
         
             
            | http_hash       | HTTP response hash lookup with BinaryEdge(SHA256), Censys(SHA256), Onyphpe(MD5) and Shodan(MurmurHash3) |
         
     | 
| 
         @@ -211,6 +215,7 @@ Configuration can be done via environment variables or a YAML file. 
     | 
|
| 
       211 
215 
     | 
    
         
             
            | MISP_API_ENDPOINT      | MISP URL                                                                                        |             |
         
     | 
| 
       212 
216 
     | 
    
         
             
            | MISP_API_KEY           | MISP API key                                                                                    |             |
         
     | 
| 
       213 
217 
     | 
    
         
             
            | ONYPHE_API_KEY         | Onyphe API key                                                                                  |             |
         
     | 
| 
      
 218 
     | 
    
         
            +
            | OTX_API_KEY            | OTX API key                                                                                     |             |
         
     | 
| 
       214 
219 
     | 
    
         
             
            | PASSIVETOTAL_API_KEY   | PassiveTotal API key                                                                            |             |
         
     | 
| 
       215 
220 
     | 
    
         
             
            | PASSIVETOTAL_USERNAME  | PassiveTotal username                                                                           |             |
         
     | 
| 
       216 
221 
     | 
    
         
             
            | PULSEDIVE_API_KEY      | Pulsedive API key                                                                               |             |
         
     | 
| 
         @@ -218,8 +223,10 @@ Configuration can be done via environment variables or a YAML file. 
     | 
|
| 
       218 
223 
     | 
    
         
             
            | SHODAN_API_KEY         | Shodan API key                                                                                  |             |
         
     | 
| 
       219 
224 
     | 
    
         
             
            | SLACK_CHANNEL          | Slack channel name                                                                              | `#general`  |
         
     | 
| 
       220 
225 
     | 
    
         
             
            | SLACK_WEBHOOK_URL      | Slack Webhook URL                                                                               |             |
         
     | 
| 
      
 226 
     | 
    
         
            +
            | SPYSE_API_KEY          | Spyse API key                                                                                   |             |
         
     | 
| 
       221 
227 
     | 
    
         
             
            | THEHIVE_API_ENDPOINT   | TheHive URL                                                                                     |             |
         
     | 
| 
       222 
228 
     | 
    
         
             
            | THEHIVE_API_KEY        | TheHive API key                                                                                 |             |
         
     | 
| 
      
 229 
     | 
    
         
            +
            | URLSCAN_API_KEY        | urlscan.io API key                                                                              |             |
         
     | 
| 
       223 
230 
     | 
    
         
             
            | VIRUSTOTAL_API_KEY     | VirusTotal API key                                                                              |             |
         
     | 
| 
       224 
231 
     | 
    
         
             
            | ZOOMEYE_PASSWORD       | ZoomEye password                                                                                |             |
         
     | 
| 
       225 
232 
     | 
    
         
             
            | ZOOMEYE_USERNAMME      | ZoomEye username                                                                                |             |
         
     | 
    
        data/docker/Dockerfile
    CHANGED
    
    
    
        data/lib/mihari.rb
    CHANGED
    
    | 
         @@ -50,11 +50,13 @@ require "mihari/analyzers/crtsh" 
     | 
|
| 
       50 
50 
     | 
    
         
             
            require "mihari/analyzers/dnpedia"
         
     | 
| 
       51 
51 
     | 
    
         
             
            require "mihari/analyzers/dnstwister"
         
     | 
| 
       52 
52 
     | 
    
         
             
            require "mihari/analyzers/onyphe"
         
     | 
| 
      
 53 
     | 
    
         
            +
            require "mihari/analyzers/otx"
         
     | 
| 
       53 
54 
     | 
    
         
             
            require "mihari/analyzers/passivetotal"
         
     | 
| 
       54 
55 
     | 
    
         
             
            require "mihari/analyzers/pulsedive"
         
     | 
| 
       55 
56 
     | 
    
         
             
            require "mihari/analyzers/securitytrails_domain_feed"
         
     | 
| 
       56 
57 
     | 
    
         
             
            require "mihari/analyzers/securitytrails"
         
     | 
| 
       57 
58 
     | 
    
         
             
            require "mihari/analyzers/shodan"
         
     | 
| 
      
 59 
     | 
    
         
            +
            require "mihari/analyzers/spyse"
         
     | 
| 
       58 
60 
     | 
    
         
             
            require "mihari/analyzers/urlscan"
         
     | 
| 
       59 
61 
     | 
    
         
             
            require "mihari/analyzers/virustotal"
         
     | 
| 
       60 
62 
     | 
    
         
             
            require "mihari/analyzers/zoomeye"
         
     | 
| 
         @@ -0,0 +1,74 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require "otx_ruby"
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            module Mihari
         
     | 
| 
      
 6 
     | 
    
         
            +
              module Analyzers
         
     | 
| 
      
 7 
     | 
    
         
            +
                class OTX < Base
         
     | 
| 
      
 8 
     | 
    
         
            +
                  attr_reader :query
         
     | 
| 
      
 9 
     | 
    
         
            +
                  attr_reader :type
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
                  attr_reader :title
         
     | 
| 
      
 12 
     | 
    
         
            +
                  attr_reader :description
         
     | 
| 
      
 13 
     | 
    
         
            +
                  attr_reader :tags
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                  def initialize(query, title: nil, description: nil, tags: [])
         
     | 
| 
      
 16 
     | 
    
         
            +
                    super()
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
                    @query = query
         
     | 
| 
      
 19 
     | 
    
         
            +
                    @type = TypeChecker.type(query)
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                    @title = title || "OTX lookup"
         
     | 
| 
      
 22 
     | 
    
         
            +
                    @description = description || "query = #{query}"
         
     | 
| 
      
 23 
     | 
    
         
            +
                    @tags = tags
         
     | 
| 
      
 24 
     | 
    
         
            +
                  end
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                  def artifacts
         
     | 
| 
      
 27 
     | 
    
         
            +
                    lookup || []
         
     | 
| 
      
 28 
     | 
    
         
            +
                  end
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
                  private
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
                  def config_keys
         
     | 
| 
      
 33 
     | 
    
         
            +
                    %w(otx_api_key)
         
     | 
| 
      
 34 
     | 
    
         
            +
                  end
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
                  def domain_client
         
     | 
| 
      
 37 
     | 
    
         
            +
                    @domain_client ||= ::OTX::Domain.new(Mihari.config.otx_api_key)
         
     | 
| 
      
 38 
     | 
    
         
            +
                  end
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
                  def ip_client
         
     | 
| 
      
 41 
     | 
    
         
            +
                    @ip_client ||= ::OTX::IP.new(Mihari.config.otx_api_key)
         
     | 
| 
      
 42 
     | 
    
         
            +
                  end
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
                  def valid_type?
         
     | 
| 
      
 45 
     | 
    
         
            +
                    %w(ip domain).include? type
         
     | 
| 
      
 46 
     | 
    
         
            +
                  end
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
                  def lookup
         
     | 
| 
      
 49 
     | 
    
         
            +
                    case type
         
     | 
| 
      
 50 
     | 
    
         
            +
                    when "domain"
         
     | 
| 
      
 51 
     | 
    
         
            +
                      domain_lookup
         
     | 
| 
      
 52 
     | 
    
         
            +
                    when "ip"
         
     | 
| 
      
 53 
     | 
    
         
            +
                      ip_lookup
         
     | 
| 
      
 54 
     | 
    
         
            +
                    else
         
     | 
| 
      
 55 
     | 
    
         
            +
                      raise InvalidInputError, "#{query}(type: #{type || 'unknown'}) is not supported." unless valid_type?
         
     | 
| 
      
 56 
     | 
    
         
            +
                    end
         
     | 
| 
      
 57 
     | 
    
         
            +
                  end
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
                  def domain_lookup
         
     | 
| 
      
 60 
     | 
    
         
            +
                    records = domain_client.get_passive_dns(query)
         
     | 
| 
      
 61 
     | 
    
         
            +
                    records.map do |record|
         
     | 
| 
      
 62 
     | 
    
         
            +
                      record.address if record.record_type == "A"
         
     | 
| 
      
 63 
     | 
    
         
            +
                    end.compact.uniq
         
     | 
| 
      
 64 
     | 
    
         
            +
                  end
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
                  def ip_lookup
         
     | 
| 
      
 67 
     | 
    
         
            +
                    records = ip_client.get_passive_dns(query)
         
     | 
| 
      
 68 
     | 
    
         
            +
                    records.map do |record|
         
     | 
| 
      
 69 
     | 
    
         
            +
                      record.hostname if record.record_type == "A"
         
     | 
| 
      
 70 
     | 
    
         
            +
                    end.compact.uniq
         
     | 
| 
      
 71 
     | 
    
         
            +
                  end
         
     | 
| 
      
 72 
     | 
    
         
            +
                end
         
     | 
| 
      
 73 
     | 
    
         
            +
              end
         
     | 
| 
      
 74 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -14,6 +14,7 @@ module Mihari 
     | 
|
| 
       14 
14 
     | 
    
         | 
| 
       15 
15 
     | 
    
         
             
                  ANALYZERS = [
         
     | 
| 
       16 
16 
     | 
    
         
             
                    Mihari::Analyzers::CIRCL,
         
     | 
| 
      
 17 
     | 
    
         
            +
                    Mihari::Analyzers::OTX,
         
     | 
| 
       17 
18 
     | 
    
         
             
                    Mihari::Analyzers::PassiveTotal,
         
     | 
| 
       18 
19 
     | 
    
         
             
                    Mihari::Analyzers::Pulsedive,
         
     | 
| 
       19 
20 
     | 
    
         
             
                    Mihari::Analyzers::SecurityTrails,
         
     | 
| 
         @@ -55,7 +56,7 @@ module Mihari 
     | 
|
| 
       55 
56 
     | 
    
         
             
                    analyzer.artifacts
         
     | 
| 
       56 
57 
     | 
    
         
             
                  rescue ArgumentError, InvalidInputError => _e
         
     | 
| 
       57 
58 
     | 
    
         
             
                    nil
         
     | 
| 
       58 
     | 
    
         
            -
                  rescue ::PassiveCIRCL::Error, ::PassiveTotal::Error, ::Pulsedive::ResponseError, ::SecurityTrails::Error, ::VirusTotal::Error => _e
         
     | 
| 
      
 59 
     | 
    
         
            +
                  rescue Faraday::Error, ::PassiveCIRCL::Error, ::PassiveTotal::Error, ::Pulsedive::ResponseError, ::SecurityTrails::Error, ::VirusTotal::Error => _e
         
     | 
| 
       59 
60 
     | 
    
         
             
                    nil
         
     | 
| 
       60 
61 
     | 
    
         
             
                  end
         
     | 
| 
       61 
62 
     | 
    
         
             
                end
         
     | 
| 
         @@ -0,0 +1,77 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require "spyse"
         
     | 
| 
      
 4 
     | 
    
         
            +
            require "json"
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            module Mihari
         
     | 
| 
      
 7 
     | 
    
         
            +
              module Analyzers
         
     | 
| 
      
 8 
     | 
    
         
            +
                class Spyse < Base
         
     | 
| 
      
 9 
     | 
    
         
            +
                  attr_reader :query
         
     | 
| 
      
 10 
     | 
    
         
            +
                  attr_reader :type
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
                  attr_reader :title
         
     | 
| 
      
 13 
     | 
    
         
            +
                  attr_reader :description
         
     | 
| 
      
 14 
     | 
    
         
            +
                  attr_reader :tags
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
                  def initialize(query, title: nil, description: nil, tags: [], type: "domain")
         
     | 
| 
      
 17 
     | 
    
         
            +
                    super()
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                    @query = query
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                    @title = title || "Spyse lookup"
         
     | 
| 
      
 22 
     | 
    
         
            +
                    @description = description || "query = #{query}"
         
     | 
| 
      
 23 
     | 
    
         
            +
                    @tags = tags
         
     | 
| 
      
 24 
     | 
    
         
            +
                    @type = type
         
     | 
| 
      
 25 
     | 
    
         
            +
                  end
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                  def artifacts
         
     | 
| 
      
 28 
     | 
    
         
            +
                    lookup || []
         
     | 
| 
      
 29 
     | 
    
         
            +
                  end
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
                  private
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
                  def search_params
         
     | 
| 
      
 34 
     | 
    
         
            +
                    @search_params ||= JSON.parse(query)
         
     | 
| 
      
 35 
     | 
    
         
            +
                  end
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
                  def config_keys
         
     | 
| 
      
 38 
     | 
    
         
            +
                    %w(spyse_api_key)
         
     | 
| 
      
 39 
     | 
    
         
            +
                  end
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
                  def api
         
     | 
| 
      
 42 
     | 
    
         
            +
                    @api ||= ::Spyse::API.new(Mihari.config.spyse_api_key)
         
     | 
| 
      
 43 
     | 
    
         
            +
                  end
         
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
      
 45 
     | 
    
         
            +
                  def valid_type?
         
     | 
| 
      
 46 
     | 
    
         
            +
                    %w(ip domain cert).include? type
         
     | 
| 
      
 47 
     | 
    
         
            +
                  end
         
     | 
| 
      
 48 
     | 
    
         
            +
             
     | 
| 
      
 49 
     | 
    
         
            +
                  def domain_lookup
         
     | 
| 
      
 50 
     | 
    
         
            +
                    res = api.domain.search(search_params, limit: 100)
         
     | 
| 
      
 51 
     | 
    
         
            +
                    items = res.dig("data", "items") || []
         
     | 
| 
      
 52 
     | 
    
         
            +
                    items.map do |item|
         
     | 
| 
      
 53 
     | 
    
         
            +
                      item.dig("name")
         
     | 
| 
      
 54 
     | 
    
         
            +
                    end.uniq.compact
         
     | 
| 
      
 55 
     | 
    
         
            +
                  end
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
      
 57 
     | 
    
         
            +
                  def ip_lookup
         
     | 
| 
      
 58 
     | 
    
         
            +
                    res = api.ip.search(search_params, limit: 100)
         
     | 
| 
      
 59 
     | 
    
         
            +
                    items = res.dig("data", "items") || []
         
     | 
| 
      
 60 
     | 
    
         
            +
                    items.map do |item|
         
     | 
| 
      
 61 
     | 
    
         
            +
                      item.dig("ip")
         
     | 
| 
      
 62 
     | 
    
         
            +
                    end.uniq.compact
         
     | 
| 
      
 63 
     | 
    
         
            +
                  end
         
     | 
| 
      
 64 
     | 
    
         
            +
             
     | 
| 
      
 65 
     | 
    
         
            +
                  def lookup
         
     | 
| 
      
 66 
     | 
    
         
            +
                    case type
         
     | 
| 
      
 67 
     | 
    
         
            +
                    when "domain"
         
     | 
| 
      
 68 
     | 
    
         
            +
                      domain_lookup
         
     | 
| 
      
 69 
     | 
    
         
            +
                    when "ip"
         
     | 
| 
      
 70 
     | 
    
         
            +
                      ip_lookup
         
     | 
| 
      
 71 
     | 
    
         
            +
                    else
         
     | 
| 
      
 72 
     | 
    
         
            +
                      raise InvalidInputError, "#{query}(type: #{type || 'unknown'}) is not supported." unless valid_type?
         
     | 
| 
      
 73 
     | 
    
         
            +
                    end
         
     | 
| 
      
 74 
     | 
    
         
            +
                  end
         
     | 
| 
      
 75 
     | 
    
         
            +
                end
         
     | 
| 
      
 76 
     | 
    
         
            +
              end
         
     | 
| 
      
 77 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/mihari/cli.rb
    CHANGED
    
    | 
         @@ -7,6 +7,10 @@ module Mihari 
     | 
|
| 
       7 
7 
     | 
    
         
             
              class CLI < Thor
         
     | 
| 
       8 
8 
     | 
    
         
             
                class_option :config, type: :string, desc: "path to config file"
         
     | 
| 
       9 
9 
     | 
    
         | 
| 
      
 10 
     | 
    
         
            +
                def self.exit_on_failure?
         
     | 
| 
      
 11 
     | 
    
         
            +
                  true
         
     | 
| 
      
 12 
     | 
    
         
            +
                end
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
       10 
14 
     | 
    
         
             
                desc "censys [QUERY]", "Censys IPv4 search by a query"
         
     | 
| 
       11 
15 
     | 
    
         
             
                method_option :title, type: :string, desc: "title"
         
     | 
| 
       12 
16 
     | 
    
         
             
                method_option :description, type: :string, desc: "description"
         
     | 
| 
         @@ -164,6 +168,27 @@ module Mihari 
     | 
|
| 
       164 
168 
     | 
    
         
             
                  end
         
     | 
| 
       165 
169 
     | 
    
         
             
                end
         
     | 
| 
       166 
170 
     | 
    
         | 
| 
      
 171 
     | 
    
         
            +
                desc "otx [IP|DOMAIN]", "OTX lookup by an IP or domain"
         
     | 
| 
      
 172 
     | 
    
         
            +
                method_option :title, type: :string, desc: "title"
         
     | 
| 
      
 173 
     | 
    
         
            +
                method_option :description, type: :string, desc: "description"
         
     | 
| 
      
 174 
     | 
    
         
            +
                method_option :tags, type: :array, desc: "tags"
         
     | 
| 
      
 175 
     | 
    
         
            +
                def otx(domain)
         
     | 
| 
      
 176 
     | 
    
         
            +
                  with_error_handling do
         
     | 
| 
      
 177 
     | 
    
         
            +
                    run_analyzer Analyzers::OTX, query: refang(domain), options: options
         
     | 
| 
      
 178 
     | 
    
         
            +
                  end
         
     | 
| 
      
 179 
     | 
    
         
            +
                end
         
     | 
| 
      
 180 
     | 
    
         
            +
             
     | 
| 
      
 181 
     | 
    
         
            +
                desc "spyse [QUERY]", "Spyse search by a query"
         
     | 
| 
      
 182 
     | 
    
         
            +
                method_option :title, type: :string, desc: "title"
         
     | 
| 
      
 183 
     | 
    
         
            +
                method_option :description, type: :string, desc: "description"
         
     | 
| 
      
 184 
     | 
    
         
            +
                method_option :tags, type: :array, desc: "tags"
         
     | 
| 
      
 185 
     | 
    
         
            +
                method_option :type, type: :string, desc: "type to search (ip or domain)", default: "doamin"
         
     | 
| 
      
 186 
     | 
    
         
            +
                def spyse(query)
         
     | 
| 
      
 187 
     | 
    
         
            +
                  with_error_handling do
         
     | 
| 
      
 188 
     | 
    
         
            +
                    run_analyzer Analyzers::Spyse, query: query, options: options
         
     | 
| 
      
 189 
     | 
    
         
            +
                  end
         
     | 
| 
      
 190 
     | 
    
         
            +
                end
         
     | 
| 
      
 191 
     | 
    
         
            +
             
     | 
| 
       167 
192 
     | 
    
         
             
                desc "passive_dns [IP|DOMAIN]", "Cross search with passive DNS services by an ip or domain"
         
     | 
| 
       168 
193 
     | 
    
         
             
                method_option :title, type: :string, desc: "title"
         
     | 
| 
       169 
194 
     | 
    
         
             
                method_option :description, type: :string, desc: "description"
         
     | 
    
        data/lib/mihari/config.rb
    CHANGED
    
    | 
         @@ -12,6 +12,7 @@ module Mihari 
     | 
|
| 
       12 
12 
     | 
    
         
             
                attr_accessor :misp_api_endpoint
         
     | 
| 
       13 
13 
     | 
    
         
             
                attr_accessor :misp_api_key
         
     | 
| 
       14 
14 
     | 
    
         
             
                attr_accessor :onyphe_api_key
         
     | 
| 
      
 15 
     | 
    
         
            +
                attr_accessor :otx_api_key
         
     | 
| 
       15 
16 
     | 
    
         
             
                attr_accessor :passivetotal_api_key
         
     | 
| 
       16 
17 
     | 
    
         
             
                attr_accessor :passivetotal_username
         
     | 
| 
       17 
18 
     | 
    
         
             
                attr_accessor :pulsedive_api_key
         
     | 
| 
         @@ -19,8 +20,10 @@ module Mihari 
     | 
|
| 
       19 
20 
     | 
    
         
             
                attr_accessor :shodan_api_key
         
     | 
| 
       20 
21 
     | 
    
         
             
                attr_accessor :slack_channel
         
     | 
| 
       21 
22 
     | 
    
         
             
                attr_accessor :slack_webhook_url
         
     | 
| 
      
 23 
     | 
    
         
            +
                attr_accessor :spyse_api_key
         
     | 
| 
       22 
24 
     | 
    
         
             
                attr_accessor :thehive_api_endpoint
         
     | 
| 
       23 
25 
     | 
    
         
             
                attr_accessor :thehive_api_key
         
     | 
| 
      
 26 
     | 
    
         
            +
                attr_accessor :urlscan_api_key
         
     | 
| 
       24 
27 
     | 
    
         
             
                attr_accessor :virustotal_api_key
         
     | 
| 
       25 
28 
     | 
    
         
             
                attr_accessor :zoomeye_password
         
     | 
| 
       26 
29 
     | 
    
         
             
                attr_accessor :zoomeye_username
         
     | 
| 
         @@ -40,6 +43,7 @@ module Mihari 
     | 
|
| 
       40 
43 
     | 
    
         
             
                  @misp_api_endpoint = ENV["MISP_API_ENDPOINT"]
         
     | 
| 
       41 
44 
     | 
    
         
             
                  @misp_api_key = ENV["MISP_API_KEY"]
         
     | 
| 
       42 
45 
     | 
    
         
             
                  @onyphe_api_key = ENV["ONYPHE_API_KEY"]
         
     | 
| 
      
 46 
     | 
    
         
            +
                  @otx_api_key = ENV["OTX_API_KEY"]
         
     | 
| 
       43 
47 
     | 
    
         
             
                  @passivetotal_api_key = ENV["PASSIVETOTAL_API_KEY"]
         
     | 
| 
       44 
48 
     | 
    
         
             
                  @passivetotal_username = ENV["PASSIVETOTAL_USERNAME"]
         
     | 
| 
       45 
49 
     | 
    
         
             
                  @pulsedive_api_key = ENV["PULSEDIVE_API_KEY"]
         
     | 
| 
         @@ -47,8 +51,10 @@ module Mihari 
     | 
|
| 
       47 
51 
     | 
    
         
             
                  @shodan_api_key = ENV["SHODAN_API_KEY"]
         
     | 
| 
       48 
52 
     | 
    
         
             
                  @slack_channel = ENV["SLACK_CHANNEL"]
         
     | 
| 
       49 
53 
     | 
    
         
             
                  @slack_webhook_url = ENV["SLACK_WEBHOOK_URL"]
         
     | 
| 
      
 54 
     | 
    
         
            +
                  @spyse_api_key = ENV["SPYSE_API_KEY"]
         
     | 
| 
       50 
55 
     | 
    
         
             
                  @thehive_api_endpoint = ENV["THEHIVE_API_ENDPOINT"]
         
     | 
| 
       51 
56 
     | 
    
         
             
                  @thehive_api_key = ENV["THEHIVE_API_KEY"]
         
     | 
| 
      
 57 
     | 
    
         
            +
                  @urlscan_api_key = ENV["URLSCAN_API_KEY"]
         
     | 
| 
       52 
58 
     | 
    
         
             
                  @virustotal_api_key = ENV["VIRUSTOTAL_API_KEY"]
         
     | 
| 
       53 
59 
     | 
    
         
             
                  @zoomeye_password = ENV["ZOOMEYE_PASSWORD"]
         
     | 
| 
       54 
60 
     | 
    
         
             
                  @zoomeye_username = ENV["ZOOMEYE_USERNAME"]
         
     | 
    
        data/lib/mihari/errors.rb
    CHANGED
    
    
    
        data/lib/mihari/retriable.rb
    CHANGED
    
    | 
         @@ -7,10 +7,10 @@ module Mihari 
     | 
|
| 
       7 
7 
     | 
    
         
             
                  begin
         
     | 
| 
       8 
8 
     | 
    
         
             
                    try += 1
         
     | 
| 
       9 
9 
     | 
    
         
             
                    yield
         
     | 
| 
       10 
     | 
    
         
            -
                  rescue Errno::ECONNRESET, Errno::ECONNABORTED, Errno::EPIPE, OpenSSL::SSL::SSLError, Timeout::Error =>  
     | 
| 
      
 10 
     | 
    
         
            +
                  rescue Errno::ECONNRESET, Errno::ECONNABORTED, Errno::EPIPE, OpenSSL::SSL::SSLError, Timeout::Error, RetryableError => e
         
     | 
| 
       11 
11 
     | 
    
         
             
                    sleep interval
         
     | 
| 
       12 
12 
     | 
    
         
             
                    retry if try < times
         
     | 
| 
       13 
     | 
    
         
            -
                    raise
         
     | 
| 
      
 13 
     | 
    
         
            +
                    raise e
         
     | 
| 
       14 
14 
     | 
    
         
             
                  end
         
     | 
| 
       15 
15 
     | 
    
         
             
                end
         
     | 
| 
       16 
16 
     | 
    
         
             
              end
         
     | 
    
        data/lib/mihari/version.rb
    CHANGED
    
    
    
        data/mihari.gemspec
    CHANGED
    
    | 
         @@ -31,8 +31,8 @@ Gem::Specification.new do |spec| 
     | 
|
| 
       31 
31 
     | 
    
         
             
              spec.add_development_dependency "pre-commit", "~> 0.39"
         
     | 
| 
       32 
32 
     | 
    
         
             
              spec.add_development_dependency "rake", "~> 13.0"
         
     | 
| 
       33 
33 
     | 
    
         
             
              spec.add_development_dependency "rspec", "~> 3.9"
         
     | 
| 
       34 
     | 
    
         
            -
              spec.add_development_dependency "rubocop", "~> 0. 
     | 
| 
       35 
     | 
    
         
            -
              spec.add_development_dependency "rubocop-performance", "~> 1. 
     | 
| 
      
 34 
     | 
    
         
            +
              spec.add_development_dependency "rubocop", "~> 0.90"
         
     | 
| 
      
 35 
     | 
    
         
            +
              spec.add_development_dependency "rubocop-performance", "~> 1.8"
         
     | 
| 
       36 
36 
     | 
    
         
             
              spec.add_development_dependency "timecop", "~> 0.9"
         
     | 
| 
       37 
37 
     | 
    
         
             
              spec.add_development_dependency "vcr", "~> 6.0"
         
     | 
| 
       38 
38 
     | 
    
         
             
              spec.add_development_dependency "webmock", "~> 3.8"
         
     | 
| 
         @@ -52,6 +52,7 @@ Gem::Specification.new do |spec| 
     | 
|
| 
       52 
52 
     | 
    
         
             
              spec.add_dependency "murmurhash3", "~> 0.1"
         
     | 
| 
       53 
53 
     | 
    
         
             
              spec.add_dependency "net-ping", "~> 2.0"
         
     | 
| 
       54 
54 
     | 
    
         
             
              spec.add_dependency "onyphe", "~> 2.0"
         
     | 
| 
      
 55 
     | 
    
         
            +
              spec.add_dependency "otx_ruby", "~> 0.9"
         
     | 
| 
       55 
56 
     | 
    
         
             
              spec.add_dependency "parallel", "~> 1.19"
         
     | 
| 
       56 
57 
     | 
    
         
             
              spec.add_dependency "passive_circl", "~> 0.1"
         
     | 
| 
       57 
58 
     | 
    
         
             
              spec.add_dependency "passivetotalx", "~> 0.1"
         
     | 
| 
         @@ -61,6 +62,7 @@ Gem::Specification.new do |spec| 
     | 
|
| 
       61 
62 
     | 
    
         
             
              spec.add_dependency "securitytrails", "~> 1.0"
         
     | 
| 
       62 
63 
     | 
    
         
             
              spec.add_dependency "shodanx", "~> 0.2"
         
     | 
| 
       63 
64 
     | 
    
         
             
              spec.add_dependency "slack-notifier", "~> 2.3"
         
     | 
| 
      
 65 
     | 
    
         
            +
              spec.add_dependency "spysex", "~> 0.1"
         
     | 
| 
       64 
66 
     | 
    
         
             
              spec.add_dependency "sqlite3", "~> 1.4"
         
     | 
| 
       65 
67 
     | 
    
         
             
              spec.add_dependency "thor", "~> 1.0"
         
     | 
| 
       66 
68 
     | 
    
         
             
              spec.add_dependency "urlscan", "~> 0.5"
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,14 +1,14 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: mihari
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 1. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 1.3.2
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Manabu Niseki
         
     | 
| 
       8 
8 
     | 
    
         
             
            autorequire:
         
     | 
| 
       9 
9 
     | 
    
         
             
            bindir: exe
         
     | 
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
     | 
    
         
            -
            date: 2020- 
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2020-09-12 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies:
         
     | 
| 
       13 
13 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       14 
14 
     | 
    
         
             
              name: bundler
         
     | 
| 
         @@ -114,28 +114,28 @@ dependencies: 
     | 
|
| 
       114 
114 
     | 
    
         
             
                requirements:
         
     | 
| 
       115 
115 
     | 
    
         
             
                - - "~>"
         
     | 
| 
       116 
116 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       117 
     | 
    
         
            -
                    version: '0. 
     | 
| 
      
 117 
     | 
    
         
            +
                    version: '0.90'
         
     | 
| 
       118 
118 
     | 
    
         
             
              type: :development
         
     | 
| 
       119 
119 
     | 
    
         
             
              prerelease: false
         
     | 
| 
       120 
120 
     | 
    
         
             
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
       121 
121 
     | 
    
         
             
                requirements:
         
     | 
| 
       122 
122 
     | 
    
         
             
                - - "~>"
         
     | 
| 
       123 
123 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       124 
     | 
    
         
            -
                    version: '0. 
     | 
| 
      
 124 
     | 
    
         
            +
                    version: '0.90'
         
     | 
| 
       125 
125 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       126 
126 
     | 
    
         
             
              name: rubocop-performance
         
     | 
| 
       127 
127 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
       128 
128 
     | 
    
         
             
                requirements:
         
     | 
| 
       129 
129 
     | 
    
         
             
                - - "~>"
         
     | 
| 
       130 
130 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       131 
     | 
    
         
            -
                    version: '1. 
     | 
| 
      
 131 
     | 
    
         
            +
                    version: '1.8'
         
     | 
| 
       132 
132 
     | 
    
         
             
              type: :development
         
     | 
| 
       133 
133 
     | 
    
         
             
              prerelease: false
         
     | 
| 
       134 
134 
     | 
    
         
             
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
       135 
135 
     | 
    
         
             
                requirements:
         
     | 
| 
       136 
136 
     | 
    
         
             
                - - "~>"
         
     | 
| 
       137 
137 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       138 
     | 
    
         
            -
                    version: '1. 
     | 
| 
      
 138 
     | 
    
         
            +
                    version: '1.8'
         
     | 
| 
       139 
139 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       140 
140 
     | 
    
         
             
              name: timecop
         
     | 
| 
       141 
141 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
         @@ -388,6 +388,20 @@ dependencies: 
     | 
|
| 
       388 
388 
     | 
    
         
             
                - - "~>"
         
     | 
| 
       389 
389 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       390 
390 
     | 
    
         
             
                    version: '2.0'
         
     | 
| 
      
 391 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency
         
     | 
| 
      
 392 
     | 
    
         
            +
              name: otx_ruby
         
     | 
| 
      
 393 
     | 
    
         
            +
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
      
 394 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 395 
     | 
    
         
            +
                - - "~>"
         
     | 
| 
      
 396 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 397 
     | 
    
         
            +
                    version: '0.9'
         
     | 
| 
      
 398 
     | 
    
         
            +
              type: :runtime
         
     | 
| 
      
 399 
     | 
    
         
            +
              prerelease: false
         
     | 
| 
      
 400 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
      
 401 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 402 
     | 
    
         
            +
                - - "~>"
         
     | 
| 
      
 403 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 404 
     | 
    
         
            +
                    version: '0.9'
         
     | 
| 
       391 
405 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       392 
406 
     | 
    
         
             
              name: parallel
         
     | 
| 
       393 
407 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
         @@ -514,6 +528,20 @@ dependencies: 
     | 
|
| 
       514 
528 
     | 
    
         
             
                - - "~>"
         
     | 
| 
       515 
529 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       516 
530 
     | 
    
         
             
                    version: '2.3'
         
     | 
| 
      
 531 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency
         
     | 
| 
      
 532 
     | 
    
         
            +
              name: spysex
         
     | 
| 
      
 533 
     | 
    
         
            +
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
      
 534 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 535 
     | 
    
         
            +
                - - "~>"
         
     | 
| 
      
 536 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 537 
     | 
    
         
            +
                    version: '0.1'
         
     | 
| 
      
 538 
     | 
    
         
            +
              type: :runtime
         
     | 
| 
      
 539 
     | 
    
         
            +
              prerelease: false
         
     | 
| 
      
 540 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
      
 541 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 542 
     | 
    
         
            +
                - - "~>"
         
     | 
| 
      
 543 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 544 
     | 
    
         
            +
                    version: '0.1'
         
     | 
| 
       517 
545 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       518 
546 
     | 
    
         
             
              name: sqlite3
         
     | 
| 
       519 
547 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
         @@ -619,6 +647,7 @@ files: 
     | 
|
| 
       619 
647 
     | 
    
         
             
            - lib/mihari/analyzers/free_text.rb
         
     | 
| 
       620 
648 
     | 
    
         
             
            - lib/mihari/analyzers/http_hash.rb
         
     | 
| 
       621 
649 
     | 
    
         
             
            - lib/mihari/analyzers/onyphe.rb
         
     | 
| 
      
 650 
     | 
    
         
            +
            - lib/mihari/analyzers/otx.rb
         
     | 
| 
       622 
651 
     | 
    
         
             
            - lib/mihari/analyzers/passive_dns.rb
         
     | 
| 
       623 
652 
     | 
    
         
             
            - lib/mihari/analyzers/passive_ssl.rb
         
     | 
| 
       624 
653 
     | 
    
         
             
            - lib/mihari/analyzers/passivetotal.rb
         
     | 
| 
         @@ -627,6 +656,7 @@ files: 
     | 
|
| 
       627 
656 
     | 
    
         
             
            - lib/mihari/analyzers/securitytrails.rb
         
     | 
| 
       628 
657 
     | 
    
         
             
            - lib/mihari/analyzers/securitytrails_domain_feed.rb
         
     | 
| 
       629 
658 
     | 
    
         
             
            - lib/mihari/analyzers/shodan.rb
         
     | 
| 
      
 659 
     | 
    
         
            +
            - lib/mihari/analyzers/spyse.rb
         
     | 
| 
       630 
660 
     | 
    
         
             
            - lib/mihari/analyzers/ssh_fingerprint.rb
         
     | 
| 
       631 
661 
     | 
    
         
             
            - lib/mihari/analyzers/urlscan.rb
         
     | 
| 
       632 
662 
     | 
    
         
             
            - lib/mihari/analyzers/virustotal.rb
         
     | 
| 
         @@ -659,6 +689,7 @@ files: 
     | 
|
| 
       659 
689 
     | 
    
         
             
            - lib/mihari/type_checker.rb
         
     | 
| 
       660 
690 
     | 
    
         
             
            - lib/mihari/version.rb
         
     | 
| 
       661 
691 
     | 
    
         
             
            - mihari.gemspec
         
     | 
| 
      
 692 
     | 
    
         
            +
            - renovate.json
         
     | 
| 
       662 
693 
     | 
    
         
             
            - screenshots/alert.png
         
     | 
| 
       663 
694 
     | 
    
         
             
            - screenshots/eyecatch.png
         
     | 
| 
       664 
695 
     | 
    
         
             
            - screenshots/misp.png
         
     |