mihari 0.6.0 → 0.7.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 487e9fb5b564d2f9edfdd225c5188dd8505e282a106ffd6434c159f1a05bf6b5
4
- data.tar.gz: 2149a69537d25d65cd7a036190351d0d89e8bf5a6fe99f79076f8328445f21b1
3
+ metadata.gz: 288de64c354401afb06966aeff20d8cbf16ad7c2fa7ba16fe3caffc473885a48
4
+ data.tar.gz: 70416695adc834d0cb3b52410fa9665a163708d2be6e3544dde41f821e37e88b
5
5
  SHA512:
6
- metadata.gz: 437dc50a254afd8a0f444224665a47fab6bd0314ad403df2f83f2bca719ac5172064348306146e97647e41b7bb87502845e4459480660500763f8fe63126c4ed
7
- data.tar.gz: 704c26e0a0a62e7481bb185a6e0af2823dcf528bb49224ab6620215b66f7bec082d8fa52aa1d0d093470fb5b1e0a2afe6f81c25e181071eb73fede734b144106
6
+ metadata.gz: a6042c43edc0817d926683694ed98decc52d35b3177b312bd36d2573b818a99add3a3a8317ae08f5a7172249422335f266595382828428fde7e5ea7017205407
7
+ data.tar.gz: 51135d5070b5f1697e0a51495de13b2e34c4e1eea2f91989ea2ae5301e65d851f52e7a963edaa7d5480f83ef720f893de404ee32ee30c458353fa9a9b1ef392b
data/README.md CHANGED
@@ -39,15 +39,17 @@ mihari supports Censys, Shodan, Onyphe, urlscan and VirusTotal by default.
39
39
  ```bash
40
40
  $ mihari
41
41
  Commands:
42
- mihari alerts # Show the alerts on TheHive
43
- mihari censys [QUERY] # Censys IPv4 lookup by a given query
44
- mihari help [COMMAND] # Describe available commands or one specific command
45
- mihari import_from_json # Give a JSON input via STDIN
46
- mihari onyphe [QUERY] # Onyphe datascan lookup by a given query
47
- mihari shodan [QUERY] # Shodan host lookup by a given query
48
- mihari status # Show the current configuration status
49
- mihari urlscan [QUERY] # urlscan lookup by a given query
50
- mihari virustotal [IP|DOMAIN] # VirusTotal resolutions lookup by a given ip or domain
42
+ mihari alerts # Show the alerts on TheHive
43
+ mihari censys [QUERY] # Censys IPv4 lookup by a given query
44
+ mihari crtsh [QUERY] # crt.sh lookup by a given query
45
+ mihari help [COMMAND] # Describe available commands or one specific command
46
+ mihari import_from_json # Give a JSON input via STDIN
47
+ mihari onyphe [QUERY] # Onyphe datascan lookup by a given query
48
+ mihari securitytrails [IP|DOMAIN] # SecurityTrails resolutions lookup by a given ip or domain
49
+ mihari shodan [QUERY] # Shodan host lookup by a given query
50
+ mihari status # Show the current configuration status
51
+ mihari urlscan [QUERY] # urlscan lookup by a given query
52
+ mihari virustotal [IP|DOMAIN] # VirusTotal resolutions lookup by a given ip or domain
51
53
 
52
54
  ```
53
55
 
@@ -79,17 +81,18 @@ The input is a JSON data should have `title`, `description` and `artifacts` key.
79
81
 
80
82
  All configuration is done via ENV variables.
81
83
 
82
- | Key | Desc. | Required or optional |
83
- |----------------------|--------------------|--------------------------------|
84
- | THEHIVE_API_ENDPOINT | TheHive URL | Required |
85
- | THEHIVE_API_KEY | TheHive API key | Required |
86
- | SLACK_WEBHOOK_URL | Slack Webhook URL | Optional |
87
- | SLACK_CHANNEL | Slack channel name | Optional (default: `#general`) |
88
- | CENSYS_ID | Censys API ID | Optional |
89
- | CENSYS_SECRET | Censys secret | Optional |
90
- | SHODAN_API_KEY | Shodan API key | Optional |
91
- | ONYPHE_API_KEY | Onyphe API key | Optional |
92
- | VIRUSTOTAL_API_KEY | VirusTotal API key | Optional |
84
+ | Key | Desc. | Required or optional |
85
+ |------------------------|------------------------|--------------------------------|
86
+ | THEHIVE_API_ENDPOINT | TheHive URL | Required |
87
+ | THEHIVE_API_KEY | TheHive API key | Required |
88
+ | SLACK_WEBHOOK_URL | Slack Webhook URL | Optional |
89
+ | SLACK_CHANNEL | Slack channel name | Optional (default: `#general`) |
90
+ | CENSYS_ID | Censys API ID | Optional |
91
+ | CENSYS_SECRET | Censys secret | Optional |
92
+ | ONYPHE_API_KEY | Onyphe API key | Optional |
93
+ | SECURITYTRAILS_API_KEY | SecurityTrails API key | Optional |
94
+ | SHODAN_API_KEY | Shodan API key | Optional |
95
+ | VIRUSTOTAL_API_KEY | VirusTotal API key | Optional |
93
96
 
