mihari 3.6.0 → 3.6.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitmodules +3 -0
- data/README.md +2 -0
- data/Steepfile +32 -0
- data/lib/mihari/analyzers/base.rb +5 -5
- data/lib/mihari/analyzers/binaryedge.rb +13 -0
- data/lib/mihari/analyzers/censys.rb +5 -0
- data/lib/mihari/analyzers/circl.rb +15 -0
- data/lib/mihari/analyzers/crtsh.rb +5 -0
- data/lib/mihari/analyzers/dnpedia.rb +5 -0
- data/lib/mihari/analyzers/dnstwister.rb +17 -0
- data/lib/mihari/analyzers/onyphe.rb +20 -4
- data/lib/mihari/analyzers/otx.rb +20 -0
- data/lib/mihari/analyzers/passivetotal.rb +25 -0
- data/lib/mihari/analyzers/pulsedive.rb +10 -0
- data/lib/mihari/analyzers/rule.rb +18 -0
- data/lib/mihari/analyzers/securitytrails.rb +25 -0
- data/lib/mihari/analyzers/shodan.rb +13 -0
- data/lib/mihari/analyzers/spyse.rb +20 -0
- data/lib/mihari/analyzers/urlscan.rb +10 -0
- data/lib/mihari/analyzers/virustotal.rb +20 -0
- data/lib/mihari/analyzers/zoomeye.rb +38 -0
- data/lib/mihari/emitters/base.rb +1 -1
- data/lib/mihari/emitters/misp.rb +38 -5
- data/lib/mihari/emitters/slack.rb +20 -2
- data/lib/mihari/emitters/the_hive.rb +16 -3
- data/lib/mihari/emitters/webhook.rb +18 -3
- data/lib/mihari/mixins/disallowed_data_value.rb +1 -1
- data/lib/mihari/structs/onyphe.rb +2 -2
- data/lib/mihari/type_checker.rb +9 -9
- data/lib/mihari/version.rb +1 -1
- data/mihari.gemspec +1 -0
- data/sig/lib/mihari/analyzers/base.rbs +99 -0
- data/sig/lib/mihari/analyzers/basic.rbs +17 -0
- data/sig/lib/mihari/analyzers/binaryedge.rbs +25 -0
- data/sig/lib/mihari/analyzers/censys.rbs +38 -0
- data/sig/lib/mihari/analyzers/circl.rbs +29 -0
- data/sig/lib/mihari/analyzers/crtsh.rbs +19 -0
- data/sig/lib/mihari/analyzers/dnpedia.rbs +18 -0
- data/sig/lib/mihari/analyzers/dnstwister.rbs +27 -0
- data/sig/lib/mihari/analyzers/onyphe.rbs +33 -0
- data/sig/lib/mihari/analyzers/otx.rbs +33 -0
- data/sig/lib/mihari/analyzers/passivetotal.rbs +33 -0
- data/sig/lib/mihari/analyzers/pulsedive.rbs +27 -0
- data/sig/lib/mihari/analyzers/rule.rbs +68 -0
- data/sig/lib/mihari/analyzers/securitytrails.rbs +33 -0
- data/sig/lib/mihari/analyzers/shodan.rbs +33 -0
- data/sig/lib/mihari/analyzers/spyse.rbs +29 -0
- data/sig/lib/mihari/analyzers/urlscan.rbs +28 -0
- data/sig/lib/mihari/analyzers/virustotal.rbs +31 -0
- data/sig/lib/mihari/analyzers/zoomeye.rbs +33 -0
- data/sig/lib/mihari/cli/analyzer.rbs +39 -0
- data/sig/lib/mihari/cli/base.rbs +11 -0
- data/sig/lib/mihari/cli/init.rbs +7 -0
- data/sig/lib/mihari/cli/main.rbs +9 -0
- data/sig/lib/mihari/cli/mixins/utils.rbs +50 -0
- data/sig/lib/mihari/cli/validator.rbs +7 -0
- data/sig/lib/mihari/commands/binaryedge.rbs +7 -0
- data/sig/lib/mihari/commands/censys.rbs +7 -0
- data/sig/lib/mihari/commands/circl.rbs +7 -0
- data/sig/lib/mihari/commands/crtsh.rbs +7 -0
- data/sig/lib/mihari/commands/dnpedia.rbs +7 -0
- data/sig/lib/mihari/commands/dnstwister.rbs +7 -0
- data/sig/lib/mihari/commands/init.rbs +11 -0
- data/sig/lib/mihari/commands/json.rbs +7 -0
- data/sig/lib/mihari/commands/onyphe.rbs +7 -0
- data/sig/lib/mihari/commands/otx.rbs +7 -0
- data/sig/lib/mihari/commands/passivetotal.rbs +7 -0
- data/sig/lib/mihari/commands/pulsedive.rbs +7 -0
- data/sig/lib/mihari/commands/search.rbs +35 -0
- data/sig/lib/mihari/commands/securitytrails.rbs +7 -0
- data/sig/lib/mihari/commands/shodan.rbs +7 -0
- data/sig/lib/mihari/commands/spyse.rbs +7 -0
- data/sig/lib/mihari/commands/urlscan.rbs +7 -0
- data/sig/lib/mihari/commands/validator.rbs +11 -0
- data/sig/lib/mihari/commands/virustotal.rbs +7 -0
- data/sig/lib/mihari/commands/web.rbs +7 -0
- data/sig/lib/mihari/commands/zoomeye.rbs +7 -0
- data/sig/lib/mihari/constants.rbs +3 -0
- data/sig/lib/mihari/database.rbs +25 -0
- data/sig/lib/mihari/emitters/base.rbs +18 -0
- data/sig/lib/mihari/emitters/database.rbs +9 -0
- data/sig/lib/mihari/emitters/misp.rbs +28 -0
- data/sig/lib/mihari/emitters/slack.rbs +58 -0
- data/sig/lib/mihari/emitters/stdout.rbs +9 -0
- data/sig/lib/mihari/emitters/the_hive.rbs +24 -0
- data/sig/lib/mihari/emitters/webhook.rbs +20 -0
- data/sig/lib/mihari/errors.rbs +10 -0
- data/sig/lib/mihari/mixins/configurable.rbs +26 -0
- data/sig/lib/mihari/mixins/configuration.rbs +45 -0
- data/sig/lib/mihari/mixins/disallowed_data_value.rbs +25 -0
- data/sig/lib/mihari/mixins/hash.rbs +14 -0
- data/sig/lib/mihari/mixins/refang.rbs +14 -0
- data/sig/lib/mihari/mixins/retriable.rbs +15 -0
- data/sig/lib/mihari/mixins/rule.rbs +41 -0
- data/sig/lib/mihari/models/alert.rbs +46 -0
- data/sig/lib/mihari/models/artifact.rbs +54 -0
- data/sig/lib/mihari/models/autonomous_system.rbs +5 -0
- data/sig/lib/mihari/models/dns.rbs +19 -0
- data/sig/lib/mihari/models/geolocation.rbs +6 -0
- data/sig/lib/mihari/models/reverse_dns.rbs +14 -0
- data/sig/lib/mihari/models/tag.rbs +5 -0
- data/sig/lib/mihari/models/tagging.rbs +4 -0
- data/sig/lib/mihari/models/whois.rbs +66 -0
- data/sig/lib/mihari/notifiers/base.rbs +18 -0
- data/sig/lib/mihari/notifiers/exception_notifier.rbs +75 -0
- data/sig/lib/mihari/notifiers/slack.rbs +50 -0
- data/sig/lib/mihari/status.rbs +25 -0
- data/sig/lib/mihari/structs/censys.rbs +50 -0
- data/sig/lib/mihari/structs/onyphe.rbs +25 -0
- data/sig/lib/mihari/structs/shodan.rbs +28 -0
- data/sig/lib/mihari/type_checker.rbs +48 -0
- data/sig/lib/mihari/types.rbs +17 -0
- data/sig/lib/mihari/version.rbs +3 -0
- data/sig/lib/mihari/web/app.rbs +5 -0
- data/sig/lib/mihari.rbs +57 -0
- metadata +102 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 14d0c74e85fbf6ef624afefe7e948595586d6c00fa8bc32f211e60caee581fc3
|
4
|
+
data.tar.gz: 9d5fde6d69f664efac0d6c56e6a0ba60adcad0edcfe45c69f285ffcaba8d11f0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 30597743e91f124388fbdf426199d97a00f92db9e525fe5725643d529d319ca670d1e9aa6eccff86c0844802157ca3d5c7db9b9afd925d6f0ac4d8b881c44949
|
7
|
+
data.tar.gz: 9d199a3c2f6c7794214730de7c8db812e939c5ddd11ab06d1c6f28c3b8764b2881958b0684adb59e8516d0ac4b6a1dc66b19c5a593efaac9695cb6e317ce8105
|
data/.gitmodules
ADDED
data/README.md
CHANGED
@@ -64,3 +64,5 @@ The gem is available as open source under the terms of the [MIT License](https:/
|
|
64
64
|
## Acknowledgement
|
65
65
|
|
66
66
|
Mihari is proudly supported by [Tines.io](https://tines.io?utm_source=github&utm_medium=sponsorship&utm_campaign=ninoseki), The SOAR Platform for Enterprise Security Teams.
|
67
|
+
|
68
|
+
$ bundle exec rbs -rpathname --repo=gem_rbs/gems -ractivesupport -ractionpack -ractivejob -ractivemodel -ractionview -ractiverecord -rrailties -I sig validate
|
data/Steepfile
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
target :lib do
|
2
|
+
signature "sig"
|
3
|
+
check "lib"
|
4
|
+
|
5
|
+
repo_path "vendor/rbs/gem_rbs_collection/gems"
|
6
|
+
|
7
|
+
library "date"
|
8
|
+
library "json"
|
9
|
+
library "logger"
|
10
|
+
library "monitor"
|
11
|
+
library "mutex_m"
|
12
|
+
library "pathname"
|
13
|
+
library "securerandom"
|
14
|
+
library "singleton"
|
15
|
+
library "time"
|
16
|
+
library "tsort"
|
17
|
+
library "uri"
|
18
|
+
library "resolv"
|
19
|
+
library "timeout"
|
20
|
+
library "socket"
|
21
|
+
|
22
|
+
library "rack"
|
23
|
+
|
24
|
+
library "actionpack"
|
25
|
+
library "actionview"
|
26
|
+
library "activejob"
|
27
|
+
library "activemodel"
|
28
|
+
library "activerecord"
|
29
|
+
library "activesupport"
|
30
|
+
library "parallel"
|
31
|
+
library "railties"
|
32
|
+
end
|
@@ -27,7 +27,7 @@ module Mihari
|
|
27
27
|
|
28
28
|
# @return [String]
|
29
29
|
def title
|
30
|
-
self.class.to_s.split("::").last
|
30
|
+
self.class.to_s.split("::").last.to_s
|
31
31
|
end
|
32
32
|
|
33
33
|
# @return [String]
|
@@ -37,7 +37,7 @@ module Mihari
|
|
37
37
|
|
38
38
|
# @return [String]
|
39
39
|
def source
|
40
|
-
self.class.to_s.split("::").last
|
40
|
+
self.class.to_s.split("::").last.to_s
|
41
41
|
end
|
42
42
|
|
43
43
|
# @return [Array<String>]
|
@@ -125,9 +125,9 @@ module Mihari
|
|
125
125
|
#
|
126
126
|
def set_enriched_artifacts
|
127
127
|
retry_on_error { enriched_artifacts }
|
128
|
-
rescue ArgumentError =>
|
128
|
+
rescue ArgumentError => e
|
129
129
|
klass = self.class.to_s.split("::").last.to_s
|
130
|
-
raise Error, "Please configure #{klass}
|
130
|
+
raise Error, "Please configure #{klass} settings properly. (#{e})"
|
131
131
|
end
|
132
132
|
|
133
133
|
#
|
@@ -139,7 +139,7 @@ module Mihari
|
|
139
139
|
@valid_emitters ||= Mihari.emitters.filter_map do |klass|
|
140
140
|
emitter = klass.new
|
141
141
|
emitter.valid? ? emitter : nil
|
142
|
-
end
|
142
|
+
end.compact
|
143
143
|
end
|
144
144
|
|
145
145
|
#
|
@@ -26,6 +26,14 @@ module Mihari
|
|
26
26
|
|
27
27
|
PAGE_SIZE = 20
|
28
28
|
|
29
|
+
#
|
30
|
+
# Search with pagination
|
31
|
+
#
|
32
|
+
# @param [String] query
|
33
|
+
# @param [Integer] page
|
34
|
+
#
|
35
|
+
# @return [Hash]
|
36
|
+
#
|
29
37
|
def search_with_page(query, page: 1)
|
30
38
|
api.host.search(query, page: page)
|
31
39
|
rescue ::BinaryEdge::Error => e
|
@@ -34,6 +42,11 @@ module Mihari
|
|
34
42
|
raise e
|
35
43
|
end
|
36
44
|
|
45
|
+
#
|
46
|
+
# Search
|
47
|
+
#
|
48
|
+
# @return [Array<Hash>]
|
49
|
+
#
|
37
50
|
def search
|
38
51
|
responses = []
|
39
52
|
(1..Float::INFINITY).each do |page|
|
@@ -35,6 +35,11 @@ module Mihari
|
|
35
35
|
@api ||= ::PassiveCIRCL::API.new(username: Mihari.config.circl_passive_username, password: Mihari.config.circl_passive_password)
|
36
36
|
end
|
37
37
|
|
38
|
+
#
|
39
|
+
# Passive DNS/SSL search
|
40
|
+
#
|
41
|
+
# @return [Array<String>]
|
42
|
+
#
|
38
43
|
def search
|
39
44
|
case @type
|
40
45
|
when "domain"
|
@@ -46,6 +51,11 @@ module Mihari
|
|
46
51
|
end
|
47
52
|
end
|
48
53
|
|
54
|
+
#
|
55
|
+
# Passive DNS search
|
56
|
+
#
|
57
|
+
# @return [Array<String>]
|
58
|
+
#
|
49
59
|
def passive_dns_search
|
50
60
|
results = api.dns.query(@query)
|
51
61
|
results.filter_map do |result|
|
@@ -54,6 +64,11 @@ module Mihari
|
|
54
64
|
end.uniq
|
55
65
|
end
|
56
66
|
|
67
|
+
#
|
68
|
+
# Passive SSL search
|
69
|
+
#
|
70
|
+
# @return [Array<String>]
|
71
|
+
#
|
57
72
|
def passive_ssl_search
|
58
73
|
result = api.ssl.cquery(@query)
|
59
74
|
seen = result["seen"] || []
|
@@ -29,6 +29,11 @@ module Mihari
|
|
29
29
|
|
30
30
|
private
|
31
31
|
|
32
|
+
#
|
33
|
+
# Check whether a type is valid or not
|
34
|
+
#
|
35
|
+
# @return [Boolean]
|
36
|
+
#
|
32
37
|
def valid_type?
|
33
38
|
type == "domain"
|
34
39
|
end
|
@@ -37,6 +42,13 @@ module Mihari
|
|
37
42
|
@api ||= ::DNSTwister::API.new
|
38
43
|
end
|
39
44
|
|
45
|
+
#
|
46
|
+
# Check whether a domain is resolvable or not
|
47
|
+
#
|
48
|
+
# @param [String] domain
|
49
|
+
#
|
50
|
+
# @return [Boolean]
|
51
|
+
#
|
40
52
|
def resolvable?(domain)
|
41
53
|
Resolv.getaddress domain
|
42
54
|
true
|
@@ -44,6 +56,11 @@ module Mihari
|
|
44
56
|
false
|
45
57
|
end
|
46
58
|
|
59
|
+
#
|
60
|
+
# Search
|
61
|
+
#
|
62
|
+
# @return [Array<String>]
|
63
|
+
#
|
47
64
|
def search
|
48
65
|
raise InvalidInputError, "#{query}(type: #{type || "unknown"}) is not supported." unless valid_type?
|
49
66
|
|
@@ -33,11 +33,24 @@ module Mihari
|
|
33
33
|
@api ||= ::Onyphe::API.new(Mihari.config.onyphe_api_key)
|
34
34
|
end
|
35
35
|
|
36
|
+
#
|
37
|
+
# Search with pagination
|
38
|
+
#
|
39
|
+
# @param [String] query
|
40
|
+
# @param [Integer] page
|
41
|
+
#
|
42
|
+
# @return [Structs::Onyphe::Response]
|
43
|
+
#
|
36
44
|
def search_with_page(query, page: 1)
|
37
45
|
res = api.simple.datascan(query, page: page)
|
38
46
|
Structs::Onyphe::Response.from_dynamic!(res)
|
39
47
|
end
|
40
48
|
|
49
|
+
#
|
50
|
+
# Search
|
51
|
+
#
|
52
|
+
# @return [Array<Structs::Onyphe::Response>]
|
53
|
+
#
|
41
54
|
def search
|
42
55
|
responses = []
|
43
56
|
(1..Float::INFINITY).each do |page|
|
@@ -60,10 +73,13 @@ module Mihari
|
|
60
73
|
def build_artifact(result)
|
61
74
|
as = AutonomousSystem.new(asn: normalize_asn(result.asn))
|
62
75
|
|
63
|
-
geolocation =
|
64
|
-
|
65
|
-
|
66
|
-
|
76
|
+
geolocation = nil
|
77
|
+
unless result.country_code.nil?
|
78
|
+
geolocation = Geolocation.new(
|
79
|
+
country: NormalizeCountry(result.country_code, to: :short),
|
80
|
+
country_code: result.country_code
|
81
|
+
)
|
82
|
+
end
|
67
83
|
|
68
84
|
Artifact.new(
|
69
85
|
data: result.ip,
|
data/lib/mihari/analyzers/otx.rb
CHANGED
@@ -39,10 +39,20 @@ module Mihari
|
|
39
39
|
@ip_client ||= ::OTX::IP.new(Mihari.config.otx_api_key)
|
40
40
|
end
|
41
41
|
|
42
|
+
#
|
43
|
+
# Check whether a type is valid or not
|
44
|
+
#
|
45
|
+
# @return [Boolean]
|
46
|
+
#
|
42
47
|
def valid_type?
|
43
48
|
%w[ip domain].include? type
|
44
49
|
end
|
45
50
|
|
51
|
+
#
|
52
|
+
# IP/domain search
|
53
|
+
#
|
54
|
+
# @return [Array<String>]
|
55
|
+
#
|
46
56
|
def search
|
47
57
|
case type
|
48
58
|
when "domain"
|
@@ -54,6 +64,11 @@ module Mihari
|
|
54
64
|
end
|
55
65
|
end
|
56
66
|
|
67
|
+
#
|
68
|
+
# Domain search
|
69
|
+
#
|
70
|
+
# @return [Array<String>]
|
71
|
+
#
|
57
72
|
def domain_search
|
58
73
|
records = domain_client.get_passive_dns(query)
|
59
74
|
records.filter_map do |record|
|
@@ -61,6 +76,11 @@ module Mihari
|
|
61
76
|
end.uniq
|
62
77
|
end
|
63
78
|
|
79
|
+
#
|
80
|
+
# IP search
|
81
|
+
#
|
82
|
+
# @return [Array<String>]
|
83
|
+
#
|
64
84
|
def ip_search
|
65
85
|
records = ip_client.get_passive_dns(query)
|
66
86
|
records.filter_map do |record|
|
@@ -35,10 +35,20 @@ module Mihari
|
|
35
35
|
@api ||= ::PassiveTotal::API.new(username: Mihari.config.passivetotal_username, api_key: Mihari.config.passivetotal_api_key)
|
36
36
|
end
|
37
37
|
|
38
|
+
#
|
39
|
+
# Check whether a type is valid or not
|
40
|
+
#
|
41
|
+
# @return [Boolean]
|
42
|
+
#
|
38
43
|
def valid_type?
|
39
44
|
%w[ip domain mail hash].include? type
|
40
45
|
end
|
41
46
|
|
47
|
+
#
|
48
|
+
# Passive DNS/SSL, reverse whois search
|
49
|
+
#
|
50
|
+
# @return [Array<String>]
|
51
|
+
#
|
42
52
|
def search
|
43
53
|
case type
|
44
54
|
when "domain", "ip"
|
@@ -52,11 +62,21 @@ module Mihari
|
|
52
62
|
end
|
53
63
|
end
|
54
64
|
|
65
|
+
#
|
66
|
+
# Passive DNS search
|
67
|
+
#
|
68
|
+
# @return [Array<String>]
|
69
|
+
#
|
55
70
|
def passive_dns_search
|
56
71
|
res = api.dns.passive_unique(query)
|
57
72
|
res["results"] || []
|
58
73
|
end
|
59
74
|
|
75
|
+
#
|
76
|
+
# Reverse whois search
|
77
|
+
#
|
78
|
+
# @return [Array<String>]
|
79
|
+
#
|
60
80
|
def reverse_whois_search
|
61
81
|
res = api.whois.search(query: query, field: "email")
|
62
82
|
results = res["results"] || []
|
@@ -65,6 +85,11 @@ module Mihari
|
|
65
85
|
end.flatten.compact.uniq
|
66
86
|
end
|
67
87
|
|
88
|
+
#
|
89
|
+
# Passive SSL search
|
90
|
+
#
|
91
|
+
# @return [Array<String>]
|
92
|
+
#
|
68
93
|
def ssl_search
|
69
94
|
res = api.ssl.history(query)
|
70
95
|
results = res["results"] || []
|
@@ -35,10 +35,20 @@ module Mihari
|
|
35
35
|
@api ||= ::Pulsedive::API.new(Mihari.config.pulsedive_api_key)
|
36
36
|
end
|
37
37
|
|
38
|
+
#
|
39
|
+
# Check whether a type is valid or not
|
40
|
+
#
|
41
|
+
# @return [Boolean]
|
42
|
+
#
|
38
43
|
def valid_type?
|
39
44
|
%w[ip domain].include? type
|
40
45
|
end
|
41
46
|
|
47
|
+
#
|
48
|
+
# Search
|
49
|
+
#
|
50
|
+
# @return [Array<String>]
|
51
|
+
#
|
42
52
|
def search
|
43
53
|
raise InvalidInputError, "#{query}(type: #{type || "unknown"}) is not supported." unless valid_type?
|
44
54
|
|
@@ -22,6 +22,8 @@ module Mihari
|
|
22
22
|
super(**kwargs)
|
23
23
|
|
24
24
|
@source = id || UUIDTools::UUID.md5_create(UUIDTools::UUID_URL_NAMESPACE, title + description).to_s
|
25
|
+
|
26
|
+
validate_analyzer_configurations
|
25
27
|
end
|
26
28
|
|
27
29
|
ANALYZER_TO_CLASS = {
|
@@ -119,6 +121,22 @@ module Mihari
|
|
119
121
|
|
120
122
|
raise ArgumentError, "#{analyzer_name} is not supported"
|
121
123
|
end
|
124
|
+
|
125
|
+
#
|
126
|
+
# Validate configuration of analyzers
|
127
|
+
#
|
128
|
+
def validate_analyzer_configurations
|
129
|
+
queries.each do |params|
|
130
|
+
analyzer_name = params[:analyzer]
|
131
|
+
klass = get_analyzer_class(analyzer_name)
|
132
|
+
|
133
|
+
instance = klass.new("dummy")
|
134
|
+
unless instance.configured?
|
135
|
+
klass_name = klass.to_s.split("::").last
|
136
|
+
raise ArgumentError, "#{klass_name} is not configured correctly"
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
122
140
|
end
|
123
141
|
end
|
124
142
|
end
|
@@ -35,10 +35,20 @@ module Mihari
|
|
35
35
|
@api ||= ::SecurityTrails::API.new(Mihari.config.securitytrails_api_key)
|
36
36
|
end
|
37
37
|
|
38
|
+
#
|
39
|
+
# Check whether a type is valid or not
|
40
|
+
#
|
41
|
+
# @return [Boolean]
|
42
|
+
#
|
38
43
|
def valid_type?
|
39
44
|
%w[ip domain mail].include? type
|
40
45
|
end
|
41
46
|
|
47
|
+
#
|
48
|
+
# IP/domain/mail search
|
49
|
+
#
|
50
|
+
# @return [Array<String>]
|
51
|
+
#
|
42
52
|
def search
|
43
53
|
case type
|
44
54
|
when "domain"
|
@@ -52,6 +62,11 @@ module Mihari
|
|
52
62
|
end
|
53
63
|
end
|
54
64
|
|
65
|
+
#
|
66
|
+
# Domain search
|
67
|
+
#
|
68
|
+
# @return [Array<String>]
|
69
|
+
#
|
55
70
|
def domain_search
|
56
71
|
result = api.history.get_all_dns_history(query, type: "a")
|
57
72
|
records = result["records"] || []
|
@@ -60,12 +75,22 @@ module Mihari
|
|
60
75
|
end.flatten.compact.uniq
|
61
76
|
end
|
62
77
|
|
78
|
+
#
|
79
|
+
# IP search
|
80
|
+
#
|
81
|
+
# @return [Array<String>]
|
82
|
+
#
|
63
83
|
def ip_search
|
64
84
|
result = api.domains.search(filter: { ipv4: query })
|
65
85
|
records = result["records"] || []
|
66
86
|
records.filter_map { |record| record["hostname"] }.uniq
|
67
87
|
end
|
68
88
|
|
89
|
+
#
|
90
|
+
# Mail search
|
91
|
+
#
|
92
|
+
# @return [Array<String>]
|
93
|
+
#
|
69
94
|
def mail_search
|
70
95
|
result = api.domains.search(filter: { whois_email: query })
|
71
96
|
records = result["records"] || []
|