mihari 5.2.4 → 5.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (135) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +4 -1
  3. data/README.md +0 -10
  4. data/Rakefile +13 -1
  5. data/build_frontend.sh +1 -1
  6. data/frontend/.eslintrc.cjs +22 -0
  7. data/frontend/.gitignore +18 -12
  8. data/frontend/.prettierrc.json +8 -0
  9. data/frontend/env.d.ts +5 -0
  10. data/frontend/package-lock.json +5213 -9655
  11. data/frontend/package.json +38 -25
  12. data/frontend/src/App.vue +5 -5
  13. data/frontend/src/api-helper.ts +38 -40
  14. data/frontend/src/api.ts +40 -40
  15. data/frontend/src/components/ErrorMessage.vue +8 -8
  16. data/frontend/src/components/Loading.vue +4 -4
  17. data/frontend/src/components/Navbar.vue +10 -27
  18. data/frontend/src/components/Pagination.vue +35 -42
  19. data/frontend/src/components/alert/Alert.vue +22 -27
  20. data/frontend/src/components/alert/Alerts.vue +23 -25
  21. data/frontend/src/components/alert/AlertsWithPagination.vue +34 -34
  22. data/frontend/src/components/alert/AlertsWrapper.vue +43 -50
  23. data/frontend/src/components/alert/Form.vue +39 -40
  24. data/frontend/src/components/artifact/AS.vue +7 -7
  25. data/frontend/src/components/artifact/Artifact.vue +69 -86
  26. data/frontend/src/components/artifact/ArtifactTag.vue +21 -27
  27. data/frontend/src/components/artifact/ArtifactTags.vue +8 -8
  28. data/frontend/src/components/artifact/ArtifactWrapper.vue +22 -25
  29. data/frontend/src/components/artifact/CPEs.vue +6 -6
  30. data/frontend/src/components/artifact/DnsRecords.vue +9 -9
  31. data/frontend/src/components/artifact/Ports.vue +6 -6
  32. data/frontend/src/components/artifact/ReverseDnsNames.vue +7 -7
  33. data/frontend/src/components/artifact/Tags.vue +6 -6
  34. data/frontend/src/components/artifact/WhoisRecord.vue +7 -9
  35. data/frontend/src/components/config/Configs.vue +9 -12
  36. data/frontend/src/components/config/ConfigsWrapper.vue +14 -20
  37. data/frontend/src/components/link/Link.vue +7 -7
  38. data/frontend/src/components/link/Links.vue +16 -21
  39. data/frontend/src/components/rule/EditRule.vue +23 -23
  40. data/frontend/src/components/rule/EditRuleWrapper.vue +22 -28
  41. data/frontend/src/components/rule/Form.vue +28 -28
  42. data/frontend/src/components/rule/InputForm.vue +31 -25
  43. data/frontend/src/components/rule/NewRule.vue +19 -19
  44. data/frontend/src/components/rule/Rule.vue +28 -30
  45. data/frontend/src/components/rule/RuleWrapper.vue +24 -31
  46. data/frontend/src/components/rule/Rules.vue +26 -30
  47. data/frontend/src/components/rule/RulesWrapper.vue +40 -43
  48. data/frontend/src/components/rule/YAML.vue +19 -22
  49. data/frontend/src/components/tag/Tag.vue +24 -32
  50. data/frontend/src/components/tag/Tags.vue +11 -11
  51. data/frontend/src/countries.ts +23 -23
  52. data/frontend/src/index.ts +9 -12
  53. data/frontend/src/links/anyrun.ts +10 -10
  54. data/frontend/src/links/base.ts +3 -3
  55. data/frontend/src/links/censys.ts +10 -10
  56. data/frontend/src/links/crtsh.ts +10 -10
  57. data/frontend/src/links/dnslytics.ts +18 -18
  58. data/frontend/src/links/greynoise.ts +10 -10
  59. data/frontend/src/links/index.ts +15 -15
  60. data/frontend/src/links/intezer.ts +10 -10
  61. data/frontend/src/links/otx.ts +14 -14
  62. data/frontend/src/links/securitytrails.ts +15 -15
  63. data/frontend/src/links/shodan.ts +10 -10
  64. data/frontend/src/links/urlscan.ts +19 -19
  65. data/frontend/src/links/virustotal.ts +27 -27
  66. data/frontend/src/main.ts +38 -8
  67. data/frontend/src/router/index.ts +20 -20
  68. data/frontend/src/rule.ts +6 -6
  69. data/frontend/src/shims-vue.d.ts +2 -2
  70. data/frontend/src/types.ts +91 -91
  71. data/frontend/src/utils.ts +23 -29
  72. data/frontend/src/views/Alerts.vue +7 -7
  73. data/frontend/src/views/Artifact.vue +17 -17
  74. data/frontend/src/views/Configs.vue +7 -7
  75. data/frontend/src/views/EditRule.vue +17 -17
  76. data/frontend/src/views/NewRule.vue +10 -10
  77. data/frontend/src/views/Rule.vue +17 -17
  78. data/frontend/src/views/Rules.vue +7 -7
  79. data/frontend/tests/utils.spec.ts +9 -0
  80. data/frontend/tsconfig.app.json +21 -0
  81. data/frontend/tsconfig.json +10 -36
  82. data/frontend/tsconfig.node.json +13 -0
  83. data/frontend/tsconfig.vitest.json +12 -0
  84. data/frontend/vite.config.ts +24 -0
  85. data/frontend/vitest.config.ts +21 -0
  86. data/lefthook.yml +4 -2
  87. data/lib/mihari/analyzers/base.rb +48 -14
  88. data/lib/mihari/analyzers/binaryedge.rb +10 -15
  89. data/lib/mihari/analyzers/censys.rb +12 -15
  90. data/lib/mihari/analyzers/circl.rb +10 -10
  91. data/lib/mihari/analyzers/crtsh.rb +10 -6
  92. data/lib/mihari/analyzers/dnstwister.rb +6 -8
  93. data/lib/mihari/analyzers/feed.rb +21 -10
  94. data/lib/mihari/analyzers/greynoise.rb +10 -20
  95. data/lib/mihari/analyzers/onyphe.rb +9 -14
  96. data/lib/mihari/analyzers/otx.rb +8 -9
  97. data/lib/mihari/analyzers/passivetotal.rb +10 -10
  98. data/lib/mihari/analyzers/pulsedive.rb +21 -31
  99. data/lib/mihari/analyzers/securitytrails.rb +8 -6
  100. data/lib/mihari/analyzers/shodan.rb +8 -13
  101. data/lib/mihari/analyzers/urlscan.rb +15 -20
  102. data/lib/mihari/analyzers/virustotal.rb +16 -26
  103. data/lib/mihari/analyzers/virustotal_intelligence.rb +11 -17
  104. data/lib/mihari/analyzers/zoomeye.rb +12 -17
  105. data/lib/mihari/config.rb +133 -0
  106. data/lib/mihari/constants.rb +3 -0
  107. data/lib/mihari/emitters/slack.rb +13 -3
  108. data/lib/mihari/errors.rb +1 -1
  109. data/lib/mihari/http.rb +2 -3
  110. data/lib/mihari/schemas/analyzer.rb +2 -0
  111. data/lib/mihari/type_checker.rb +6 -6
  112. data/lib/mihari/version.rb +1 -1
  113. data/lib/mihari/web/endpoints/configs.rb +5 -1
  114. data/lib/mihari/web/public/assets/{index-eed1bcd8.css → index-b17c40c6.css} +1 -5
  115. data/lib/mihari/web/public/assets/index-f740e4f9.js +799 -0
  116. data/lib/mihari/web/public/index.html +2 -2
  117. data/lib/mihari/web/public/redoc-static.html +388 -2193
  118. data/lib/mihari.rb +9 -59
  119. data/mihari.gemspec +8 -8
  120. metadata +29 -117
  121. data/frontend/.browserslistrc +0 -3
  122. data/frontend/.eslintrc.js +0 -33
  123. data/frontend/babel.config.js +0 -3
  124. data/frontend/jest.config.js +0 -9
  125. data/frontend/tests/unit/utils.spec.ts +0 -7
  126. data/frontend/vite.config.js +0 -24
  127. data/lib/mihari/web/public/assets/fa-brands-400-20c4a58b.ttf +0 -0
  128. data/lib/mihari/web/public/assets/fa-brands-400-74833209.woff2 +0 -0
  129. data/lib/mihari/web/public/assets/fa-regular-400-528d022d.ttf +0 -0
  130. data/lib/mihari/web/public/assets/fa-regular-400-8e7e5ea1.woff2 +0 -0
  131. data/lib/mihari/web/public/assets/fa-solid-900-67a65763.ttf +0 -0
  132. data/lib/mihari/web/public/assets/fa-solid-900-7152a693.woff2 +0 -0
  133. data/lib/mihari/web/public/assets/fa-v4compatibility-0515a423.ttf +0 -0
  134. data/lib/mihari/web/public/assets/fa-v4compatibility-694a17c3.woff2 +0 -0
  135. data/lib/mihari/web/public/assets/index-ac4e5ffa.js +0 -50
