diff --git a/CHANGELOG b/CHANGELOG index 3e7540864..86facdd1f 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -65,6 +65,11 @@ o Nmap's Nsock-utilizing subsystems (DNS, NSE, version detection) have been o Added --ip-options support for the connect() scan (-sT). [Kris] +o The NSE Comm library now defaults to trying to read as many bytes as are + available rather than lines if neither the "bytes" nor "lines" options are + given. Thanks to Brandon for reporting a problem which he noticed in the + dns-test-open-recursion script. [Kris] + o Changed the order preference of timing ping propes. [Michael] o Enabled nmap to switch between multiple types of timing pings during port diff --git a/docs/scripting.xml b/docs/scripting.xml index 3a41d0047..dac86f4ba 100644 --- a/docs/scripting.xml +++ b/docs/scripting.xml @@ -1651,8 +1651,9 @@ if(s) code_to_be_done_on_match end The relevant indexes for this table are bytes, lines, proto and timeout. bytes is used to provide the minimum number of bytes required for a read. lines - does the same, but for the minimum number of lines. proto is used - to set the protocol to communicate with, defaulting to "tcp" if not provided. + does the same, but for the minimum number of lines. If neither are provided, these + functions attempt to read as many bytes as are available. proto + is used to set the protocol to communicate with, defaulting to "tcp" if not provided. timeout is used to set the socket timeout (see the socket function set_timeout() for details). diff --git a/nselib/comm.lua b/nselib/comm.lua index 48ad74cfb..4f6cf69c5 100644 --- a/nselib/comm.lua +++ b/nselib/comm.lua @@ -27,10 +27,10 @@ module(..., package.seeall) -- proto: Specifies the protocol to be used with the connect() call -- timeout: Sets the socket's timeout with nmap.set_timeout() -- --- If neither lines nor bytes are specified, the calls read as many lines --- as possible. If only bytes if specified, then it only tries to read that --- many bytes. Likewise, it only lines if specified, then it only tries to --- read that many lines. If they're both specified, the lines value is used. +-- If neither lines nor bytes are specified, the calls attempt to read as many +-- bytes as possible. If only bytes is specified, then it only tries to read +-- that many bytes. Likewise, it only lines if specified, then it only tries +-- to read that many lines. If they're both specified, the lines value is used. -- ------ @@ -71,39 +71,24 @@ local setup_connect = function(host, port, opts) return status, err end + -- If nothing is given, specify bytes=1 so NSE reads everything + if not opts.lines and not opts.bytes then + opts.bytes = 1 + end + return true, sock end local read = function(sock, opts) - local line, response, status + local response, status if opts.lines then status, response = sock:receive_lines(opts.lines) return status, response - elseif opts.bytes then - status, response = sock:receive_bytes(opts.bytes) - return status, response end - response = "" - - while true do - status, line = sock:receive_lines(1) - - if not status then - break - end - - response = response .. line - end - - -- Either we reached the end of the stream, or we got all we could - -- within the socket timeout - if line == "EOF" or (line == "TIMEOUT" and response ~= "") then - return true, response - end - - return false, line + status, response = sock:receive_bytes(opts.bytes) + return status, response end get_banner = function(host, port, opts) diff --git a/scripts/HTTP_open_proxy.nse b/scripts/HTTP_open_proxy.nse index 75e81134b..a7ed1fa0e 100644 --- a/scripts/HTTP_open_proxy.nse +++ b/scripts/HTTP_open_proxy.nse @@ -47,7 +47,7 @@ action = function(host, port) -- Ask proxy to open www.google.com local req = "GET http://www.google.com HTTP/1.0\r\nHost: www.google.com\r\n\r\n" - local status, result = comm.exchange(host, port, req, {proto=port.protocol, timeout=10000}) + local status, result = comm.exchange(host, port, req, {lines=1,proto=port.protocol, timeout=10000}) if not status then return diff --git a/scripts/HTTPtrace.nse b/scripts/HTTPtrace.nse index 9f35972a5..87802d4ed 100644 --- a/scripts/HTTPtrace.nse +++ b/scripts/HTTPtrace.nse @@ -79,7 +79,7 @@ portrule = shortport.port_or_service({80, 8080}, "http") action = function(host, port) local cmd = "TRACE / HTTP/1.0\r\n\r\n" - local status, response = comm.exchange(host, port, cmd, {timeout=5000}) + local status, response = comm.exchange(host, port, cmd, {lines=1,timeout=5000}) if not status then return diff --git a/scripts/PPTPversion.nse b/scripts/PPTPversion.nse index ade1fc806..950dd659d 100644 --- a/scripts/PPTPversion.nse +++ b/scripts/PPTPversion.nse @@ -53,7 +53,7 @@ action = function(host, port) payload = payload .. "\000\000\000\000" -- padding for vendor name local try = nmap.new_try() - local response = try(comm.exchange(host, port, payload, {bytes=1, timeout=5000})) + local response = try(comm.exchange(host, port, payload, {timeout=5000})) local result diff --git a/scripts/iax2Detect.nse b/scripts/iax2Detect.nse index 28026e1ed..4b53e7c3b 100644 --- a/scripts/iax2Detect.nse +++ b/scripts/iax2Detect.nse @@ -20,7 +20,7 @@ action = function(host, port) poke = poke .. string.char(0x00, 0x00, 0x00, 0x00) poke = poke .. string.char(0x00, 0x00, 0x06, 0x1e) - local status, recv = comm.exchange(host, port, poke, {bytes=1,proto=port.protocol,timeout=10000}) + local status, recv = comm.exchange(host, port, poke, {proto=port.protocol,timeout=10000}) if not status then return diff --git a/scripts/nbstat.nse b/scripts/nbstat.nse index e34cb3782..5f863382a 100644 --- a/scripts/nbstat.nse +++ b/scripts/nbstat.nse @@ -65,7 +65,7 @@ action = function(host) "\065\065\065\065\065\000\000\033" .. "\000\001" - local status, result = comm.exchange(host, 137, data, {bytes=1, proto="udp", timeout=5000}) + local status, result = comm.exchange(host, 137, data, {proto="udp", timeout=5000}) if (not status) then return