dnstraverse 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +674 -0
- data/README +4 -0
- data/Rakefile +19 -0
- data/a +44 -0
- data/bin/dnstraverse +300 -0
- data/doc.tar +0 -0
- data/doc/classes/DNSTraverse.html +198 -0
- data/doc/classes/DNSTraverse/CachingResolver.html +172 -0
- data/doc/classes/DNSTraverse/CachingResolver.src/M000055.html +21 -0
- data/doc/classes/DNSTraverse/CachingResolver.src/M000056.html +42 -0
- data/doc/classes/DNSTraverse/DecodedQuery.html +475 -0
- data/doc/classes/DNSTraverse/DecodedQuery.src/M000020.html +34 -0
- data/doc/classes/DNSTraverse/DecodedQuery.src/M000021.html +23 -0
- data/doc/classes/DNSTraverse/DecodedQuery.src/M000022.html +19 -0
- data/doc/classes/DNSTraverse/DecodedQuery.src/M000023.html +33 -0
- data/doc/classes/DNSTraverse/DecodedQuery.src/M000024.html +26 -0
- data/doc/classes/DNSTraverse/DecodedQuery.src/M000025.html +24 -0
- data/doc/classes/DNSTraverse/DecodedQuery.src/M000026.html +29 -0
- data/doc/classes/DNSTraverse/DecodedQuery.src/M000027.html +19 -0
- data/doc/classes/DNSTraverse/DecodedQuery.src/M000028.html +18 -0
- data/doc/classes/DNSTraverse/DecodedQuery.src/M000029.html +32 -0
- data/doc/classes/DNSTraverse/DecodedQuery.src/M000030.html +19 -0
- data/doc/classes/DNSTraverse/DecodedQuery.src/M000031.html +19 -0
- data/doc/classes/DNSTraverse/DecodedQuery.src/M000032.html +20 -0
- data/doc/classes/DNSTraverse/DecodedQuery.src/M000033.html +31 -0
- data/doc/classes/DNSTraverse/DecodedQueryCache.html +182 -0
- data/doc/classes/DNSTraverse/DecodedQueryCache.src/M000063.html +21 -0
- data/doc/classes/DNSTraverse/DecodedQueryCache.src/M000064.html +33 -0
- data/doc/classes/DNSTraverse/Fingerprint.html +277 -0
- data/doc/classes/DNSTraverse/Fingerprint.src/M000047.html +29 -0
- data/doc/classes/DNSTraverse/Fingerprint.src/M000048.html +18 -0
- data/doc/classes/DNSTraverse/Fingerprint.src/M000049.html +57 -0
- data/doc/classes/DNSTraverse/Fingerprint.src/M000050.html +28 -0
- data/doc/classes/DNSTraverse/Fingerprint.src/M000051.html +27 -0
- data/doc/classes/DNSTraverse/Fingerprint.src/M000052.html +35 -0
- data/doc/classes/DNSTraverse/Fingerprint.src/M000053.html +24 -0
- data/doc/classes/DNSTraverse/Fingerprint.src/M000054.html +29 -0
- data/doc/classes/DNSTraverse/InfoCache.html +235 -0
- data/doc/classes/DNSTraverse/InfoCache.src/M000034.html +20 -0
- data/doc/classes/DNSTraverse/InfoCache.src/M000035.html +23 -0
- data/doc/classes/DNSTraverse/InfoCache.src/M000036.html +28 -0
- data/doc/classes/DNSTraverse/InfoCache.src/M000037.html +25 -0
- data/doc/classes/DNSTraverse/InfoCache.src/M000038.html +27 -0
- data/doc/classes/DNSTraverse/InfoCache.src/M000039.html +33 -0
- data/doc/classes/DNSTraverse/MessageUtility.html +275 -0
- data/doc/classes/DNSTraverse/MessageUtility.src/M000011.html +35 -0
- data/doc/classes/DNSTraverse/MessageUtility.src/M000012.html +37 -0
- data/doc/classes/DNSTraverse/MessageUtility.src/M000013.html +28 -0
- data/doc/classes/DNSTraverse/MessageUtility.src/M000014.html +27 -0
- data/doc/classes/DNSTraverse/MessageUtility.src/M000015.html +30 -0
- data/doc/classes/DNSTraverse/MessageUtility.src/M000016.html +32 -0
- data/doc/classes/DNSTraverse/MessageUtility.src/M000017.html +34 -0
- data/doc/classes/DNSTraverse/MessageUtility.src/M000018.html +23 -0
- data/doc/classes/DNSTraverse/MessageUtility.src/M000019.html +36 -0
- data/doc/classes/DNSTraverse/Referral.html +641 -0
- data/doc/classes/DNSTraverse/Referral.src/M000065.html +22 -0
- data/doc/classes/DNSTraverse/Referral.src/M000066.html +21 -0
- data/doc/classes/DNSTraverse/Referral.src/M000067.html +23 -0
- data/doc/classes/DNSTraverse/Referral.src/M000068.html +19 -0
- data/doc/classes/DNSTraverse/Referral.src/M000069.html +18 -0
- data/doc/classes/DNSTraverse/Referral.src/M000070.html +54 -0
- data/doc/classes/DNSTraverse/Referral.src/M000071.html +25 -0
- data/doc/classes/DNSTraverse/Referral.src/M000072.html +27 -0
- data/doc/classes/DNSTraverse/Referral.src/M000073.html +23 -0
- data/doc/classes/DNSTraverse/Referral.src/M000074.html +20 -0
- data/doc/classes/DNSTraverse/Referral.src/M000075.html +40 -0
- data/doc/classes/DNSTraverse/Referral.src/M000076.html +52 -0
- data/doc/classes/DNSTraverse/Referral.src/M000077.html +29 -0
- data/doc/classes/DNSTraverse/Referral.src/M000078.html +54 -0
- data/doc/classes/DNSTraverse/Referral.src/M000079.html +18 -0
- data/doc/classes/DNSTraverse/Referral.src/M000080.html +22 -0
- data/doc/classes/DNSTraverse/Referral.src/M000081.html +20 -0
- data/doc/classes/DNSTraverse/Referral.src/M000082.html +29 -0
- data/doc/classes/DNSTraverse/Referral.src/M000083.html +28 -0
- data/doc/classes/DNSTraverse/Referral.src/M000084.html +29 -0
- data/doc/classes/DNSTraverse/Referral.src/M000085.html +55 -0
- data/doc/classes/DNSTraverse/Referral.src/M000086.html +30 -0
- data/doc/classes/DNSTraverse/Referral.src/M000087.html +24 -0
- data/doc/classes/DNSTraverse/Referral.src/M000088.html +20 -0
- data/doc/classes/DNSTraverse/Referral.src/M000089.html +58 -0
- data/doc/classes/DNSTraverse/ResolveError.html +111 -0
- data/doc/classes/DNSTraverse/Response.html +271 -0
- data/doc/classes/DNSTraverse/Response.src/M000057.html +27 -0
- data/doc/classes/DNSTraverse/Response.src/M000058.html +21 -0
- data/doc/classes/DNSTraverse/Response.src/M000059.html +19 -0
- data/doc/classes/DNSTraverse/Response.src/M000060.html +21 -0
- data/doc/classes/DNSTraverse/Response.src/M000061.html +31 -0
- data/doc/classes/DNSTraverse/Response.src/M000062.html +23 -0
- data/doc/classes/DNSTraverse/Response/NoGlue.html +222 -0
- data/doc/classes/DNSTraverse/Response/NoGlue.src/M000007.html +32 -0
- data/doc/classes/DNSTraverse/Response/NoGlue.src/M000008.html +18 -0
- data/doc/classes/DNSTraverse/Response/NoGlue.src/M000009.html +18 -0
- data/doc/classes/DNSTraverse/Response/NoGlue.src/M000010.html +18 -0
- data/doc/classes/DNSTraverse/Traverser.html +247 -0
- data/doc/classes/DNSTraverse/Traverser.src/M000040.html +17 -0
- data/doc/classes/DNSTraverse/Traverser.src/M000041.html +52 -0
- data/doc/classes/DNSTraverse/Traverser.src/M000042.html +61 -0
- data/doc/classes/DNSTraverse/Traverser.src/M000043.html +110 -0
- data/doc/classes/DNSTraverse/Traverser.src/M000044.html +63 -0
- data/doc/classes/DNSTraverse/Traverser.src/M000045.html +28 -0
- data/doc/classes/DNSTraverse/Traverser.src/M000046.html +18 -0
- data/doc/classes/FingerprintRules.html +175 -0
- data/doc/classes/Log.html +174 -0
- data/doc/classes/Log.src/M000002.html +18 -0
- data/doc/classes/Log.src/M000003.html +18 -0
- data/doc/classes/Log.src/M000004.html +18 -0
- data/doc/classes/Log/Formatter.html +165 -0
- data/doc/classes/Log/Formatter.src/M000005.html +22 -0
- data/doc/classes/Log/Formatter.src/M000006.html +24 -0
- data/doc/classes/TestFingerprint.html +137 -0
- data/doc/classes/TestFingerprint.src/M000001.html +22 -0
- data/doc/created.rid +1 -0
- data/doc/files/lib/dnstraverse/caching_resolver_rb.html +132 -0
- data/doc/files/lib/dnstraverse/decoded_query_cache_rb.html +132 -0
- data/doc/files/lib/dnstraverse/decoded_query_rb.html +132 -0
- data/doc/files/lib/dnstraverse/fingerprint_rb.html +134 -0
- data/doc/files/lib/dnstraverse/fingerprint_rules_rb.html +143 -0
- data/doc/files/lib/dnstraverse/info_cache_rb.html +131 -0
- data/doc/files/lib/dnstraverse/log_rb.html +131 -0
- data/doc/files/lib/dnstraverse/message_utility_rb.html +124 -0
- data/doc/files/lib/dnstraverse/referral_rb.html +134 -0
- data/doc/files/lib/dnstraverse/response_noglue_rb.html +124 -0
- data/doc/files/lib/dnstraverse/response_rb.html +132 -0
- data/doc/files/lib/dnstraverse/traverser_rb.html +137 -0
- data/doc/files/test/test_fingerprint_rb.html +133 -0
- data/doc/fr_class_index.html +43 -0
- data/doc/fr_file_index.html +39 -0
- data/doc/fr_method_index.html +115 -0
- data/doc/index.html +24 -0
- data/doc/rdoc-style.css +208 -0
- data/lib/dnstraverse/caching_resolver.rb +63 -0
- data/lib/dnstraverse/decoded_query.rb +199 -0
- data/lib/dnstraverse/decoded_query_cache.rb +53 -0
- data/lib/dnstraverse/fingerprint.rb +166 -0
- data/lib/dnstraverse/fingerprint_rules.rb +389 -0
- data/lib/dnstraverse/info_cache.rb +108 -0
- data/lib/dnstraverse/log.rb +55 -0
- data/lib/dnstraverse/message_utility.rb +199 -0
- data/lib/dnstraverse/referral.rb +463 -0
- data/lib/dnstraverse/response.rb +92 -0
- data/lib/dnstraverse/response_noglue.rb +54 -0
- data/lib/dnstraverse/traverser.rb +291 -0
- data/test/test_fingerprint.rb +29 -0
- metadata +231 -0
data/README
ADDED
@@ -0,0 +1,4 @@
|
|
1
|
+
DNSTraverse is a rubygem and command line program that allows you to traverse
|
2
|
+
the DNS from the root exploring all possible ways of getting to the final
|
3
|
+
destination domain name. The results are probabilities of which server will
|
4
|
+
respond and what they will respond with.
|
data/Rakefile
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'rake/gempackagetask'
|
2
|
+
spec = Gem::Specification.new do |s|
|
3
|
+
s.name = 'dnstraverse'
|
4
|
+
s.summary = 'Complete DNS traversal checker'
|
5
|
+
s.description = File.read(File.join(File.dirname(__FILE__), 'README'))
|
6
|
+
s.requirements = []
|
7
|
+
s.version = '0.0.1'
|
8
|
+
s.author = 'James Ponder'
|
9
|
+
s.email = 'james@squish.net'
|
10
|
+
s.homepage = 'http://www.squish.net/dnstraverse/'
|
11
|
+
s.platform = Gem::Platform::RUBY
|
12
|
+
s.required_ruby_version = '>=1.8'
|
13
|
+
s.files = Dir['**/**']
|
14
|
+
s.executables = [ 'dnstraverse' ]
|
15
|
+
s.test_files = Dir["test/test*.rb"]
|
16
|
+
s.has_rdoc = true
|
17
|
+
s.add_dependency('dnsruby', '>= 1.26')
|
18
|
+
end
|
19
|
+
Rake::GemPackageTask.new(spec).define
|
data/a
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
|
2
|
+
ri v1.0.1 - 20041108
|
3
|
+
|
4
|
+
Usage:
|
5
|
+
|
6
|
+
ri [options] [names...]
|
7
|
+
|
8
|
+
Display information on Ruby classes, modules, and methods.
|
9
|
+
Give the names of classes or methods to see their documentation.
|
10
|
+
Partial names may be given: if the names match more than
|
11
|
+
one entity, a list will be shown, otherwise details on
|
12
|
+
that entity will be displayed.
|
13
|
+
|
14
|
+
Nested classes and modules can be specified using the normal
|
15
|
+
Name::Name notation, and instance methods can be distinguished
|
16
|
+
from class methods using "." (or "#") instead of "::".
|
17
|
+
|
18
|
+
For example:
|
19
|
+
|
20
|
+
ri File
|
21
|
+
ri File.new
|
22
|
+
ri F.n
|
23
|
+
ri zip
|
24
|
+
|
25
|
+
Note that shell quoting may be required for method names
|
26
|
+
containing punctuation:
|
27
|
+
|
28
|
+
ri 'Array.[]'
|
29
|
+
ri compact\!
|
30
|
+
|
31
|
+
By default ri searches for documentation in the following
|
32
|
+
directories:
|
33
|
+
|
34
|
+
/usr/share/ri/1.8/system
|
35
|
+
/usr/share/ri/1.8/site
|
36
|
+
/home/james/.rdoc
|
37
|
+
/usr/lib/ruby/gems/1.8/doc/*/ri
|
38
|
+
|
39
|
+
Specifying the --system, --site, --home, --gems or --doc-dir
|
40
|
+
options will limit ri to searching only the specified
|
41
|
+
directories.
|
42
|
+
|
43
|
+
For help on options, type 'ri -h'
|
44
|
+
For a list of classes I know about, type 'ri -c'
|
data/bin/dnstraverse
ADDED
@@ -0,0 +1,300 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# = Summary
|
3
|
+
# Traverse the DNS from the root exploring all possible ways of
|
4
|
+
# getting to the final destination domain name. This is the command
|
5
|
+
# line interface to the DNSTraverse module.
|
6
|
+
#
|
7
|
+
# = Usage
|
8
|
+
# dnstraverse [options] DOMAIN
|
9
|
+
# -t, --type TYPE Select record type (A, AAAA, SRV, WKS, NS,
|
10
|
+
# CNAME, SOA, PTR, HINFO, MINFO, MX, TXT, ANY)
|
11
|
+
# --root-server HOST Root DNS server (default - ask local resolver)
|
12
|
+
# --[no-]all-root-servers Find all root servers (default false)
|
13
|
+
# --root-aaaa TODO Look for IPv6 addresses for root servers
|
14
|
+
# --follow-aaaa TODO Only follow AAAA records for referrals
|
15
|
+
# --udp-size SIZE Turn on EDNS0 with given UDP size
|
16
|
+
# --max-depth DEPTH Maximum depth to traverse (default 10)
|
17
|
+
# --retries TIMES Number of 2s retries before timing out (2)
|
18
|
+
# --[no-]allow-tcp Try using tcp if udp truncated (default true)
|
19
|
+
# --[no-]always-tcp Always use tcp (default false)
|
20
|
+
#
|
21
|
+
# --[no-]show-progress Display progress information (default true)
|
22
|
+
# --[no-]show-all-stats Display statistics as we go (default false)
|
23
|
+
# --[no-]show-resolves Display referral resolutions (default false)
|
24
|
+
# --[no-]show-serverlist Display list of servers seen (default true)
|
25
|
+
# --[no-]show-versions Display versions of dns servers (default true)
|
26
|
+
# --[no-]show-results Display the results (default true)
|
27
|
+
#
|
28
|
+
# --fast Short-cut answers using previous information,
|
29
|
+
# less accurate but usually ok - by-passes the
|
30
|
+
# proper simulation of the resolver cache.
|
31
|
+
#
|
32
|
+
# -v, --[no-]verbose Run verbosely
|
33
|
+
# -d, --debug Debug mode: One -d for DNSCheck debug
|
34
|
+
# Two -d also turns on library debug
|
35
|
+
# -h, --help Show full help
|
36
|
+
# -V, --version Show version and exit
|
37
|
+
#
|
38
|
+
# == Example
|
39
|
+
# dnstraverse www.nic.uk
|
40
|
+
# dnstraverse --fast www.google.com
|
41
|
+
# dnstraverse --fast --show-resolves --udp-size 1000 www.microsoft.com
|
42
|
+
#
|
43
|
+
# = Copyright
|
44
|
+
# Copyright (c) 2008 James Ponder <james@squish.net>
|
45
|
+
# Portions Copyright (c) 2003,2004,2005 Roy Arends & Jakob Schlyter
|
46
|
+
#
|
47
|
+
# This program is free software: you can redistribute it and/or modify
|
48
|
+
# it under the terms of the GNU General Public License as published by
|
49
|
+
# the Free Software Foundation, version 3 of the License.
|
50
|
+
|
51
|
+
require 'optparse'
|
52
|
+
require 'logger'
|
53
|
+
require 'rdoc/usage'
|
54
|
+
require 'pp'
|
55
|
+
|
56
|
+
require 'dnstraverse/traverser'
|
57
|
+
require 'dnstraverse/log'
|
58
|
+
require 'dnstraverse/fingerprint'
|
59
|
+
|
60
|
+
Version = [ 0, 0, 1].freeze
|
61
|
+
|
62
|
+
EMPTY_STRING = ''.freeze
|
63
|
+
|
64
|
+
def referral_txt_normal(r)
|
65
|
+
if r.serverips then
|
66
|
+
return "#{r.refid} #{r.server} (#{r.txt_ips})"
|
67
|
+
end
|
68
|
+
return "#{r.refid} #{r.server}"
|
69
|
+
end
|
70
|
+
|
71
|
+
def referral_txt_verbose(r)
|
72
|
+
if r.serverips then
|
73
|
+
return sprintf("%s [%s] %s (%s) <%s>", r.refid, r.qname, r.server,
|
74
|
+
r.txt_ips, r.bailiwick)
|
75
|
+
end
|
76
|
+
return sprintf("%s [%s] %s <%s>", r.refid, r.qname, r.server,
|
77
|
+
r.bailiwick)
|
78
|
+
end
|
79
|
+
|
80
|
+
# TODO: warnings aren't in referral object any more, they are in bubbled up to response object from decoded_query, and there are several for each referral object as each IP address for a referral could have warnings.
|
81
|
+
# TODO: display warnings after each response object is created
|
82
|
+
def progress_main(args)
|
83
|
+
o = args[:state]
|
84
|
+
r = args[:referral]
|
85
|
+
stage = args[:stage]
|
86
|
+
return if r.refid.empty?
|
87
|
+
case stage
|
88
|
+
when :answer then
|
89
|
+
if o[:verbose] then
|
90
|
+
for warning in r.warnings do
|
91
|
+
puts "#{r.refid} WARNING: #{warning}"
|
92
|
+
end
|
93
|
+
end
|
94
|
+
if o[:allstats] then
|
95
|
+
r.stats_display(:prefix => "#{r.refid} Results:", :results => false)
|
96
|
+
end
|
97
|
+
when :start then
|
98
|
+
print o[:verbose] ? referral_txt_verbose(r) : referral_txt_normal(r)
|
99
|
+
if r.serverips.nil? then
|
100
|
+
print " -- resolving"
|
101
|
+
end
|
102
|
+
print "\n"
|
103
|
+
when :answer_fast then
|
104
|
+
print o[:verbose] ? referral_txt_verbose(r) : referral_txt_normal(r)
|
105
|
+
puts " -- completed earlier"
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def progress_resolves(args)
|
110
|
+
o = args[:state]
|
111
|
+
r = args[:referral]
|
112
|
+
stage = args[:stage]
|
113
|
+
case stage
|
114
|
+
when :start then
|
115
|
+
print o[:verbose] ? referral_txt_verbose(r) : referral_txt_normal(r)
|
116
|
+
print "\n"
|
117
|
+
when :answer_fast then
|
118
|
+
print o[:verbose] ? referral_txt_verbose(r) : referral_txt_normal(r)
|
119
|
+
puts " -- completed earlier"
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
def require_relative(path)
|
124
|
+
require File.join(File.dirname(caller[0]), path.to_str)
|
125
|
+
end
|
126
|
+
|
127
|
+
### Main program
|
128
|
+
|
129
|
+
options = Hash.new
|
130
|
+
options[:verbose] = false
|
131
|
+
options[:debug] = 0
|
132
|
+
options[:type] = :a
|
133
|
+
options[:root] = nil
|
134
|
+
options[:allroots] = false
|
135
|
+
options[:broken] = false
|
136
|
+
options[:progress] = true
|
137
|
+
options[:summary] = true
|
138
|
+
options[:resolves] = false
|
139
|
+
options[:serverlist] = true
|
140
|
+
options[:versions] = true
|
141
|
+
options[:domainname] = nil
|
142
|
+
options[:follow_aaaa] = false
|
143
|
+
options[:root_aaaa] = false
|
144
|
+
options[:always_tcp] = false
|
145
|
+
options[:allow_tcp] = false
|
146
|
+
options[:allstats] = false
|
147
|
+
options[:saveobjects] = false
|
148
|
+
options[:fast] = false
|
149
|
+
options[:udpsize] = 512
|
150
|
+
options[:maxdepth] = 10
|
151
|
+
options[:retries] = 2
|
152
|
+
options[:results] = true
|
153
|
+
|
154
|
+
opts = OptionParser.new
|
155
|
+
opts.banner = "Usage: #{File.basename($0)} [options] DOMAIN"
|
156
|
+
opts.on("-v", "--[no-]verbose") { |o| options[:verbose] = o }
|
157
|
+
opts.on("-d", "--[no-]debug") { |o| options[:debug]+= 1 }
|
158
|
+
opts.on("-r", "--root-server HOST") { |o| options[:root] = o }
|
159
|
+
opts.on("-a", "--all-root-servers") { |o| options[:allroots] = o }
|
160
|
+
opts.on("-t", "--type TYPE", Dnsruby::Types.constants) { |o| options[:type] = o }
|
161
|
+
opts.on("--udp-size SIZE") { |o| options[:udpsize] = o }
|
162
|
+
opts.on("--allow-tcp") { |o| options[:allow_tcp] = o }
|
163
|
+
opts.on("--always-tcp") { |o| options[:always_tcp] = o }
|
164
|
+
opts.on("--max-depth DEPTH") { |o| options[:maxdepth] = o }
|
165
|
+
opts.on("--retries TIMES") { |o| options[:retries] = o }
|
166
|
+
opts.on("--[no-]follow-aaaa") { |o| options[:follow_aaaa] = o }
|
167
|
+
opts.on("--[no-]root-aaaa") { |o| options[:root_aaaa] = o }
|
168
|
+
opts.on("--[no-]show-progress") { |o| options[:progress] = o }
|
169
|
+
opts.on("--[no-]show-resolves") { |o| options[:resolves] = o }
|
170
|
+
opts.on("--[no-]show-serverlist") { |o| options[:serverlist] = o }
|
171
|
+
opts.on("--[no-]show-versions") { |o| options[:versions] = o }
|
172
|
+
opts.on("--[no-]show-all-stats") { |o| options[:allstats] = o }
|
173
|
+
opts.on("--[no-]show-results") { |o| options[:results] = o }
|
174
|
+
opts.on("--save-objects") { |o| options[:saveobjects] = o }
|
175
|
+
opts.on("--fast") { |o| options[:fast] = o }
|
176
|
+
opts.on_tail("-h", "--help") { RDoc::usage }
|
177
|
+
opts.on_tail("-V", "--version") { puts Version.join('.'); exit }
|
178
|
+
begin
|
179
|
+
opts.parse!
|
180
|
+
if ARGV.size != 1 then
|
181
|
+
raise OptionParser::ParseError, "Missing domain name parameter"
|
182
|
+
end
|
183
|
+
options[:domainname] = ARGV.shift
|
184
|
+
rescue OptionParser::ParseError => e
|
185
|
+
puts e
|
186
|
+
RDoc::usage(1, 'Usage')
|
187
|
+
end
|
188
|
+
Log.level = options[:debug] > 0 ? Logger::DEBUG : Logger::UNKNOWN
|
189
|
+
Log.debug {"Options chosen:\n" }
|
190
|
+
Log.debug { options.map {|x,y| " #{x}: #{y}" }.join("\n") }
|
191
|
+
args = { :state => options, :aaaa => options[:follow_aaaa],
|
192
|
+
:udpsize => options[:udpsize] }
|
193
|
+
args[:progress_main] = method(:progress_main) if options[:progress]
|
194
|
+
args[:progress_resolve] = method(:progress_resolves) if options[:progress] and options[:resolves]
|
195
|
+
args[:loglevel] = options[:debug] >= 1 ? Logger::DEBUG : Logger::UNKNOWN
|
196
|
+
args[:libloglevel] = options[:debug] >= 2 ? Logger::DEBUG : Logger::UNKNOWN
|
197
|
+
args[:always_tcp] = true if options[:always_tcp]
|
198
|
+
args[:allow_tcp] = true if options[:allow_tcp]
|
199
|
+
args[:fast] = true if options[:fast]
|
200
|
+
begin
|
201
|
+
traverser = DNSTraverse::Traverser.new(args)
|
202
|
+
if options[:root] then
|
203
|
+
root = options[:root]
|
204
|
+
rootip = root # XXX fix me need to look up IP address if not passed
|
205
|
+
else
|
206
|
+
begin
|
207
|
+
(root, rootip) = traverser.get_a_root(:aaaa => options[:root_aaaa])
|
208
|
+
rescue => e
|
209
|
+
$stderr.puts "Failed to find a root: #{e}"
|
210
|
+
exit 2
|
211
|
+
end
|
212
|
+
end
|
213
|
+
puts "Using #{root} (#{rootip}) as initial root"
|
214
|
+
if options[:allroots] then
|
215
|
+
begin
|
216
|
+
roots = traverser.find_all_roots(:root => root, :rootip => rootip,
|
217
|
+
:aaaa => options[:root_aaaa] )
|
218
|
+
rescue => e
|
219
|
+
$stderr.puts "Failed to find all roots: #{e}"
|
220
|
+
exit 2
|
221
|
+
end
|
222
|
+
puts "All roots:"
|
223
|
+
for aroot in roots do
|
224
|
+
puts " #{aroot[:name]} #{aroot[:ips].join(', ')}"
|
225
|
+
end
|
226
|
+
else
|
227
|
+
roots = [ { :name => root, :ips => [ rootip ] } ]
|
228
|
+
end
|
229
|
+
puts "Running query #{options[:domainname]} type #{options[:type]}"
|
230
|
+
result = traverser.run_query(:qname => options[:domainname],
|
231
|
+
:qtype => options[:type].to_s, :roots => roots,
|
232
|
+
:maxdepth => options[:maxdepth],
|
233
|
+
:retries => options[:retries])
|
234
|
+
puts if options[:progress]
|
235
|
+
if options[:serverlist] then
|
236
|
+
puts "The following servers were encountered:"
|
237
|
+
fp = options[:versions] ? DNSTraverse::Fingerprint.new : nil
|
238
|
+
seen = traverser.servers_encountered
|
239
|
+
ss = seen.keys.sort! { |a,b| a.downcase.reverse! <=> b.downcase.reverse! }
|
240
|
+
w = 16
|
241
|
+
ss.each { |a| w = a.length if a.length > w }
|
242
|
+
ss.each do |server|
|
243
|
+
for ip in seen[server] do
|
244
|
+
ver = ""
|
245
|
+
if options[:versions] then
|
246
|
+
fpres = fp.fingerprint(ip)
|
247
|
+
ver += " #{fpres[:vendor]}" if fpres.has_key?(:vendor)
|
248
|
+
ver += " #{fpres[:product]}" if fpres.has_key?(:product)
|
249
|
+
ver += " #{fpres[:version]}" if fpres.has_key?(:version)
|
250
|
+
ver += " #{fpres[:error]}" if fpres.has_key?(:error)
|
251
|
+
end
|
252
|
+
printf "%#{w}s: %-15s%s", server, ip, ver
|
253
|
+
puts
|
254
|
+
end
|
255
|
+
end
|
256
|
+
puts
|
257
|
+
end
|
258
|
+
if options[:results] then
|
259
|
+
puts "Results:"
|
260
|
+
result.stats_display(:results => true, :spacing => true)
|
261
|
+
end
|
262
|
+
rescue Interrupt => e
|
263
|
+
$stderr.puts "Interrupted by user"
|
264
|
+
end
|
265
|
+
if options[:saveobjects] then
|
266
|
+
GC.start
|
267
|
+
s = Hash.new
|
268
|
+
ObjectSpace.each_object do |o|
|
269
|
+
s[o.class]||= 0
|
270
|
+
s[o.class]= s[o.class] + 1
|
271
|
+
end
|
272
|
+
f = File.open("classes.dump", "w")
|
273
|
+
s.sort {|a,b| a[1] <=> b[1]}.each do | c |
|
274
|
+
f.puts "#{c[1]} #{c[0]}"
|
275
|
+
end
|
276
|
+
f = File.open("strings.dump", "w")
|
277
|
+
ObjectSpace.each_object do |o|
|
278
|
+
if o.instance_of? String then
|
279
|
+
f.puts o
|
280
|
+
end
|
281
|
+
end
|
282
|
+
f = File.open("hashes.dump", "w")
|
283
|
+
ObjectSpace.each_object do |o|
|
284
|
+
if o.instance_of? Hash then
|
285
|
+
f.puts o.size.to_s
|
286
|
+
end
|
287
|
+
end
|
288
|
+
f = File.open("label.dump", "w")
|
289
|
+
ObjectSpace.each_object do |o|
|
290
|
+
if o.instance_of? Dnsruby::Name::Label then
|
291
|
+
f.puts o.to_s
|
292
|
+
end
|
293
|
+
end
|
294
|
+
f = File.open("referral.dump", "w")
|
295
|
+
ObjectSpace.each_object do |o|
|
296
|
+
if o.instance_of? DNSTraverse::Referral then
|
297
|
+
f.puts o.to_s
|
298
|
+
end
|
299
|
+
end
|
300
|
+
end
|
data/doc.tar
ADDED
Binary file
|
@@ -0,0 +1,198 @@
|
|
1
|
+
<?xml version="1.0" encoding="iso-8859-1"?>
|
2
|
+
<!DOCTYPE html
|
3
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
4
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
5
|
+
|
6
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
7
|
+
<head>
|
8
|
+
<title>Module: DNSTraverse</title>
|
9
|
+
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
10
|
+
<meta http-equiv="Content-Script-Type" content="text/javascript" />
|
11
|
+
<link rel="stylesheet" href=".././rdoc-style.css" type="text/css" media="screen" />
|
12
|
+
<script type="text/javascript">
|
13
|
+
// <![CDATA[
|
14
|
+
|
15
|
+
function popupCode( url ) {
|
16
|
+
window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
|
17
|
+
}
|
18
|
+
|
19
|
+
function toggleCode( id ) {
|
20
|
+
if ( document.getElementById )
|
21
|
+
elem = document.getElementById( id );
|
22
|
+
else if ( document.all )
|
23
|
+
elem = eval( "document.all." + id );
|
24
|
+
else
|
25
|
+
return false;
|
26
|
+
|
27
|
+
elemStyle = elem.style;
|
28
|
+
|
29
|
+
if ( elemStyle.display != "block" ) {
|
30
|
+
elemStyle.display = "block"
|
31
|
+
} else {
|
32
|
+
elemStyle.display = "none"
|
33
|
+
}
|
34
|
+
|
35
|
+
return true;
|
36
|
+
}
|
37
|
+
|
38
|
+
// Make codeblocks hidden by default
|
39
|
+
document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
|
40
|
+
|
41
|
+
// ]]>
|
42
|
+
</script>
|
43
|
+
|
44
|
+
</head>
|
45
|
+
<body>
|
46
|
+
|
47
|
+
|
48
|
+
|
49
|
+
<div id="classHeader">
|
50
|
+
<table class="header-table">
|
51
|
+
<tr class="top-aligned-row">
|
52
|
+
<td><strong>Module</strong></td>
|
53
|
+
<td class="class-name-in-header">DNSTraverse</td>
|
54
|
+
</tr>
|
55
|
+
<tr class="top-aligned-row">
|
56
|
+
<td><strong>In:</strong></td>
|
57
|
+
<td>
|
58
|
+
<a href="../files/lib/dnstraverse/fingerprint_rb.html">
|
59
|
+
lib/dnstraverse/fingerprint.rb
|
60
|
+
</a>
|
61
|
+
<br />
|
62
|
+
<a href="../files/lib/dnstraverse/decoded_query_rb.html">
|
63
|
+
lib/dnstraverse/decoded_query.rb
|
64
|
+
</a>
|
65
|
+
<br />
|
66
|
+
<a href="../files/lib/dnstraverse/traverser_rb.html">
|
67
|
+
lib/dnstraverse/traverser.rb
|
68
|
+
</a>
|
69
|
+
<br />
|
70
|
+
<a href="../files/lib/dnstraverse/decoded_query_cache_rb.html">
|
71
|
+
lib/dnstraverse/decoded_query_cache.rb
|
72
|
+
</a>
|
73
|
+
<br />
|
74
|
+
<a href="../files/lib/dnstraverse/response_noglue_rb.html">
|
75
|
+
lib/dnstraverse/response_noglue.rb
|
76
|
+
</a>
|
77
|
+
<br />
|
78
|
+
<a href="../files/lib/dnstraverse/referral_rb.html">
|
79
|
+
lib/dnstraverse/referral.rb
|
80
|
+
</a>
|
81
|
+
<br />
|
82
|
+
<a href="../files/lib/dnstraverse/response_rb.html">
|
83
|
+
lib/dnstraverse/response.rb
|
84
|
+
</a>
|
85
|
+
<br />
|
86
|
+
<a href="../files/lib/dnstraverse/info_cache_rb.html">
|
87
|
+
lib/dnstraverse/info_cache.rb
|
88
|
+
</a>
|
89
|
+
<br />
|
90
|
+
<a href="../files/lib/dnstraverse/caching_resolver_rb.html">
|
91
|
+
lib/dnstraverse/caching_resolver.rb
|
92
|
+
</a>
|
93
|
+
<br />
|
94
|
+
<a href="../files/lib/dnstraverse/message_utility_rb.html">
|
95
|
+
lib/dnstraverse/message_utility.rb
|
96
|
+
</a>
|
97
|
+
<br />
|
98
|
+
</td>
|
99
|
+
</tr>
|
100
|
+
|
101
|
+
</table>
|
102
|
+
</div>
|
103
|
+
<!-- banner header -->
|
104
|
+
|
105
|
+
<div id="bodyContent">
|
106
|
+
|
107
|
+
|
108
|
+
|
109
|
+
<div id="contextContent">
|
110
|
+
|
111
|
+
<div id="description">
|
112
|
+
<p>
|
113
|
+
<a href="DNSTraverse.html">DNSTraverse</a> traverses the DNS to show
|
114
|
+
statistics and information Copyright (C) 2008 James Ponder
|
115
|
+
</p>
|
116
|
+
<p>
|
117
|
+
This program is free software: you can redistribute it and/or modify it
|
118
|
+
under the terms of the GNU General Public License as published by the Free
|
119
|
+
Software Foundation, version 3 of the License.
|
120
|
+
</p>
|
121
|
+
<p>
|
122
|
+
This program is distributed in the hope that it will be useful, but WITHOUT
|
123
|
+
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
124
|
+
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
125
|
+
more details.
|
126
|
+
</p>
|
127
|
+
<p>
|
128
|
+
You should have received a copy of the GNU General Public License along
|
129
|
+
with this program. If not, see <<a
|
130
|
+
href="http://www.gnu.org/licenses">www.gnu.org/licenses</a>/>.
|
131
|
+
</p>
|
132
|
+
|
133
|
+
</div>
|
134
|
+
|
135
|
+
|
136
|
+
</div>
|
137
|
+
|
138
|
+
|
139
|
+
</div>
|
140
|
+
|
141
|
+
|
142
|
+
<!-- if includes -->
|
143
|
+
|
144
|
+
<div id="section">
|
145
|
+
|
146
|
+
<div id="class-list">
|
147
|
+
<h3 class="section-bar">Classes and Modules</h3>
|
148
|
+
|
149
|
+
Module <a href="DNSTraverse/MessageUtility.html" class="link">DNSTraverse::MessageUtility</a><br />
|
150
|
+
Module <a href="DNSTraverse/Response.html" class="link">DNSTraverse::Response</a><br />
|
151
|
+
Class <a href="DNSTraverse/CachingResolver.html" class="link">DNSTraverse::CachingResolver</a><br />
|
152
|
+
Class <a href="DNSTraverse/DecodedQuery.html" class="link">DNSTraverse::DecodedQuery</a><br />
|
153
|
+
Class <a href="DNSTraverse/DecodedQueryCache.html" class="link">DNSTraverse::DecodedQueryCache</a><br />
|
154
|
+
Class <a href="DNSTraverse/Fingerprint.html" class="link">DNSTraverse::Fingerprint</a><br />
|
155
|
+
Class <a href="DNSTraverse/InfoCache.html" class="link">DNSTraverse::InfoCache</a><br />
|
156
|
+
Class <a href="DNSTraverse/Referral.html" class="link">DNSTraverse::Referral</a><br />
|
157
|
+
Class <a href="DNSTraverse/ResolveError.html" class="link">DNSTraverse::ResolveError</a><br />
|
158
|
+
Class <a href="DNSTraverse/Response.html" class="link">DNSTraverse::Response</a><br />
|
159
|
+
Class <a href="DNSTraverse/Traverser.html" class="link">DNSTraverse::Traverser</a><br />
|
160
|
+
|
161
|
+
</div>
|
162
|
+
|
163
|
+
<div id="constants-list">
|
164
|
+
<h3 class="section-bar">Constants</h3>
|
165
|
+
|
166
|
+
<div class="name-list">
|
167
|
+
<table summary="Constants">
|
168
|
+
<tr class="top-aligned-row context-row">
|
169
|
+
<td class="context-item-name">TYPE_ARRAY_AAAA</td>
|
170
|
+
<td>=</td>
|
171
|
+
<td class="context-item-value">['AAAA', 'A'].freeze</td>
|
172
|
+
</tr>
|
173
|
+
<tr class="top-aligned-row context-row">
|
174
|
+
<td class="context-item-name">TYPE_ARRAY_A</td>
|
175
|
+
<td>=</td>
|
176
|
+
<td class="context-item-value">['A'].freeze</td>
|
177
|
+
</tr>
|
178
|
+
</table>
|
179
|
+
</div>
|
180
|
+
</div>
|
181
|
+
|
182
|
+
|
183
|
+
|
184
|
+
|
185
|
+
|
186
|
+
|
187
|
+
<!-- if method_list -->
|
188
|
+
|
189
|
+
|
190
|
+
</div>
|
191
|
+
|
192
|
+
|
193
|
+
<div id="validator-badges">
|
194
|
+
<p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
|
195
|
+
</div>
|
196
|
+
|
197
|
+
</body>
|
198
|
+
</html>
|