@@ -3,23 +3,18 @@
3
3
  module Mihari
4
4
  module Analyzers
5
5
  class BinaryEdge < Base
6
- param :query
7
-
8
- option :interval, default: proc { 0 }
9
-
10
6
  # @return [String, nil]
11
7
  attr_reader :api_key
12
8
 
13
- # @return [String]
14
- attr_reader :query
15
-
16
- # @return [Integer]
17
- attr_reader :interval
18
-
19
- def initialize(*args, **kwargs)
20
- super(*args, **kwargs)
9
+ #
10
+ # @param [String] query
11
+ # @param [Hash, nil] options
12
+ # @param [String, nil] api_key
13
+ #
14
+ def initialize(query, options: nil, api_key: nil)
15
+ super(query, options: options)
21
16
 
22
- @api_key = kwargs[:api_key] || Mihari.config.binaryedge_api_key
17
+ @api_key = api_key || Mihari.config.binaryedge_api_key
23
18
  end
24
19
 
25
20
  def artifacts
@@ -48,7 +43,7 @@ module Mihari
48
43
  #
49
44
  def search_with_page(page: 1)
50
45
  client.search(query, page: page)
51
- rescue UnsuccessfulStatusCodeError => e
46
+ rescue StatusCodeError => e
52
47
  raise RetryableError, e if e.message.include?("Request time limit exceeded")
