1
0
mirror of https://github.com/nmap/nmap.git synced 2026-01-22 22:29:03 +00:00

Don't mark starttls as failed if it ever succeeded in the past.

This commit is contained in:
dmiller
2016-12-31 21:05:43 +00:00
parent b530ad7be0
commit 85cf1194e3

View File

@@ -48,17 +48,23 @@ _ENV = stdnse.module("sslcert", stdnse.seeall)
--@see nmap.get_ssl_certificate
_ENV.parse_ssl_certificate = nmap.socket.parse_ssl_certificate
-- Mark this port as not supporting STARTTLS, to save connection attempts later.
local function starttls_not_supported (host, port)
local failreg = host.registry.starttls_failed or {}
failreg[("%d/%s"):format(port.number, port.protocol)] = true
host.registry.starttls_failed = failreg
-- Mark whether this port supports STARTTLS, to save connection attempts later.
-- If it ever succeeds, it can't be marked as failing later, but if it fails
-- the first time, we won't try again.
local function starttls_supported(host, port, state)
local reg = host.registry.starttls or {}
local key = ("%d/%s"):format(port.number, port.protocol)
if reg[key] then
return true
end
reg[key] = state
host.registry.starttls_failed = reg
end
-- Check whether we've tried and failed to STARTTLS already
local function check_starttls_failed (host, port)
local failreg = host.registry.starttls_failed
return failreg and failreg[("%d/%s"):format(port.number, port.protocol)]
local reg = host.registry.starttls
return reg and not reg[("%d/%s"):format(port.number, port.protocol)]
end
-- Simple reconnect_ssl wrapper for most common case
@@ -200,7 +206,7 @@ StartTLS = {
s:send("AUTH TLS\r\n")
code, result = ftp.read_reply(buf)
if code ~= 234 then
starttls_not_supported(host, port)
starttls_supported(host, port, false)
stdnse.debug1("AUTH TLS failed or unavailable. Enable --script-trace to see what is happening.")
-- Send QUIT to clean up server side connection
@@ -209,6 +215,7 @@ StartTLS = {
return false, string.format("FTP AUTH TLS error: %s", code or result)
end
-- Should have a solid TLS over FTP session now...
starttls_supported(host, port, true)
return true, s
end,
@@ -233,7 +240,7 @@ StartTLS = {
status, result = s:receive_lines(1)
if not (string.match(result, "STARTTLS")) then
starttls_not_supported(host, port)
starttls_supported(host, port, false)
stdnse.debug1("Server doesn't support STARTTLS")
return false, "Failed to connect to IMAP server"
end
@@ -243,12 +250,13 @@ StartTLS = {
status, result = s:receive_lines(1)
if not (string.match(result, "^A002 OK")) then
starttls_not_supported(host, port)
starttls_supported(host, port, false)
stdnse.debug1(string.format("Error: %s", result))
return false, "Failed to connect to IMAP server"
end
-- Should have a solid TLS over IMAP session now...
starttls_supported(host, port, true)
return true, s
end,
@@ -302,7 +310,7 @@ StartTLS = {
ldapOp = asn1.intToBER(tmp)
if ldapOp.number ~= ExtendedResponse then
starttls_not_supported(host, port)
starttls_supported(host, port, false)
stdnse.debug1(string.format(
"STARTTLS failed (got wrong op number: %d)", ldapOp.number))
return false, "STARTTLS failed"
@@ -313,13 +321,14 @@ StartTLS = {
pos, resultCode = ldap.decode(response, pos)
if resultCode ~= 0 then
starttls_not_supported(host, port)
starttls_supported(host, port, false)
stdnse.debug1(string.format(
"STARTTLS failed (LDAP error code is: %d)", resultCode))
return false, "STARTTLS failed"
end
-- Should have a solid TLS over LDAP session now...
starttls_supported(host, port, true)
return true,s
end,
@@ -351,7 +360,7 @@ StartTLS = {
end
if not status then
starttls_not_supported(host, port)
starttls_supported(host, port, false)
stdnse.debug1("STARTTLS failed or unavailable. Enable --script-trace to see what is happening.")
-- Send QUIT to clean up server side connection
@@ -359,6 +368,7 @@ StartTLS = {
return false, string.format("Failed to connect to SMTP server: %s", result)
end
-- Should have a solid TLS over LMTP session now...
starttls_supported(host, port, true)
return true, s
end,
@@ -378,13 +388,14 @@ StartTLS = {
status, result = s:receive_lines(1)
if not (string.match(result, "^382 ")) then
starttls_not_supported(host, port)
starttls_supported(host, port, false)
stdnse.debug1(string.format("Error: %s", result))
status = s:send("QUIT\r\n")
s:close()
return false, "NNTP server does not support STARTTLS"
end
starttls_supported(host, port, true)
return true, s
end,
@@ -409,13 +420,14 @@ StartTLS = {
status, result = s:receive_lines(1)
if not (string.match(result, "^%+OK")) then
starttls_not_supported(host, port)
starttls_supported(host, port, false)
stdnse.debug1(string.format("Error: %s", result))
status = s:send("QUIT\r\n")
return false, "Failed to connect to POP3 server"
end
-- Should have a solid TLS over POP3 session now...
starttls_supported(host, port, true)
return true, s
end,
@@ -430,9 +442,10 @@ StartTLS = {
end
-- v2 has "Y", v3 has "S"
if string.match(resp, "^[SY]") then
starttls_supported(host, port, true)
return true, s
elseif string.match(resp, "^N") then
starttls_not_supported(host, port)
starttls_supported(host, port, false)
return false, "Postgres server does not support SSL"
end
return false, "Unknown response from Postgres server"
@@ -464,7 +477,7 @@ StartTLS = {
end
if not status then
starttls_not_supported(host, port)
starttls_supported(host, port, false)
stdnse.debug1("STARTTLS failed or unavailable. Enable --script-trace to see what is happening.")
-- Send QUIT to clean up server side connection
@@ -472,6 +485,7 @@ StartTLS = {
return false, string.format("Failed to connect to SMTP server: %s", result)
end
-- Should have a solid TLS over SMTP session now...
starttls_supported(host, port, true)
return true, s
end,
@@ -501,16 +515,17 @@ StartTLS = {
pos, optype, oppos, oplen = bin.unpack('>CSS', result, pos)
end
if not encryption then
starttls_not_supported(host, port)
starttls_supported(host, port, false)
return false, "no encryption option found"
elseif encryption == 0 then
starttls_not_supported(host, port)
starttls_supported(host, port, false)
return false, "Server refused encryption"
elseif encryption == 3 then
starttls_not_supported(host, port)
starttls_supported(host, port, false)
return false, "Server does not support encryption"
end
starttls_supported(host, port, true)
return true, WrappedSocket:new(tds._socket, {
wrap_close = function(self)
return tds:Disconnect()
@@ -626,26 +641,28 @@ StartTLS = {
end
if not best then
starttls_not_supported(host, port)
starttls_supported(host, port, false)
return false, "No TLS VeNCrypt auth subtype received"
end
sock:send(bin.pack(">I", best))
local status, buf = sock:receive_buf(match.numbytes(1), true)
if not status or string.byte(buf, 1) ~= 1 then
starttls_not_supported(host, port)
starttls_supported(host, port, false)
return false, "VeNCrypt auth subtype refused"
end
starttls_supported(host, port, true)
return true, sock
elseif v:supportsSecType(vnc.VNC.sectypes.TLS) then
status = sock:send( bin.pack("C", vnc.VNC.sectypes.TLS) )
if not status then
starttls_not_supported(host, port)
starttls_supported(host, port, false)
return false, "Failed to select TLS authentication type"
end
else
starttls_not_supported(host, port)
starttls_supported(host, port, false)
return false, string.format("No TLS auth types supported")
end
starttls_supported(host, port, true)
return true, sock
end,
@@ -688,6 +705,7 @@ StartTLS = {
return false, "Failed to connect to XMPP server"
end
if string.find(result,"proceed") then
starttls_supported(host, port, true)
return true,sock
end
@@ -698,9 +716,10 @@ StartTLS = {
return false, "Failed to connect to XMPP server"
end
if string.find(result,"proceed") then
starttls_supported(host, port, true)
return true,sock
else
starttls_not_supported(host, port)
starttls_supported(host, port, false)
return false, "Failed to connect to XMPP server"
end
end,
@@ -719,6 +738,7 @@ StartTLS = {
if not(status) then
return false, "Failed to connected"
end
starttls_supported(host, port, true)
return true, ls.socket
end
}