1
0
mirror of https://github.com/nmap/nmap.git synced 2025-12-18 13:39:02 +00:00

NSE enhanced output patch

This commit is contained in:
devin
2014-05-29 03:22:59 +00:00
parent 415e2671ab
commit 5e6c9d5f78
3 changed files with 148 additions and 23 deletions

View File

@@ -443,7 +443,7 @@ do
co = co, co = co,
env = env, env = env,
identifier = tostring(co), identifier = tostring(co),
info = format("'%s' (%s)", self.short_basename, tostring(co)); info = format("'%s' M:%s", self.id, match(tostring(co), "0x(.*)") , -1);
parent = nil, -- placeholder parent = nil, -- placeholder
script = self, script = self,
type = script_type, type = script_type,
@@ -466,7 +466,7 @@ do
args = {n = select("#", ...), ...}, args = {n = select("#", ...), ...},
close_handlers = {}, close_handlers = {},
co = co, co = co,
info = format("'%s' worker (%s)", self.short_basename, tostring(co)); info = format("'%s' W:%s", self.id, match(tostring(co), "0x(.*)") , -1);
parent = self, parent = self,
worker = true, worker = true,
}; };
@@ -905,6 +905,20 @@ local function run (threads_iter, hosts)
rawset(stdnse, "base", function () rawset(stdnse, "base", function ()
return current and current.co; return current and current.co;
end); end);
rawset(stdnse, "gettid", function ()
return current and current.identifier;
end);
rawset(stdnse, "getid", function ()
return current and current.id;
end);
rawset(stdnse, "gethostport", function ()
if current then
return current.host, current.port;
end
end);
rawset(stdnse, "isworker", function ()
return current and current.worker;
end);
while threads_iter and num_threads < CONCURRENCY_LIMIT do while threads_iter and num_threads < CONCURRENCY_LIMIT do
local thread = threads_iter() local thread = threads_iter()
@@ -1344,6 +1358,10 @@ local function main (hosts, scantype)
-- These functions do not exist until we are executing action functions. -- These functions do not exist until we are executing action functions.
rawset(stdnse, "new_thread", nil) rawset(stdnse, "new_thread", nil)
rawset(stdnse, "base", nil) rawset(stdnse, "base", nil)
rawset(stdnse, "gettid", nil)
rawset(stdnse, "getid", nil)
rawset(stdnse, "gethostport", nil)
rawset(stdnse, "isworker", nil)
for runlevel, scripts in ipairs(runlevels) do for runlevel, scripts in ipairs(runlevels) do
-- This iterator is passed to the run function. It returns one new script -- This iterator is passed to the run function. It returns one new script

View File

