mihari 0.5.1 → 0.5.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/lib/mihari/analyzers/censys.rb +3 -3
- data/lib/mihari/analyzers/onyphe.rb +3 -3
- data/lib/mihari/analyzers/shodan.rb +3 -3
- data/lib/mihari/analyzers/urlscan.rb +3 -3
- data/lib/mihari/analyzers/virustotal.rb +3 -3
- data/lib/mihari/cli.rb +24 -15
- data/lib/mihari/emitters/slack.rb +14 -15
- data/lib/mihari/notifiers/exception_notifier.rb +5 -5
- data/lib/mihari/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d0d889b6f04bff599f1dbb8eac861469500061e5ef4c3f48e4e4624d0c4ce57a
|
4
|
+
data.tar.gz: 0201ba42b96271982b78d28ac7f8c01f0e34a398d5f897b5e5b1e7f0fb1573cb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b32e5330ba7f77c9c2a6411de65ef91bd49a7798bef817c0ed2ae76ee8818c81dd4e3b24970361017ba60dbb9c629b508bb13abf0ffa81978c0bca8d1c9fc1df
|
7
|
+
data.tar.gz: 9ec9fc6d441b83f0e337f4af7647ddd7a15600c7cfb371e4a05dba066e3a6bf8933a43261b27b76f24ea474a69b1da48e98b4cf22edd2ffdf5cc7697b7e6b69b
|
@@ -14,15 +14,15 @@ module Mihari
|
|
14
14
|
CENSYS_ID_KEY = "CENSYS_ID"
|
15
15
|
CENSYS_SECRET_KEY = "CENSYS_SECRET"
|
16
16
|
|
17
|
-
def initialize(query, tags: [])
|
17
|
+
def initialize(query, title: nil, description: nil, tags: [])
|
18
18
|
super()
|
19
19
|
|
20
20
|
raise ArgumentError, "#{CENSYS_ID_KEY} and #{CENSYS_SECRET_KEY} are required" unless valid?
|
21
21
|
|
22
22
|
@api = ::Censys::API.new
|
23
23
|
@query = query
|
24
|
-
@title = "Censys lookup"
|
25
|
-
@description = "query = #{query}"
|
24
|
+
@title = title || "Censys lookup"
|
25
|
+
@description = description || "query = #{query}"
|
26
26
|
@tags = tags
|
27
27
|
end
|
28
28
|
|
@@ -11,13 +11,13 @@ module Mihari
|
|
11
11
|
attr_reader :query
|
12
12
|
attr_reader :tags
|
13
13
|
|
14
|
-
def initialize(query, tags: [])
|
14
|
+
def initialize(query, title: nil, description: nil, tags: [])
|
15
15
|
super()
|
16
16
|
|
17
17
|
@api = ::Onyphe::API.new
|
18
18
|
@query = query
|
19
|
-
@title = "Onyphe lookup"
|
20
|
-
@description = "query = #{query}"
|
19
|
+
@title = title || "Onyphe lookup"
|
20
|
+
@description = description || "query = #{query}"
|
21
21
|
@tags = tags
|
22
22
|
end
|
23
23
|
|
@@ -11,13 +11,13 @@ module Mihari
|
|
11
11
|
attr_reader :query
|
12
12
|
attr_reader :tags
|
13
13
|
|
14
|
-
def initialize(query, tags: [])
|
14
|
+
def initialize(query, title: nil, description: nil, tags: [])
|
15
15
|
super()
|
16
16
|
|
17
17
|
@api = ::Shodan::API.new
|
18
18
|
@query = query
|
19
|
-
@title = "Shodan lookup"
|
20
|
-
@description = "query = #{query}"
|
19
|
+
@title = title || "Shodan lookup"
|
20
|
+
@description = description || "query = #{query}"
|
21
21
|
@tags = tags
|
22
22
|
end
|
23
23
|
|
@@ -11,13 +11,13 @@ module Mihari
|
|
11
11
|
attr_reader :query
|
12
12
|
attr_reader :tags
|
13
13
|
|
14
|
-
def initialize(query, tags: [])
|
14
|
+
def initialize(query, title: nil, description: nil, tags: [])
|
15
15
|
super()
|
16
16
|
|
17
17
|
@api = ::UrlScan::API.new
|
18
18
|
@query = query
|
19
|
-
@title = "urlscan lookup"
|
20
|
-
@description = "query = #{query}"
|
19
|
+
@title = title || "urlscan lookup"
|
20
|
+
@description = description || "query = #{query}"
|
21
21
|
@tags = tags
|
22
22
|
end
|
23
23
|
|
@@ -13,15 +13,15 @@ module Mihari
|
|
13
13
|
attr_reader :description
|
14
14
|
attr_reader :tags
|
15
15
|
|
16
|
-
def initialize(indicator, tags: [])
|
16
|
+
def initialize(indicator, title: nil, description: nil, tags: [])
|
17
17
|
super()
|
18
18
|
|
19
19
|
@api = ::VirusTotal::API.new
|
20
20
|
@indicator = indicator
|
21
21
|
@type = TypeChecker.type(indicator)
|
22
22
|
|
23
|
-
@title = "VirusTotal lookup"
|
24
|
-
@description = "indicator = #{indicator}"
|
23
|
+
@title = title || "VirusTotal lookup"
|
24
|
+
@description = description || "indicator = #{indicator}"
|
25
25
|
@tags = tags
|
26
26
|
end
|
27
27
|
|
data/lib/mihari/cli.rb
CHANGED
@@ -6,52 +6,52 @@ require "json"
|
|
6
6
|
module Mihari
|
7
7
|
class CLI < Thor
|
8
8
|
desc "censys [QUERY]", "Censys IPv4 lookup by a given query"
|
9
|
+
method_option :title, type: :string, desc: "title"
|
10
|
+
method_option :description, type: :string, desc: "description"
|
9
11
|
method_option :tags, type: :array, desc: "tags"
|
10
12
|
def censys(query)
|
11
13
|
with_error_handling do
|
12
|
-
|
13
|
-
censys = Analyzers::Censys.new(query, tags: tags)
|
14
|
-
censys.run
|
14
|
+
run_analyzer Analyzers::Censys, query: query, options: options
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
18
|
desc "shodan [QUERY]", "Shodan host lookup by a given query"
|
19
|
+
method_option :title, type: :string, desc: "title"
|
20
|
+
method_option :description, type: :string, desc: "description"
|
19
21
|
method_option :tags, type: :array, desc: "tags"
|
20
22
|
def shodan(query)
|
21
23
|
with_error_handling do
|
22
|
-
|
23
|
-
shodan = Analyzers::Shodan.new(query, tags: tags)
|
24
|
-
shodan.run
|
24
|
+
run_analyzer Analyzers::Shodan, query: query, options: options
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
28
|
desc "onyphe [QUERY]", "Onyphe datascan lookup by a given query"
|
29
|
+
method_option :title, type: :string, desc: "title"
|
30
|
+
method_option :description, type: :string, desc: "description"
|
29
31
|
method_option :tags, type: :array, desc: "tags"
|
30
32
|
def onyphe(query)
|
31
33
|
with_error_handling do
|
32
|
-
|
33
|
-
onyphe = Analyzers::Onyphe.new(query, tags: tags)
|
34
|
-
onyphe.run
|
34
|
+
run_analyzer Analyzers::Onyphe, query: query, options: options
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
38
|
desc "urlscan [QUERY]", "urlscan lookup by a given query"
|
39
|
+
method_option :title, type: :string, desc: "title"
|
40
|
+
method_option :description, type: :string, desc: "description"
|
39
41
|
method_option :tags, type: :array, desc: "tags"
|
40
42
|
def urlscan(query)
|
41
43
|
with_error_handling do
|
42
|
-
|
43
|
-
urlscan = Analyzers::Urlscan.new(query, tags: tags)
|
44
|
-
urlscan.run
|
44
|
+
run_analyzer Analyzers::Urlscan, query: query, options: options
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
48
48
|
desc "virustotal [IP|DOMAIN]", "VirusTotal resolutions lookup by a given ip or domain"
|
49
|
+
method_option :title, type: :string, desc: "title"
|
50
|
+
method_option :description, type: :string, desc: "description"
|
49
51
|
method_option :tags, type: :array, desc: "tags"
|
50
52
|
def virustotal(indiactor)
|
51
53
|
with_error_handling do
|
52
|
-
|
53
|
-
virustotal = Analyzers::VirusTotal.new(indiactor, tags: tags)
|
54
|
-
virustotal.run
|
54
|
+
run_analyzer Analyzers::VirusTotal, query: indiactor, options: options
|
55
55
|
end
|
56
56
|
end
|
57
57
|
|
@@ -102,6 +102,15 @@ module Mihari
|
|
102
102
|
def valid_json?(json)
|
103
103
|
%w(title description artifacts).all? { |key| json.key? key }
|
104
104
|
end
|
105
|
+
|
106
|
+
def run_analyzer(analyzer_class, query:, options:)
|
107
|
+
title = options.dig("title")
|
108
|
+
description = options.dig("description")
|
109
|
+
tags = options.dig("tags") || []
|
110
|
+
|
111
|
+
analyzer = analyzer_class.new(query, title: title, description: description, tags: tags)
|
112
|
+
analyzer.run
|
113
|
+
end
|
105
114
|
end
|
106
115
|
end
|
107
116
|
end
|
@@ -16,32 +16,26 @@ module Mihari
|
|
16
16
|
@data_type = data_type
|
17
17
|
end
|
18
18
|
|
19
|
-
def fields
|
20
|
-
[vt_link, urlscan_link].compact
|
21
|
-
end
|
22
|
-
|
23
19
|
def actions
|
24
|
-
[vt_link, urlscan_link].compact
|
20
|
+
[vt_link, urlscan_link, censys_link].compact
|
25
21
|
end
|
26
22
|
|
27
23
|
def vt_link
|
28
24
|
return nil unless _vt_link
|
29
25
|
|
30
|
-
{
|
31
|
-
type: "button",
|
32
|
-
text: "Lookup on VirusTotal",
|
33
|
-
url: _vt_link,
|
34
|
-
}
|
26
|
+
{ type: "button", text: "Lookup on VirusTotal", url: _vt_link, }
|
35
27
|
end
|
36
28
|
|
37
29
|
def urlscan_link
|
38
30
|
return nil unless _urlscan_link
|
39
31
|
|
40
|
-
{
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
32
|
+
{ type: "button", text: "Lookup on urlscan.io", url: _urlscan_link, }
|
33
|
+
end
|
34
|
+
|
35
|
+
def censys_link
|
36
|
+
return nil unless _censys_link
|
37
|
+
|
38
|
+
{ type: "button", text: "Lookup on Censys", url: _censys_link, }
|
45
39
|
end
|
46
40
|
|
47
41
|
# @return [Array]
|
@@ -88,6 +82,11 @@ module Mihari
|
|
88
82
|
end
|
89
83
|
memoize :_vt_link
|
90
84
|
|
85
|
+
def _censys_link
|
86
|
+
data_type == "ip" ? "https://censys.io/ipv4/#{data}" : nil
|
87
|
+
end
|
88
|
+
memoize :_censys_link
|
89
|
+
|
91
90
|
# @return [String]
|
92
91
|
def sha256
|
93
92
|
Digest::SHA256.hexdigest data
|
@@ -7,7 +7,7 @@ module Mihari
|
|
7
7
|
class ExceptionNotifier
|
8
8
|
def initialize
|
9
9
|
@backtrace_lines = 10
|
10
|
-
@color =
|
10
|
+
@color = "danger"
|
11
11
|
|
12
12
|
@slack = Notifiers::Slack.new
|
13
13
|
end
|
@@ -44,20 +44,20 @@ module Mihari
|
|
44
44
|
end
|
45
45
|
|
46
46
|
def to_text(exception_class)
|
47
|
-
measure_word = /^[aeiou]/i.match?(exception_class.to_s) ?
|
47
|
+
measure_word = /^[aeiou]/i.match?(exception_class.to_s) ? "An" : "A"
|
48
48
|
exception_name = "*#{measure_word}* `#{exception_class}`"
|
49
49
|
"#{exception_name} *occured in background*\n"
|
50
50
|
end
|
51
51
|
|
52
52
|
def to_fields(clean_message, backtrace)
|
53
53
|
fields = [
|
54
|
-
{ title:
|
55
|
-
{ title:
|
54
|
+
{ title: "Exception", value: clean_message },
|
55
|
+
{ title: "Hostname", value: hostname }
|
56
56
|
]
|
57
57
|
|
58
58
|
if backtrace
|
59
59
|
formatted_backtrace = format_backtrace(backtrace)
|
60
|
-
fields << { title:
|
60
|
+
fields << { title: "Backtrace", value: formatted_backtrace }
|
61
61
|
end
|
62
62
|
fields
|
63
63
|
end
|
data/lib/mihari/version.rb
CHANGED
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.5.
|
4
|
+
version: 0.5.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: 2019-08-
|
11
|
+
date: 2019-08-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|