94
97
  ## How to create a custom analyzer
95
98
 
@@ -28,7 +28,9 @@ require "mihari/the_hive"
28
28
  require "mihari/analyzers/base"
29
29
  require "mihari/analyzers/basic"
30
30
  require "mihari/analyzers/censys"
31
+ require "mihari/analyzers/crtsh"
31
32
  require "mihari/analyzers/onyphe"
33
+ require "mihari/analyzers/securitytrails"
32
34
  require "mihari/analyzers/shodan"
33
35
  require "mihari/analyzers/urlscan"
34
36
  require "mihari/analyzers/virustotal"
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "crtsh"
4
+
5
+ module Mihari
6
+ module Analyzers
7
+ class Crtsh < Base
8
+ attr_reader :api
9
+ attr_reader :title
10
+ attr_reader :description
11
+ attr_reader :query
12
+ attr_reader :tags
13
+
14
+ def initialize(query, title: nil, description: nil, tags: [])
15
+ super()
16
+
17
+ @api = ::Crtsh::API.new
18
+ @query = query
19
+ @title = title || "crt.sh lookup"
20
+ @description = description || "query = #{query}"
21
+ @tags = tags
22
+ end
23
+
24
+ def artifacts
25
+ results = search
26
+ results.map { |result| result.dig("name_value") }.compact.uniq
27
+ end
28
+
29
+ private
30
+
31
+ def search
32
+ api.search(query)
33
+ rescue ::Crtsh::Error => _e
34
+ []
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "securitytrails"
4
+
5
+ module Mihari
6
+ module Analyzers
7
+ class SecurityTrails < Base
8
+ attr_reader :api
9
+ attr_reader :indicator
10
+ attr_reader :type
11
+
12
+ attr_reader :title
13
+ attr_reader :description
14
+ attr_reader :tags
15
+
16
+ def initialize(indicator, title: nil, description: nil, tags: [])
17
+ super()
18
+
19
+ @api = ::SecurityTrails::API.new
20
+ @indicator = indicator
21
+ @type = TypeChecker.type(indicator)
22
+
23
+ @title = title || "SecurityTrails lookup"
24
+ @description = description || "indicator = #{indicator}"
25
+ @tags = tags
26
+ end
27
+
28
+ def artifacts
29
+ lookup || []
30
+ end
31
+
32
+ private
33
+
34
+ def valid_type?
35
+ %w(ip domain).include? type
36
+ end
37
+
38
+ def lookup
39
+ case type
40
+ when "domain"
41
+ domain_lookup
42
+ when "ip"
43
+ ip_lookup
44
+ else
45
+ raise ArgumentError, "#{indicator}(type: #{type || 'unknown'}) is not supported." unless valid_type?
46
+ end
47
+ rescue ::SecurityTrails::Error => _e
48
+ nil
49
+ end
50
+
51
+ def domain_lookup
52
+ result = api.history.get_all_dns_history(indicator, "a").to_h
53
+ records = result.dig(:records) || []
54
+ records.map do |record|
55
+ values = record.dig(:values) || []
56
+ values.map { |value| value.dig(:ip) }
57
+ end.compact.flatten.uniq
58
+ end
59
+
60
+ def ip_lookup
61
+ result = api.domains.search( filter: { ipv4: indicator }).to_h
62
+ records = result.dig(:records) || []
63
+ records.map do |record|
64
+ record.dig(:hostname)
65
+ end.compact.uniq
66
+ end
67
+ end
68
+ end
69
+ end
@@ -56,6 +56,26 @@ module Mihari
56
56
  end
57
57
  end
58
58
 
59
+ desc "securitytrails [IP|DOMAIN]", "SecurityTrails resolutions lookup by a given ip or domain"
60
+ method_option :title, type: :string, desc: "title"
61
+ method_option :description, type: :string, desc: "description"
62
+ method_option :tags, type: :array, desc: "tags"
63
+ def securitytrails(indiactor)
64
+ with_error_handling do
65
+ run_analyzer Analyzers::SecurityTrails, query: indiactor, options: options
66
+ end
67
+ end
68
+
69
+ desc "crtsh [QUERY]", "crt.sh lookup by a given query"
70
+ method_option :title, type: :string, desc: "title"
71
+ method_option :description, type: :string, desc: "description"
72
+ method_option :tags, type: :array, desc: "tags"
73
+ def crtsh(query)
74
+ with_error_handling do
75
+ run_analyzer Analyzers::Crtsh, query: query, options: options
76
+ end
77
+ end
78
+
59
79
  desc "import_from_json", "Give a JSON input via STDIN"
