rogue_one 0.3.0 → 0.4.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6967b5c72247d5e6709f0ba71a7402bd181ec8dec2bdc6caa8bd588a01c9d409
4
- data.tar.gz: 2a79181907673bb4c64b97fe706ce3a3d200260d71f361117f6b42d0fd3c4ba6
3
+ metadata.gz: b93f5fd8739dbb15739809bba1f391a913d5e7e3a8822a07487f9942ee307ac6
4
+ data.tar.gz: c413a952f102a75f3bbf7db003373eebe1ecd8b0f92c52db345dbda3d562bff1
5
5
  SHA512:
6
- metadata.gz: 910aa8d5b1715407536204b63ac365006ff5ae0b7b09e51d42fcae4391a0be7cb1139f25c7131d3f14b386bb1e283f4be14a5b1d7a1b35a8fc01e18fbce21359
7
- data.tar.gz: c408c4cba8b1b170771adf46132357221db2c00100cfb0991f5547c386d299bbb129dd375609636bd426feae46a06c3dd91cdfdc73ba9528f453c665e471870e
6
+ metadata.gz: 477c391a0c54c2889ff000048c24952355e2e9c26116a68c7748e6e64d16ca0657264c81a6ce6c56d2251c5d830c8075efd81ccfb3a6151d03914e083927c9a3
7
+ data.tar.gz: 3c4ebc1b64c51d0299c969363fd5d51223f4ef21912c4957ac8d8db1666295f3f070919674687935d48f2e45334f7d4e66fabb96ef4a39e36ef0a7b56c9f903e
@@ -0,0 +1,23 @@
1
+ name: Ruby CI
2
+
3
+ on: [pull_request]
4
+
5
+ jobs:
6
+ build:
7
+ runs-on: ubuntu-latest
8
+
9
+ strategy:
10
+ fail-fast: false
11
+ matrix:
12
+ ruby: [2.7, "3.0"]
13
+
14
+ steps:
15
+ - uses: actions/checkout@v2
16
+ - name: Set up Ruby
17
+ uses: ruby/setup-ruby@v1
18
+ with:
19
+ ruby-version: ${{ matrix.ruby }}
20
+ bundler-cache: true
21
+ - name: Build and test with Rake
22
+ run: |
23
+ bundle exec rake
data/Gemfile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source "https://rubygems.org"
2
4
 
