miteru 0.12.11 → 0.14.1

This diff has not been reviewed by any users.
Log in in order to be able to vote.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 80ce8c8350165a57da77e2f4c7e86acd36e48b921a114fc8299ac7925847b696
4
- data.tar.gz: 5c1efd6135cef875a7d425ee5f22c65553b05564afcff2b6ccc8234990db0fc2
3
+ metadata.gz: cbb47828d938e86289f845435bd9d342e18d7c50090e486b5681bf212dfcd84b
4
+ data.tar.gz: c416439bc1c80cfd4cf2de8bc9a7a6abb6ff46bb1af5d0a58ec0e71954584a4c
5
5
  SHA512:
6
- metadata.gz: 7bcf546a3dedf9cc4e9b1bc5aeb52806846fba4828279fc75afcf6c113c9ddf87646ecd2c737f8078c77ef391e13d56aafea00eba00073884cd2ada0acfd11b2
7
- data.tar.gz: 220a3b82b01ec336d98217edb2a8940bab3ba46ab786aa5ed34aec93a23d55fadd9fb4a1668ca96f90f0c2f1679b8048d3b418970f2d79ee4819df779f49607d
6
+ metadata.gz: f15f1770d870404e7b50cddb2e20d7e5d90adfab04283d5cb4364a2480f210b9c4869717d647bdc0174b5d0f0a9323903aac101f77d140ebad0c9523688b43d0
7
+ data.tar.gz: cb4a8e2c561aa53265362beec7e45445f6a6825bf991c7c4c559d40279dc84e138f54e300ab163f9db19dc891f2fe0a30c874d620d0464c9451c1e6c0e6e729e
@@ -2,8 +2,6 @@ sudo: false
2
2
  language: ruby
3
3
  cache: bundler
4
4
  rvm:
5
- - 2.5.1
6
- - 2.6.1
7
- before_install:
8
- - gem update --system
9
- - gem install bundler
5
+ - 2.6
6
+ - 2.7
7
+ before_install: gem install bundler -v 2.1
data/README.md CHANGED
@@ -1,8 +1,9 @@
1
1
  # Miteru
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/miteru.svg)](https://badge.fury.io/rb/miteru)
4
- [![Build Status](https://travis-ci.org/ninoseki/miteru.svg?branch=master)](https://travis-ci.org/ninoseki/miteru)
5
- [![Maintainability](https://api.codeclimate.com/v1/badges/d90e1b5bbdd9663a17d1/maintainability)](https://codeclimate.com/github/ninoseki/miteru/maintainability)
4
+ [![Build Status](https://travis-ci.com/ninoseki/miteru.svg?branch=master)](https://travis-ci.com/ninoseki/miteru)
5
+ [![Docker Cloud Build Status](https://img.shields.io/docker/cloud/build/ninoseki/miteru)](https://hub.docker.com/repository/docker/ninoseki/miteru)
6
+ [![CodeFactor](https://www.codefactor.io/repository/github/ninoseki/miteru/badge)](https://www.codefactor.io/repository/github/ninoseki/miteru)
6
7
  [![Coverage Status](https://coveralls.io/repos/github/ninoseki/miteru/badge.svg?branch=master)](https://coveralls.io/github/ninoseki/miteru?branch=master)
7
8
 
8
9
  Miteru is an experimental phishing kit detection tool.
@@ -13,7 +14,11 @@ Miteru is an experimental phishing kit detection tool.
13
14
  - [CertStream-Suspicious feed via urlscan.io](https://urlscan.io/search/#certstream-suspicious)
14
15
  - [OpenPhish feed via urlscan.io](https://urlscan.io/search/#OpenPhish)
15
16
  - [PhishTank feed via urlscan.io](https://urlscan.io/search/#PhishTank)
17
+ - [URLhaus feed via urlscan.io](https://urlscan.io/search/#URLHaus)
18
+ - urlscan.io phish feed (available for Pro users)
16
19
  - [Ayashige feed](https://github.com/ninoseki/ayashige)
20
+ - [Phishing Database feed](https://github.com/mitchellkrogza/Phishing.Database)
21
+ - [PhishStats feed](https://phishstats.info/)
17
22
  - It checks each phishy URL whether it enables directory listing and contains a phishing kit (compressed file) or not.
18
23
  - Note: compressed file = `*.zip`, `*.rar`, `*.7z`, `*.tar` and `*.gz`.
19
24
 
@@ -83,6 +88,10 @@ For using `--post-to-slack` feature, you should set the following environment va
83
88
  - `SLACK_WEBHOOK_URL`: Your Slack Webhook URL.
84
89
  - `SLACK_CHANNEL`: Slack channel to post a message (default: "#general").
85
90
 
91
+ If you are a urlscan.io Pro user, set your API key as an environment variable `URLSCAN_API_KEY`.
92
+
93
+ It enables you to subscribe the urlscan.io phish feed.
94
+
86
95
  ## Examples
87
96
 
88
97
  ### Aasciinema cast
@@ -36,7 +36,7 @@ module Miteru
36
36
  @post_to_slack = false
37
37
  @size = 100
38
38
  @threads = Parallel.processor_count
39
- @verbaose = false
39
+ @verbose = false
40
40
  end
41
41
 
42
42
  def auto_download?
@@ -56,7 +56,7 @@ module Miteru
56
56
  end
57
57
 
58
58
  def verbose?
59
- @verbaose
59
+ @verbose
60
60
  end
61
61
  end
62
62
 
@@ -11,7 +11,6 @@ module Miteru
11
11
 
12
12
  def initialize
13
13
  @downloader = Downloader.new(Miteru.configuration.download_to)
14
-
15
14
  @feeds = Feeds.new
16
15
  @notifier = Notifier.new
17
16
  end
@@ -25,7 +24,6 @@ module Miteru
25
24
  end
26
25
 
27
26
  def execute
28
- threads = Miteru.configuration.threads
29
27
  suspicious_urls = feeds.suspicious_urls
30
28
  puts "Loaded #{suspicious_urls.length} URLs to crawl. (crawling in #{threads} threads)" if verbose?
31
29
 
@@ -34,8 +32,8 @@ module Miteru
34
32
  end
35
33
  end
36
34
 
37
- def self.execute
38
- new.execute
35
+ def threads
36
+ @threads ||= Miteru.configuration.threads
39
37
  end
40
38
 
41
39
  def notify(website)
@@ -49,5 +47,11 @@ module Miteru
49
47
  def verbose?
50
48
  Miteru.configuration.verbose?
51
49
  end
50
+
51
+ class << self
52
+ def execute
53
+ new.execute
54
+ end
55
+ end
52
56
  end
53
57
  end
@@ -22,8 +22,7 @@ module Miteru
22
22
  private
23
23
 
24
24
  def download_kit(kit)
25
- filename = download_filename(kit)
26
- destination = filepath_to_download(filename)
25
+ destination = kit.download_filepath
27
26
  begin
28
27
  downloaded_filepath = HTTPClient.download(kit.url, destination)
29
28
  hash = sha256(downloaded_filepath)
@@ -38,12 +37,6 @@ module Miteru
38
37
  end
39
38
  end
40
39
 
41
- def download_filename(kit)
42
- domain = URI(kit.base_url).hostname
43
-
44
- "#{domain}_#{kit.filename}_#{SecureRandom.alphanumeric(10)}#{kit.extname}"
45
- end
46
-
47
40
  def filepath_to_download(filename)
48
41
  "#{base_dir}/#{filename}"
49
42
  end
@@ -1,14 +1,25 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "./feeds/feed"
4
+ require_relative "./feeds/phishing_database"
5
+ require_relative "./feeds/phishstats"
4
6
  require_relative "./feeds/ayashige"
5
7
  require_relative "./feeds/urlscan"
8
+ require_relative "./feeds/urlscan_pro"
6
9
 
7
10
  module Miteru
8
11
  class Feeds
12
+ IGNORE_EXTENSIONS = %w(.htm .html .php .asp .aspx .exe .txt).freeze
13
+ VALID_EXTENSIONS = [".zip", ".rar", ".7z", ".tar", ".gz"].freeze
14
+
9
15
  def initialize
10
- @feeds = [UrlScan.new(Miteru.configuration.size)]
11
- @feeds << Ayashige.new if Miteru.configuration.ayashige?
16
+ @feeds = [
17
+ PhishingDatabase.new,
18
+ PhishStats.new,
19
+ UrlScan.new(Miteru.configuration.size),
20
+ UrlScanPro.new,
21
+ Miteru.configuration.ayashige? ? Ayashige.new : nil
22
+ ].compact
12
23
  end
13
24
 
14
25
  def directory_traveling?
@@ -38,11 +49,25 @@ module Miteru
38
49
  segments = uri.path.split("/")
39
50
  return [base] if segments.length.zero?
40
51
 
41
- urls = (0...segments.length).map { |idx| "#{base}#{segments[0..idx].join('/')}" }
52
+ urls = (0...segments.length).map do |idx|
53
+ breakdowned_url = "#{base}#{segments[0..idx].join('/')}"
54
+ breakdown = [breakdowned_url]
55
+ if idx > 0 && idx < segments.length - 1
56
+ VALID_EXTENSIONS.each do |ext|
57
+ breakdown << "#{base}#{segments[0..idx - 1].join('/')}/#{segments[idx]}#{ext}"
58
+ end
59
+ end
60
+ breakdown
61
+ end.flatten
62
+
42
63
  urls.reject do |breakdowned_url|
43
64
  # Reject a url which ends with specific extension names
44
- %w(.htm .html .php .asp .aspx).any? { |ext| breakdowned_url.end_with? ext }
65
+ invalid_extension? breakdowned_url
45
66
  end
46
67
  end
68
+
69
+ def invalid_extension?(url)
70
+ IGNORE_EXTENSIONS.any? { |ext| url.end_with? ext }
71
+ end
47
72
  end
48
73
  end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "json"
4
+ require "uri"
5
+
6
+ module Miteru
7
+ class Feeds
8
+ class PhishingDatabase < Feed
9
+ URL = "https://raw.githubusercontent.com/mitchellkrogza/Phishing.Database/master/phishing-links-NEW-today.txt"
10
+
11
+ def urls
12
+ body = get(URL)
13
+ body.to_s.lines.map(&:chomp)
14
+ rescue HTTPResponseError, HTTP::Error, JSON::ParserError => e
15
+ puts "Failed to load phishing database feed (#{e})"
16
+ []
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "json"
4
+ require "uri"
5
+
6
+ module Miteru
7
+ class Feeds
8
+ class PhishStats < Feed
9
+ URL = "https://phishstats.info:2096/api/phishing?_sort=-id&size=100"
10
+
11
+ def urls
12
+ json = JSON.parse(get(URL))
13
+ json.map do |entry|
14
+ entry.dig("url")
15
+ end
16
+ rescue HTTPResponseError, HTTP::Error, JSON::ParserError => e
17
+ puts "Failed to load PhishStats feed (#{e})"
18
+ []
19
+ end
20
+
21
+ private
22
+
23
+ def url_for(path)
24
+ URI(URL + path)
25
+ end
26
+ end
27
+ end
28
+ end
@@ -1,39 +1,35 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "json"
4
- require "uri"
3
+ require "urlscan"
5
4
 
6
5
  module Miteru
7
6
  class Feeds
8
7
  class UrlScan < Feed
9
- HOST = "urlscan.io"
10
- VERSION = 1
11
- URL = "https://#{HOST}/api/v#{VERSION}"
12
-
13
8
  attr_reader :size
9
+
14
10
  def initialize(size = 100)
15
11
  @size = size
16
12
  raise ArgumentError, "size must be less than 10,000" if size > 10_000
17
13
  end
18
14
 
15
+ def api
16
+ @api ||= ::UrlScan::API.new
17
+ end
18
+
19
19
  def urls
20
- url = url_for("/search/")
21
- url.query = URI.encode_www_form(
22
- q: "PhishTank OR OpenPhish OR CertStream-Suspicious",
23
- size: size
24
- )
25
-
26
- res = JSON.parse(get(url))
27
- res["results"].map { |result| result.dig("task", "url") }
28
- rescue HTTPResponseError, HTTP::Error, JSON::ParserError => e
20
+ urls_from_community_feed
21
+ rescue ::UrlScan::ResponseError => e
29
22
  puts "Failed to load urlscan.io feed (#{e})"
30
23
  []
31
24
  end
32
25
 
33
26
  private
34
27
 
35
- def url_for(path)
36
- URI(URL + path)
28
+ def urls_from_community_feed
29
+ res = api.search("task.method:automatic", size: size)
30
+
31
+ results = res["results"] || []
32
+ results.map { |result| result.dig("task", "url") }
37
33
  end
38
34
  end
39
35
  end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "urlscan"
4
+
5
+ module Miteru
6
+ class Feeds
7
+ class UrlScanPro < Feed
8
+ def api
9
+ @api ||= ::UrlScan::API.new
10
+ end
11
+
12
+ def urls
13
+ urls_from_pro_feed
14
+ rescue ::UrlScan::ResponseError => e
15
+ puts "Failed to load urlscan.io pro feed (#{e})"
16
+ []
17
+ end
18
+
19
+ private
20
+
21
+ def api_key?
22
+ ENV.key? "URLSCAN_API_KEY"
23
+ end
24
+
25
+ def urls_from_pro_feed
26
+ return [] unless api_key?
27
+
28
+ res = api.pro.phishfeed
29
+ results = res["results"] || []
30
+ results.map { |result| result.dig("page_url") }
31
+ rescue ArgumentError => _e
32
+ []
33
+ end
34
+ end
35
+ end
36
+ end
@@ -2,7 +2,6 @@
2
2
 
3
3
  require "down/http"
4
4
  require "http"
5
- require "securerandom"
6
5
  require "uri"
7
6
 
8
7
  module Miteru
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "cgi"
4
+ require "securerandom"
4
5
 
5
6
  module Miteru
6
7
  class Kit
@@ -34,5 +35,39 @@ module Miteru
34
35
  def url
35
36
  "#{base_url}/#{basename}"
36
37
  end
38
+
39
+ def download_filepath
40
+ "#{base_dir}/#{download_filename}"
41
+ end
42
+
43
+ def filesize
44
+ return nil unless File.exist?(download_filepath)
45
+
46
+ File.size download_filepath
47
+ end
48
+
49
+ def filename_with_size
50
+ return filename unless filesize
51
+
52
+ "#{filename}(#{filesize / 1024}KB)"
53
+ end
54
+
55
+ private
56
+
57
+ def id
58
+ @id ||= SecureRandom.hex(10)
59
+ end
60
+
61
+ def hostname
62
+ URI(base_url).hostname
63
+ end
64
+
65
+ def download_filename
66
+ "#{hostname}_#{filename}_#{id}#{extname}"
67
+ end
68
+
69
+ def base_dir
70
+ @base_dir ||= Miteru.configuration.download_to
71
+ end
37
72
  end
38
73
  end
@@ -7,13 +7,14 @@ module Miteru
7
7
  class Notifier
8
8
  def notify(url:, kits:, message:)
9
9
  attachement = Attachement.new(url)
10
+ kits = kits.select(&:filesize)
10
11
 
11
- if post_to_slack? && !kits.empty?
12
+ if post_to_slack? && kits.any?
12
13
  notifier = Slack::Notifier.new(slack_webhook_url, channel: slack_channel)
13
14
  notifier.post(text: message, attachments: attachement.to_a)
14
15
  end
15
16
 
16
- message = message.colorize(:light_red) unless kits.empty?
17
+ message = message.colorize(:light_red) if kits.any?
17
18
  puts "#{url}: #{message}"
18
19
  end
19
20
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Miteru
4
- VERSION = "0.12.11"
4
+ VERSION = "0.14.1"
5
5
  end
@@ -41,9 +41,9 @@ module Miteru
41
41
  def message
42
42
  return "It doesn't contain a phishing kit." unless kits?
43
43
 
44
- kit_names = kits.map(&:filename).join(", ")
44
+ filename_with_sizes = kits.map(&:filename_with_size).join(", ")
45
45
  noun = kits.length == 1 ? "a phishing kit" : "phishing kits"
46
- "It might contain #{noun}: #{kit_names}."
46
+ "It might contain #{noun}: #{filename_with_sizes}."
47
47
  end
48
48
 
49
49
  private
@@ -24,19 +24,20 @@ Gem::Specification.new do |spec|
24
24
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
25
25
  spec.require_paths = ["lib"]
26
26
 
27
- spec.add_development_dependency "bundler", "~> 2.0"
27
+ spec.add_development_dependency "bundler", "~> 2.1"
28
28
  spec.add_development_dependency "coveralls", "~> 0.8"
29
29
  spec.add_development_dependency "glint", "~> 0.1"
30
30
  spec.add_development_dependency "rake", "~> 13.0"
31
- spec.add_development_dependency "rspec", "~> 3.8"
32
- spec.add_development_dependency "vcr", "~> 5.0"
33
- spec.add_development_dependency "webmock", "~> 3.7"
31
+ spec.add_development_dependency "rspec", "~> 3.9"
32
+ spec.add_development_dependency "vcr", "~> 6.0"
33
+ spec.add_development_dependency "webmock", "~> 3.8"
34
34
 
35
35
  spec.add_dependency "colorize", "~> 0.8"
36
- spec.add_dependency "down", "~> 5.0"
37
- spec.add_dependency "http", "~> 4.1"
38
- spec.add_dependency "oga", "~> 2.15"
39
- spec.add_dependency "parallel", "~> 1.18"
36
+ spec.add_dependency "down", "~> 5.1"
37
+ spec.add_dependency "http", "~> 4.4"
38
+ spec.add_dependency "oga", "~> 3.2"
39
+ spec.add_dependency "parallel", "~> 1.19"
40
40
  spec.add_dependency "slack-notifier", "~> 2.3"
41
- spec.add_dependency "thor", "~> 0.20"
41
+ spec.add_dependency "thor", "~> 1.0"
42
+ spec.add_dependency "urlscan", "~> 0.5"
42
43
  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.11
4
+ version: 0.14.1
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-10-09 00:00:00.000000000 Z
11
+ date: 2020-06-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '2.0'
19
+ version: '2.1'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '2.0'
26
+ version: '2.1'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: coveralls
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -72,42 +72,42 @@ dependencies:
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '3.8'
75
+ version: '3.9'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '3.8'
82
+ version: '3.9'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: vcr
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '5.0'
89
+ version: '6.0'
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: '5.0'
96
+ version: '6.0'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: webmock
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: '3.7'
103
+ version: '3.8'
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.7'
110
+ version: '3.8'
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: colorize
113
113
  requirement: !ruby/object:Gem::Requirement
@@ -128,56 +128,56 @@ dependencies:
128
128
  requirements:
129
129
  - - "~>"
130
130
  - !ruby/object:Gem::Version
131
- version: '5.0'
131
+ version: '5.1'
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: '5.0'
138
+ version: '5.1'
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: http
141
141
  requirement: !ruby/object:Gem::Requirement
142
142
  requirements:
143
143
  - - "~>"
144
144
  - !ruby/object:Gem::Version
145
- version: '4.1'
145
+ version: '4.4'
146
146
  type: :runtime
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
150
  - - "~>"
151
151
  - !ruby/object:Gem::Version
152
- version: '4.1'
152
+ version: '4.4'
153
153
  - !ruby/object:Gem::Dependency
154
154
  name: oga
155
155
  requirement: !ruby/object:Gem::Requirement
156
156
  requirements:
157
157
  - - "~>"
158
158
  - !ruby/object:Gem::Version
159
- version: '2.15'
159
+ version: '3.2'
160
160
  type: :runtime
161
161
  prerelease: false
162
162
  version_requirements: !ruby/object:Gem::Requirement
163
163
  requirements:
164
164
  - - "~>"
165
165
  - !ruby/object:Gem::Version
166
- version: '2.15'
166
+ version: '3.2'
167
167
  - !ruby/object:Gem::Dependency
168
168
  name: parallel
169
169
  requirement: !ruby/object:Gem::Requirement
170
170
  requirements:
171
171
  - - "~>"
172
172
  - !ruby/object:Gem::Version
173
- version: '1.18'
173
+ version: '1.19'
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.18'
180
+ version: '1.19'
181
181
  - !ruby/object:Gem::Dependency
182
182
  name: slack-notifier
183
183
  requirement: !ruby/object:Gem::Requirement
@@ -198,14 +198,28 @@ dependencies:
198
198
  requirements:
199
199
  - - "~>"
200
200
  - !ruby/object:Gem::Version
201
- version: '0.20'
201
+ version: '1.0'
202
+ type: :runtime
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - "~>"
207
+ - !ruby/object:Gem::Version
208
+ version: '1.0'
209
+ - !ruby/object:Gem::Dependency
210
+ name: urlscan
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - "~>"
214
+ - !ruby/object:Gem::Version
215
+ version: '0.5'
202
216
  type: :runtime
203
217
  prerelease: false
204
218
  version_requirements: !ruby/object:Gem::Requirement
205
219
  requirements:
206
220
  - - "~>"
207
221
  - !ruby/object:Gem::Version
208
- version: '0.20'
222
+ version: '0.5'
209
223
  description: An experimental phishing kit detector
210
224
  email:
211
225
  - manabu.niseki@gmail.com
@@ -235,7 +249,10 @@ files:
235
249
  - lib/miteru/feeds.rb
236
250
  - lib/miteru/feeds/ayashige.rb
237
251
  - lib/miteru/feeds/feed.rb
252
+ - lib/miteru/feeds/phishing_database.rb
253
+ - lib/miteru/feeds/phishstats.rb
238
254
  - lib/miteru/feeds/urlscan.rb
255
+ - lib/miteru/feeds/urlscan_pro.rb
239
256
  - lib/miteru/http_client.rb
240
257
  - lib/miteru/kit.rb
241
258
  - lib/miteru/notifier.rb
@@ -262,7 +279,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
262
279
  - !ruby/object:Gem::Version
263
280
  version: '0'
264
281
  requirements: []
265
- rubygems_version: 3.0.6
282
+ rubygems_version: 3.1.2
266
283
  signing_key:
267
284
  specification_version: 4
268
285
  summary: An experimental phishing kit detector