53
48
 
54
49
  raise e
@@ -69,7 +64,7 @@ module Mihari
69
64
  break if total <= page * PAGE_SIZE
70
65
 
71
66
  # sleep #{interval} seconds to avoid the rate limitation (if it is set)
72
- sleep interval
67
+ sleep(interval) if interval
73
68
  end
74
69
  responses
75
70
  end
@@ -3,27 +3,24 @@
3
3
  module Mihari
4
4
  module Analyzers
5
5
  class Censys < Base
6
- param :query
7
-
8
- option :interval, default: proc { 0 }
9
-
10
6
  # @return [String, nil]
11
7
  attr_reader :id
12
8
 
13
9
  # @return [String, nil]
14
10
  attr_reader :secret
15
11
 
16
- # @return [Integer]
17
- attr_reader :interval
18
-
19
- # @return [String]
20
- attr_reader :query
21
-
22
- def initialize(*args, **kwargs)
23
- super(*args, **kwargs)
12
+ #
13
+ # @param [String] query
14
+ # @param [hash, nil] options
15
+ # @param [String, nil] api_key
16
+ # @param [String, nil] id
17
+ # @param [String, nil] secret
18
+ #
19
+ def initialize(query, options: nil, id: nil, secret: nil)
20
+ super(query, options: options)
24
21
 
25
- @id = kwargs[:id] || Mihari.config.censys_id
26
- @secret = kwargs[:secret] || Mihari.config.censys_secret
22
+ @id = id || Mihari.config.censys_id
23
+ @secret = secret || Mihari.config.censys_secret
27
24
  end
28
25
 
29
26
  #
@@ -45,7 +42,7 @@ module Mihari
45
42
  break if cursor.nil? || cursor.empty?
46
43
 
47
44
  # sleep #{interval} seconds to avoid the rate limitation (if it is set)
48
- sleep interval
45
+ sleep(interval) if interval
49
46
  end
50
47
 
51
48
  artifacts.flatten.uniq(&:data)
@@ -5,8 +5,6 @@ module Mihari
5
5
  class CIRCL < Base
6
6
  include Mixins::Refang
7
7
 
8
- param :query
9
-
10
8
  # @return [String, nil]
11
9
  attr_reader :type
12
10
 
@@ -16,17 +14,19 @@ module Mihari
16
14
  # @return [String, nil]
17
15
  attr_reader :password
18
16
 
