From ddcbf14ff57efdf4f6f7276734a73e4dd4f5956e Mon Sep 17 00:00:00 2001 From: nnposter Date: Sun, 21 Jul 2019 01:12:30 +0000 Subject: [PATCH] Improve the script screen output. Fixes #1637 - properly handle indentation and line termination of multi-line command output - strip off control characters - replace tabs with spaces to maintain column alignment - clean up documentation --- scripts/ssh-run.nse | 52 +++++++++++++++++++++++++++++++-------------- 1 file changed, 36 insertions(+), 16 deletions(-) diff --git a/scripts/ssh-run.nse b/scripts/ssh-run.nse index 12f3aa406..16522fc32 100644 --- a/scripts/ssh-run.nse +++ b/scripts/ssh-run.nse @@ -1,5 +1,6 @@ local stdnse = require "stdnse" local shortport = require "shortport" +local stringaux = require "stringaux" local table = require "table" local libssh2_util = require "libssh2-utility" @@ -8,22 +9,25 @@ Runs remote command on ssh server and returns command output. ]] --- --- @usage nmap -p 22 -v -d --script=ssh-run --datadir=./ \ +-- @usage nmap -p 22 --script=ssh-run \ -- --script-args="ssh-run.cmd=ls -l /, ssh-run.username=myusername, ssh-run.password=mypassword" -- -- @output --- 22/tcp open ssh syn-ack 0 --- | run-remote: +-- 22/tcp open ssh +-- | ssh-run: -- | output: --- | total 124 --- | drwxr-xr-x 2 root root 4096 Jun 23 09:34 bin --- | drwxr-xr-x 3 root root 4096 Jun 19 12:42 boot --- | drwxr-xr-x 2 root root 4096 Feb 6 2013 cdrom --- | drwxr-xr-x 16 root root 4340 Jul 17 13:37 dev --- | drwxr-xr-x 162 root root 12288 Jul 20 12:10 etc --- | drwxr-xr-x 15 root root 4096 Jun 23 15:20 home --- | ... --- |_drwxr-xr-x 14 root root 4096 Jun 6 14:58 var +-- | total 91 +-- | drwxr-xr-x 2 root root 4096 Jun 5 11:56 bin +-- | drwxr-xr-x 4 root root 3072 Jun 5 12:42 boot +-- | drwxrwxr-x 2 root root 4096 Jun 22 2017 cdrom +-- | drwxr-xr-x 20 root root 4060 Jun 23 10:26 dev +-- | drwxr-xr-x 127 root root 12288 Jun 5 11:56 etc +-- | drwxr-xr-x 3 root root 4096 Jun 22 2017 home +-- .... +-- |_ drwxr-xr-x 13 root root 4096 Jul 20 2016 var +-- +-- @xmloutput +-- total 91\x0D drwxr-xr-x 2 root root 4096 Jun 5 11:56 bin\x0D drwxr-xr-x 4 root root 3072 Jun 5 12:42 boot\x0D drwxrwxr-x 2 root root 4096 Jun 22 2017 cdrom\x0D drwxr-xr-x 20 root root 4060 Jun 23 10:26 dev\x0D drwxr-xr-x 127 root root 12288 Jun 5 11:56 etc\x0D drwxr-xr-x 3 root root 4096 Jun 22 2017 home\x0D ....\x0D drwxr-xr-x 13 root root 4096 Jul 20 2016 var\x0D -- -- @args ssh-run.username Username to authenticate as -- @args ssh-run.password Password to use if using password authentication @@ -47,6 +51,14 @@ local password = stdnse.get_script_args 'ssh-run.password' local privatekey = stdnse.get_script_args 'ssh-run.privatekey' local passphrase = stdnse.get_script_args 'ssh-run.passphrase' +local function remove_tabs (str, tabsize) +tabsize = tabsize or 8 +local out = str:gsub("(.-)\t", function (s) + return s .. (" "):rep(tabsize - #s % tabsize) + end) + return out +end + function action (host, port) local conn = libssh2_util.SSHConnection:new() if not conn:connect(host, port) then @@ -76,8 +88,16 @@ function action (host, port) stdnse.verbose("Running command: " .. cmd) local output, err_output = conn:run_remote(cmd) stdnse.verbose("Output of command: " .. output) - local result = stdnse.output_table() - result.output = {} - table.insert(result.output, output) - return result + + local out = stdnse.output_table() + out.output = output + + local txtout = {} + for _, line in ipairs(stringaux.strsplit("\r?\n", output:gsub("\r?\n$", ""))) do + local str = line:gsub("[^\t\x20-\x7f]", "") + table.insert(txtout, remove_tabs(str)) + end + txtout.name = "output:" + + return out, stdnse.format_output(true, {txtout}) end