summaryrefslogtreecommitdiffstats
path: root/scripts/bittorrent-discovery.nse
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/bittorrent-discovery.nse')
-rw-r--r--scripts/bittorrent-discovery.nse139
1 files changed, 139 insertions, 0 deletions
diff --git a/scripts/bittorrent-discovery.nse b/scripts/bittorrent-discovery.nse
new file mode 100644
index 0000000..0fbd22d
--- /dev/null
+++ b/scripts/bittorrent-discovery.nse
@@ -0,0 +1,139 @@
+local stdnse = require "stdnse"
+local table = require "table"
+local target = require "target"
+
+
+local bittorrent = stdnse.silent_require "bittorrent"
+
+description = [[
+Discovers bittorrent peers sharing a file based on a user-supplied
+torrent file or magnet link. Peers implement the Bittorrent protocol
+and share the torrent, whereas the nodes (only shown if the
+include-nodes NSE argument is given) implement the DHT protocol and
+are used to track the peers. The sets of peers and nodes are not the
+same, but they usually intersect.
+
+If the <code>newtargets</code> script-arg is supplied it adds the discovered
+peers as targets.
+]]
+
+---
+-- @usage
+-- nmap --script bittorrent-discovery --script-args newtargets,bittorrent-discovery.torrent=<torrent_file>
+--
+-- @args bittorrent-discovery.torrent a string containing the filename of the torrent file
+-- @args bittorrent-discovery.magnet a string containing the magnet link of the torrent
+-- @args bittorrent-discovery.timeout desired (not actual) timeout for the DHT discovery (default = 30s)
+-- @args bittorrent-discovery.include-nodes boolean selecting whether to show only nodes
+--
+-- @output
+-- | bittorrent-discovery:
+-- | Peers:
+-- | 97.88.178.168
+-- | 89.100.184.36
+-- | 86.185.55.212
+-- | Total of 3 peers discovered
+-- | Nodes:
+-- | 68.103.0.189
+-- | 67.164.32.71
+-- | 24.121.13.69
+-- | 207.112.100.224
+-- | Total of 4 nodes discovered
+-- |_ Use the newtargets script-arg to add the results as targets
+--
+
+author = "Gorjan Petrovski"
+license = "Same as Nmap--See https://nmap.org/book/man-legal.html"
+categories = {"discovery","safe"}
+
+
+prerule = function()
+ if not stdnse.get_script_args(SCRIPT_NAME..".torrent") and
+ not stdnse.get_script_args(SCRIPT_NAME..".magnet") then
+ stdnse.debug3("Skipping '%s' %s, No magnet link or torrent file arguments.", SCRIPT_NAME, SCRIPT_TYPE)
+ return false
+ end
+ return true
+end
+
+action = function()
+ local timeout = stdnse.parse_timespec(stdnse.get_script_args(SCRIPT_NAME..".timeout"))
+ local filename = stdnse.get_script_args(SCRIPT_NAME..".torrent")
+ local magnet = stdnse.get_script_args(SCRIPT_NAME..".magnet")
+ local include_nodes = stdnse.get_script_args(SCRIPT_NAME..".include-nodes")
+
+ local t = bittorrent.Torrent:new()
+ if filename then
+ local status, err = t:load_from_file(filename)
+ if not status then
+ return stdnse.format_output(false, err)
+ end
+ elseif magnet then
+ local status, err = t:load_from_magnet(magnet)
+ if not status then
+ return stdnse.format_output(false, err)
+ end
+ end
+ t:trackers_peers()
+ t:dht_peers(timeout)
+
+ local output = {}
+ local peers = {}
+ peers.name = "Peers:"
+ local nodes = {}
+ nodes.name = "Nodes:"
+
+ -- add peers
+ if target.ALLOW_NEW_TARGETS then
+ for peer_ip in pairs(t.peers) do
+ target.add(peer_ip)
+ table.insert(peers, peer_ip)
+ end
+ if #peers>0 then
+ table.insert(peers, "Total of "..#peers.." peers discovered")
+ end
+ else
+ for peer_ip in pairs(t.peers) do
+ table.insert(peers, peer_ip)
+ end
+ if #peers>0 then
+ table.insert(peers, "Total of "..#peers.." peers discovered")
+ end
+ end
+
+ -- add nodes
+ if target.ALLOW_NEW_TARGETS and include_nodes then
+ for node_ip in pairs(t.nodes) do
+ target.add(node_ip)
+ table.insert(nodes, node_ip)
+ end
+ if #nodes >0 then
+ table.insert(nodes, "Total of "..#nodes.." nodes discovered")
+ end
+ elseif include_nodes then
+ for node_ip in pairs(t.nodes) do
+ table.insert(nodes, node_ip)
+ end
+ if #nodes >0 then
+ table.insert(nodes, "Total of "..#nodes.." nodes discovered")
+ end
+ end
+
+ local print_out = false
+
+ if #peers > 0 then
+ table.insert(output, peers)
+ print_out = true
+ end
+
+ if include_nodes and #nodes > 0 then
+ table.insert(output, nodes)
+ print_out = true
+ end
+
+ if print_out and not target.ALLOW_NEW_TARGETS then
+ table.insert(output,"Use the newtargets script-arg to add the results as targets")
+ end
+
+ return stdnse.format_output( print_out , output)
+end