diff --git a/scripts/ms-sql-info.nse b/scripts/ms-sql-info.nse
index 63c4c2823..74b3d15ab 100644
--- a/scripts/ms-sql-info.nse
+++ b/scripts/ms-sql-info.nse
@@ -70,31 +70,69 @@ be disabled using the mssql.scanned-ports-only script argument.
-- @output
-- | ms-sql-info:
-- | Windows server name: WINXP
--- | [192.168.100.128\PROD]
+-- | 192.168.100.128\PROD:
-- | Instance name: PROD
--- | Version: Microsoft SQL Server 2000 SP3
--- | Version number: 8.00.760
--- | Product: Microsoft SQL Server 2005
+-- | Version:
+-- | name: Microsoft SQL Server 2000 SP3
+-- | number: 8.00.760
+-- | Product: Microsoft SQL Server 2000
-- | Service pack level: SP3
-- | Post-SP patches applied: No
-- | TCP port: 1278
-- | Named pipe: \\192.168.100.128\pipe\MSSQL$PROD\sql\query
-- | Clustered: No
--- | [192.168.100.128\SQLFIREWALLED]
+-- | 192.168.100.128\SQLFIREWALLED:
-- | Instance name: SQLFIREWALLED
--- | Version: Microsoft SQL Server 2008 RTM
+-- | Version:
+-- | name: Microsoft SQL Server 2008 RTM
-- | Product: Microsoft SQL Server 2008
-- | Service pack level: RTM
-- | TCP port: 4343
-- | Clustered: No
--- | [\\192.168.100.128\pipe\sql\query]
--- | Version: Microsoft SQL Server 2005 SP3+
--- | Version number: 9.00.4053
+-- | \\192.168.100.128\pipe\sql\query:
+-- | Version:
+-- | name: Microsoft SQL Server 2005 SP3+
+-- | number: 9.00.4053
-- | Product: Microsoft SQL Server 2005
-- | Service pack level: SP3
-- | Post-SP patches applied: Yes
-- |_ Named pipe: \\192.168.100.128\pipe\sql\query
--
+-- @xmloutput
+-- WINXP
+--
+-- PROD
+--
+-- Microsoft SQL Server 2000 SP3
+-- 8.00.760
+-- Microsoft SQL Server 2000
+-- SP3
+-- No
+--
+-- 1278
+-- \\192.168.100.128\pipe\MSSQL$PROD\sql\query
+-- No
+--
+--
+-- SQLFIREWALLED
+--
+-- Microsoft SQL Server 2008 RTM
+-- Microsoft SQL Server 2008
+-- RTM
+--
+-- 4343
+-- No
+--
+--
+--
+-- Microsoft SQL Server 2005 SP3+
+-- 9.00.4053
+-- Microsoft SQL Server 2005
+-- SP3
+-- Yes
+--
+-- \\192.168.100.128\pipe\sql\query
+--
-- rev 1.0 (2007-06-09)
-- rev 1.1 (2009-12-06 - Added SQL 2008 identification T Sellers)
@@ -106,6 +144,7 @@ be disabled using the mssql.scanned-ports-only script argument.
-- weren't in original Nmap scan )
-- rev 1.5 (2011-02-01 - Moved discovery functionality into ms-sql-discover.nse and
-- broadcast-ms-sql-discovery.nse )
+-- rev 1.6 (2014-09-04 - Added structured output Daniel Miller)
author = "Chris Woodbury, Thomas Buchanan"
@@ -133,32 +172,17 @@ hostrule = function(host)
end
---- Adds a label and value to an output table. If the value is a boolean, it is
--- converted to Yes/No; if the value is nil, nothing is added to the table.
-local function add_to_output_table( outputTable, outputLabel, outputData )
- if outputData == nil then return end
-
- if outputData == true then
- outputData = "Yes"
- elseif outputData == false then
- outputData = "No"
- end
-
- table.insert(outputTable, string.format( "%s: %s", outputLabel, outputData ) )
-end
-
-
--- Returns formatted output for the given version data
local function create_version_output_table( versionInfo )
local versionOutput = {}
- versionOutput["name"] = "Version: " .. versionInfo:ToString()
+ versionOutput["name"] = versionInfo:ToString()
if ( versionInfo.source ~= "SSRP" ) then
- add_to_output_table( versionOutput, "Version number", versionInfo.versionNumber )
+ versionOutput["number"] = versionInfo.versionNumber
end
- add_to_output_table( versionOutput, "Product", versionInfo.productName )
- add_to_output_table( versionOutput, "Service pack level", versionInfo.servicePackLevel )
- add_to_output_table( versionOutput, "Post-SP patches applied", versionInfo.patched )
+ versionOutput["Product"] = versionInfo.productName
+ versionOutput["Service pack level"] = versionInfo.servicePackLevel
+ versionOutput["Post-SP patches applied"] = versionInfo.patched
return versionOutput
end
@@ -171,17 +195,15 @@ local function create_instance_output_table( instance )
-- being SQL Server), don't report anything
if not ( instance.instanceName or instance.version ) then return nil end
- local instanceOutput = {}
- instanceOutput["name"] = string.format( "[%s]", instance:GetName() )
+ local instanceOutput = stdnse.output_table()
- add_to_output_table( instanceOutput, "Instance name", instance.instanceName )
+ instanceOutput["Instance name"] = instance.instanceName
if instance.version then
- local versionOutput = create_version_output_table( instance.version )
- table.insert( instanceOutput, versionOutput )
+ instanceOutput["Version"] = create_version_output_table( instance.version )
end
- if instance.port then add_to_output_table( instanceOutput, "TCP port", instance.port.number ) end
- add_to_output_table( instanceOutput, "Named pipe", instance.pipeName )
- add_to_output_table( instanceOutput, "Clustered", instance.isClustered )
+ if instance.port then instanceOutput["TCP port"] = instance.port.number end
+ instanceOutput["Named pipe"] = instance.pipeName
+ instanceOutput["Clustered"] = instance.isClustered
return instanceOutput
@@ -229,7 +251,7 @@ end
action = function( host )
- local scriptOutput = {}
+ local scriptOutput = stdnse.output_table()
local status, instanceList = mssql.Helper.GetTargetInstances( host )
-- if no instances were targeted, then display info on all
@@ -246,19 +268,16 @@ action = function( host )
else
for _, instance in ipairs( instanceList ) do
if instance.serverName then
- table.insert(scriptOutput, string.format( "Windows server name: %s", instance.serverName ))
+ scriptOutput["Windows server name"] = instance.serverName
break
end
end
for _, instance in pairs( instanceList ) do
process_instance( instance )
- local instanceOutput = create_instance_output_table( instance )
- if instanceOutput then
- table.insert( scriptOutput, instanceOutput )
- end
+ scriptOutput[instance:GetName()] = create_instance_output_table( instance )
end
end
- return stdnse.format_output( true, scriptOutput )
+ return scriptOutput
end