summaryrefslogtreecommitdiffstats
path: root/scripts/targets-asn.nse
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/targets-asn.nse')
-rw-r--r--scripts/targets-asn.nse101
1 files changed, 101 insertions, 0 deletions
diff --git a/scripts/targets-asn.nse b/scripts/targets-asn.nse
new file mode 100644
index 0000000..1002e0b
--- /dev/null
+++ b/scripts/targets-asn.nse
@@ -0,0 +1,101 @@
+local nmap = require "nmap"
+local stdnse = require "stdnse"
+local stringaux = require "stringaux"
+local table = require "table"
+local target = require "target"
+
+description = [[
+Produces a list of IP prefixes for a given routing AS number (ASN).
+
+This script uses a whois server database operated by the Shadowserver
+Foundation. We thank them for granting us permission to use this in
+Nmap.
+
+Output is in CIDR notation.
+
+http://www.shadowserver.org/wiki/pmwiki.php/Services/IP-BGP
+]]
+
+---
+-- @args targets-asn.asn The ASN to search.
+-- @args targets-asn.whois_server The whois server to use. Default: asn.shadowserver.org.
+-- @args targets-asn.whois_port The whois port to use. Default: 43.
+--
+-- @usage
+-- nmap --script targets-asn --script-args targets-asn.asn=32
+--
+-- @output
+-- Pre-scan script results:
+-- | targets-asn:
+-- | 32
+-- | 128.12.0.0/16
+-- |_ 171.64.0.0/14
+
+author = "John R. Bond"
+license = "Simplified (2-clause) BSD license--See https://nmap.org/svn/docs/licenses/BSD-simplified"
+
+categories = {"discovery", "external", "safe"}
+
+
+prerule = function()
+ return true
+end
+
+action = function(host, port)
+ local asns, whois_server, whois_port, err, status, newtargets
+ local results = {}
+
+ asns = stdnse.get_script_args('targets-asn.asn') or stdnse.get_script_args('asn-to-prefix.asn')
+ whois_server = stdnse.get_script_args('targets-asn.whois_server') or stdnse.get_script_args('asn-to-prefix.whois_server')
+ whois_port = stdnse.get_script_args('targets-asn.whois_port') or stdnse.get_script_args('asn-to-prefix.whois_port')
+
+ if not asns then
+ return stdnse.format_output(true, "targets-asn.asn is a mandatory parameter")
+ end
+ if not whois_server then
+ whois_server = "asn.shadowserver.org"
+ end
+ if not whois_port then
+ whois_port = 43
+ end
+ if type(asns) ~= "table" then
+ asns = {asns}
+ end
+
+ for _, asn in ipairs(asns) do
+ local socket = nmap.new_socket()
+
+ local prefixes = {}
+ prefixes['name'] = asn
+
+ status, err = socket:connect(whois_server, whois_port)
+ if ( not(status) ) then
+ table.insert(prefixes, err)
+ else
+ status, err = socket:send("prefix " .. asn .. "\n")
+ if ( not(status) ) then
+ table.insert(prefixes, err)
+ else
+ while true do
+ local status, data = socket:receive_lines(1)
+ if ( not(status) ) then
+ table.insert(prefixes, err)
+ break
+ else
+ for i, prefix in ipairs(stringaux.strsplit("\n",data)) do
+ if ( #prefix > 1 ) then
+ table.insert(prefixes,prefix)
+ if target.ALLOW_NEW_TARGETS then
+ stdnse.debug1("Added targets: "..prefix)
+ local status,err = target.add(prefix)
+ end
+ end
+ end
+ end
+ end
+ end
+ end
+ table.insert(results,prefixes)
+ end
+ return stdnse.format_output(true, results)
+end