@@ -33,6 +33,7 @@ local max = math.max
local format = string.format; local format = string.format;
local rep = string.rep local rep = string.rep
local match = string.match
local concat = table.concat; local concat = table.concat;
local insert = table.insert; local insert = table.insert;
@@ -61,14 +62,72 @@ _ENV.sleep = nmap.socket.sleep;
-- Prints a formatted debug message if the current debugging level is greater -- Prints a formatted debug message if the current debugging level is greater
-- than or equal to a given level. -- than or equal to a given level.
-- --
-- This is a convenience wrapper around -- This is a convenience wrapper around <code>nmap.log_write</code>. The first
-- <code>nmap.log_write</code>. The first optional numeric -- optional numeric argument, <code>level</code>, is used as the debugging level
-- argument, <code>level</code>, is used as the debugging level necessary -- necessary to print the message (it defaults to 1 if omitted). All remaining
-- to print the message (it defaults to 1 if omitted). All remaining arguments -- arguments are processed with Lua's <code>string.format</code> function.
-- are processed with Lua's <code>string.format</code> function. --
-- If known, the output includes some context based information: the script
-- identifier and the target ip/port (if there is one). If the debug level is
-- at least 2, it also prints the base thread identifier and whether it is a
-- worker thread or the master thread.
--
-- @param level Optional debugging level. -- @param level Optional debugging level.
-- @param fmt Format string. -- @param fmt Format string.
-- @param ... Arguments to format. -- @param ... Arguments to format.
function debug (level, fmt, ...)
local current = nmap.debugging()
local prefix = "["
local id = getid()
if id then
prefix = prefix .. id
end
local host, port = gethostport()
if host and host.ip then
prefix = prefix .. " " .. host.ip
end
if port and port.number then
prefix = prefix .. ":" .. port.number
end
local tid = gettid()
local tid = match(tostring(tid), "0x(.*)")
local worker = isworker()
if current >= 2 and tid then
if worker then
prefix = prefix .. " W:" .. tid
else
prefix = prefix .. " M:" .. tid
end
end
prefix = prefix .. "] "
if type(level) == "number" then
if level <= current then
if prefix ~= "[] " then
nmap.log_write("stdout", prefix..format(fmt, ...))
else
nmap.log_write("stdout", format(fmt, ...))
end
end
elseif 1 <= current then
-- level is fmt and fmt is first argument
if prefix ~= "[] " then
nmap.log_write("stdout", prefix..format(level, fmt, ...))
else
nmap.log_write("stdout", format(level, fmt, ...))
end
end
end
--Aliases for particular debug levels
function debug1 (...) return stdnse.debug(1, ...) end
function debug2 (...) return stdnse.debug(2, ...) end
function debug3 (...) return stdnse.debug(3, ...) end
function debug3 (...) return stdnse.debug(4, ...) end
function debug5 (...) return stdnse.debug(5, ...) end
---
-- Deprecated version of debug(), kept for now to prevent the script id from being
-- printed twice. Scripts should use debug() and not pass SCRIPT_NAME
print_debug = function(level, fmt, ...) print_debug = function(level, fmt, ...)
local l, d = tonumber(level), nmap.debugging(); local l, d = tonumber(level), nmap.debugging();
if l and l <= d then if l and l <= d then
@@ -77,19 +136,68 @@ print_debug = function(level, fmt, ...)
nmap.log_write("stdout", format(level, fmt, ...)); nmap.log_write("stdout", format(level, fmt, ...));
end end
end end
--- ---
-- Prints a formatted verbosity message if the current verbosity level is greater -- Prints a formatted verbosity message if the current verbosity level is greater
-- than or equal to a given level. -- than or equal to a given level.
--
-- This is a convenience wrapper around <code>nmap.log_write</code>. The first
-- optional numeric argument, <code>level</code>, is used as the verbosity level
-- necessary to print the message (it defaults to 1 if omitted). All remaining
-- arguments are processed with Lua's <code>string.format</code> function.
--
-- If known, the output includes some context based information: the script
-- identifier. If the verbosity level is at least 2, it also prints the target
-- ip/port (if there is one)
-- --
-- This is a convenience wrapper around
-- <code>nmap.log_write</code>. The first optional numeric
-- argument, <code>level</code>, is used as the verbosity level necessary
-- to print the message (it defaults to 1 if omitted). All remaining arguments
-- are processed with Lua's <code>string.format</code> function.
-- @param level Optional verbosity level. -- @param level Optional verbosity level.
-- @param fmt Format string. -- @param fmt Format string.
-- @param ... Arguments to format. -- @param ... Arguments to format.
function verbose (level, fmt, ...)
local current = nmap.verbosity()
local prefix = "["
local id = getid()
if id then
prefix = prefix .. id
end
if current >= 2 then
local host, port = gethostport()
if host and host.ip then
prefix = prefix .. " " .. host.ip
end
if port and port.number then
prefix = prefix .. ":" .. port.number
end
end
prefix = prefix .. "] "
if type(level) == "number" then
if level <= current then
if prefix ~= "[] " then
nmap.log_write("stdout", prefix..format(fmt, ...))
else
nmap.log_write("stdout", format(fmt, ...))
end
end
elseif 1 <= current then
-- level is fmt and fmt is first argument
if prefix ~= "[] " then
nmap.log_write("stdout", prefix..format(level, fmt, ...))
else
nmap.log_write("stdout", format(level, fmt, ...))
end
end
end
--Aliases for particular verbosity levels
function verbose1 (...) return stdnse.verbose(1, ...) end
function verbose2 (...) return stdnse.verbose(2, ...) end
function verbose3 (...) return stdnse.verbose(3, ...) end
function verbose4 (...) return stdnse.verbose(4, ...) end
function verbose5 (...) return stdnse.verbose(5, ...) end
---
-- Deprecated version of verbose(), kept for now to prevent the script id from being
-- printed twice. Scripts should use verbose() and not pass SCRIPT_NAME
print_verbose = function(level, fmt, ...) print_verbose = function(level, fmt, ...)
local l, d = tonumber(level), nmap.verbosity(); local l, d = tonumber(level), nmap.verbosity();
if l and l <= d then if l and l <= d then
@@ -99,7 +207,6 @@ print_verbose = function(level, fmt, ...)
end end
end end
--- Join a list of strings with a separator string. --- Join a list of strings with a separator string.
-- --
-- This is Lua's <code>table.concat</code> function with the parameters -- This is Lua's <code>table.concat</code> function with the parameters

View File

