Module: Wmap::Utils
- Extended by:
- Utils
- Includes:
- DomainRoot, Logger, UrlMagic
- Included in:
- CidrTracker, DnsBruter, DomainTracker, DomainTracker::SubDomain, GeoIPTracker, GoogleSearchScraper, HostTracker, HostTracker::PrimaryHost, NetworkProfiler, PortScanner, SiteTracker, SiteTracker::DeactivatedSite, SiteTracker::WpTracker, UrlChecker, UrlCrawler, Utils, Whois
- Defined in:
- lib/wmap/utils/utils.rb,
lib/wmap/utils/logger.rb,
lib/wmap/utils/url_magic.rb,
lib/wmap/utils/wp_detect.rb,
lib/wmap/utils/domain_root.rb
Defined Under Namespace
Modules: DomainRoot, Logger, UrlMagic, WpDetect
Constant Summary
Constants included from UrlMagic
UrlMagic::Max_http_timeout, UrlMagic::User_agent
Constants included from DomainRoot
DomainRoot::File_ccsld, DomainRoot::File_cctld, DomainRoot::File_gtld, DomainRoot::File_tld
Instance Method Summary collapse
-
#cidr_2_ips(cidr) ⇒ Object
Convert a CIDR to a list of IPs: Input is a CIDR expression such as ‘192.168.1.1/30’, output is an array of IPs.
-
#file_2_hash(f, lc = true) ⇒ Object
Load entries from a text file and return a hash.
-
#file_2_list(f, lc = true) ⇒ Object
Load entries from a text file and return an array.
-
#get_nameserver(host) ⇒ Object
(also: #get_ns)
Retrieve the first name server from the Internet whois data repository for the host / subdomain / domain.
-
#get_nameservers(host) ⇒ Object
Retrieve a list of the authoritative name servers from the Internet whois data repository for the host / subdomain / domain.
-
#host_2_ip(hostname) ⇒ Object
Perform DNS query on a hostname.
-
#host_2_ips(hostname) ⇒ Object
(also: #ns_lookup)
Perform the DNS query on a hostname over the Internet.
-
#is_cidr?(cidr) ⇒ Boolean
Simple test to determine if the entry is in valid network cidr format.
-
#is_fqdn?(host) ⇒ Boolean
(also: #is_host?)
Simple test a host string format.
-
#is_ip?(ip) ⇒ Boolean
(also: #is_valid_ip?)
Test if it’s a legitimate IP4 address.
-
#list_2_file(list, file) ⇒ Object
Save an array into a file.
-
#reverse_dns_lookup(ip) ⇒ Object
(also: #ip_2_host)
Perform reverse dns lookup for an IP.
-
#sort_ips(ips) ⇒ Object
Sort an array of IPs in the ascendant order.
-
#valid_dns_record?(hostname) ⇒ Boolean
(also: #is_record?, #a_record?)
Query the name-server to see if the dns record is still valid.
-
#zone_transferable?(domain) ⇒ Boolean
Test the DNS server if zone transfer is allowed.
Methods included from Logger
Methods included from UrlMagic
#create_absolute_url_from_base, #create_absolute_url_from_context, #host_2_url, #is_site?, #is_ssl?, #is_url?, #landing_location, #make_absolute, #normalize_url, #open_page, #redirect_location, #response_code, #response_headers, #url_2_host, #url_2_path, #url_2_port, #url_2_site, #urls_on_same_domain?
Methods included from DomainRoot
#get_domain_root, #get_domain_root_by_ccsld, #get_domain_root_by_cctld, #get_domain_root_by_tlds, #get_sub_domain, #is_domain_root?, #print_ccsld, #print_cctld, #print_gtld
Instance Method Details
#cidr_2_ips(cidr) ⇒ Object
Convert a CIDR to a list of IPs: Input is a CIDR expression such as ‘192.168.1.1/30’, output is an array of IPs
315 316 317 318 319 320 321 322 323 324 325 326 |
# File 'lib/wmap/utils/utils.rb', line 315 def cidr_2_ips (cidr) puts "Method to convert a CIDR block into a list of IPs: #{cidr}" if @verbose begin cidr4 = NetAddr::CIDR.create(cidr) ips = cidr4.enumerate(:Limit => 0, :Bitstep => 1) #ips2 = ips.slice!(1, (ips.length-2)) return ips rescue => ee puts "Exception on method #{__method__}: #{ee}" if @verbose return nil end end |
#file_2_hash(f, lc = true) ⇒ Object
Load entries from a text file and return a hash
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
# File 'lib/wmap/utils/utils.rb', line 60 def file_2_hash(f,lc=true) puts "Loading records from file: #{f}" if @verbose begin hs=Hash.new file = File.open(f, "r") file.each_line do |line| line=line.chomp.strip next if line.nil? next if line.empty? line=line.downcase if lc==true next if line =~ /^\s*#/ hs[line]=true unless hs.key?(line) end file.close return hs rescue => ee puts "Exception on method #{__method__} on #{f}: #{ee}" if @verbose return nil end end |
#file_2_list(f, lc = true) ⇒ Object
Load entries from a text file and return an array
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
# File 'lib/wmap/utils/utils.rb', line 21 def file_2_list(f,lc=true) puts "Loading records from file: #{f}" if @verbose begin list=Array.new file = File.open(f, "r") file.each_line do |line| line=line.chomp.strip next if line.nil? next if line.empty? next if line =~ /^\s*#/ line=line.downcase if lc==true list.push(line.chomp.strip) end file.close return list rescue => ee puts "Exception on method #{__method__} for file #{f}: #{ee}" if @verbose return nil end end |
#get_nameserver(host) ⇒ Object Also known as: get_ns
Retrieve the first name server from the Internet whois data repository for the host / subdomain / domain
281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 |
# File 'lib/wmap/utils/utils.rb', line 281 def get_nameserver (host) puts "Retrieve the first authoritative name server for: #{host}" if @verbose begin domain=get_domain_root(host) w=Wmap::Whois.new ns = w.query(domain).nameservers.map! { |x| x.name } if ns.empty? puts "No name server found for domain root: #{domain}" if @verbose return nil else return ns.first end rescue => ee puts "Exception on method get_nameservers for #{host}: #{ee}" if @verbose return nil end end |
#get_nameservers(host) ⇒ Object
Retrieve a list of the authoritative name servers from the Internet whois data repository for the host / subdomain / domain
262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 |
# File 'lib/wmap/utils/utils.rb', line 262 def get_nameservers (host) puts "Retrieve a list of authoritative name server for: #{host}" if @verbose begin domain=get_domain_root(host) w=Wmap::Whois.new ns = w.query(domain).nameservers.map! { |x| x.name } if ns.empty? puts "No name server found for domain root: #{domain}" if @verbose return nil else return ns end rescue => ee puts "Exception on method get_nameservers for #{host}: #{ee}" if @verbose return nil end end |
#host_2_ip(hostname) ⇒ Object
Perform DNS query on a hostname. Return the first resolved IP as a string
238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 |
# File 'lib/wmap/utils/utils.rb', line 238 def host_2_ip (hostname) puts "Perform DNS query on host: #{hostname}" if @verbose begin ips=Array.new if is_ip?(hostname) puts "No change - same IP is returned. " if @verbose return hostname.strip else ips=Resolv.getaddresses(hostname) if (ips.empty?) then puts "Failed to resolve #{hostname}" if @verbose return nil else puts "IP found: #{ips.first}" if @verbose return ips.first.strip end end rescue => ee puts "Exception on method host_2_ip for host #{hostname}: #{ee}" if @verbose return nil end end |
#host_2_ips(hostname) ⇒ Object Also known as: ns_lookup
Perform the DNS query on a hostname over the Internet. Return the resolved IP(s) in an array
215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 |
# File 'lib/wmap/utils/utils.rb', line 215 def host_2_ips (hostname) begin ips=Array.new if is_ip?(hostname) ips.push(hostname) return ips else ips = Resolv.getaddresses(hostname) if (ips.empty?) then puts "Failed to resolve #{hostname}" if @verbose return nil else return ips end end rescue => ee puts "Exception on method host_2_ips for host #{hostname}: #{ee}" if @verbose return nil end end |
#is_cidr?(cidr) ⇒ Boolean
Simple test to determine if the entry is in valid network cidr format
178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 |
# File 'lib/wmap/utils/utils.rb', line 178 def is_cidr?(cidr) puts "Validate if the entry is valid CIDR format: #{cidr}" if @verbose begin cidr=cidr.strip if cidr =~ /^(\d+\.\d+\.\d+.\d+)\/(\d+)$/ ip=$1 mask=$2.to_i if is_ip?(ip) if mask >0 and mask <=32 puts "confirmed as a valid CIDR entry: #{cidr}" if @verbose return true else return false end else return false end else return false end rescue => ee puts "Exception on method #{__method__}: #{ee}" if @verbose return false end end |
#is_fqdn?(host) ⇒ Boolean Also known as: is_host?
Simple test a host string format. Return true if it contains a valid internet domain sub-string. Note: Don’t be confused with another method ‘valid_dns_record?’, which is a stricter and time-consuming test on the DNS server for a resolvable internet host.
160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 |
# File 'lib/wmap/utils/utils.rb', line 160 def is_fqdn? (host) puts "Validate the host-name format is valid: #{host}" if @verbose return false if is_ip?(host) or is_url?(host) domain=get_domain_root(host) if domain.nil? return false elsif is_domain_root?(domain) return true else return false end # rescue => ee # puts "Exception on method is_fqdn? for #{host}: #{ee}" if @verbose # return false end |
#is_ip?(ip) ⇒ Boolean Also known as: is_valid_ip?
Test if it’s a legitimate IP4 address
138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 |
# File 'lib/wmap/utils/utils.rb', line 138 def is_ip? (ip) puts "Validate the IP format is valid: #{ip}" if @verbose begin ip=ip.strip raise "This is an URL: #{ip}" if is_url?(ip) if ip =~ /\d+\.\d+\.\d+.\d+/ and ip !~ /\/\d+/ octs=ip.split('.') return false unless octs.size==4 octs.map { |x| return false unless x.to_i >=0 and x.to_i <=255 } else return false end puts "Confirmed as a valid IP: #{ip}" if @verbose return true rescue => ee puts "Exception on method is_ip? for #{ip}: #{ee}" if @verbose return false end end |
#list_2_file(list, file) ⇒ Object
Save an array into a file
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
# File 'lib/wmap/utils/utils.rb', line 43 def list_2_file (list,file) puts "Save list #{list} to plain file #{file}" if @verbose begin f = File.open(file, "w") list.map do |ent| #ent.strip! # Append the unix line break f.write("#{ent}\n") end f.close rescue => ee puts "Exception on method #{__method__} for file #{file}: #{ee}" if @verbose return nil end end |
#reverse_dns_lookup(ip) ⇒ Object Also known as: ip_2_host
Perform reverse dns lookup for an IP. Return the found ‘hostname’ if found, or the original IP if not
301 302 303 304 305 306 307 308 309 310 311 |
# File 'lib/wmap/utils/utils.rb', line 301 def reverse_dns_lookup (ip) puts "Retrieve the hostname by the reverse DNS lookup on IP: #{ip}" hostname = ip begin hostname = Socket.gethostbyaddr(ip.split('.').collect{ |x| x.to_i}.pack("CCCC"))[0] return hostname.downcase rescue => ee puts "Exception on method reverse_dns_lookup: #{ee}" if @verbose return hostname end end |
#sort_ips(ips) ⇒ Object
Sort an array of IPs in the ascendant order
205 206 207 208 209 210 211 212 |
# File 'lib/wmap/utils/utils.rb', line 205 def sort_ips (ips) begin "Sort the list of IP address in the ascendant order: #{ips}" if @verbose return NetAddr.sort(ips) rescue => ee puts "Exception on method sort_ips for IPs #{ips}: #{ee}" # if @verbose end end |
#valid_dns_record?(hostname) ⇒ Boolean Also known as: is_record?, a_record?
Query the name-server to see if the dns record is still valid
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
# File 'lib/wmap/utils/utils.rb', line 82 def valid_dns_record? (hostname) puts "Validate the hostname record: #{hostname}" if @verbose begin ips=Resolv.getaddresses(hostname) if ips.empty? return false else puts "Found: #{hostname}" if @verbose return true end rescue => ee puts "Exception on method #{__method__} for host #{hostname}: #{ee}" if @verbose return false end end |
#zone_transferable?(domain) ⇒ Boolean
Test the DNS server if zone transfer is allowed. If allowed, save the found hosts into the class variable.
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 |
# File 'lib/wmap/utils/utils.rb', line 101 def zone_transferable?(domain) puts "Check if the domain allows free zone transfer: #{domain}" begin transferable=false domain=domain.downcase nameservers = get_nameservers(domain) raise "Unable to determine the name servers for domain #{domain}" if nameservers.nil? puts "Retrieved name servers: #{nameservers}" if @verbose nameservers.each do |nssrv| begin puts "Attempt zone transfer on name server: #{nssrv}" if nssrv.nil? abort "Method input variable error: no name server found!" if @verbose next end zt = Dnsruby::ZoneTransfer.new zt.server=(nssrv) if nssrv!="" records = zt.transfer(domain) if records==nil puts "#{domain} zone transfer is not allowed on name server: #{nssrv}" next else puts "#{domain} zone transfer is allowed!" transferable=true end rescue Exception=>ee puts "Exception on method zone_transferable? for domain #{domain}: #{ee}" end end return transferable rescue Exception => ee puts "Exception on method #{__method__}: #{ee}" if @verbose return false end end |