wmap 2.4.4
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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +141 -0
- data/LICENSE.txt +15 -0
- data/README.rdoc +98 -0
- data/TODO +13 -0
- data/bin/deprime +21 -0
- data/bin/distrust +38 -0
- data/bin/googleBot +23 -0
- data/bin/prime +21 -0
- data/bin/refresh +26 -0
- data/bin/run_tests +16 -0
- data/bin/spiderBot +26 -0
- data/bin/trust +38 -0
- data/bin/updateAll +57 -0
- data/bin/wadd +25 -0
- data/bin/wadds +26 -0
- data/bin/wcheck +28 -0
- data/bin/wdel +25 -0
- data/bin/wdump +21 -0
- data/bin/wmap +151 -0
- data/bin/wscan +32 -0
- data/data/cidrs +2 -0
- data/data/deactivated_sites +1 -0
- data/data/domains +2 -0
- data/data/hosts +1 -0
- data/data/prime_hosts +1 -0
- data/data/sites +2 -0
- data/data/sub_domains +2 -0
- data/demos/bruter.rb +27 -0
- data/demos/dns_brutes.rb +28 -0
- data/demos/filter_cidr.rb +18 -0
- data/demos/filter_crawls.rb +5 -0
- data/demos/filter_domain.rb +25 -0
- data/demos/filter_geoip.rb +26 -0
- data/demos/filter_known_services.rb +59 -0
- data/demos/filter_netinfo.rb +23 -0
- data/demos/filter_prime.rb +25 -0
- data/demos/filter_profiler.rb +3 -0
- data/demos/filter_redirection.rb +19 -0
- data/demos/filter_site.rb +40 -0
- data/demos/filter_siteip.rb +31 -0
- data/demos/filter_status.rb +17 -0
- data/demos/filter_timestamp.rb +23 -0
- data/demos/filter_url.rb +19 -0
- data/demos/new_fnd.rb +66 -0
- data/demos/nmap_parser.pl +138 -0
- data/demos/site_format.rb +18 -0
- data/demos/whois_domain.rb +78 -0
- data/dicts/GeoIP.dat +0 -0
- data/dicts/GeoIPASNum.dat +0 -0
- data/dicts/GeoLiteCity.dat +0 -0
- data/dicts/ccsld.txt +2646 -0
- data/dicts/cctld.txt +243 -0
- data/dicts/gtld.txt +25 -0
- data/dicts/hostnames-dict.big +1402 -0
- data/dicts/hostnames-dict.txt +101 -0
- data/lib/wmap/cidr_tracker.rb +327 -0
- data/lib/wmap/dns_bruter.rb +308 -0
- data/lib/wmap/domain_tracker/sub_domain.rb +142 -0
- data/lib/wmap/domain_tracker.rb +342 -0
- data/lib/wmap/geoip_tracker.rb +72 -0
- data/lib/wmap/google_search_scraper.rb +177 -0
- data/lib/wmap/host_tracker/primary_host.rb +130 -0
- data/lib/wmap/host_tracker.rb +550 -0
- data/lib/wmap/network_profiler.rb +144 -0
- data/lib/wmap/port_scanner.rb +208 -0
- data/lib/wmap/site_tracker/deactivated_site.rb +85 -0
- data/lib/wmap/site_tracker.rb +937 -0
- data/lib/wmap/url_checker.rb +314 -0
- data/lib/wmap/url_crawler.rb +381 -0
- data/lib/wmap/utils/domain_root.rb +184 -0
- data/lib/wmap/utils/logger.rb +53 -0
- data/lib/wmap/utils/url_magic.rb +343 -0
- data/lib/wmap/utils/utils.rb +333 -0
- data/lib/wmap/whois.rb +76 -0
- data/lib/wmap.rb +227 -0
- data/logs/wmap.log +17 -0
- data/ruby_whois_patches/base_cocca2.rb +149 -0
- data/ruby_whois_patches/kero.yachay.pe.rb +120 -0
- data/ruby_whois_patches/whois.PublicDomainRegistry.com.rb +124 -0
- data/ruby_whois_patches/whois.above.com.rb +61 -0
- data/ruby_whois_patches/whois.adamsnames.tc.rb +107 -0
- data/ruby_whois_patches/whois.aeda.net.ae.rb +105 -0
- data/ruby_whois_patches/whois.ai.rb +112 -0
- data/ruby_whois_patches/whois.arnes.si.rb +121 -0
- data/ruby_whois_patches/whois.ascio.com.rb +91 -0
- data/ruby_whois_patches/whois.cnnic.cn.rb +123 -0
- data/ruby_whois_patches/whois.corporatedomains.com.rb +67 -0
- data/ruby_whois_patches/whois.crsnic.net.rb +108 -0
- data/ruby_whois_patches/whois.denic.de.rb +174 -0
- data/ruby_whois_patches/whois.dk-hostmaster.dk.rb +120 -0
- data/ruby_whois_patches/whois.dns.be.rb +134 -0
- data/ruby_whois_patches/whois.dns.lu.rb +129 -0
- data/ruby_whois_patches/whois.dns.pl.rb +150 -0
- data/ruby_whois_patches/whois.dns.pt.rb +119 -0
- data/ruby_whois_patches/whois.domain.kg.rb +126 -0
- data/ruby_whois_patches/whois.domainregistry.my.rb +123 -0
- data/ruby_whois_patches/whois.domreg.lt.rb +110 -0
- data/ruby_whois_patches/whois.dot.tk.rb +140 -0
- data/ruby_whois_patches/whois.hkirc.hk.rb +121 -0
- data/ruby_whois_patches/whois.isnic.is.rb +130 -0
- data/ruby_whois_patches/whois.je.rb +119 -0
- data/ruby_whois_patches/whois.jprs.jp.rb +137 -0
- data/ruby_whois_patches/whois.kenic.or.ke.rb +140 -0
- data/ruby_whois_patches/whois.markmonitor.com.rb +118 -0
- data/ruby_whois_patches/whois.melbourneit.com.rb +58 -0
- data/ruby_whois_patches/whois.nic.as.rb +96 -0
- data/ruby_whois_patches/whois.nic.at.rb +109 -0
- data/ruby_whois_patches/whois.nic.ch.rb +141 -0
- data/ruby_whois_patches/whois.nic.cl.rb +117 -0
- data/ruby_whois_patches/whois.nic.ec.rb +157 -0
- data/ruby_whois_patches/whois.nic.im.rb +120 -0
- data/ruby_whois_patches/whois.nic.it.rb +170 -0
- data/ruby_whois_patches/whois.nic.lv.rb +116 -0
- data/ruby_whois_patches/whois.nic.ly.rb +127 -0
- data/ruby_whois_patches/whois.nic.mu.rb +27 -0
- data/ruby_whois_patches/whois.nic.mx.rb +123 -0
- data/ruby_whois_patches/whois.nic.net.sa.rb +111 -0
- data/ruby_whois_patches/whois.nic.or.kr.rb +101 -0
- data/ruby_whois_patches/whois.nic.tel.rb +129 -0
- data/ruby_whois_patches/whois.nic.tr.rb +133 -0
- data/ruby_whois_patches/whois.nic.us.rb +129 -0
- data/ruby_whois_patches/whois.nic.ve.rb +135 -0
- data/ruby_whois_patches/whois.norid.no.rb +127 -0
- data/ruby_whois_patches/whois.pandi.or.id.rb +118 -0
- data/ruby_whois_patches/whois.psi-usa.info.rb +63 -0
- data/ruby_whois_patches/whois.registro.br.rb +109 -0
- data/ruby_whois_patches/whois.registrygate.com.rb +55 -0
- data/ruby_whois_patches/whois.rrpproxy.net.rb +61 -0
- data/ruby_whois_patches/whois.sgnic.sg.rb +130 -0
- data/ruby_whois_patches/whois.srs.net.nz.rb +166 -0
- data/ruby_whois_patches/whois.tucows.com.rb +70 -0
- data/ruby_whois_patches/whois.twnic.net.tw.rb +133 -0
- data/settings/discovery_ports +24 -0
- data/settings/google_keywords.txt +9 -0
- data/settings/google_locator.txt +23 -0
- data/test/domain_tracker_test.rb +31 -0
- data/test/utils_test.rb +168 -0
- data/version.txt +13 -0
- data/wmap.gemspec +49 -0
- metadata +202 -0
data/bin/wdel
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# Executable to delete a new site into the tracking data repository
|
|
3
|
+
# This is useful as a self-correction mechanism to flag out unique website in a constant way
|
|
4
|
+
require "wmap"
|
|
5
|
+
|
|
6
|
+
def print_usage
|
|
7
|
+
puts "Program to delete an entry from the local data repository. Usage: wdel [site]"
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
puts Wmap.banner
|
|
11
|
+
print_usage
|
|
12
|
+
Log_dir=File.dirname(__FILE__)+'/../logs/'
|
|
13
|
+
Wmap.wlog("Execute the command: wdel #{ARGV[0]}","wdel",Log_dir+"wmap.log")
|
|
14
|
+
|
|
15
|
+
st=Wmap::SiteTracker.instance
|
|
16
|
+
abort "Incorrect program argument!" unless ARGV.length==1
|
|
17
|
+
|
|
18
|
+
# Evaluate the argument and update the data store accordingly
|
|
19
|
+
if st.is_site?(ARGV[0])
|
|
20
|
+
st.delete(ARGV[0])
|
|
21
|
+
st.save!
|
|
22
|
+
st=nil
|
|
23
|
+
else
|
|
24
|
+
abort "Unknown argument format: #{ARGV[0]}"
|
|
25
|
+
end
|
data/bin/wdump
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# Wmap data repository Dump - Dump out a list of unique websites stored in the current tracking data repository.
|
|
3
|
+
# Usage: wdump <output file>
|
|
4
|
+
require "wmap"
|
|
5
|
+
|
|
6
|
+
def print_usage
|
|
7
|
+
puts "Program to dump out unique website assets from the local repository. Usage: wdump <output file>"
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
puts Wmap.banner
|
|
11
|
+
Log_dir=File.dirname(__FILE__)+'/../logs/'
|
|
12
|
+
Wmap.wlog("Execute the command: wdump #{ARGV[0]}","wdump",Log_dir+"wmap.log")
|
|
13
|
+
|
|
14
|
+
unless ARGV.length==1
|
|
15
|
+
print_usage
|
|
16
|
+
abort "Program argument error. Please check your input and try again. "
|
|
17
|
+
end
|
|
18
|
+
# dump out the unique target list in .csv format
|
|
19
|
+
continue=Wmap.dump(ARGV[0]+".csv")
|
|
20
|
+
# continue to dump out the list in the .xml format if previous step is successful
|
|
21
|
+
Wmap.dump_xml(ARGV[0]+".xml") if continue
|
data/bin/wmap
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# Wmap main executable - intelligent enough to handle most command argument inputs from the user.
|
|
3
|
+
# The discovery result is automatically compared and saved into the the tracking data repository.
|
|
4
|
+
#
|
|
5
|
+
# Usage: wmap <Target Host | URL | IP | CIDR | or a seed file with any of the above combo> <Optional Discovery Result Directory>
|
|
6
|
+
require "wmap"
|
|
7
|
+
|
|
8
|
+
def print_usage
|
|
9
|
+
abort "Program to perform website asset discovery and tracking. \nUsage: wmap <Target Host | URL | IP | CIDR | or a seed file with any of the above combo> <Optional Discovery Result Directory>"
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# preparing - spit out the program banner
|
|
13
|
+
puts Wmap.banner
|
|
14
|
+
if ARGV.length == 1
|
|
15
|
+
# Log the command entry
|
|
16
|
+
Log_dir=File.dirname(__FILE__)+'/../logs/'
|
|
17
|
+
elsif ARGV.length == 2
|
|
18
|
+
# Log to the instance running directory
|
|
19
|
+
Log_dir=ARGV[1] + '/logs/'
|
|
20
|
+
Dir.mkdir(Log_dir) unless Dir.exist?(Log_dir)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
Wmap.wlog("Execute the command: wmap #{ARGV[0]}","wmap",Log_dir+"wmap.log")
|
|
24
|
+
print_usage unless (ARGV.length==1 or ARGV.length==2)
|
|
25
|
+
urls = Array.new
|
|
26
|
+
# first step - construct the host list
|
|
27
|
+
scanner = Wmap::PortScanner.new(:verbose=>false, :socket_timeout=>600) # default time-out of 600 milliseconds
|
|
28
|
+
hosts=Array.new
|
|
29
|
+
if File.exist?(ARGV[0])
|
|
30
|
+
puts "Parsing the discovery seed file: \"#{ARGV[0]}\" "
|
|
31
|
+
seeds=scanner.file_2_list(ARGV[0])-[nil,""]
|
|
32
|
+
domains=Array.new
|
|
33
|
+
cidrs=Array.new
|
|
34
|
+
raise "Error: empty seed file or no legal entry found!" if seeds.nil? or seeds.empty?
|
|
35
|
+
seeds.map do |x|
|
|
36
|
+
x=x.split(%r{(,|\s+)})[0]
|
|
37
|
+
urls.push(x) if scanner.is_url?(x)
|
|
38
|
+
domains.push(x) if scanner.is_domain_root?(x) or Wmap.sub_domain_known?(x)
|
|
39
|
+
# invoke bruter if the hostname contains a numeric number.
|
|
40
|
+
domains.push(x) if scanner.is_fqdn?(x) and (x.split('.')[0] =~ /\d+/)
|
|
41
|
+
hosts.push(x) if scanner.is_fqdn?(x) or scanner.is_ip?(x)
|
|
42
|
+
cidrs.push(x) if scanner.is_cidr?(x)
|
|
43
|
+
end
|
|
44
|
+
puts "Parsing done. "
|
|
45
|
+
hosts+=Wmap::DnsBruter.new(:verbose=>false).dns_brute_workers(domains.uniq).values.flatten if domains.size > 0
|
|
46
|
+
cidrs.map { |x| hosts+= scanner.cidr_2_ips(x) } if cidrs.size > 0
|
|
47
|
+
elsif scanner.is_url?(ARGV[0])
|
|
48
|
+
puts "Processing the URL: #{ARGV[0]}"
|
|
49
|
+
urls.push(ARGV[0])
|
|
50
|
+
elsif Wmap.domain_known?(ARGV[0]) or Wmap.sub_domain_known?(ARGV[0])
|
|
51
|
+
puts "Processing the domain: #{ARGV[0]}"
|
|
52
|
+
hosts+=Wmap::DnsBruter.new(:verbose=>false).dns_brute_worker(ARGV[0]).values.flatten
|
|
53
|
+
elsif scanner.is_fqdn?(ARGV[0])
|
|
54
|
+
puts "Processing the host: #{ARGV[0]}"
|
|
55
|
+
hosts.push(ARGV[0])
|
|
56
|
+
my_hosts=Wmap::DnsBruter.new(:verbose=>false).dns_brute_worker(ARGV[0]).values.flatten if (ARGV[0].split('.')[0] =~ /\d+/)
|
|
57
|
+
hosts+=my_hosts unless my_hosts.nil?
|
|
58
|
+
elsif scanner.is_cidr?(ARGV[0])
|
|
59
|
+
puts "Processing the network block: #{ARGV[0]}"
|
|
60
|
+
hosts+=scanner.cidr_2_ips(ARGV[0])
|
|
61
|
+
elsif scanner.is_ip?(ARGV[0])
|
|
62
|
+
hosts.push(ARGV[0])
|
|
63
|
+
else
|
|
64
|
+
print_usage
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# second step - update the hosts repository
|
|
68
|
+
if ARGV.length == 1
|
|
69
|
+
puts puts "Invoke the HostTracker."
|
|
70
|
+
host_tracker = Wmap::HostTracker.new(:verbose=>true)
|
|
71
|
+
elsif ARGV.length == 2
|
|
72
|
+
puts "Invoke the HostTracker with optional directory setter."
|
|
73
|
+
host_tracker = Wmap::HostTracker.new(:verbose=>true, :data_dir => ARGV[1])
|
|
74
|
+
else
|
|
75
|
+
aborts "Error firing up HostTracker instance!"
|
|
76
|
+
end
|
|
77
|
+
hosts.uniq!
|
|
78
|
+
if hosts.size > 0
|
|
79
|
+
hostnames=hosts.dup.delete_if { |h| host_tracker.is_ip?(h) }
|
|
80
|
+
if hostnames.size > 0
|
|
81
|
+
puts "Update the local hosts data repository."
|
|
82
|
+
new_hosts=host_tracker.adds(hostnames)
|
|
83
|
+
host_tracker.save! if new_hosts.size>0
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
host_tracker=nil
|
|
87
|
+
|
|
88
|
+
# third step - port discovery on the above host list, and to build the URL seeds
|
|
89
|
+
puts "Build up URL list for the web crawler ..."
|
|
90
|
+
urls0=scanner.scans(hosts)
|
|
91
|
+
urls+=urls0
|
|
92
|
+
urls.uniq!
|
|
93
|
+
scanner=nil
|
|
94
|
+
|
|
95
|
+
# fourth step - crawling on the URL seeds
|
|
96
|
+
if ARGV.length == 1
|
|
97
|
+
puts "Fire up the crawler."
|
|
98
|
+
crawler = Wmap::UrlCrawler.new(:verbose=>false)
|
|
99
|
+
elsif ARGV.length == 2
|
|
100
|
+
puts "Fire up the crawler with the optional directory setter."
|
|
101
|
+
crawler = Wmap::UrlCrawler.new(:data_dir => ARGV[1])
|
|
102
|
+
else
|
|
103
|
+
aborts "Error firing up UrlCrawler instance!"
|
|
104
|
+
end
|
|
105
|
+
Wmap.wlog(urls, "wmap", Log_dir+"url_seeds.log") if urls.size > 0 # save port scan results for debugging
|
|
106
|
+
crawler.crawls(urls) if urls.size>0
|
|
107
|
+
dis_urls=crawler.discovered_urls_by_crawler
|
|
108
|
+
#c_start=crawler.crawl_start
|
|
109
|
+
#c_done=crawler.crawl_done
|
|
110
|
+
dis_sites=Hash.new
|
|
111
|
+
unless dis_urls.empty?
|
|
112
|
+
dis_urls.keys.map do |url|
|
|
113
|
+
site=crawler.url_2_site(url)
|
|
114
|
+
dis_sites[site]=true unless dis_sites.key?(site)
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
puts "Discovered sites: "
|
|
118
|
+
|
|
119
|
+
if dis_sites.empty?
|
|
120
|
+
puts "No web site is discovered. "
|
|
121
|
+
else
|
|
122
|
+
dis_sites.keys.map {|x| puts x}
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
# fifth step - trace the discovery results into a local log file for debugging and other purposes
|
|
126
|
+
Wmap.wlog(dis_urls.keys, "wmap", Log_dir+"discovered_urls.log") unless dis_urls.empty?
|
|
127
|
+
Wmap.wlog(dis_sites.keys, "wmap", Log_dir+"discovered_sites.log") unless dis_sites.empty?
|
|
128
|
+
#crawler.wlog(c_start.keys,Log_dir+"crawler.log")
|
|
129
|
+
#crawler.wlog(c_done.keys,Log_dir+"crawler.log")
|
|
130
|
+
crawler=nil
|
|
131
|
+
|
|
132
|
+
# sixth step - save discovery results into the inventory data repository
|
|
133
|
+
case dis_sites.keys
|
|
134
|
+
when nil,[]
|
|
135
|
+
puts "No new site found. There is no change to the site tracking data repository. "
|
|
136
|
+
else
|
|
137
|
+
puts "Automatically save the discovery results into the site tracking data repository: "
|
|
138
|
+
if ARGV.length == 1
|
|
139
|
+
puts "Start the SiteTracker. "
|
|
140
|
+
inventory=Wmap::SiteTracker.new
|
|
141
|
+
elsif ARGV.length == 2
|
|
142
|
+
puts "Start the SiteTracker with the optional directory setter. "
|
|
143
|
+
inventory=Wmap::SiteTracker.new(:data_dir => ARGV[1])
|
|
144
|
+
else
|
|
145
|
+
aborts "Error firing up SiteTracker instance!"
|
|
146
|
+
end
|
|
147
|
+
new_sites=inventory.adds(dis_sites.keys)
|
|
148
|
+
inventory.save! if new_sites.size>0
|
|
149
|
+
inventory=nil
|
|
150
|
+
puts "Done! New found sites are successfully saved. " if new_sites.size > 0
|
|
151
|
+
end
|
data/bin/wscan
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# Executable to perform port scanning by using build-in tcp port scanner
|
|
3
|
+
# This is useful to detect the web service
|
|
4
|
+
require "wmap"
|
|
5
|
+
|
|
6
|
+
def print_usage
|
|
7
|
+
puts "Program to port scanning remote hops(s) or IP(s). Usage: wscan [IP | File with list of IPs]"
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
puts Wmap.banner
|
|
11
|
+
print_usage
|
|
12
|
+
Log_dir=File.dirname(__FILE__)+'/../logs/'
|
|
13
|
+
Wmap.wlog("Execute the command: wscan #{ARGV[0]}","wscan",Log_dir+"wmap.log")
|
|
14
|
+
|
|
15
|
+
sites=Array.new
|
|
16
|
+
ps=Wmap::PortScanner.new
|
|
17
|
+
abort "Incorrect program argument!" unless ARGV.length==1
|
|
18
|
+
|
|
19
|
+
# Evaluate the argument and update the data psore accordingly
|
|
20
|
+
if File.exist?(ARGV[0])
|
|
21
|
+
targets=ps.file_2_list(ARGV[0])
|
|
22
|
+
sites=ps.scans(targets)
|
|
23
|
+
elsif ps.is_ip?(ARGV[0]) or ps.is_fqdn?(ARGV[0])
|
|
24
|
+
sites=ps.scan(ARGV[0])
|
|
25
|
+
else
|
|
26
|
+
print_usage and abort "Unknown argument format: #{ARGV[0]}."
|
|
27
|
+
end
|
|
28
|
+
ps=nil
|
|
29
|
+
if sites.count>0
|
|
30
|
+
puts "Done. Discovered sites:"
|
|
31
|
+
sites.map {|x| puts x}
|
|
32
|
+
end
|
data/data/cidrs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Local site store created by class Wmap::SiteTracker::DeactivatedSite method save_sites_to_file! at: 2015-04-27 08:43:06 -0400
|
data/data/domains
ADDED
data/data/hosts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# local hosts file created by the Wmap::HostTracker class save_known_hosts_to_file! method at: 2015-04-21 08:59:33 -0400
|
data/data/prime_hosts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# local hosts file created by the Wmap::HostTracker::PrimaryHost class save_known_hosts_to_file! method at: 2015-07-07 12:25:34 -0400
|
data/data/sites
ADDED
data/data/sub_domains
ADDED
data/demos/bruter.rb
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Brute-forcing multiple domains at the same time, the purpose is to extract a valid host list
|
|
2
|
+
# Usage: ruby dns_brute.rb [file with list of domains]
|
|
3
|
+
require "wmap"
|
|
4
|
+
|
|
5
|
+
f_rpt=".rpt.txt"
|
|
6
|
+
# Step 1 - obtain list of domains to be brute-forced on
|
|
7
|
+
host_tracker=Wmap::HostTracker.new
|
|
8
|
+
root_domains=host_tracker.dump_root_domains
|
|
9
|
+
sub_domains=host_tracker.instance.dump_sub_domains
|
|
10
|
+
# Step 2 - multi-thread brute forcer works on known domains and sub-domains
|
|
11
|
+
k=Wmap::DnsBruter.new(:verbose=>true, :max_parallel=>50)
|
|
12
|
+
#hosts=k.dns_brute_file(ARGV[0])
|
|
13
|
+
results=k.dns_brute_workers(sub_domains+root_domains)
|
|
14
|
+
k=nil
|
|
15
|
+
#hosts=hosts1+hosts2
|
|
16
|
+
# Step 3 - save results to a local file for debugging
|
|
17
|
+
f=File.open(f_rpt,"w")
|
|
18
|
+
results.each_pair do |key,value|
|
|
19
|
+
f.write("#{value}\n")
|
|
20
|
+
end
|
|
21
|
+
f.close
|
|
22
|
+
puts "Brute force results are saved successfully: #{f_rpt}"
|
|
23
|
+
|
|
24
|
+
# Step 4 - now update the local hosts table accordingly
|
|
25
|
+
host_tracker.bulk_add(results.values.flatten)
|
|
26
|
+
host_tracker.instance.save!
|
|
27
|
+
host_tracker=nil
|
data/demos/dns_brutes.rb
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Brute-forcing multiple domains at the same time, the purpose is to extract a valid host list
|
|
2
|
+
# Usage: ruby dns_brute.rb [file with list of domains]
|
|
3
|
+
require "wmap"
|
|
4
|
+
|
|
5
|
+
f_rpt=".rpt.txt"
|
|
6
|
+
# Step 1 - obtain list of domains to be brute-forced on
|
|
7
|
+
tracker=Wmap::HostTracker.new
|
|
8
|
+
root_domains=tracker.dump_root_domains
|
|
9
|
+
sub_domains=tracker.dump_sub_domains
|
|
10
|
+
# Step 2 - multi-thread brute forcer works on known domains and sub-domains
|
|
11
|
+
k=Wmap::DnsBruter.new(:verbose=>false, :max_parallel=>50)
|
|
12
|
+
#hosts=k.dns_brute_file(ARGV[0])
|
|
13
|
+
#hosts = k.dns_brute_domains(root_domains)
|
|
14
|
+
hosts=k.dns_brute_domains(sub_domains)
|
|
15
|
+
k=nil
|
|
16
|
+
#hosts=hosts1+hosts2
|
|
17
|
+
# Step 3 - save results to a local file for debugging
|
|
18
|
+
f=File.open(f_rpt,"w")
|
|
19
|
+
hosts.map do |x|
|
|
20
|
+
f.write("#{x}\n")
|
|
21
|
+
end
|
|
22
|
+
f.close
|
|
23
|
+
puts "Brute force results are saved successfully: #{f_rpt}"
|
|
24
|
+
|
|
25
|
+
# Step 4 - now update the local hosts table accordingly
|
|
26
|
+
tracker.bulk_add(hosts)
|
|
27
|
+
tracker.save!
|
|
28
|
+
tracker=nil
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Sample CIDR Tracker - Given a trusted IP, print out all tracked CIDR information
|
|
2
|
+
# Usage: ruby filter_cidr.rb [file_web_hosts]
|
|
3
|
+
require "wmap"
|
|
4
|
+
|
|
5
|
+
puts "IP, CIDR, CIDR Netname, CIDR Reference"
|
|
6
|
+
myDis = Wmap::CidrTracker.new(:verbose=>false)
|
|
7
|
+
|
|
8
|
+
f_ips = File.open(ARGV[0], 'r:iso-8859-1')
|
|
9
|
+
f_ips.each do |line|
|
|
10
|
+
ip=line.chomp.split(',')[1]
|
|
11
|
+
if myDis.is_ip?(ip)
|
|
12
|
+
tracker=myDis.track(ip)
|
|
13
|
+
puts "#{line.chomp},#{tracker['cidr']},#{tracker['netname']},#{tracker['ref']}"
|
|
14
|
+
else
|
|
15
|
+
puts "#{line.chomp},,,"
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
f_ips.close
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Input file is a list of hosts or domains, output is a list of unknown hosts / domains
|
|
2
|
+
# Usage: ruby filter_domain_x.rb [file_host]
|
|
3
|
+
require "wmap"
|
|
4
|
+
|
|
5
|
+
puts Wmap.banner
|
|
6
|
+
puts "Host,Domain,IP,Trusted CIDR,Trusted CIDR Netname"
|
|
7
|
+
myD = Wmap::DomainTracker.new
|
|
8
|
+
f_urls = File.open(ARGV[0], 'r')
|
|
9
|
+
f_urls.each do |line|
|
|
10
|
+
url=line.chomp
|
|
11
|
+
host=myD.url_2_host(url)
|
|
12
|
+
next if host.nil?
|
|
13
|
+
domain=myD.domain_root(host)
|
|
14
|
+
next if domain.nil?
|
|
15
|
+
if myD.domain_known?(domain)
|
|
16
|
+
#puts url
|
|
17
|
+
next
|
|
18
|
+
else
|
|
19
|
+
#next
|
|
20
|
+
tracker=Wmap.track(host)
|
|
21
|
+
puts "#{host}, #{domain}, #{tracker['ip']}, #{tracker['cidr']}, #{tracker['netname']}"
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
f_urls.close
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Perform GEOIP info lookup, based on Maxmind GeoIP database
|
|
2
|
+
# Usage: ruby filter_geoip.rb [file_wdump_csv]
|
|
3
|
+
require "wmap"
|
|
4
|
+
|
|
5
|
+
verbose=false
|
|
6
|
+
tracker = Wmap::GeoIPTracker.new(:verbose=>false)
|
|
7
|
+
|
|
8
|
+
#puts "IP, GeoIP Location"
|
|
9
|
+
f_ips = File.open(ARGV[0], 'r')
|
|
10
|
+
f_ips.each do |line|
|
|
11
|
+
ip=line.chomp.split(',')[1]
|
|
12
|
+
info=String.new
|
|
13
|
+
if tracker.is_ip?(ip)
|
|
14
|
+
puts "IP: #{ip}" if verbose
|
|
15
|
+
ctr=tracker.country(ip)
|
|
16
|
+
info = info + " " + ctr.country_code3 unless ctr.country_code3.nil?
|
|
17
|
+
citi=tracker.city(ip)
|
|
18
|
+
info=info+" "+citi.region_name unless citi.nil? or citi.region_name.nil?
|
|
19
|
+
info=info+" "+citi.city_name unless citi.nil? or citi.city_name.nil?
|
|
20
|
+
info=info+" "+citi.postal_code unless citi.nil? or citi.postal_code.nil?
|
|
21
|
+
puts "#{line.chomp}, #{info}"
|
|
22
|
+
else
|
|
23
|
+
puts "#{line.chomp},"
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
f_ips.close
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Compare the scan lists and flag out the new site
|
|
2
|
+
# Usage: filter_known_@services.rb [last quarter list] [this quarter list]
|
|
3
|
+
|
|
4
|
+
require "wmap"
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
# Create a known service map by parsing last quarter scan list
|
|
8
|
+
def parse_old
|
|
9
|
+
host_tracker=Wmap::HostTracker.new
|
|
10
|
+
@services=Hash.new
|
|
11
|
+
f_site=File.open(ARGV[0],'r')
|
|
12
|
+
f_site.each do |line|
|
|
13
|
+
site=line.chomp.strip
|
|
14
|
+
site=host_tracker.url_2_site(site)
|
|
15
|
+
abort "Error on processing site: #{site}" if site.nil?
|
|
16
|
+
host=host_tracker.url_2_host(site)
|
|
17
|
+
abort "Error on processing host: #{host}" if host.nil?
|
|
18
|
+
ip=host_tracker.local_host_2_ip(host)
|
|
19
|
+
ip=host_tracker.host_2_ip(host) if ip.nil?
|
|
20
|
+
next if ip.nil?
|
|
21
|
+
next unless host_tracker.is_ip?(ip)
|
|
22
|
+
port=host_tracker.url_2_port(site)
|
|
23
|
+
key=ip+":"
|
|
24
|
+
key+=port.to_s
|
|
25
|
+
@services[key]=true unless @services.key?(key)
|
|
26
|
+
end
|
|
27
|
+
f_site.close
|
|
28
|
+
host_tracker=nil
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Go through the new scan list and look up for known service from last quarter
|
|
32
|
+
def diff
|
|
33
|
+
host_tracker=Wmap::HostTracker.new
|
|
34
|
+
f_new = File.open(ARGV[1],'r')
|
|
35
|
+
f_new.each do |line|
|
|
36
|
+
site=line.chomp.strip
|
|
37
|
+
site1=host_tracker.url_2_site(site)
|
|
38
|
+
abort "Error on processing site: #{site}" if site1.nil?
|
|
39
|
+
host=host_tracker.url_2_host(site1)
|
|
40
|
+
abort "Error on processing host: #{host}" if host.nil?
|
|
41
|
+
ip=host_tracker.local_host_2_ip(host)
|
|
42
|
+
ip=host_tracker.host_2_ip(host) if ip.nil?
|
|
43
|
+
abort "Error resolve host: #{host}" if ip.nil?
|
|
44
|
+
port=host_tracker.url_2_port(site1)
|
|
45
|
+
abort "Error retrieve service port on site: #{site}" if port.nil?
|
|
46
|
+
key=ip+":"
|
|
47
|
+
key+=port.to_s
|
|
48
|
+
if @services.key?(key)
|
|
49
|
+
puts "No"
|
|
50
|
+
else
|
|
51
|
+
puts "Yes"
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
f_new.close
|
|
55
|
+
host_tracker=nil
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
parse_old
|
|
59
|
+
diff
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Exact netname and description from the whois query on an IP
|
|
2
|
+
# Usage: ruby filter_netinfo.rb [file_ip]
|
|
3
|
+
require "wmap"
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
puts Wmap.banner
|
|
7
|
+
whois = Wmap::Whois.new(:verbose=>false)
|
|
8
|
+
#tracker = Wmap::CidrTracker.new
|
|
9
|
+
|
|
10
|
+
#puts "IP ; Netname ; Net Reference"
|
|
11
|
+
f_ips = File.open(ARGV[0], 'r:iso-8859-1')
|
|
12
|
+
f_ips.each do |line|
|
|
13
|
+
ip=line.chomp.split(',')[1]
|
|
14
|
+
if whois.is_ip?(ip) or whois.is_cidr?(ip)
|
|
15
|
+
netname=whois.get_netname(ip)
|
|
16
|
+
desc=whois.get_net_desc(ip)
|
|
17
|
+
#tr=tracker.track(ip)
|
|
18
|
+
puts "#{line.chomp};#{netname};#{desc}"
|
|
19
|
+
else
|
|
20
|
+
puts "#{line.chomp};;"
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
f_ips.close
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Replace the embedded hostname within the url, based on the prime host table
|
|
2
|
+
# Usage: ruby filter_prime.rb [file_host]
|
|
3
|
+
require "wmap"
|
|
4
|
+
|
|
5
|
+
puts "URL | Prime URL"
|
|
6
|
+
my_tracker=Wmap::HostTracker::PrimaryHost.new
|
|
7
|
+
f_urls = File.open(ARGV[0], 'r')
|
|
8
|
+
f_urls.each do |line|
|
|
9
|
+
url=line.chomp
|
|
10
|
+
if my_tracker.is_url?(url)
|
|
11
|
+
host=my_tracker.url_2_host(url)
|
|
12
|
+
ip=my_tracker.host_2_ip(host)
|
|
13
|
+
if my_tracker.ip_known?(ip)
|
|
14
|
+
p_host=my_tracker.local_ip_2_host(ip)
|
|
15
|
+
url_new=url.sub(host,p_host)
|
|
16
|
+
else
|
|
17
|
+
url_new=url
|
|
18
|
+
end
|
|
19
|
+
puts "#{url} | #{url_new}"
|
|
20
|
+
else
|
|
21
|
+
puts "#{url} | #{url}"
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
f_urls.close
|
|
25
|
+
my_tracker=nil
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Internet domain fingerprint technique - print the redirection location if any
|
|
2
|
+
# Usage: ruby filter_redirection.rb [file_urls]
|
|
3
|
+
require "wmap"
|
|
4
|
+
|
|
5
|
+
puts "List of URLs with Redirection:"
|
|
6
|
+
puts "URL, Reponse Code, Redirection Location"
|
|
7
|
+
myDis = Wmap::UrlChecker.new
|
|
8
|
+
myDis.http_timeout=5000
|
|
9
|
+
f_urls = File.open(ARGV[0], 'r')
|
|
10
|
+
f_urls.each do |line|
|
|
11
|
+
url=line.chomp
|
|
12
|
+
host=myDis.url_2_host(url)
|
|
13
|
+
code=myDis.response_code(url)
|
|
14
|
+
if code >= 300 && code < 400
|
|
15
|
+
location=myDis.redirect_location(url)
|
|
16
|
+
end
|
|
17
|
+
puts "#{url}, #{code}, #{location}"
|
|
18
|
+
end
|
|
19
|
+
f_urls.close
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# filter to select findings for the list of sites
|
|
2
|
+
# Usage: ruby filter_site.rb [file targets] [file finding keys]
|
|
3
|
+
# Input A is a list of target sites, input B is a list of site index keys for the finding summary
|
|
4
|
+
# Output is a list of key for the matching purpose
|
|
5
|
+
|
|
6
|
+
require "wmap"
|
|
7
|
+
@map=Hash.new
|
|
8
|
+
|
|
9
|
+
def build_map (file)
|
|
10
|
+
k=Wmap::SiteTracker.new
|
|
11
|
+
f=File.open(file,'r')
|
|
12
|
+
f.each do |line|
|
|
13
|
+
url=line.chomp.strip.downcase
|
|
14
|
+
if k.is_url?(url)
|
|
15
|
+
@map[k.url_2_site(url)]=true
|
|
16
|
+
else
|
|
17
|
+
#puts url
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
f.close
|
|
21
|
+
k=nil
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
build_map(ARGV[0])
|
|
26
|
+
s=Wmap::SiteTracker.new
|
|
27
|
+
f=File.open(ARGV[1],'r')
|
|
28
|
+
f.each do |line|
|
|
29
|
+
url=line.chomp.strip.downcase
|
|
30
|
+
if s.is_url?(url)
|
|
31
|
+
site=s.url_2_site(url)
|
|
32
|
+
if @map.key?(site)
|
|
33
|
+
puts "yes"
|
|
34
|
+
else
|
|
35
|
+
puts "no"
|
|
36
|
+
end
|
|
37
|
+
else
|
|
38
|
+
puts "Invalid Internet URL"
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Sample Site IP Tracker - Given a IP, flag it if not found in the site data repository
|
|
2
|
+
# Usage: ruby filter_siteip.rb [file_web_hosts]
|
|
3
|
+
require "wmap"
|
|
4
|
+
|
|
5
|
+
def known?(ip)
|
|
6
|
+
ip=ip.chomp.strip
|
|
7
|
+
myDis = Wmap::SiteTracker.new
|
|
8
|
+
known=false
|
|
9
|
+
if myDis.is_ip?(ip)
|
|
10
|
+
if myDis.siteip_known?(ip)
|
|
11
|
+
myDis=nil
|
|
12
|
+
return true
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
myDis=nil
|
|
16
|
+
return known
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
puts "Site IP, Status"
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
f_ips = File.open(ARGV[0], 'r')
|
|
23
|
+
f_ips.each do |line|
|
|
24
|
+
ip=line.chomp.strip
|
|
25
|
+
if known?(ip)
|
|
26
|
+
# do nothing
|
|
27
|
+
else
|
|
28
|
+
puts "#{ip}, unknown"
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
f_ips.close
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Print the URL of a site if it response to the HTTP request
|
|
2
|
+
# Usage: ruby filter_status.rb [file_url_links]
|
|
3
|
+
require "wmap"
|
|
4
|
+
|
|
5
|
+
puts "List of URLs with the Valid Response Code:"
|
|
6
|
+
puts "URL, Reponse Code, URL Finger Print, IP, Trusted CIDR, Trusted CIDR Netname"
|
|
7
|
+
myDis = Wmap::UrlChecker.new(:verbose=>false, :http_timeout=>5000)
|
|
8
|
+
|
|
9
|
+
f_urls = File.open(ARGV[0], 'r')
|
|
10
|
+
f_urls.each do |line|
|
|
11
|
+
next if url.nil?
|
|
12
|
+
checker=myDis.check(url)
|
|
13
|
+
host=line.chomp
|
|
14
|
+
tracker=Wmap.track(host)
|
|
15
|
+
puts "#{url}, #{checker['code']}, #{checker['md5']}, #{tracker['ip']}, #{tracker['cidr']}, #{tracker['netname']}"
|
|
16
|
+
end
|
|
17
|
+
f_urls.close
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# print out the timestamp for the sites
|
|
2
|
+
# Usage: ruby filter_timestamp.rb [file_sites]
|
|
3
|
+
require "wmap"
|
|
4
|
+
|
|
5
|
+
tracker = Wmap::SiteTracker.instance
|
|
6
|
+
|
|
7
|
+
puts "Site | Timestamp"
|
|
8
|
+
f_urls = File.open(ARGV[0], 'r')
|
|
9
|
+
f_urls.each do |line|
|
|
10
|
+
url=line.chomp
|
|
11
|
+
if tracker.is_url?(url)
|
|
12
|
+
site=tracker.url_2_site(url)
|
|
13
|
+
if tracker.site_known?(site)
|
|
14
|
+
ts=tracker.known_sites[site]['timestamp']
|
|
15
|
+
puts "#{site}|#{ts}"
|
|
16
|
+
else
|
|
17
|
+
puts site
|
|
18
|
+
end
|
|
19
|
+
else
|
|
20
|
+
puts url
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
f_urls.close
|
data/demos/filter_url.rb
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# filter to detect unknown internet domain
|
|
2
|
+
# Input is a list of URLs
|
|
3
|
+
# Output is an internet domain list that not currently tracked by the domain tracker
|
|
4
|
+
|
|
5
|
+
require "wmap"
|
|
6
|
+
|
|
7
|
+
k=Wmap::DomainTracker.new
|
|
8
|
+
#k.verbose=true
|
|
9
|
+
f=File.open(ARGV[0],'r')
|
|
10
|
+
f.each do |line|
|
|
11
|
+
url=line.chomp.strip.downcase
|
|
12
|
+
host=k.url_2_host(url)
|
|
13
|
+
root=k.get_domain_root(host)
|
|
14
|
+
unless k.domain_known?(root)
|
|
15
|
+
puts root
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
f.close
|
|
19
|
+
k=nil
|