@@ -148,7 +148,7 @@ local function load_fingerprints(filename, cat)
-- Check if fingerprints are cached -- Check if fingerprints are cached
if(nmap.registry.http_default_accounts_fingerprints ~= nil) then if(nmap.registry.http_default_accounts_fingerprints ~= nil) then
stdnse.print_debug(1, "%s: Loading cached fingerprints", SCRIPT_NAME) stdnse.debug(1, "Loading cached fingerprints")
return nmap.registry.http_default_accounts_fingerprints return nmap.registry.http_default_accounts_fingerprints
end end
@@ -160,11 +160,11 @@ local function load_fingerprints(filename, cat)
end end
-- Load the file -- Load the file
stdnse.print_debug(1, "%s: Loading fingerprints: %s", SCRIPT_NAME, filename_full) stdnse.debug(1, "Loading fingerprints: %s", filename_full)
local env = setmetatable({fingerprints = {}}, {__index = _G}); local env = setmetatable({fingerprints = {}}, {__index = _G});
file = loadfile(filename_full, "t", env) file = loadfile(filename_full, "t", env)
if( not(file) ) then if( not(file) ) then
stdnse.print_debug(1, "%s: Couldn't load the file: %s", SCRIPT_NAME, filename_full) stdnse.debug(1, "Couldn't load the file: %s", filename_full)
return false, "Couldn't load fingerprint file: " .. filename_full return false, "Couldn't load fingerprint file: " .. filename_full
end end
file() file()
@@ -238,7 +238,7 @@ action = function(host, port)
-- Identify servers that answer 200 to invalid HTTP requests and exit as these would invalidate the tests -- Identify servers that answer 200 to invalid HTTP requests and exit as these would invalidate the tests
local _, http_status, _ = http.identify_404(host,port) local _, http_status, _ = http.identify_404(host,port)
if ( http_status == 200 ) then if ( http_status == 200 ) then
stdnse.print_debug(1, "%s: Exiting due to ambiguous response from web server on %s:%s. All URIs return status 200.", SCRIPT_NAME, host.ip, port.number) stdnse.debug(1, "Exiting due to ambiguous response from web server on %s:%s. All URIs return status 200.", host.ip, port.number)
return nil return nil
end end
@@ -247,14 +247,14 @@ action = function(host, port)
if(not(status)) then if(not(status)) then
return stdnse.format_output(false, fingerprints) return stdnse.format_output(false, fingerprints)
end end
stdnse.print_debug(1, "%s: %d fingerprints were loaded", SCRIPT_NAME, #fingerprints) stdnse.debug(1, "%d fingerprints were loaded", #fingerprints)
--Format basepath: Removes or adds slashs --Format basepath: Removes or adds slashs
basepath = format_basepath(basepath) basepath = format_basepath(basepath)
-- Add requests to the http pipeline -- Add requests to the http pipeline
requests = {} requests = {}
stdnse.print_debug(1, "%s: Trying known locations under path '%s' (change with '%s.basepath' argument)", SCRIPT_NAME, basepath, SCRIPT_NAME) stdnse.debug(1, "Trying known locations under path '%s' (change with '%s.basepath' argument)", basepath, SCRIPT_NAME)
for i = 1, #fingerprints, 1 do for i = 1, #fingerprints, 1 do
for j = 1, #fingerprints[i].paths, 1 do for j = 1, #fingerprints[i].paths, 1 do
requests = http.pipeline_add(basepath .. fingerprints[i].paths[j].path, nil, requests, 'GET') requests = http.pipeline_add(basepath .. fingerprints[i].paths[j].path, nil, requests, 'GET')
@@ -278,7 +278,7 @@ action = function(host, port)
for i, fingerprint in ipairs(fingerprints) do for i, fingerprint in ipairs(fingerprints) do
local credentials_found = false local credentials_found = false
stdnse.print_debug(1, "%s: Processing %s", SCRIPT_NAME, fingerprint.name) stdnse.debug(1, "Processing %s", fingerprint.name)
for _, probe in ipairs(fingerprint.paths) do for _, probe in ipairs(fingerprint.paths) do
if (results[j] and not(credentials_found)) then if (results[j] and not(credentials_found)) then
@@ -289,12 +289,12 @@ action = function(host, port)
or fingerprint.target_check(host, port, path, results[j])) or fingerprint.target_check(host, port, path, results[j]))
then then
for _, login_combo in ipairs(fingerprint.login_combos) do for _, login_combo in ipairs(fingerprint.login_combos) do
stdnse.print_debug(2, "%s: Trying login combo -> %s:%s", SCRIPT_NAME, login_combo["username"], login_combo["password"]) stdnse.debug(2, "Trying login combo -> %s:%s", login_combo["username"], login_combo["password"])
--Check default credentials --Check default credentials
if( fingerprint.login_check(host, port, path, login_combo["username"], login_combo["password"]) ) then if( fingerprint.login_check(host, port, path, login_combo["username"], login_combo["password"]) ) then
--Valid credentials found --Valid credentials found
stdnse.print_debug(1, "%s:[%s] valid default credentials found.", SCRIPT_NAME, fingerprint.name) stdnse.debug(1, "[%s] valid default credentials found.", fingerprint.name)
output_lns[#output_lns + 1] = string.format("[%s] credentials found -> %s:%s Path:%s", output_lns[#output_lns + 1] = string.format("[%s] credentials found -> %s:%s Path:%s",
fingerprint.name, login_combo["username"], login_combo["password"], path) fingerprint.name, login_combo["username"], login_combo["password"], path)
-- Add to http credentials table -- Add to http credentials table