mihari 0.5.2 → 0.6.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 +4 -4
- data/README.md +3 -0
- data/lib/mihari.rb +2 -0
- data/lib/mihari/analyzers/urlscan.rb +10 -2
- data/lib/mihari/cli.rb +14 -4
- data/lib/mihari/status.rb +79 -0
- data/lib/mihari/version.rb +1 -1
- data/mihari.gemspec +3 -3
- metadata +9 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 487e9fb5b564d2f9edfdd225c5188dd8505e282a106ffd6434c159f1a05bf6b5
|
4
|
+
data.tar.gz: 2149a69537d25d65cd7a036190351d0d89e8bf5a6fe99f79076f8328445f21b1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 437dc50a254afd8a0f444224665a47fab6bd0314ad403df2f83f2bca719ac5172064348306146e97647e41b7bb87502845e4459480660500763f8fe63126c4ed
|
7
|
+
data.tar.gz: 704c26e0a0a62e7481bb185a6e0af2823dcf528bb49224ab6620215b66f7bec082d8fa52aa1d0d093470fb5b1e0a2afe6f81c25e181071eb73fede734b144106
|
data/README.md
CHANGED
@@ -39,13 +39,16 @@ 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
|
42
43
|
mihari censys [QUERY] # Censys IPv4 lookup by a given query
|
43
44
|
mihari help [COMMAND] # Describe available commands or one specific command
|
44
45
|
mihari import_from_json # Give a JSON input via STDIN
|
45
46
|
mihari onyphe [QUERY] # Onyphe datascan lookup by a given query
|
46
47
|
mihari shodan [QUERY] # Shodan host lookup by a given query
|
48
|
+
mihari status # Show the current configuration status
|
47
49
|
mihari urlscan [QUERY] # urlscan lookup by a given query
|
48
50
|
mihari virustotal [IP|DOMAIN] # VirusTotal resolutions lookup by a given ip or domain
|
51
|
+
|
49
52
|
```
|
50
53
|
|
51
54
|
### Import from JSON
|
data/lib/mihari.rb
CHANGED
@@ -10,8 +10,9 @@ module Mihari
|
|
10
10
|
attr_reader :description
|
11
11
|
attr_reader :query
|
12
12
|
attr_reader :tags
|
13
|
+
attr_reader :target_type
|
13
14
|
|
14
|
-
def initialize(query, title: nil, description: nil, tags: [])
|
15
|
+
def initialize(query, title: nil, description: nil, tags: [], target_type: "url")
|
15
16
|
super()
|
16
17
|
|
17
18
|
@api = ::UrlScan::API.new
|
@@ -19,6 +20,9 @@ module Mihari
|
|
19
20
|
@title = title || "urlscan lookup"
|
20
21
|
@description = description || "query = #{query}"
|
21
22
|
@tags = tags
|
23
|
+
@target_type = target_type
|
24
|
+
|
25
|
+
raise ArgumentError, "type should be url, domain or ip." unless valid_target_type?
|
22
26
|
end
|
23
27
|
|
24
28
|
def artifacts
|
@@ -27,7 +31,7 @@ module Mihari
|
|
27
31
|
|
28
32
|
results = result.dig("results") || []
|
29
33
|
results.map do |match|
|
30
|
-
match.dig "
|
34
|
+
match.dig "page", target_type
|
31
35
|
end.compact.uniq
|
32
36
|
end
|
33
37
|
|
@@ -38,6 +42,10 @@ module Mihari
|
|
38
42
|
rescue ::UrlScan::ResponseError => _e
|
39
43
|
nil
|
40
44
|
end
|
45
|
+
|
46
|
+
def valid_target_type?
|
47
|
+
%w(url domain ip).include? target_type
|
48
|
+
end
|
41
49
|
end
|
42
50
|
end
|
43
51
|
end
|
data/lib/mihari/cli.rb
CHANGED
@@ -39,6 +39,7 @@ module Mihari
|
|
39
39
|
method_option :title, type: :string, desc: "title"
|
40
40
|
method_option :description, type: :string, desc: "description"
|
41
41
|
method_option :tags, type: :array, desc: "tags"
|
42
|
+
method_option :target_type, type: :string, default: "url", desc: "target type to fetch from lookup results (target type should be 'url', 'domain' or 'ip')"
|
42
43
|
def urlscan(query)
|
43
44
|
with_error_handling do
|
44
45
|
run_analyzer Analyzers::Urlscan, query: query, options: options
|
@@ -84,6 +85,13 @@ module Mihari
|
|
84
85
|
end
|
85
86
|
end
|
86
87
|
|
88
|
+
desc "status", "Show the current configuration status"
|
89
|
+
def status
|
90
|
+
with_error_handling do
|
91
|
+
puts JSON.pretty_generate(Status.check)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
87
95
|
no_commands do
|
88
96
|
def with_error_handling
|
89
97
|
yield
|
@@ -104,13 +112,15 @@ module Mihari
|
|
104
112
|
end
|
105
113
|
|
106
114
|
def run_analyzer(analyzer_class, query:, options:)
|
107
|
-
|
108
|
-
description = options.dig("description")
|
109
|
-
tags = options.dig("tags") || []
|
115
|
+
options = symbolize_hash_keys(options)
|
110
116
|
|
111
|
-
analyzer = analyzer_class.new(query,
|
117
|
+
analyzer = analyzer_class.new(query, **options)
|
112
118
|
analyzer.run
|
113
119
|
end
|
120
|
+
|
121
|
+
def symbolize_hash_keys(hash)
|
122
|
+
hash.map{ |k, v| [k.to_sym, v] }.to_h
|
123
|
+
end
|
114
124
|
end
|
115
125
|
end
|
116
126
|
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mihari
|
4
|
+
class Status
|
5
|
+
def check
|
6
|
+
{
|
7
|
+
shodan: { status: shodan?, message: shodan },
|
8
|
+
slack: { status: slack?, message: slack },
|
9
|
+
censys: { status: censys?, message: censys },
|
10
|
+
virustotal: { status: virustotal?, message: virustotal },
|
11
|
+
onyphe: { status: onyphe?, message: onyphe },
|
12
|
+
the_hive: { status: the_hive?, message: the_hive },
|
13
|
+
}.map do |key, value|
|
14
|
+
[key, convert(value)]
|
15
|
+
end.to_h
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.check
|
19
|
+
new.check
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def convert(status:, message:)
|
25
|
+
{
|
26
|
+
status: status ? "OK" : "Bad",
|
27
|
+
message: message
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
def virustotal?
|
32
|
+
ENV.key?("VIRUSTOTAL_API_KEY")
|
33
|
+
end
|
34
|
+
|
35
|
+
def virustotal
|
36
|
+
virustotal? ? "VIRUSTOTAL_API_KEY is found" : "VIRUSTOTAL_API_KEY is missing"
|
37
|
+
end
|
38
|
+
|
39
|
+
def onyphe?
|
40
|
+
ENV.key? "ONYPHE_API_KEY"
|
41
|
+
end
|
42
|
+
|
43
|
+
def onyphe
|
44
|
+
onyphe? ? "ONYPHE_API_KEY is found" : "ONYPHE_API_KEY is missing"
|
45
|
+
end
|
46
|
+
|
47
|
+
def censys?
|
48
|
+
ENV.key?("CENSYS_ID") && ENV.key?("CENSYS_SECRET")
|
49
|
+
end
|
50
|
+
|
51
|
+
def censys
|
52
|
+
censys? ? "CENSYS_ID and CENSYS_SECRET are found" : "CENSYS_ID and CENSYS_SECRET are missing"
|
53
|
+
end
|
54
|
+
|
55
|
+
def shodan?
|
56
|
+
ENV.key? "SHODAN_API_KEY"
|
57
|
+
end
|
58
|
+
|
59
|
+
def shodan
|
60
|
+
shodan? ? "SHODAN_API_KEY is found" : "SHODAN_API_KEY is missing"
|
61
|
+
end
|
62
|
+
|
63
|
+
def slack?
|
64
|
+
ENV.key? "SLACK_WEBHOOK_URL"
|
65
|
+
end
|
66
|
+
|
67
|
+
def slack
|
68
|
+
slack? ? "SLACK_WEBHOOK_URL is found" : "SLACK_WEBHOOK_URL is missing"
|
69
|
+
end
|
70
|
+
|
71
|
+
def the_hive?
|
72
|
+
ENV.key?("THEHIVE_API_ENDPOINT") && ENV.key?("THEHIVE_API_KEY")
|
73
|
+
end
|
74
|
+
|
75
|
+
def the_hive
|
76
|
+
the_hive? ? "THEHIVE_API_ENDPOINT and THEHIVE_API_KEY are found" : "THEHIVE_API_ENDPOINT and THEHIVE_API_KEY are are missing"
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
data/lib/mihari/version.rb
CHANGED
data/mihari.gemspec
CHANGED
@@ -29,9 +29,9 @@ Gem::Specification.new do |spec|
|
|
29
29
|
spec.add_development_dependency "rake", "~> 12.3"
|
30
30
|
spec.add_development_dependency "rspec", "~> 3.8"
|
31
31
|
spec.add_development_dependency "vcr", "~> 5.0"
|
32
|
-
spec.add_development_dependency "webmock", "~> 3.
|
32
|
+
spec.add_development_dependency "webmock", "~> 3.7"
|
33
33
|
|
34
|
-
spec.add_dependency "addressable", "~> 2.
|
34
|
+
spec.add_dependency "addressable", "~> 2.7"
|
35
35
|
spec.add_dependency "censu", "~> 0.2"
|
36
36
|
spec.add_dependency "email_address", "~> 0.1"
|
37
37
|
spec.add_dependency "hachi", "~> 0.2"
|
@@ -42,6 +42,6 @@ Gem::Specification.new do |spec|
|
|
42
42
|
spec.add_dependency "shodanx", "~> 0.1"
|
43
43
|
spec.add_dependency "slack-notifier", "~> 2.3"
|
44
44
|
spec.add_dependency "thor", "~> 0.20"
|
45
|
-
spec.add_dependency "urlscan", "~> 0.
|
45
|
+
spec.add_dependency "urlscan", "~> 0.3"
|
46
46
|
spec.add_dependency "virustotalx", "~> 0.1"
|
47
47
|
end
|
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.
|
4
|
+
version: 0.6.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-
|
11
|
+
date: 2019-09-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -86,28 +86,28 @@ dependencies:
|
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: '3.
|
89
|
+
version: '3.7'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: '3.
|
96
|
+
version: '3.7'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: addressable
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
101
|
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: '2.
|
103
|
+
version: '2.7'
|
104
104
|
type: :runtime
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: '2.
|
110
|
+
version: '2.7'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: censu
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -254,14 +254,14 @@ dependencies:
|
|
254
254
|
requirements:
|
255
255
|
- - "~>"
|
256
256
|
- !ruby/object:Gem::Version
|
257
|
-
version: '0.
|
257
|
+
version: '0.3'
|
258
258
|
type: :runtime
|
259
259
|
prerelease: false
|
260
260
|
version_requirements: !ruby/object:Gem::Requirement
|
261
261
|
requirements:
|
262
262
|
- - "~>"
|
263
263
|
- !ruby/object:Gem::Version
|
264
|
-
version: '0.
|
264
|
+
version: '0.3'
|
265
265
|
- !ruby/object:Gem::Dependency
|
266
266
|
name: virustotalx
|
267
267
|
requirement: !ruby/object:Gem::Requirement
|
@@ -315,6 +315,7 @@ files:
|
|
315
315
|
- lib/mihari/notifiers/base.rb
|
316
316
|
- lib/mihari/notifiers/exception_notifier.rb
|
317
317
|
- lib/mihari/notifiers/slack.rb
|
318
|
+
- lib/mihari/status.rb
|
318
319
|
- lib/mihari/the_hive.rb
|
319
320
|
- lib/mihari/the_hive/alert.rb
|
320
321
|
- lib/mihari/the_hive/artifact.rb
|