miteru 0.12.10 → 0.12.11
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -5
- data/docker/Dockerfile +9 -3
- data/lib/miteru/configuration.rb +13 -13
- data/lib/miteru/downloader.rb +16 -7
- data/lib/miteru/feeds/ayashige.rb +1 -1
- data/lib/miteru/feeds/urlscan.rb +1 -1
- data/lib/miteru/http_client.rb +13 -10
- data/lib/miteru/version.rb +1 -1
- data/miteru.gemspec +5 -5
- metadata +13 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 80ce8c8350165a57da77e2f4c7e86acd36e48b921a114fc8299ac7925847b696
|
4
|
+
data.tar.gz: 5c1efd6135cef875a7d425ee5f22c65553b05564afcff2b6ccc8234990db0fc2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7bcf546a3dedf9cc4e9b1bc5aeb52806846fba4828279fc75afcf6c113c9ddf87646ecd2c737f8078c77ef391e13d56aafea00eba00073884cd2ada0acfd11b2
|
7
|
+
data.tar.gz: 220a3b82b01ec336d98217edb2a8940bab3ba46ab786aa5ed34aec93a23d55fadd9fb4a1668ca96f90f0c2f1679b8048d3b418970f2d79ee4819df779f49607d
|
data/README.md
CHANGED
@@ -71,12 +71,9 @@ https://dummy4.com: it might contain a phishing kit (dummy.zip).
|
|
71
71
|
## Using Docker (alternative if you don't install Ruby)
|
72
72
|
|
73
73
|
```bash
|
74
|
-
$
|
75
|
-
$ cd miteru/docker
|
76
|
-
$ docker build -t miteru .
|
77
|
-
$ docker run miteru
|
74
|
+
$ docker pull ninoseki/miteru
|
78
75
|
# ex. auto-download detected phishing kit(s) into host machines's /tmp directory
|
79
|
-
$ docker run -v /tmp:/tmp miteru execute --auto-download
|
76
|
+
$ docker run --rm -v /tmp:/tmp ninoseki/miteru execute --auto-download
|
80
77
|
```
|
81
78
|
|
82
79
|
## Configuration
|
data/docker/Dockerfile
CHANGED
@@ -1,6 +1,12 @@
|
|
1
|
-
FROM ruby:2.6
|
2
|
-
|
3
|
-
|
1
|
+
FROM ruby:2.6-alpine3.10
|
2
|
+
RUN apk --no-cache add git build-base ruby-dev \
|
3
|
+
&& cd /tmp/ \
|
4
|
+
&& git clone https://github.com/ninoseki/miteru.git \
|
5
|
+
&& cd miteru \
|
6
|
+
&& gem build miteru.gemspec -o miteru.gem \
|
7
|
+
&& gem install miteru.gem \
|
8
|
+
&& rm -rf /tmp/miteru \
|
9
|
+
&& apk del --purge git build-base ruby-dev
|
4
10
|
|
5
11
|
ENTRYPOINT ["miteru"]
|
6
12
|
|
data/lib/miteru/configuration.rb
CHANGED
@@ -60,20 +60,20 @@ module Miteru
|
|
60
60
|
end
|
61
61
|
end
|
62
62
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
63
|
+
class << self
|
64
|
+
# @return [Miteru::Configuration] Miteru's current configuration
|
65
|
+
def configuration
|
66
|
+
@configuration ||= Configuration.new
|
67
|
+
end
|
67
68
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
@configuration = config
|
72
|
-
end
|
69
|
+
# Set Miteru's configuration
|
70
|
+
# @param config [Miteru::Configuration]
|
71
|
+
attr_writer :configuration
|
73
72
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
73
|
+
# Modify Miteru's current configuration
|
74
|
+
# @yieldparam [Miteru::Configuration] config current Miteru config
|
75
|
+
def configure
|
76
|
+
yield configuration
|
77
|
+
end
|
78
78
|
end
|
79
79
|
end
|
data/lib/miteru/downloader.rb
CHANGED
@@ -7,9 +7,11 @@ require "uri"
|
|
7
7
|
module Miteru
|
8
8
|
class Downloader
|
9
9
|
attr_reader :base_dir
|
10
|
+
attr_reader :memo
|
10
11
|
|
11
12
|
def initialize(base_dir = "/tmp")
|
12
13
|
@base_dir = base_dir
|
14
|
+
@memo = {}
|
13
15
|
raise ArgumentError, "#{base_dir} is not exist." unless Dir.exist?(base_dir)
|
14
16
|
end
|
15
17
|
|
@@ -24,8 +26,9 @@ module Miteru
|
|
24
26
|
destination = filepath_to_download(filename)
|
25
27
|
begin
|
26
28
|
downloaded_filepath = HTTPClient.download(kit.url, destination)
|
27
|
-
|
28
|
-
|
29
|
+
hash = sha256(downloaded_filepath)
|
30
|
+
if duplicated?(hash)
|
31
|
+
puts "Do not download #{kit.url} because there is a duplicate file in the directory (SHA256: #{hash})."
|
29
32
|
FileUtils.rm downloaded_filepath
|
30
33
|
else
|
31
34
|
puts "Download #{kit.url} as #{downloaded_filepath}"
|
@@ -46,14 +49,20 @@ module Miteru
|
|
46
49
|
end
|
47
50
|
|
48
51
|
def sha256(path)
|
52
|
+
return memo[path] if memo.key?(path)
|
53
|
+
|
49
54
|
digest = Digest::SHA256.file(path)
|
50
|
-
digest.hexdigest
|
55
|
+
hash = digest.hexdigest
|
56
|
+
memo[path] = hash
|
57
|
+
hash
|
58
|
+
end
|
59
|
+
|
60
|
+
def sha256s
|
61
|
+
Dir.glob("#{base_dir}/*.{zip,rar,7z,tar,gz}").map { |path| sha256(path) }
|
51
62
|
end
|
52
63
|
|
53
|
-
def duplicated?(
|
54
|
-
|
55
|
-
sha256s = Dir.glob("#{base_dir}/*.{zip,rar,7z,tar,gz}").map { |path| sha256(path) }
|
56
|
-
sha256s.select { |sha256| sha256 == base }.length > 1
|
64
|
+
def duplicated?(hash)
|
65
|
+
sha256s.count(hash) > 1
|
57
66
|
end
|
58
67
|
end
|
59
68
|
end
|
data/lib/miteru/feeds/urlscan.rb
CHANGED
@@ -25,7 +25,7 @@ module Miteru
|
|
25
25
|
|
26
26
|
res = JSON.parse(get(url))
|
27
27
|
res["results"].map { |result| result.dig("task", "url") }
|
28
|
-
rescue HTTPResponseError, JSON::ParserError => e
|
28
|
+
rescue HTTPResponseError, HTTP::Error, JSON::ParserError => e
|
29
29
|
puts "Failed to load urlscan.io feed (#{e})"
|
30
30
|
[]
|
31
31
|
end
|
data/lib/miteru/http_client.rb
CHANGED
@@ -11,6 +11,7 @@ module Miteru
|
|
11
11
|
URLSCAN_UA = "miteru/#{Miteru::VERSION}"
|
12
12
|
|
13
13
|
attr_reader :ssl_context
|
14
|
+
|
14
15
|
def initialize
|
15
16
|
ctx = OpenSSL::SSL::SSLContext.new
|
16
17
|
ctx.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
@@ -23,10 +24,6 @@ module Miteru
|
|
23
24
|
destination
|
24
25
|
end
|
25
26
|
|
26
|
-
def self.download(url, base_dir = "/tmp")
|
27
|
-
new.download(url, base_dir)
|
28
|
-
end
|
29
|
-
|
30
27
|
def get(url, options = {})
|
31
28
|
options = options.merge default_options
|
32
29
|
|
@@ -36,16 +33,22 @@ module Miteru
|
|
36
33
|
.get(url, options)
|
37
34
|
end
|
38
35
|
|
39
|
-
def self.get(url, options = {})
|
40
|
-
new.get url, options
|
41
|
-
end
|
42
|
-
|
43
36
|
def post(url, options = {})
|
44
37
|
HTTP.post url, options
|
45
38
|
end
|
46
39
|
|
47
|
-
|
48
|
-
|
40
|
+
class << self
|
41
|
+
def download(url, base_dir = "/tmp")
|
42
|
+
new.download(url, base_dir)
|
43
|
+
end
|
44
|
+
|
45
|
+
def get(url, options = {})
|
46
|
+
new.get url, options
|
47
|
+
end
|
48
|
+
|
49
|
+
def post(url, options = {})
|
50
|
+
new.post url, options
|
51
|
+
end
|
49
52
|
end
|
50
53
|
|
51
54
|
private
|
data/lib/miteru/version.rb
CHANGED
data/miteru.gemspec
CHANGED
@@ -27,16 +27,16 @@ Gem::Specification.new do |spec|
|
|
27
27
|
spec.add_development_dependency "bundler", "~> 2.0"
|
28
28
|
spec.add_development_dependency "coveralls", "~> 0.8"
|
29
29
|
spec.add_development_dependency "glint", "~> 0.1"
|
30
|
-
spec.add_development_dependency "rake", "~>
|
30
|
+
spec.add_development_dependency "rake", "~> 13.0"
|
31
31
|
spec.add_development_dependency "rspec", "~> 3.8"
|
32
32
|
spec.add_development_dependency "vcr", "~> 5.0"
|
33
|
-
spec.add_development_dependency "webmock", "~> 3.
|
33
|
+
spec.add_development_dependency "webmock", "~> 3.7"
|
34
34
|
|
35
35
|
spec.add_dependency "colorize", "~> 0.8"
|
36
|
-
spec.add_dependency "down", "~>
|
36
|
+
spec.add_dependency "down", "~> 5.0"
|
37
37
|
spec.add_dependency "http", "~> 4.1"
|
38
38
|
spec.add_dependency "oga", "~> 2.15"
|
39
|
-
spec.add_dependency "parallel", "~> 1.
|
39
|
+
spec.add_dependency "parallel", "~> 1.18"
|
40
40
|
spec.add_dependency "slack-notifier", "~> 2.3"
|
41
|
-
spec.add_dependency "thor", "~> 0.
|
41
|
+
spec.add_dependency "thor", "~> 0.20"
|
42
42
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: miteru
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.12.
|
4
|
+
version: 0.12.11
|
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-10-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -58,14 +58,14 @@ dependencies:
|
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '
|
61
|
+
version: '13.0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
68
|
+
version: '13.0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rspec
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -100,14 +100,14 @@ dependencies:
|
|
100
100
|
requirements:
|
101
101
|
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: '3.
|
103
|
+
version: '3.7'
|
104
104
|
type: :development
|
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: '3.
|
110
|
+
version: '3.7'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: colorize
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -128,14 +128,14 @@ dependencies:
|
|
128
128
|
requirements:
|
129
129
|
- - "~>"
|
130
130
|
- !ruby/object:Gem::Version
|
131
|
-
version: '
|
131
|
+
version: '5.0'
|
132
132
|
type: :runtime
|
133
133
|
prerelease: false
|
134
134
|
version_requirements: !ruby/object:Gem::Requirement
|
135
135
|
requirements:
|
136
136
|
- - "~>"
|
137
137
|
- !ruby/object:Gem::Version
|
138
|
-
version: '
|
138
|
+
version: '5.0'
|
139
139
|
- !ruby/object:Gem::Dependency
|
140
140
|
name: http
|
141
141
|
requirement: !ruby/object:Gem::Requirement
|
@@ -170,14 +170,14 @@ dependencies:
|
|
170
170
|
requirements:
|
171
171
|
- - "~>"
|
172
172
|
- !ruby/object:Gem::Version
|
173
|
-
version: '1.
|
173
|
+
version: '1.18'
|
174
174
|
type: :runtime
|
175
175
|
prerelease: false
|
176
176
|
version_requirements: !ruby/object:Gem::Requirement
|
177
177
|
requirements:
|
178
178
|
- - "~>"
|
179
179
|
- !ruby/object:Gem::Version
|
180
|
-
version: '1.
|
180
|
+
version: '1.18'
|
181
181
|
- !ruby/object:Gem::Dependency
|
182
182
|
name: slack-notifier
|
183
183
|
requirement: !ruby/object:Gem::Requirement
|
@@ -198,14 +198,14 @@ dependencies:
|
|
198
198
|
requirements:
|
199
199
|
- - "~>"
|
200
200
|
- !ruby/object:Gem::Version
|
201
|
-
version: '0.
|
201
|
+
version: '0.20'
|
202
202
|
type: :runtime
|
203
203
|
prerelease: false
|
204
204
|
version_requirements: !ruby/object:Gem::Requirement
|
205
205
|
requirements:
|
206
206
|
- - "~>"
|
207
207
|
- !ruby/object:Gem::Version
|
208
|
-
version: '0.
|
208
|
+
version: '0.20'
|
209
209
|
description: An experimental phishing kit detector
|
210
210
|
email:
|
211
211
|
- manabu.niseki@gmail.com
|
@@ -262,7 +262,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
262
262
|
- !ruby/object:Gem::Version
|
263
263
|
version: '0'
|
264
264
|
requirements: []
|
265
|
-
rubygems_version: 3.0.
|
265
|
+
rubygems_version: 3.0.6
|
266
266
|
signing_key:
|
267
267
|
specification_version: 4
|
268
268
|
summary: An experimental phishing kit detector
|