19
- # @return [String]
20
- attr_reader :query
21
-
22
- def initialize(*args, **kwargs)
23
- super
17
+ #
18
+ # @param [String] query
19
+ # @param [Hash, nil] options
20
+ # @param [String, nil] username
21
+ # @param [String, nil] password
22
+ #
23
+ def initialize(query, options: nil, username: nil, password: nil)
24
+ super(refang(query), options: options)
24
25
 
25
- @query = refang(query)
26
26
  @type = TypeChecker.type(query)
27
27
 
28
- @username = kwargs[:username] || Mihari.config.circl_passive_username
29
- @password = kwargs[:password] || Mihari.config.circl_passive_password
28
+ @username = username || Mihari.config.circl_passive_username
29
+ @password = password || Mihari.config.circl_passive_password
30
30
  end
31
31
 
32
32
  def artifacts
@@ -3,15 +3,19 @@
3
3
  module Mihari
4
4
  module Analyzers
5
5
  class Crtsh < Base
6
- param :query
7
-
8
- option :exclude_expired, default: proc { true }
9
-
10
6
  # @return [Boolean]
11
7
  attr_reader :exclude_expired
12
8
 
13
- # @return [String]
14
- attr_reader :query
9
+ #
10
+ # @param [String] query
11
+ # @param [Hash, nil] options
12
+ # @param [Bool] exclude_expired
13
+ #
14
+ def initialize(query, options: nil, exclude_expired: true)
15
+ super(query, options: options)
16
+
17
+ @exclude_expired = exclude_expired
18
+ end
15
19
 
16
20
  def artifacts
17
21
  results = search
@@ -5,18 +5,16 @@ module Mihari
5
5
  class DNSTwister < Base
6
6
  include Mixins::Refang
7
7
 
8
- param :query
9
-
10
8
  # @return [String]
11
9
  attr_reader :type
12
10
 
13
- # @return [String]
14
- attr_reader :query
15
-
16
- def initialize(*args, **kwargs)
17
- super
11
+ #
12
+ # @param [String] query
13
+ # @param [Hash, nil] options
14
+ #
15
+ def initialize(query, options: nil)
16
+ super(refang(query), options: options)
18
17
 
19
- @query = refang(query)
20
18
  @type = TypeChecker.type(query)
21
19
  end
22
20
 
@@ -6,16 +6,6 @@ require "mihari/feed/parser"
6
6
  module Mihari
7
7
  module Analyzers
8
8
  class Feed < Base
9
- param :query
10
-
11
- option :method, default: proc { "GET" }
12
- option :headers, default: proc { {} }
13
- option :params, default: proc {}
14
- option :json, default: proc {}
15
- option :data, default: proc {}
16
-
17
- option :selector, default: proc { "" }
18
-
19
9
  # @return [Hash, nil]
20
10
  attr_reader :data
21
11
 
@@ -37,6 +27,27 @@ module Mihari
37
27
  # @return [String]
38
28
  attr_reader :query
39
29
 
30
+ #
31
+ # @param [String] query
32
+ # @param [Hash, nil] options
33
+ # @param [String] method
34
+ # @param [Hash] headers
35
+ # @param [Hash] params
36
+ # @param [Hash] json
37
+ # @param [Hash] data
38
+ # @param [String] selector
39
+ #
40
+ def initialize(query, options: nil, method: "GET", headers: {}, params: {}, json: {}, data: {}, selector: "")
41
+ super(query, options: options)
42
+
43
+ @method = method
44
+ @headers = headers
45
+ @params = params
46
+ @json = json
47
+ @data = data
48
+ @selector = selector
49
+ end
50
+
40
51
  def artifacts
41
52
  Mihari::Feed::Parser.new(results).parse selector
42
53
  end
@@ -3,29 +3,28 @@
3
3
  module Mihari
4
4
  module Analyzers
5
5
  class GreyNoise < Base
6
- param :query
6
+ PAGE_SIZE = 10_000
7
7
 
8
8
  # @return [String, nil]
9
9
  attr_reader :api_key
10
10
 
11
- # @return [String]
12
- attr_reader :query
13
-
14
- def initialize(*args, **kwargs)
15
- super(*args, **kwargs)
11
+ #
12
+ # @param [String] query
13
+ # @param [Hash, nil] options
14
+ # @param [String, nil] api_key
15
+ #
16
+ def initialize(query, options: nil, api_key: nil)
17
+ super(query, options: options)
16
18
 
17
- @api_key = kwargs[:api_key] || Mihari.config.greynoise_api_key
19
+ @api_key = api_key || Mihari.config.greynoise_api_key
18
20
  end