60
80
  def import_from_json(input = nil)
61
81
  with_error_handling do
@@ -4,12 +4,13 @@ module Mihari
4
4
  class Status
5
5
  def check
6
6
  {
7
- shodan: { status: shodan?, message: shodan },
8
- slack: { status: slack?, message: slack },
9
7
  censys: { status: censys?, message: censys },
10
- virustotal: { status: virustotal?, message: virustotal },
11
8
  onyphe: { status: onyphe?, message: onyphe },
9
+ securitytrails: { status: securitytrails?, message: securitytrails },
10
+ shodan: { status: shodan?, message: shodan },
11
+ slack: { status: slack?, message: slack },
12
12
  the_hive: { status: the_hive?, message: the_hive },
13
+ virustotal: { status: virustotal?, message: virustotal },
13
14
  }.map do |key, value|
14
15
  [key, convert(value)]
15
16
  end.to_h
@@ -28,6 +29,14 @@ module Mihari
28
29
  }
29
30
  end
30
31
 
32
+ def securitytrails?
33
+ ENV.key? "SECURITYTRAILS_API_KEY"
34
+ end
35
+
36
+ def securitytrails
37
+ securitytrails? ? "SECURITYTRAILS_API_KEY is found" : "SECURITYTRAILS_API_KEY is missing"
38
+ end
39
+
31
40
  def virustotal?
32
41
  ENV.key?("VIRUSTOTAL_API_KEY")
33
42
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Mihari
4
- VERSION = "0.6.0"
4
+ VERSION = "0.7.0"
5
5
  end
@@ -33,12 +33,14 @@ Gem::Specification.new do |spec|
33
33
 
34
34
  spec.add_dependency "addressable", "~> 2.7"
35
35
  spec.add_dependency "censu", "~> 0.2"
36
+ spec.add_dependency "crtsh-rb", "~> 0.1"
36
37
  spec.add_dependency "email_address", "~> 0.1"
37
38
  spec.add_dependency "hachi", "~> 0.2"
38
39
  spec.add_dependency "mem", "~> 0.1"
39
40
  spec.add_dependency "net-ping", "~> 2.0"
40
41
  spec.add_dependency "onyphe", "~> 0.2"
41
42
  spec.add_dependency "public_suffix", "~> 3.1"
43
+ spec.add_dependency "securitytrails", "~> 0.2"
42
44
  spec.add_dependency "shodanx", "~> 0.1"
43
45
  spec.add_dependency "slack-notifier", "~> 2.3"
44
46
  spec.add_dependency "thor", "~> 0.20"
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: 0.6.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Manabu Niseki
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-09-01 00:00:00.000000000 Z
11
+ date: 2019-09-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -122,6 +122,20 @@ dependencies:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0.2'
125
+ - !ruby/object:Gem::Dependency
126
+ name: crtsh-rb
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '0.1'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '0.1'
125
139
  - !ruby/object:Gem::Dependency
126
140
  name: email_address
127
141
  requirement: !ruby/object:Gem::Requirement
@@ -206,6 +220,20 @@ dependencies:
206
220
  - - "~>"
207
221
  - !ruby/object:Gem::Version
208
222
  version: '3.1'
223
+ - !ruby/object:Gem::Dependency
224
+ name: securitytrails
225
+ requirement: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - "~>"
228
+ - !ruby/object:Gem::Version
229
+ version: '0.2'
230
+ type: :runtime
231
+ prerelease: false
232
+ version_requirements: !ruby/object:Gem::Requirement
233
+ requirements:
234
+ - - "~>"
235
+ - !ruby/object:Gem::Version
236
+ version: '0.2'
209
237
  - !ruby/object:Gem::Dependency
210
238
  name: shodanx
211
239
  requirement: !ruby/object:Gem::Requirement
@@ -301,7 +329,9 @@ files:
301
329
  - lib/mihari/analyzers/base.rb
302
330
  - lib/mihari/analyzers/basic.rb
303
331
  - lib/mihari/analyzers/censys.rb
332
+ - lib/mihari/analyzers/crtsh.rb
304
333
  - lib/mihari/analyzers/onyphe.rb
334
+ - lib/mihari/analyzers/securitytrails.rb
305
335
  - lib/mihari/analyzers/shodan.rb
306
336
  - lib/mihari/analyzers/urlscan.rb
307
337
  - lib/mihari/analyzers/virustotal.rb