wmap 2.4.4
Sign up to get free protection for your applications and to get access to all the features.
- 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
|