19
21
 
20
22
  def artifacts
21
- res = search
22
- res.to_artifacts
23
+ client.gnql_search(query, size: PAGE_SIZE).to_artifacts
23
24
  end
24
25
 
25
26
  private
26
27
 
27
- PAGE_SIZE = 10_000
28
-
29
28
  def configuration_keys
30
29
  %w[greynoise_api_key]
31
30
  end
@@ -33,15 +32,6 @@ module Mihari
33
32
  def client
34
33
  @client ||= Clients::GreyNoise.new(api_key: api_key)
35
34
  end
36
-
37
- #
38
- # Search
39
- #
40
- # @return [Hash]
41
- #
42
- def search
43
- client.gnql_search(query, size: PAGE_SIZE)
44
- end
45
35
  end
46
36
  end
47
37
  end
@@ -5,23 +5,18 @@ require "normalize_country"
5
5
  module Mihari
6
6
  module Analyzers
7
7
  class Onyphe < Base
8
- param :query
9
-
10
- option :interval, default: proc { 0 }
11
-
12
8
  # @return [String, nil]
13
9
  attr_reader :api_key
14
10
 
15
- # @return [String]
16
- attr_reader :query
17
-
18
- # @return [Integer]
19
- attr_reader :interval
20
-
21
- def initialize(*args, **kwargs)
22
- super(*args, **kwargs)
11
+ #
12
+ # @param [String] query
13
+ # @param [Hash, nil] options
14
+ # @param [String, nil] api_key
15
+ #
16
+ def initialize(query, options: nil, api_key: nil)
17
+ super(query, options: options)
23
18
 
24
- @api_key = kwargs[:api_key] || Mihari.config.onyphe_api_key
19
+ @api_key = api_key || Mihari.config.onyphe_api_key
25
20
  end
26
21
 
27
22
  def artifacts
@@ -70,7 +65,7 @@ module Mihari
70
65
  break if total <= page * PAGE_SIZE
71
66
 
72
67
  # sleep #{interval} seconds to avoid the rate limitation (if it is set)
73
- sleep interval
68
+ sleep(interval) if interval
74
69
  end
75
70
  responses
76
71
  end
@@ -5,24 +5,23 @@ module Mihari
5
5
  class OTX < Base
6
6
  include Mixins::Refang
7
7
 
8
- param :query
9
-
10
8
  # @return [String, nil]
11
9
  attr_reader :type
12
10
 
13
11
  # @return [String, nil]
14
12
  attr_reader :api_key
15
13
 
16
- # @return [String]
17
- attr_reader :query
18
-
19
- def initialize(*args, **kwargs)
20
- super
14
+ #
15
+ # @param [String] query
16
+ # @param [Hash, nil] options
17
+ # @param [String, nil] api_key
18
+ #
19
+ def initialize(query, options: nil, api_key: nil)
20
+ super(refang(query), options: options)
21
21
 
22
- @query = refang(query)
23
22
  @type = TypeChecker.type(query)
24
23
 
25
- @api_key = kwargs[:api_key] || Mihari.config.otx_api_key
24
+ @api_key = api_key || Mihari.config.otx_api_key
26
25
  end
27
26
 
28
27
  def artifacts
@@ -5,8 +5,6 @@ module Mihari
5
5
  class PassiveTotal < Base
6
6
  include Mixins::Refang
7
7
 
8
- param :query
9
-
10
8
  # @return [String, nil]
11
9
  attr_reader :type
12
10
 
@@ -16,17 +14,19 @@ module Mihari
16
14
  # @return [String, nil]
17
15
  attr_reader :api_key
18
16
 
19
- # @return [String]
20
- attr_reader :query
21
-
22
- def initialize(*args, **kwargs)
23
- super(*args, **kwargs)
17
+ #
18
+ # @param [String] query
19
+ # @param [Hash, nil] options
20
+ # @param [String, nil] api_key
21
+ # @param [String, nil] username
22
+ #
23
+ def initialize(query, options: nil, api_key: nil, username: nil)
24
+ super(refang(query), options: options)
24
25
 
25
- @query = refang(query)
26
26
  @type = TypeChecker.type(query)
27
27
 
28
- @username = kwargs[:username] || Mihari.config.passivetotal_username
29
- @api_key = kwargs[:api_key] || Mihari.config.passivetotal_api_key
28
+ @username = username || Mihari.config.passivetotal_username
29
+ @api_key = api_key || Mihari.config.passivetotal_api_key
30
30
  end