3
5
  # Specify your gem's dependencies in rogue_one.gemspec
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # Rogue one
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/rogue_one.svg)](https://badge.fury.io/rb/rogue_one)
4
- [![Build Status](https://travis-ci.org/ninoseki/rogue_one.svg?branch=master)](https://travis-ci.org/ninoseki/rogue_one)
4
+ [![Ruby CI](https://github.com/ninoseki/rogue_one/actions/workflows/test.yaml/badge.svg)](https://github.com/ninoseki/rogue_one/actions/workflows/test.yaml)
5
5
  [![CodeFactor](https://www.codefactor.io/repository/github/ninoseki/rogue_one/badge)](https://www.codefactor.io/repository/github/ninoseki/rogue_one)
6
6
  [![Coverage Status](https://coveralls.io/repos/github/ninoseki/rogue_one/badge.svg?branch=master)](https://coveralls.io/github/ninoseki/rogue_one?branch=master)
7
7
 
@@ -39,8 +39,12 @@ Usage:
39
39
  rogue_one report [DNS_SERVER]
40
40
 
41
41
  Options:
42
- [--custom-list=CUSTOM_LIST] # A path to a custom list of domains
43
- [--threshold=N] # Threshold value for determining malicious or not
42
+ [--custom-list=CUSTOM_LIST] # A path to a custom list of domains
43
+ [--default-list=DEFAULT_LIST] # A default list of top 100 domains (Alexa or Fortune)
44
+ # Default: alexa
45
+ [--record-type=RECORD_TYPE] # A type of the DNS resource to check
46
+ # Default: A
47
+ [--threshold=N] # Threshold value for determining malicious or not
44
48
  [--verbose], [--no-verbose]
45
49
 
46
50
  Show a report of a given DNS server
@@ -71,11 +75,11 @@ $ rogue_one report 171.244.3.111 --custom-list tmp/roaming.yml
71
75
  "58.82.243.9"
72
76
  ]
73
77
  }
74
- # Note: a custom list should be an array of domains in YAML format.
78
+ # Note: a custom list should be an array of domains in a YAML file.
75
79
  ```
76
80
 
77
81
  | Key | Desc. |
78
- | ------------- | ------------------------------------------------------------------------ |
82
+ |---------------|--------------------------------------------------------------------------|
79
83
  | verdict | A detection result (`rogue one` or `benign one`) |
80
84
  | landing_pages | An array of IP of landing pages |
81
85
  | results | DNS resolution results (only available if --verbose option is specified) |
data/Rakefile CHANGED
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "bundler/gem_tasks"
2
4
  require "rspec/core/rake_task"
3
5
 
4
6
  RSpec::Core::RakeTask.new(:spec)
5
7
 
6
- task :default => :spec
8
+ task default: :spec
data/bin/console CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require "bundler/setup"
4
5
  require "rogue_one"
data/exe/rogue_one CHANGED
@@ -5,4 +5,6 @@ $LOAD_PATH.unshift("#{__dir__}/../lib")
5
5
 
6
6
  require "rogue_one"
7
7
 
8
- RogueOne::CLI.start
8
+ ARGV.unshift(RogueOne::CLI.default_task) unless RogueOne::CLI.all_tasks.key?(ARGV[0])
9
+
10
+ RogueOne::CLI.start(ARGV)
data/lib/rogue_one/cli.rb CHANGED
@@ -5,8 +5,16 @@ require "json"
5
5
 
6
6
  module RogueOne
7
7
  class CLI < Thor
8
+ class << self
9
+ def exit_on_failure?
10
+ true
11
+ end
12
+ end
13
+
8
14
  desc "report [DNS_SERVER]", "Show a report of a given DNS server"
9
15
  method_option :custom_list, type: :string, desc: "A path to a custom list of domains"
16
+ method_option :default_list, type: :string, default: "alexa", desc: "A default list of top 100 domains (Alexa or Fortune)"
17
+ method_option :record_type, type: :string, default: "A", desc: "A type of the DNS resource to check"
10
18
  method_option :threshold, type: :numeric, desc: "Threshold value for determining malicious or not"
11
19
  method_option :verbose, type: :boolean
12
20
  def report(dns_server)
@@ -14,12 +22,23 @@ module RogueOne
14
22
  Ping.pong? dns_server
15
23
 
16
24
  custom_list = options["custom_list"]
25
+ default_list = options["default_list"].downcase
26
+ record_type = options["record_type"].upcase
17
27
  threshold = options["threshold"]
18
28
  verbose = options["verbose"]
19
- detector = Detector.new(target: dns_server, custom_list: custom_list, threshold: threshold, verbose: verbose)
29
+
30
+ detector = Detector.new(
31
+ custom_list: custom_list,
32
+ default_list: default_list,
33
+ record_type: record_type,
34
+ target: dns_server,
35
+ threshold: threshold,
36
+ verbose: verbose,
37
+ )
20
38
  puts JSON.pretty_generate(detector.report)
21
39
  end
22
40
  end
41
+ default_command :report
23
42
 
24
43
  no_commands do
25
44
  def with_error_handling
@@ -0,0 +1,101 @@
1
+ ---
2
+ - google.com
3
+ - youtube.com
4
+ - tmall.com
5
+ - baidu.com
6
+ - qq.com
7
+ - sohu.com
8
+ - facebook.com
9
+ - login.tmall.com
10
+ - wikipedia.org
11
+ - taobao.com
12
+ - yahoo.com
13
+ - jd.com
14
+ - 360.cn
15
+ - amazon.com
16
+ - sina.com.cn
17
+ - weibo.com
18
+ - pages.tmall.com
19
+ - reddit.com
20
+ - live.com
21
+ - vk.com
22
+ - okezone.com
23
+ - netflix.com
24
+ - blogspot.com
25
+ - office.com
26
+ - csdn.net
27
+ - alipay.com
28
+ - xinhuanet.com
29
+ - stackoverflow.com
30
+ - yahoo.co.jp
31
+ - instagram.com
32
+ - google.com.hk
33
+ - aliexpress.com
34
+ - microsoft.com
35
+ - babytree.com
36
+ - naver.com
37
+ - twitter.com
38
+ - bing.com
39
+ - livejasmin.com
40
+ - amazon.co.jp
41
+ - tribunnews.com
42
+ - ebay.com
43
+ - salesforce.com
44
+ - twitch.tv
45
+ - google.co.in
46
+ - force.com
47
+ - microsoftonline.com
48
+ - apple.com
49
+ - tianya.cn
50
+ - adobe.com
51
+ - pornhub.com
52
+ - msn.com
53
+ - zhanqi.tv
54
+ - dropbox.com
55
+ - linkedin.com
56
+ - yandex.ru
57
+ - wordpress.com
58
+ - myshopify.com
59
+ - amazon.in
60
+ - mail.ru
61
+ - panda.tv
62
+ - imdb.com
63
+ - caijing.com.cn
64
+ - china.com.cn
65
+ - mama.cn
66
+ - amazonaws.com
67
+ - google.com.br
68
+ - trello.com
69
+ - bongacams.com
70
+ - google.de
71
+ - medium.com
72
+ - google.co.jp
73
+ - soso.com
74
+ - booking.com
75
+ - w3schools.com
76
+ - amazon.co.uk
77
+ - spotify.com
78
+ - amazon.de
79
+ - rednet.cn
80
+ - bbc.com
81
+ - detail.tmall.com
82
+ - xvideos.com
83
+ - espn.com
84
+ - detik.com
85
+ - github.com
86
+ - cnn.com
87
+ - instructure.com
88
+ - ok.ru
89
+ - indeed.com
90
+ - yy.com
91
+ - tumblr.com
92
+ - huanqiu.com
93
+ - stackexchange.com
94
+ - nytimes.com
95
+ - imgur.com
96
+ - soundcloud.com
97
+ - whatsapp.com
98
+ - rakuten.co.jp
99
+ - nih.gov
100
+ - sogou.com
101
+ - google.cn
@@ -0,0 +1,101 @@
1
+ ---
2
+ - walmart.com
3
+ - exxonmobil.com
4
+ - berkshirehathaway.com
5
+ - apple.com
6
+ - unitedhealthgroup.com
7
+ - mckesson.com
8
+ - cvshealth.com
9
+ - amazon.com
10
+ - att.com
11
+ - gm.com
12
+ - ford.com
13
+ - amerisourcebergen.com
14
+ - chevron.com
15
+ - cardinalhealth.com
16
+ - costco.com
17
+ - verizon.com
18
+ - kroger.com
19
+ - ge.com
20
+ - walgreensbootsalliance.com
21
+ - jpmorganchase.com
22
+ - fanniemae.com
23
+ - abc.xyz
24
+ - homedepot.com
25
+ - bankofamerica.com
26
+ - express-scripts.com
27
+ - wellsfargo.com
28
+ - boeing.com
29
+ - phillips66.com
30
+ - antheminc.com
31
+ - microsoft.com
32
+ - valero.com
33
+ - citigroup.com
34
+ - comcastcorporation.com
35
+ - ibm.com
36
+ - delltechnologies.com
37
+ - statefarm.com
38
+ - jnj.com
39
+ - freddiemac.com
40
+ - target.com
41
+ - lowes.com
42
+ - marathonpetroleum.com
43
+ - pg.com
44
+ - metlife.com
45
+ - ups.com
46
+ - pepsico.com
47
+ - intel.com
48
+ - dow-dupont.com
49
+ - adm.com
50
+ - aetna.com
51
+ - fedex.com
52
+ - utc.com
53
+ - prudential.com
54
+ - albertsons.com
55
+ - sysco.com
56
+ - disney.com
57
+ - humana.com
58
+ - pfizer.com
59
+ - hp.com
60
+ - lockheedmartin.com
61
+ - aig.com
62
+ - centene.com
63
+ - cisco.com
64
+ - hcahealthcare.com
65
+ - energytransfer.com
66
+ - caterpillar.com
67
+ - nationwide.com
68
+ - morganstanley.com
69
+ - libertymutual.com
70
+ - newyorklife.com
71
+ - gs.com
72
+ - aa.com
73
+ - bestbuy.com
74
+ - cigna.com
75
+ - charter.com
76
+ - delta.com
77
+ - facebook.com
78
+ - honeywell.com
79
+ - merck.com
80
+ - allstate.com
81
+ - tysonfoods.com
82
+ - united.com
83
+ - oracle.com
84
+ - techdata.com
85
+ - tiaa.org
86
+ - tjx.com
87
+ - americanexpress.com
88
+ - coca-colacompany.com
89
+ - publix.com
90
+ - nike.com
91
+ - andeavor.com
92
+ - wfscorp.com
93
+ - exeloncorp.com
94
+ - massmutual.com
95
+ - riteaid.com
96
+ - conocophillips.com
97
+ - chsinc.com
98
+ - 3m.com
99
+ - timewarner.com
100
+ - generaldynamics.com
101
+ - usaa.com
@@ -1,22 +1,37 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "async"
4
+ require "async/barrier"
5
+ require "async/dns"
6
+ require "async/reactor"
7
+ require "async/semaphore"
8
+ require "resolv"
3
9
  require "yaml"
4
- require "parallel"
10
+ require "etc"
5
11
 
6
12
  module RogueOne
7
13
  class Detector
8
- attr_reader :target
9
- attr_reader :custom_list
10
- attr_reader :verbose
14
+ attr_reader :custom_list, :default_list, :max_concurrency, :record_type, :target, :verbose
11
15
 
12
16
  GOOGLE_PUBLIC_DNS = "8.8.8.8"
13
17
 
14
- def initialize(target:, custom_list: nil, threshold: nil, verbose: false)
18
+ def initialize(
19
+ target:,
20
+ custom_list: nil,
21
+ default_list: "alexa",
22
+ record_type: "A",
23
+ threshold: nil,
24
+ verbose: false
25
+ )
15
26
  @target = target
27
+
16
28
  @custom_list = custom_list
29
+ @default_list = default_list
30
+ @record_type = record_type.upcase.to_sym
17
31
  @threshold = threshold
18
32
  @verbose = verbose
19
33
 
34
+ @max_concurrency = Etc.nprocessors * 2
20
35
  @memo = {}
21
36
  @verbose_memo = nil
22
37
  end
@@ -49,13 +64,16 @@ module RogueOne
49
64
  def meta
50
65
  return nil unless verbose
51
66
 
52
- { threshold: threshold }
67
+ {
68
+ record_type: record_type,
69
+ threshold: threshold,
70
+ }
53
71
  end
54
72
 
55
73
  def landing_pages
56
- @memo.map do |ip, count|
74
+ @memo.filter_map do |ip, count|
57
75
  count > threshold ? ip : nil
58
- end.compact.sort
76
+ end.sort
59
77
  end
60
78
 
61
79
  def results
@@ -78,19 +96,28 @@ module RogueOne
78
96
  def inspect
79
97
  return unless @memo.empty?
80
98
 
81
- results = Parallel.map(domains) do |domain|
82
- normal_results = normal_resolver.get_resources(domain, "A")
83
- target_result = target_resolver.get_resource(domain, "A")
99
+ # read domains outside of the async blocks
100
+ load_domains
84
101
 
85
- [domain, target_result] if target_result && !normal_results.include?(target_result)
86
- end.compact.to_h
102
+ normal_resolutions = bulk_resolve(normal_resolver, domains)
103
+ resolutions = bulk_resolve(target_resolver, domains)
87
104
 
88
- @memo = results.values.group_by(&:itself).map { |k, v| [k, v.length] }.to_h
105
+ results = resolutions.filter_map do |domain, addresses|
106
+ normal_addresses = normal_resolutions[domain] || []
107
+ address = (addresses || []).first
108
+ [domain, address] if address && !normal_addresses.include?(address)
109
+ end.to_h
110
+
111
+ @memo = results.values.group_by(&:itself).transform_values(&:length)
89
112
  @verbose_memo = results if verbose
90
113
  end
91
114
 
115
+ def load_domains
116
+ domains
117
+ end
118
+
92
119
  def domains
93
- @domains ||= custom_domains || top_100_domains
120
+ @domains ||= custom_list ? custom_domains : top_100_domains
94
121
  end
95
122
 
96
123
  def custom_domains
@@ -98,20 +125,61 @@ module RogueOne
98
125
  end
99
126
 
100
127
  def top_100_domains
101
- read_domains File.expand_path("./data/top_100.yml", __dir__)
128
+ case default_list
129
+ when "alexa"
130
+ read_domains File.expand_path("./data/alexa_100.yml", __dir__)
131
+ when "fortune"
132
+ read_domains File.expand_path("./data/fortune_100.yml", __dir__)
133
+ end
102
134
  end
103
135
 
104
136
  def read_domains(path)
105
137
  list = DomainList.new(path)
106
- list.valid? ? list.domains : nil
138
+ return list.domains if list.valid?
139
+
140
+ raise ArgumentError, "Inputted an invalid list. #{path} does not eixst." unless list.exists?
141
+ raise ArgumentError, "Inputted an invalid list. Please input a list via a YAML file." unless list.valid_format?
142
+ end
143
+
144
+ def bulk_resolve(resolver, domains)
145
+ results = []
146
+
147
+ Async do
148
+ barrier = Async::Barrier.new
149
+ semaphore = Async::Semaphore.new(max_concurrency, parent: barrier)
150
+
151
+ domains.each do |domain|
152
+ semaphore.async do
153
+ addresses = []
154
+ begin
155
+ addresses = resolver.addresses_for(domain, dns_resource_by_record_type, { retries: 1 }).map(&:to_s)
156
+ rescue Async::DNS::ResolutionFailure
157
+ # do nothing
158
+ end
159
+ results << [domain, addresses]
160
+ end
161
+ end
162
+ end
163
+ results.to_h
107
164
  end
108
165
 
109
166
  def normal_resolver
110
- @normal_resolver ||= Resolver.new(nameserver: GOOGLE_PUBLIC_DNS)
167
+ Async::DNS::Resolver.new([[:udp, GOOGLE_PUBLIC_DNS, 53], [:tcp, GOOGLE_PUBLIC_DNS, 53]])
111
168
  end
112
169
 
113
170
  def target_resolver
114
- @target_resolver ||= Resolver.new(nameserver: target)
171
+ Async::DNS::Resolver.new([[:udp, target, 53], [:tcp, target, 53]])
172
+ end
173
+
174
+ def dns_resource_by_record_type
175
+ @dns_resource_by_record_type ||= dns_resources[record_type]
176
+ end
177
+
178
+ def dns_resources
179
+ {
180
+ A: Resolv::DNS::Resource::IN::A,
181
+ AAAA: Resolv::DNS::Resource::IN::AAAA,
182
+ }
115
183
  end
116
184
  end
117
185
  end
@@ -18,8 +18,6 @@ module RogueOne
18
18
  @domains ||= exists? ? YAML.safe_load(File.read(path)) : nil
19
19
  end
20
20
 
21
- private
22
-
23
21
  def exists?
24
22
  File.exist?(path)
25
23
  end
@@ -1,16 +1,26 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "resolv"
4
+
3
5
  module RogueOne
4
6
  class Ping
5
- attr_reader :resolver
7
+ attr_reader :resolver, :nameserver
6
8
 
7
9
  def initialize(nameserver)
8
- @resolver = Resolver.new(nameserver: nameserver)
10
+ @nameserver = nameserver
11
+ @resolver = Resolv::DNS.new(nameserver: [nameserver])
12
+ @resolver.timeouts = 5
13
+ end
14
+
15
+ def get_a_record
16
+ resolver.getresource("example.com", Resolv::DNS::Resource::IN::A)
17
+ rescue Resolv::ResolvError => _e
18
+ nil
9
19
  end
10
20
 
11
21
  def pong?
12
- result = resolver.get_resource("example.com", "A")
13
- raise Error, "DNS resolve error: there is no resopnse from #{resolver.nameserver}" unless result
22
+ result = get_a_record
23
+ raise Error, "DNS resolve error: there is no resopnse from #{nameserver}" unless result
14
24
 
15
25
  true
16
26
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RogueOne
4
- VERSION = "0.3.0"
4
+ VERSION = "0.4.3"
5
5
  end
data/lib/rogue_one.rb CHANGED
@@ -4,7 +4,6 @@ require "rogue_one/version"
4
4
 
5
5
  require "rogue_one/domain_list"
6
6
 
7
- require "rogue_one/resolver"
8
7
  require "rogue_one/detector"
9
8
  require "rogue_one/ping"
10
9
  require "rogue_one/cli"
data/renovate.json ADDED
@@ -0,0 +1,5 @@
1
+ {
2
+ "extends": [
3
+ "config:base"
4
+ ]
5
+ }
data/rogue_one.gemspec CHANGED
@@ -24,11 +24,11 @@ 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"
28
- spec.add_development_dependency "coveralls", "~> 0.8"
27
+ spec.add_development_dependency "bundler", "~> 2.2"
28
+ spec.add_development_dependency "coveralls_reborn", "~> 0.23"
29
29
  spec.add_development_dependency "rake", "~> 13.0"
30
- spec.add_development_dependency "rspec", "~> 3.9"
30
+ spec.add_development_dependency "rspec", "~> 3.10"
31
31
 
32
- spec.add_dependency "parallel", "~> 1.18"
33
- spec.add_dependency "thor", "~> 0.20"
32
+ spec.add_dependency "async-dns", "~> 1.3"
33
+ spec.add_dependency "thor", "~> 1.1"
34
34
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rogue_one
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Manabu Niseki
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-11-12 00:00:00.000000000 Z
11
+ date: 2021-10-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '2.0'
19
+ version: '2.2'
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.2'
27
27
  - !ruby/object:Gem::Dependency
28
- name: coveralls
28
+ name: coveralls_reborn
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0.8'
33
+ version: '0.23'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0.8'
40
+ version: '0.23'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -58,42 +58,42 @@ dependencies:
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '3.9'
61
+ version: '3.10'
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: '3.9'
68
+ version: '3.10'
69
69
  - !ruby/object:Gem::Dependency
70
- name: parallel
70
+ name: async-dns
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '1.18'
75
+ version: '1.3'
76
76
  type: :runtime
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: '1.18'
82
+ version: '1.3'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: thor
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '0.20'
89
+ version: '1.1'
90
90
  type: :runtime
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: '0.20'
96
+ version: '1.1'
97
97
  description: A rogue DNS detector
98
98
  email:
99
99
  - manabu.niseki@gmail.com
@@ -102,9 +102,9 @@ executables:
102
102
  extensions: []
103
103
  extra_rdoc_files: []
104
104
  files:
105
+ - ".github/workflows/test.yaml"
105
106
  - ".gitignore"
106
107
  - ".rspec"
107
- - ".travis.yml"
108
108
  - Gemfile
109
109
  - LICENSE
110
110
  - README.md
@@ -115,18 +115,19 @@ files:
115
115
  - images/eyecatch.png
116
116
  - lib/rogue_one.rb
117
117
  - lib/rogue_one/cli.rb
118
- - lib/rogue_one/data/top_100.yml
118
+ - lib/rogue_one/data/alexa_100.yml
119
+ - lib/rogue_one/data/fortune_100.yml
119
120
  - lib/rogue_one/detector.rb
120
121
  - lib/rogue_one/domain_list.rb
121
122
  - lib/rogue_one/ping.rb
122
- - lib/rogue_one/resolver.rb
123
123
  - lib/rogue_one/version.rb
124
+ - renovate.json
124
125
  - rogue_one.gemspec
125
126
  homepage: https://github.com/ninoseki/rogue_one
126
127
  licenses:
127
128
  - MIT
128
129
  metadata: {}
129
- post_install_message:
130
+ post_install_message:
130
131
  rdoc_options: []
131
132
  require_paths:
132
133
  - lib
@@ -141,8 +142,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
141
142
  - !ruby/object:Gem::Version
142
143
  version: '0'
143
144
  requirements: []
144
- rubygems_version: 3.0.3
145
- signing_key:
145
+ rubygems_version: 3.2.22
146
+ signing_key:
146
147
  specification_version: 4
147
148
  summary: A rogue DNS detector
148
149
  test_files: []
data/.travis.yml DELETED
@@ -1,7 +0,0 @@
1
- ---
2
- sudo: false
3
- language: ruby
4
- cache: bundler
5
- rvm:
6
- - 2.6
7
- before_install: gem install bundler -v 2.0.1
@@ -1,101 +0,0 @@
1
- ---
2
- - google.com
3
- - facebook.com
4
- - youtube.com
5
- - yahoo.com
6
- - baidu.com
7
- - wikipedia.org
8
- - qq.com
9
- - taobao.com
10
- - twitter.com
11
- - amazon.com
12
- - linkedin.com
13
- - live.com
14
- - google.co.in
15
- - sina.com.cn
16
- - hao123.com
17
- - blogspot.com
18
- - weibo.com
19
- - tmall.com
20
- - vk.com
21
- - wordpress.com
22
- - yahoo.co.jp
23
- - sohu.com
24
- - yandex.ru
25
- - ebay.com
26
- - google.de
27
- - bing.com
28
- - pinterest.com
29
- - google.co.uk
30
- - 163.com
31
- - 360.cn
32
- - google.fr
33
- - ask.com
34
- - instagram.com
35
- - google.co.jp
36
- - tumblr.com
37
- - msn.com
38
- - google.com.br
39
- - mail.ru
40
- - microsoft.com
41
- - xvideos.com
42
- - paypal.com
43
- - google.ru
44
- - soso.com
45
- - adcash.com
46
- - google.es
47
- - google.it
48
- - imdb.com
49
- - apple.com
50
- - imgur.com
51
- - neobux.com
52
- - craigslist.org
53
- - amazon.co.jp
54
- - t.co
55
- - xhamster.com
56
- - stackoverflow.com
57
- - reddit.com
58
- - google.com.mx
59
- - google.com.hk
60
- - cnn.com
61
- - google.ca
62
- - fc2.com
63
- - go.com
64
- - ifeng.com
65
- - bbc.co.uk
66
- - vube.com
67
- - people.com.cn
68
- - blogger.com
69
- - aliexpress.com
70
- - odnoklassniki.ru
71
- - wordpress.org
72
- - alibaba.com
73
- - gmw.cn
74
- - adobe.com
75
- - huffingtonpost.com
76
- - google.com.tr
77
- - xinhuanet.com
78
- - googleusercontent.com
79
- - youku.com
80
- - godaddy.com
81
- - pornhub.com
82
- - akamaihd.net
83
- - thepiratebay.se
84
- - kickass.to
85
- - google.com.au
86
- - amazon.de
87
- - clkmon.com
88
- - ebay.de
89
- - alipay.com
90
- - google.pl
91
- - espn.go.com
92
- - dailymotion.com
93
- - about.com
94
- - bp.blogspot.com
95
- - blogspot.in
96
- - netflix.com
97
- - vimeo.com
98
- - dailymail.co.uk
99
- - redtube.com
100
- - rakuten.co.jp
101
- - conduit.com
@@ -1,55 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "resolv"
4
-
5
- module RogueOne
6
- class Resolver
7
- attr_reader :nameserver
8
-
9
- def initialize(nameserver:)
10
- @nameserver = nameserver
11
- end
12
-
13
- def get_resource(domain, type)
14
- _resolver.getresource(domain, resource_by_type(type)).address.to_s
15
- rescue Resolv::ResolvError => _e
16
- nil
17
- end
18
-
19
- def get_resources(domain, type)
20
- _resolver.getresources(domain, resource_by_type(type)).map { |r| r.address.to_s }
21
- rescue Resolv::ResolvError => _e
22
- nil
23
- end
24
-
25
- private
26
-
27
- def _resolver
28
- @_resolver ||= Resolv::DNS.new(nameserver: [nameserver])
29
- @_resolver.timeouts = 5
30
- @_resolver
31
- end
32
-
33
- def resource_by_type(type)
34
- resources.dig(type.upcase.to_sym)
35
- end
36
-
37
- def resources
38
- {
39
- ANY: Resolv::DNS::Resource::IN::ANY,
40
- NS: Resolv::DNS::Resource::IN::NS,
41
- CNAME: Resolv::DNS::Resource::IN::CNAME,
42
- SOA: Resolv::DNS::Resource::IN::SOA,
43
- HINFO: Resolv::DNS::Resource::IN::HINFO,
44
- MINFO: Resolv::DNS::Resource::IN::MINFO,
45
- MX: Resolv::DNS::Resource::IN::MX,
46
- TXT: Resolv::DNS::Resource::IN::TXT,
47
- A: Resolv::DNS::Resource::IN::A,
48
- WKS: Resolv::DNS::Resource::IN::WKS,
49
- PTR: Resolv::DNS::Resource::IN::PTR,
50
- AAAA: Resolv::DNS::Resource::IN::AAAA,
51
- SRV: Resolv::DNS::Resource::IN::SRV,
52
- }
53
- end
54
- end
55
- end