dnstraverse 0.0.1
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.
- 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>
|