31
31
 
32
32
  def artifacts
@@ -5,28 +5,39 @@ module Mihari
5
5
  class Pulsedive < Base
6
6
  include Mixins::Refang
7
7
 
8
- param :query
9
-
10
8
  # @return [String, nil]
11
9
  attr_reader :type
12
10
 
13
11
  # @return [String, nil]
14
12
  attr_reader :api_key
15
13
 
16
- # @return [Integer]
17
- attr_reader :query
18
-
19
- def initialize(*args, **kwargs)
20
- super
14
+ #
15
+ # @param [String] query
16
+ # @param [Hash, nil] options
17
+ # @param [String, nil] api_key
18
+ #
19
+ def initialize(query, options: nil, api_key: nil)
20
+ super(refang(query), options: options)
21
21
 
22
- @query = refang(query)
23
22
  @type = TypeChecker.type(query)
24
23
 
25
- @api_key = kwargs[:api_key] || Mihari.config.pulsedive_api_key
24
+ @api_key = api_key || Mihari.config.pulsedive_api_key
26
25
  end
27
26
 
28
27
  def artifacts
29
- search || []
28
+ raise InvalidInputError, "#{query}(type: #{type || "unknown"}) is not supported." unless valid_type?
29
+
30
+ indicator = client.get_indicator(query)
31
+ iid = indicator["iid"]
32
+ properties = client.get_properties(iid)
33
+ (properties["dns"] || []).filter_map do |property|
34
+ if %w[A PTR].include?(property["name"])
35
+ nil
36
+ else
37
+ data = property["value"]
38
+ Artifact.new(data: data, source: source, metadata: property)
39
+ end
40
+ end
30
41
  end
31
42
 
32
43
  private
@@ -47,27 +58,6 @@ module Mihari
47
58
  def valid_type?
48
59
  %w[ip domain].include? type
49
60
  end
50
-
51
- #
52
- # Search
53
- #
54
- # @return [Array<Mihari::Artifact>]
55
- #
56
- def search
57
- raise InvalidInputError, "#{query}(type: #{type || "unknown"}) is not supported." unless valid_type?
58
-
59
- indicator = client.get_indicator(query)
60
- iid = indicator["iid"]
61
- properties = client.get_properties(iid)
62
- (properties["dns"] || []).filter_map do |property|
63
- if %w[A PTR].include?(property["name"])
64
- nil
65
- else
66
- data = property["value"]
67
- Artifact.new(data: data, source: source, metadata: property)
68
- end
69
- end
70
- end
71
61
  end
72
62
  end
73
63
  end
@@ -5,8 +5,6 @@ module Mihari
5
5
  class SecurityTrails < Base
6
6
  include Mixins::Refang
7
7
 
8
- param :query
9
-
10
8
  # @return [String, nil]
11
9
  attr_reader :type
12
10
 
@@ -16,13 +14,17 @@ module Mihari
16
14
  # @return [String]
17
15
  attr_reader :query
18
16
 
19
- def initialize(*args, **kwargs)
20
- super
17
+ #
18
+ # @param [String] query
19
+ # @param [Hash, nil] options
20
+ # @param [String, nil] api_key
21
+ #
22
+ def initialize(query, options: nil, api_key: nil)
23
+ super(refang(query), options: options)
21
24
 
22
- @query = refang(query)
23
25
  @type = TypeChecker.type(query)
24
26
 
25
- @api_key = kwargs[:api_key] || Mihari.config.securitytrails_api_key
27
+ @api_key = api_key || Mihari.config.securitytrails_api_key
26
28
  end
27
29
 
28
30
  def artifacts
@@ -3,23 +3,18 @@
3
3
  module Mihari
4
4
  module Analyzers
5
5
  class Shodan < Base
6
- param :query
7
-
8
- option :interval, default: proc { 0 }
9
-
10
6
  # @return [String, nil]
11
7
  attr_reader :api_key
12
8
 
13
- # @return [Integer]
14
- attr_reader :interval
15
-
16
- # @return [String]
17
- attr_reader :query
18
-
19
- def initialize(*args, **kwargs)
20
- super(*args, **kwargs)
9
+ #
10
+ # @param [String] query
11
+ # @param [Hash, nil] options
12
+ # @param [String, nil] api_key
13
+ #
14
+ def initialize(query, options: nil, api_key: nil)
15
+ super(query, options: options)
21
16
 
