summaryrefslogtreecommitdiffstats
path: root/scripts/gopher-ls.nse
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/gopher-ls.nse')
-rw-r--r--scripts/gopher-ls.nse92
1 files changed, 92 insertions, 0 deletions
diff --git a/scripts/gopher-ls.nse b/scripts/gopher-ls.nse
new file mode 100644
index 0000000..70ae90c
--- /dev/null
+++ b/scripts/gopher-ls.nse
@@ -0,0 +1,92 @@
+local nmap = require "nmap"
+local shortport = require "shortport"
+local stdnse = require "stdnse"
+local string = require "string"
+local stringaux = require "stringaux"
+local table = require "table"
+
+description = [[
+Lists files and directories at the root of a gopher service.
+]]
+
+---
+-- @usage
+-- nmap -p 70 --script gopher-ls --script-args gopher-ls.maxfiles=100 <target>
+--
+-- @output
+-- 70/tcp open gopher
+-- | gopher-ls:
+-- | [txt] /gresearch.txt "Gopher, the next big thing?"
+-- | [dir] /taxf "Tax Forms"
+-- |_Only 2 shown. Use --script-args gopher-ls.maxfiles=-1 to see all.
+--
+-- @args gopher-ls.maxfiles If set, limits the amount of files returned by
+-- the script. If set to 0 or less, all files are shown. The default
+-- value is 10.
+
+
+author = "Toni Ruottu"
+license = "Same as Nmap--See https://nmap.org/book/man-legal.html"
+categories = {"default", "discovery", "safe"}
+
+
+portrule = shortport.port_or_service (70, "gopher", {"tcp"})
+
+local function typelabel(gtype)
+ if gtype == "0" then
+ return "[txt]"
+ end
+ if gtype == "1" then
+ return "[dir]"
+ end
+ return string.format("[%s]", gtype)
+
+end
+
+action = function( host, port )
+
+ local INFO = "i"
+ local maxfiles = stdnse.get_script_args(SCRIPT_NAME..".maxfiles")
+ if not maxfiles then
+ maxfiles = 10
+ else
+ maxfiles = tonumber(maxfiles)
+ end
+ if maxfiles < 1 then
+ maxfiles = nil
+ end
+
+ local socket = nmap.new_socket()
+ local status, err = socket:connect(host, port)
+ if not status then
+ return
+ end
+
+ socket:send("\r\n")
+
+ local buffer, _ = stdnse.make_buffer(socket, "\r\n")
+ local line = buffer()
+ local files = {}
+
+ while line ~= nil do
+ if #line > 1 then
+ local gtype = string.sub(line, 1, 1)
+ local fields = stringaux.strsplit("\t", string.sub(line, 2))
+ if #fields > 1 then
+ local label = fields[1]
+ local filename = fields[2]
+ if gtype ~= INFO then
+ if maxfiles and #files >= maxfiles then
+ table.insert(files, string.format('Only %d shown. Use --script-args %s.maxfiles=-1 to see all.', maxfiles, SCRIPT_NAME))
+ break
+ else
+ table.insert(files, string.format('%s %s "%s"', typelabel(gtype), filename, label))
+ end
+ end
+ end
+ end
+ line = buffer()
+ end
+ return "\n" .. table.concat(files, "\n")
+end
+