diff --git a/CHANGELOG b/CHANGELOG index 97f75a535..5aa06262f 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,9 @@ # Nmap Changelog ($Id$); -*-text-*- +o [NSE] New script vmware-version queries VMWare SOAP API for version and + product information. Submitted in 2011, this was mistakenly turned into a + service probe that was unable to elicit any matches. [Aleksey Tyurin] + o [Ncat] The --no-shutdown option now also works in connect mode, not only in listen mode. diff --git a/nmap-service-probes b/nmap-service-probes index 05c1e5317..27ed165ca 100644 --- a/nmap-service-probes +++ b/nmap-service-probes @@ -15238,11 +15238,6 @@ ports 19150 match gkrellm m|^\n\ngkrellmd ([\w._-]+)\n| p/GKrellM System Monitor/ v/$1/ -##############################NEXT PROBE############################## -Probe TCP vmware-esx q|00000001-00000001<_this xsi:type="ManagedObjectReference" type="ServiceInstance">ServiceInstance| -sslports 443 -rarity 9 - ##############################NEXT PROBE############################## Probe TCP metasploit-xmlrpc q|nmap.probe\n\0| ports 9390,55553 diff --git a/scripts/script.db b/scripts/script.db index 7e606b2ed..6912af718 100644 --- a/scripts/script.db +++ b/scripts/script.db @@ -543,6 +543,7 @@ Entry { filename = "url-snarf.nse", categories = { "safe", } } Entry { filename = "ventrilo-info.nse", categories = { "default", "discovery", "safe", "version", } } Entry { filename = "versant-info.nse", categories = { "discovery", "safe", } } Entry { filename = "vmauthd-brute.nse", categories = { "brute", "intrusive", } } +Entry { filename = "vmware-version.nse", categories = { "discovery", "safe", "version", } } Entry { filename = "vnc-brute.nse", categories = { "brute", "intrusive", } } Entry { filename = "vnc-info.nse", categories = { "default", "discovery", "safe", } } Entry { filename = "vnc-title.nse", categories = { "discovery", "intrusive", } } diff --git a/scripts/vmware-version.nse b/scripts/vmware-version.nse new file mode 100644 index 000000000..46c75db76 --- /dev/null +++ b/scripts/vmware-version.nse @@ -0,0 +1,88 @@ +description = [[ +Queries VMware server (vCenter, ESX, ESXi) SOAP API to extract the version information. + +The same script as VMware Fingerprinter from VASTO created by Claudio Criscione, Paolo Canaletti +]] + +--- +-- @usage +-- nmap --script vmware-version -p443 +-- +-- @output +-- | vmware-version: +-- | Server version: VMware ESX 4.1.0 +-- | Build: 348481 +-- | Locale version: INTL 000 +-- | OS type: vmnix-x86 +-- |_ Product Line ID: esx +---------------------------------------------------------- + +author = "Alexey Tyurin" +license = "Same as Nmap--See https://nmap.org/book/man-legal.html" +categories = {"discovery", "safe", "version"} + +local http = require "http" +local nmap = require "nmap" +local shortport = require "shortport" +local stdnse = require "stdnse" +local table = require "table" + +portrule = function (host, port) + if nmap.version_intensity() < 7 or nmap.port_is_excluded(port.number, port.protocol) then + return false + end + return shortport.http(host, port) +end + +local function get_file(host, port, path) + local req + req='00000001-00000001<_this xsi:type="ManagedObjectReference" type="ServiceInstance">ServiceInstance' + + local result = http.post( host, port, path, nil, nil, req) + if(result['status'] ~= 200 or result['content-length'] == 0) then + return false, "Couldn't download file: " .. path + end + + return true, result.body +end + +action = function(host, port) + + local result, body = get_file(host, port, "/sdk") + + if(not(result)) then + stdnse.debug1("%s", body) + return nil + end + + local vwname = body:match("([^<]*)") + + if not vwname then + stdnse.debug1("Problem with XML parsing.") + return nil + end + + local vwversion = body:match("([^<]*)") + local vwbuild = body:match("([^<]*)") + local vwlversion = body:match("([^<]*)") + local vwlbuild = body:match("([^<]*)") + local vmostype = body:match("([^<]*)") + local vmprod= body:match("([^<]*)") + + if not port.version.product then + port.version.product = ("%s SOAP API"):format(vwname) + port.version.version = vwversion + end + table.insert(port.version.cpe, ("cpe:/o:vmware:%s:%s"):format(vwname:gsub("^[Vv][Mm][Ww]are ", ""), vwversion)) + nmap.set_port_version(host, port, "hardmatched") + + local response = stdnse.output_table() + + response["Server version"] = ("%s %s"):format(vwname, vwversion) + response["Build"] = vwbuild + response["Locale version"] = ("%s %s"):format(vwlversion, vwlbuild) + response["OS type"] = vmostype + response["Product Line ID"] = vmprod + + return response +end