22
- @api_key = kwargs[:api_key] || Mihari.config.shodan_api_key
17
+ @api_key = api_key || Mihari.config.shodan_api_key
23
18
  end
24
19
 
25
20
  def artifacts
@@ -3,35 +3,30 @@
3
3
  module Mihari
4
4
  module Analyzers
5
5
  class Urlscan < Base
6
- param :query
7
-
8
- option :allowed_data_types, default: proc { SUPPORTED_DATA_TYPES }
9
-
10
- option :interval, default: proc { 0 }
11
-
12
6
  SUPPORTED_DATA_TYPES = %w[url domain ip].freeze
13
7
  SIZE = 1000
14
8
 
15
9
  # @return [String, nil]
16
10
  attr_reader :api_key
17
11
 
18
- # @return [String]
19
- attr_reader :query
20
-
21
- # @return [Integer]
22
- attr_reader :interval
23
-
24
- # @return [String]
12
+ # @return [Array<String>]
25
13
  attr_reader :allowed_data_types
26
14
 
27
- def initialize(*args, **kwargs)
28
- super
15
+ #
16
+ # @param [String] query
17
+ # @param [Hash, nil] options
18
+ # @param [String, nil] api_key
19
+ # @param [Array<String>] allowed_data_types
20
+ #
21
+ def initialize(query, options: nil, api_key: nil, allowed_data_types: SUPPORTED_DATA_TYPES)
22
+ super(query, options: options)
29
23
 
30
- unless valid_allowed_data_types?
31
- raise InvalidInputError, "allowed_data_types should be any of url, domain and ip."
32
- end
24
+ @api_key = api_key || Mihari.config.urlscan_api_key
25
+ @allowed_data_types = allowed_data_types
26
+
27
+ return if valid_allowed_data_types?
33
28
 
34
- @api_key = kwargs[:api_key] || Mihari.config.urlscan_api_key
29
+ raise InvalidInputError, "allowed_data_types should be any of url, domain and ip."
35
30
  end
36
31
 
37
32
  def artifacts
@@ -82,7 +77,7 @@ module Mihari
82
77
  search_after = res.results.last.sort.join(",")
83
78
 
84
79
  # sleep #{interval} seconds to avoid the rate limitation (if it is set)
85
- sleep interval
80
+ sleep(interval) if interval
86
81
  end
87
82
 
88
83
  responses
@@ -5,28 +5,34 @@ module Mihari
5
5
  class VirusTotal < Base
6
6
  include Mixins::Refang
7
7
 
8
- param :query
9
-
10
8
  # @return [String]
11
9
  attr_reader :type
12
10
 
13
11
  # @return [String, nil]
14
12
  attr_reader :api_key
15
13
 
16
- # @return [String]
17
- attr_reader :query
18
-
19
- def initialize(*args, **kwargs)
20
- super(*args, **kwargs)
14
+ #
15
+ # @param [String] query
16
+ # @param [Hash, nil] options
17
+ # @param [String, nil] api_key
18
+ #
19
+ def initialize(query, options: nil, api_key: nil)
20
+ super(refang(query), options: options)
21
21
 
22
- @query = refang(query)
23
22
  @type = TypeChecker.type(query)
24
23
 
25
- @api_key = kwargs[:api_key] || Mihari.config.virustotal_api_key
24
+ @api_key = api_key || Mihari.config.virustotal_api_key
26
25
  end
27
26
 
28
27
  def artifacts
29
- search || []
28
+ case type
29
+ when "domain"
30
+ domain_search
31
+ when "ip"
32
+ ip_search
33
+ else
34
+ raise InvalidInputError, "#{query}(type: #{type || "unknown"}) is not supported." unless valid_type?
35
+ end
30
36
  end
31
37
 
32
38
  private
@@ -48,22 +54,6 @@ module Mihari
48
54
  %w[ip domain].include? type
49
55
  end
50
56
 
51
- #
52
- # Search
53
- #
54
- # @return [Array<Mihari::Artifact>]
55
- #
56
- def search
57
- case type
58
- when "domain"
59
- domain_search
60
- when "ip"
61
- ip_search
62
- else
63
- raise InvalidInputError, "#{query}(type: #{type || "unknown"}) is not supported." unless valid_type?
64
- end
65
- end
66
-
67
57
  #
68
58
  # Domain search
69
59
  #