mirror of
https://github.com/nmap/nmap.git
synced 2026-01-04 13:49:03 +00:00
Fix #2852: add TLS support to redis.lua, better detection with -sV
This commit is contained in:
@@ -6,6 +6,7 @@ local match = require "match"
|
||||
local nmap = require "nmap"
|
||||
local stdnse = require "stdnse"
|
||||
local table = require "table"
|
||||
local comm = require "comm"
|
||||
_ENV = stdnse.module("redis", stdnse.seeall)
|
||||
|
||||
Request = {
|
||||
@@ -30,6 +31,63 @@ Request = {
|
||||
|
||||
}
|
||||
|
||||
local socket_wrapper = {
|
||||
new = function(self, socket, init)
|
||||
local o = {
|
||||
socket = socket,
|
||||
init = init,
|
||||
pos = init and 1 or nil,
|
||||
}
|
||||
setmetatable (o,self)
|
||||
self.__index = self
|
||||
return o
|
||||
end,
|
||||
|
||||
getline = function(self)
|
||||
if self.pos then
|
||||
local oldpos = self.pos
|
||||
local first, last = self.init:find("\r\n", oldpos)
|
||||
if first then
|
||||
stdnse.debug1("getline: found line: %s", self.init:sub(oldpos, first-1))
|
||||
self.pos = last < #self.init and (last + 1) or nil
|
||||
return true, self.init:sub(oldpos, first-1)
|
||||
else
|
||||
stdnse.debug1("getline: no line found: %s", self.init:sub(oldpos))
|
||||
self.pos = nil
|
||||
local status, more = self.socket:receive_buf(match.pattern_limit("\r\n", 2048), false)
|
||||
if not status then
|
||||
return status, more
|
||||
end
|
||||
return true, self.init:sub(oldpos) .. more
|
||||
end
|
||||
end
|
||||
return self.socket:receive_buf(match.pattern_limit("\r\n", 2048), false)
|
||||
end,
|
||||
|
||||
getbytes = function(self, len)
|
||||
if self.pos then
|
||||
local remains = #self.init - self.pos + 1
|
||||
stdnse.debug1("getbytes(%d), remains=%d", len, remains)
|
||||
if remains == len then
|
||||
self.pos = nil
|
||||
return true, self.init:sub(-len)
|
||||
elseif remains > len then
|
||||
local part = self.init:sub(self.pos, self.pos + len - 1)
|
||||
self.pos = self.pos + len
|
||||
return true, part
|
||||
else
|
||||
local part = self.init:sub(self.pos)
|
||||
self.pos = nil
|
||||
local status, more = self.socket:receive_buf(match.numbytes(len - #part), false)
|
||||
if not status then
|
||||
return status, more
|
||||
end
|
||||
return true, part .. more
|
||||
end
|
||||
end
|
||||
return self.socket:receive_buf(match.numbytes(len), true)
|
||||
end,
|
||||
}
|
||||
|
||||
Response = {
|
||||
|
||||
@@ -48,8 +106,10 @@ Response = {
|
||||
return o
|
||||
end,
|
||||
|
||||
receive = function(self)
|
||||
local status, data = self.socket:receive_buf(match.pattern_limit("\r\n", 2048), false)
|
||||
receive = function(self, init)
|
||||
stdnse.debug1("Response.receive(%d)", #(init or ""))
|
||||
local sock = socket_wrapper:new(self.socket, init)
|
||||
local status, data = sock:getline()
|
||||
if ( not(status) ) then
|
||||
return false, "Failed to receive data from server"
|
||||
end
|
||||
@@ -78,12 +138,12 @@ Response = {
|
||||
|
||||
local len = tonumber(data:match("^%$(%d*)"))
|
||||
-- we should only have a single line, so we can just peel of the length
|
||||
status, data = self.socket:receive_buf(match.numbytes(len), true)
|
||||
status, data = sock:getbytes(len)
|
||||
if( not(status) ) then
|
||||
return false, "Failed to receive data from server"
|
||||
end
|
||||
-- move past the terminal CRLF
|
||||
local status, crlf = self.socket:receive_buf(match.pattern_limit("\r\n", 2048), false)
|
||||
local status, crlf = sock:getline()
|
||||
|
||||
return true, { data = data, type = Response.Type.BULK }
|
||||
end
|
||||
@@ -95,12 +155,12 @@ Response = {
|
||||
|
||||
for i=1, count do
|
||||
-- peel of the length
|
||||
local status = self.socket:receive_buf(match.pattern_limit("\r\n", 2048), false)
|
||||
local status = sock:getline()
|
||||
if( not(status) ) then
|
||||
return false, "Failed to receive data from server"
|
||||
end
|
||||
|
||||
status, data = self.socket:receive_buf(match.pattern_limit("\r\n", 2048), false)
|
||||
status, data = sock:getline()
|
||||
if( not(status) ) then
|
||||
return false, "Failed to receive data from server"
|
||||
end
|
||||
@@ -125,18 +185,27 @@ Helper = {
|
||||
return o
|
||||
end,
|
||||
|
||||
connect = function(self, socket)
|
||||
self.socket = socket or nmap.new_socket()
|
||||
return self.socket:connect(self.host, self.port)
|
||||
connect = function(self)
|
||||
return true
|
||||
end,
|
||||
|
||||
do_send = function(self, payload)
|
||||
local response
|
||||
if not self.socket then
|
||||
self.socket, response = comm.tryssl(self.host, self.port, payload)
|
||||
return not not self.socket, response
|
||||
else
|
||||
return self.socket:send(payload)
|
||||
end
|
||||
end,
|
||||
|
||||
reqCmd = function(self, cmd, ...)
|
||||
local req = Request:new(cmd, ...)
|
||||
local status, err = self.socket:send(tostring(req))
|
||||
local status, err_or_response = self:do_send(tostring(req))
|
||||
if (not(status)) then
|
||||
return false, "Failed to send command to server"
|
||||
end
|
||||
return Response:new(self.socket):receive()
|
||||
return Response:new(self.socket):receive(err_or_response)
|
||||
end,
|
||||
|
||||
close = function(self)
|
||||
|
||||
Reference in New Issue
Block a user