diff --git a/nselib/citrixxml.lua b/nselib/citrixxml.lua index fac6aa20e..f6b8df4ca 100644 --- a/nselib/citrixxml.lua +++ b/nselib/citrixxml.lua @@ -81,11 +81,11 @@ end -- function request_server_farm_data( host, port ) - local xmldata = "\r\n" - xmldata = xmldata .. "\r\n" - xmldata = xmldata .. "" - xmldata = xmldata .. "" - xmldata = xmldata .. "\r\n" + local xmldata = "\r\n\z + \r\n\z + \z + \z + \r\n" return send_citrix_xml_request(host, port, xmldata) end @@ -127,20 +127,24 @@ function request_appdata(host, port, params) local client_type = params['ClientType'] or "ica30" local desired_details = params['DesiredDetails'] or nil - local xmldata = "\r\n" - xmldata = xmldata .. "\r\n" - xmldata = xmldata .. "" - xmldata = xmldata .. "" - xmldata = xmldata .. "" - xmldata = xmldata .. "" .. server_type .. "" - xmldata = xmldata .. "" .. client_type .. "" + local xmldata = { + '\r\n\z + \r\n\z + ', + server_type, + "", + client_type, + "" + } if desired_details then if type(desired_details) == "string" then - xmldata = xmldata .. "" .. desired_details .. "" + xmldata[#xmldata+1] = "" .. desired_details .. "" elseif type(desired_details) == "table" then for _, v in ipairs(desired_details) do - xmldata = xmldata .. "" .. v .. "" + xmldata[#xmldata+1] = "" .. v .. "" end else assert(desired_details) @@ -148,10 +152,9 @@ function request_appdata(host, port, params) end - xmldata = xmldata .. "" - xmldata = xmldata .. "\r\n" + xmldata[#xmldata+1] = "\r\n" - return send_citrix_xml_request(host, port, xmldata) + return send_citrix_xml_request(host, port, table.concat(xmldata)) end @@ -270,25 +273,23 @@ end -- function request_address(host, port, flags, appname) - local xmldata = "\r\n" - xmldata = xmldata .. "\r\n" - xmldata = xmldata .. "" - xmldata = xmldata .. "" + local xmldata = { + '\r\n\z + \r\n\z + ' + } if flags then - xmldata = xmldata .. "" .. flags .. "" + xmldata[#xmldata+1] = "" .. flags .. "" end if appname then - xmldata = xmldata .. "" - xmldata = xmldata .. "" .. appname .. "" - xmldata = xmldata .. "" + xmldata[#xmldata+1] = "" .. appname .. "" end - xmldata = xmldata .. "" - xmldata = xmldata .. "\r\n" + xmldata[#xmldata+1] = "\r\n" - return send_citrix_xml_request(host, port, xmldata) + return send_citrix_xml_request(host, port, table.concat(xmldata)) end --- Request information about the Citrix protocol @@ -308,23 +309,23 @@ function request_server_data(host, port, params) local server_type = params.ServerType or {"all"} local client_type = params.ClientType or {"all"} - local xmldata = "\r\n" - xmldata = xmldata .. "\r\n" - xmldata = xmldata .. "" - xmldata = xmldata .. "" + local xmldata = { + '\r\n\z + \r\n\z + ' + } for _, srvtype in pairs(server_type) do - xmldata = xmldata .. "" .. srvtype .. "" + xmldata[#xmldata+1] = "" .. srvtype .. "" end for _, clitype in pairs(client_type) do - xmldata = xmldata .. "" .. clitype .. "" + xmldata[#xmldata+1] = "" .. clitype .. "" end - xmldata = xmldata .. "" - xmldata = xmldata .. "\r\n" + xmldata[#xmldata+1] = "\r\n" - return send_citrix_xml_request(host, port, xmldata) + return send_citrix_xml_request(host, port, table.concat(xmldata)) end --- Parses the response from the request_server_data request @@ -359,20 +360,21 @@ function request_protocol_info( host, port, params ) local params = params or {} - local xmldata = "\r\n" - xmldata = xmldata .. "\r\n" - xmldata = xmldata .. "" - xmldata = xmldata .. "" + local xmldata = { + '\r\n\z + \r\n\z + ' + } if params['ServerAddress'] then - xmldata = xmldata .. "" - xmldata = xmldata .. params['ServerAddress'] .. "" + xmldata[#xmldata+1] = ('' .. + params['ServerAddress'] .. "") end - xmldata = xmldata .. "" - xmldata = xmldata .. "\r\n" + xmldata[#xmldata+1] = "\r\n" - return send_citrix_xml_request(host, port, xmldata) + return send_citrix_xml_request(host, port, table.concat(xmldata)) end --- Request capability information @@ -387,12 +389,10 @@ end -- function request_capabilities( host, port ) - local xmldata = "\r\n" - xmldata = xmldata .. "\r\n" - xmldata = xmldata .. "" - xmldata = xmldata .. "" - xmldata = xmldata .. "" - xmldata = xmldata .. "\r\n" + local xmldata = '\r\n\z + \r\n\z + \z + \r\n' return send_citrix_xml_request(host, port, xmldata) end @@ -431,29 +431,27 @@ function request_validate_credentials(host, port, params ) local params = params or {} local credentials = params['Credentials'] or {} - local xmldata = "\r\n" - xmldata = xmldata .. "\r\n" - xmldata = xmldata .. "" - xmldata = xmldata .. "" - xmldata = xmldata .. "" + local xmldata = { + '\r\n\z + \r\n\z + ' + } if credentials['UserName'] then - xmldata = xmldata .. "" .. credentials['UserName'] .. "" + xmldata[#xmldata+1] = "" .. credentials['UserName'] .. "" end if credentials['Password'] then - xmldata = xmldata .. "" .. credentials['Password'] .. "" + xmldata[#xmldata+1] = '' .. credentials['Password'] .. "" end if credentials['Domain'] then - xmldata = xmldata .. "" .. credentials['Domain'] .. "" + xmldata[#xmldata+1] = '' .. credentials['Domain'] .. "" end - xmldata = xmldata .. "" - xmldata = xmldata .. "" - xmldata = xmldata .. "\r\n" + xmldata[#xmldata+1] = "\r\n" - return send_citrix_xml_request(host, port, xmldata) + return send_citrix_xml_request(host, port, table.concat(xmldata)) end @@ -491,47 +489,45 @@ function request_reconnect_session_data(host, port, params) params.ServerType = params.ServerType or {} params.ClientType = params.ClientType or {} - local xmldata = "\r\n" - xmldata = xmldata .. "\r\n" - xmldata = xmldata .. "" - xmldata = xmldata .. "" - - xmldata = xmldata .. "" + local xmldata = { + '\r\n\z + \r\n\z + ' + } if Credentials.UserName then - xmldata = xmldata .. "" .. Credentials.UserName .. "" + xmldata[#xmldata+1] = "" .. Credentials.UserName .. "" end if Credentials.Password then - xmldata = xmldata .. "" .. Credentials.Password .. "" + xmldata[#xmldata+1] = '' .. Credentials.Password .. "" end if Credentials.Domain then - xmldata = xmldata .. "" .. Credentials.Domain .. "" + xmldata[#xmldata+1] = '' .. Credentials.Domain .. "" end - xmldata = xmldata .. "" + xmldata[#xmldata+1] = "" if params.ClientName then - xmldata = xmldata .. "" .. params.ClientName .. "" + xmldata[#xmldata+1] = "" .. params.ClientName .. "" end if params.DeviceId then - xmldata = xmldata .. "" .. params.DeviceId .. "" + xmldata[#xmldata+1] = "" .. params.DeviceId .. "" end for _, srvtype in pairs(params.ServerType) do - xmldata = xmldata .. "" .. srvtype .. "" + xmldata[#xmldata+1] = "" .. srvtype .. "" end for _, clitype in pairs(params.ClientType) do - xmldata = xmldata .. "" .. clitype .. "" + xmldata[#xmldata+1] = "" .. clitype .. "" end - xmldata = xmldata .. "" - xmldata = xmldata .. "\r\n" + xmldata[#xmldata+1] = "\r\n" - return send_citrix_xml_request(host, port, xmldata) + return send_citrix_xml_request(host, port, table.concat(xmldata)) end diff --git a/nselib/drda.lua b/nselib/drda.lua index cfff34247..f9ebee571 100644 --- a/nselib/drda.lua +++ b/nselib/drda.lua @@ -721,23 +721,23 @@ Comm = { } -- EBCDIC/ASCII Conversion tables -a2e_hex = "00010203372D2E2F1605250B0C0D0E0F101112133C3D322618193F271C1D1E1F" -a2e_hex = a2e_hex .. "405A7F7B5B6C507D4D5D5C4E6B604B61F0F1F2F3F4F5F6F7F8F97A5E4C7E6E6F" -a2e_hex = a2e_hex .. "7CC1C2C3C4C5C6C7C8C9D1D2D3D4D5D6D7D8D9E2E3E4E5E6E7E8E9ADE0BD5F6D" -a2e_hex = a2e_hex .. "79818283848586878889919293949596979899A2A3A4A5A6A7A8A9C04FD0A107" -a2e_hex = a2e_hex .. "202122232415061728292A2B2C090A1B30311A333435360838393A3B04143EE1" -a2e_hex = a2e_hex .. "4142434445464748495152535455565758596263646566676869707172737475" -a2e_hex = a2e_hex .. "767778808A8B8C8D8E8F909A9B9C9D9E9FA0AAABAC4AAEAFB0B1B2B3B4B5B6B7" -a2e_hex = a2e_hex .. "B8B9BABBBC6ABEBFCACBCCCDCECFDADBDCDDDEDFEAEBECEDEEEFFAFBFCFDFEFF" +a2e_hex = "00010203372D2E2F1605250B0C0D0E0F101112133C3D322618193F271C1D1E1F\z +405A7F7B5B6C507D4D5D5C4E6B604B61F0F1F2F3F4F5F6F7F8F97A5E4C7E6E6F\z +7CC1C2C3C4C5C6C7C8C9D1D2D3D4D5D6D7D8D9E2E3E4E5E6E7E8E9ADE0BD5F6D\z +79818283848586878889919293949596979899A2A3A4A5A6A7A8A9C04FD0A107\z +202122232415061728292A2B2C090A1B30311A333435360838393A3B04143EE1\z +4142434445464748495152535455565758596263646566676869707172737475\z +767778808A8B8C8D8E8F909A9B9C9D9E9FA0AAABAC4AAEAFB0B1B2B3B4B5B6B7\z +B8B9BABBBC6ABEBFCACBCCCDCECFDADBDCDDDEDFEAEBECEDEEEFFAFBFCFDFEFF" -e2a_hex = "000102039C09867F978D8E0B0C0D0E0F101112139D8508871819928F1C1D1E1F" -e2a_hex = e2a_hex .. "80818283840A171B88898A8B8C050607909116939495960498999A9B14159E1A" -e2a_hex = e2a_hex .. "20A0A1A2A3A4A5A6A7A8D52E3C282B7C26A9AAABACADAEAFB0B121242A293B5E" -e2a_hex = e2a_hex .. "2D2FB2B3B4B5B6B7B8B9E52C255F3E3FBABBBCBDBEBFC0C1C2603A2340273D22" -e2a_hex = e2a_hex .. "C3616263646566676869C4C5C6C7C8C9CA6A6B6C6D6E6F707172CBCCCDCECFD0" -e2a_hex = e2a_hex .. "D17E737475767778797AD2D3D45BD6D7D8D9DADBDCDDDEDFE0E1E2E3E45DE6E7" -e2a_hex = e2a_hex .. "7B414243444546474849E8E9EAEBECED7D4A4B4C4D4E4F505152EEEFF0F1F2F3" -e2a_hex = e2a_hex .. "5C9F535455565758595AF4F5F6F7F8F930313233343536373839FAFBFCFDFEFF" +e2a_hex = "000102039C09867F978D8E0B0C0D0E0F101112139D8508871819928F1C1D1E1F\z +80818283840A171B88898A8B8C050607909116939495960498999A9B14159E1A\z +20A0A1A2A3A4A5A6A7A8D52E3C282B7C26A9AAABACADAEAFB0B121242A293B5E\z +2D2FB2B3B4B5B6B7B8B9E52C255F3E3FBABBBCBDBEBFC0C1C2603A2340273D22\z +C3616263646566676869C4C5C6C7C8C9CA6A6B6C6D6E6F707172CBCCCDCECFD0\z +D17E737475767778797AD2D3D45BD6D7D8D9DADBDCDDDEDFE0E1E2E3E45DE6E7\z +7B414243444546474849E8E9EAEBECED7D4A4B4C4D4E4F505152EEEFF0F1F2F3\z +5C9F535455565758595AF4F5F6F7F8F930313233343536373839FAFBFCFDFEFF" -- Creates the lookup tables needed for conversion a2e_tbl = bin.pack("H", a2e_hex) diff --git a/nselib/rmi.lua b/nselib/rmi.lua index 356f4148f..86d9fc4b1 100644 --- a/nselib/rmi.lua +++ b/nselib/rmi.lua @@ -448,33 +448,33 @@ JavaClass = { end, __tostring = function( self ) - local data + local data = {} if self.name ~=nil then - data = ("%s "):format(self.name) + data[#data+1] = ("%s "):format(self.name) else - data = "???" + data[#data+1] = "???" end if self.superClass~=nil then - data = data .. " extends ".. tostring( self.superClass) + data[#data+1] = " extends ".. tostring( self.superClass) end if self.ifaces ~= nil then - data = data .. " implements " .. self.ifaces + data[#data+1] = " implements " .. self.ifaces end if self.fields ~=nil then for i=1, #self.fields do if i == 1 then - data = data .. "[" + data[#data+1] = "[" end - data = data .. tostring(self.fields[i]) + data[#data+1] = tostring(self.fields[i]) if ( i < #self.fields ) then - data = data .. ";" + data[#data+1] = ";" else - data = data .. "]" + data[#data+1] = "]" end end end - return data + return table.concat(data) end, toTable = function(self, customDataFormatter) local data = {self.name} @@ -571,7 +571,8 @@ JavaField = { table.insert(data, self.value) end else - data = data .." = " .. tostring(self.value) + --TODO: FIXME This is illegal, but I don't know what the intent was: + data = data .." = " .. tostring(self.value) --FIXME end end return data @@ -592,13 +593,15 @@ JavaArray = { setLength = function( self, length ) self.length = length end, setValue = function(self, index, object) self.values[index] = object end, __tostring=function(self) - local data = ("Array: %s [%d] = {"):format(tostring(self.class), self.length) + local data = { + ("Array: %s [%d] = {"):format(tostring(self.class), self.length) + } for i=1, #self.values do - data = data .. self.values[i].."," + data[#data+1] = self.values[i].."," end - data = data .."}" - return data + data[#data+1] = "}" + return table.concat(data) end, toTable = function(self) local title = ("Array: %s [%d] = {"):format(tostring(self.class), self.length) diff --git a/nselib/rpc.lua b/nselib/rpc.lua index 0f8a7b1ff..04e0ead6b 100644 --- a/nselib/rpc.lua +++ b/nselib/rpc.lua @@ -325,10 +325,12 @@ Comm = { packet = packet .. bin.pack( "IIII", 0, 0, 0, 0 ) elseif auth.type == Portmap.AuthType.UNIX then packet = packet .. Util.marshall_int32(auth.type) - local blob = Util.marshall_int32(nmap.clock()) --time - blob = blob .. Util.marshall_vopaque(auth.hostname or 'localhost') - blob = blob .. Util.marshall_int32(auth.uid or 0) - blob = blob .. Util.marshall_int32(auth.gid or 0) + local blob = ( + Util.marshall_int32(nmap.clock()) --time + .. Util.marshall_vopaque(auth.hostname or 'localhost') + .. Util.marshall_int32(auth.uid or 0) + .. Util.marshall_int32(auth.gid or 0) + ) if auth.gids then --len prefix gid list blob = blob .. Util.marshall_int32(#auth.gids) for _,gid in ipairs(auth.gids) do @@ -337,8 +339,9 @@ Comm = { else blob = blob .. Util.marshall_int32(0) end - packet = packet .. Util.marshall_vopaque(blob) - packet = packet .. bin.pack( "II", 0, 0 ) --AUTH_NULL verf + packet = (packet .. Util.marshall_vopaque(blob) + .. bin.pack( "II", 0, 0 ) --AUTH_NULL verf + ) else return false, "Comm.CreateHeader: invalid authentication type specified" end @@ -2981,10 +2984,7 @@ Util = -- @param mode number containing the ACL mode -- @return string containing the ACL characters FpermToString = function(mode) - local tmpacl, acl = {}, "" - for i = 1, 9 do - tmpacl[i] = "-" - end + local tmpacl = { "-", "-", "-", "-", "-", "-", "-", "-", "-" } for user,_ in pairs(Util.Fperm) do local t = Util.Fperm[user] @@ -3009,11 +3009,7 @@ Util = end end - for i = 1,#tmpacl do - acl = acl .. tmpacl[i] - end - - return acl + return table.concat(tmpacl) end, --- Converts the NFS file attributes to a string. @@ -3096,11 +3092,7 @@ Util = end, marshall_opaque = function(data) - local opaque = bin.pack(">A", data) - for i = 1, Util.CalcFillBytes(data:len()) do - opaque = opaque .. string.char(0x00) - end - return opaque + return bin.pack(">A", data) .. string.rep("\0", Util.CalcFillBytes(data:len())) end, unmarshall_opaque = function(len, data, pos) @@ -3108,13 +3100,11 @@ Util = end, marshall_vopaque = function(data) - local opaque, l - l = data:len() - opaque = Util.marshall_uint32(l) .. bin.pack(">A", data) - for i = 1, Util.CalcFillBytes(l) do - opaque = opaque .. string.char(0x00) - end - return opaque + local l = data:len() + return ( + Util.marshall_uint32(l) .. bin.pack(">A", data) .. + string.rep("\0", Util.CalcFillBytes(l)) + ) end, unmarshall_vopaque = function(len, data, pos) diff --git a/nselib/upnp.lua b/nselib/upnp.lua index 354dbd89e..ece197f1c 100644 --- a/nselib/upnp.lua +++ b/nselib/upnp.lua @@ -94,14 +94,13 @@ Comm = { -- -- @return status true on success, false on failure sendRequest = function( self ) - local payload = strbuf.new() -- for details about the UPnP message format, see http://upnp.org/resources/documents.asp - payload = payload .. "M-SEARCH * HTTP/1.1\r\n" - payload = payload .. "Host:239.255.255.250:1900\r\n" - payload = payload .. "ST:upnp:rootdevice\r\n" - payload = payload .. "Man:\"ssdp:discover\"\r\n" - payload = payload .. "MX:3\r\n\r\n" + local payload = 'M-SEARCH * HTTP/1.1\r\n\z + Host:239.255.255.250:1900\r\n\z + ST:upnp:rootdevice\r\n\z + Man:"ssdp:discover"\r\n\z + MX:3\r\n\r\n' local status, err diff --git a/nselib/url.lua b/nselib/url.lua index fdb4899c8..406ee4e84 100644 --- a/nselib/url.lua +++ b/nselib/url.lua @@ -290,29 +290,27 @@ end -- @return The corresponding path string ----------------------------------------------------------------------------- function build_path(parsed, unsafe) - local path = "" + local path = {} + if parsed.is_absolute then path[#path+1] = "/" end local n = #parsed if unsafe then for i = 1, n-1 do - path = path .. parsed[i] - path = path .. "/" + path[#path+1] = parsed[i] .. "/" end if n > 0 then - path = path .. parsed[n] - if parsed.is_directory then path = path .. "/" end + path[#path+1] = parsed[n] + if parsed.is_directory then path[#path+1] = "/" end end else for i = 1, n-1 do - path = path .. protect_segment(parsed[i]) - path = path .. "/" + path[#path+1] = protect_segment(parsed[i]) .. "/" end if n > 0 then - path = path .. protect_segment(parsed[n]) - if parsed.is_directory then path = path .. "/" end + path[#path+1] = protect_segment(parsed[n]) + if parsed.is_directory then path[#path+1] = "/" end end end - if parsed.is_absolute then path = "/" .. path end - return path + return table.concat(path) end --- diff --git a/nselib/versant.lua b/nselib/versant.lua index da9580369..527e67223 100644 --- a/nselib/versant.lua +++ b/nselib/versant.lua @@ -13,6 +13,7 @@ local bin = require "bin" local match = require "match" local nmap = require "nmap" local package = require "package" +local string = require "string" local table = require "table" _ENV = stdnse.module("versant", stdnse.seeall) @@ -60,22 +61,22 @@ Versant = { ver = ver or Versant.VERSION arg = arg or "" - local data = bin.pack("H", "000100000000000000020002000000010000000000000000000000000000000000010000") - data = data .. cmd .. "\0" .. user .. "\0" .. ver .. "\0" + local data = bin.pack("Hzzz", + "000100000000000000020002000000010000000000000000000000000000000000010000", + cmd, + user, + ver + ) -- align to even 4 bytes - if ( #data % 4 ~= 0 ) then - for i=1, ( 4 - (#data % 4)) do - data = data .. "\0" - end - end + data = data .. string.rep("\0", 4 - ((#data % 4) or 0)) - data = data .. bin.pack("H", "0000000b000001000000000000000000") - data = data .. ("%s:%d\0"):format(self.host.ip, self.port.number) - data = data .. "\0\0\0\0\0\0\0\0\0\0" .. arg + data = data .. bin.pack("Hzxxxxxxxxxxz", + "0000000b000001000000000000000000", + ("%s:%d"):format(self.host.ip, self.port.number), + arg + ) - while ( #data < 2048 ) do - data = data .. "\0" - end + data = data .. string.rep("\0", 2048 - #data) local status, err = self.socket:send(data) if ( not(status) ) then @@ -254,12 +255,10 @@ Versant.OBE = { -- lib_path - the library directory -- hostname - the database host name getVODInfo = function(self) - local data = bin.pack("H", "1002005d00000000000100000000000d000000000000000000000000") - data = data .. "-noprint -i " - - while( #data < 256 ) do - data = data .. "\0" - end + local data = bin.pack("Hz", + "1002005d00000000000100000000000d000000000000000000000000", --28 + "-noprint -i " --12 + 1 (for null) + ) .. string.rep("\0", 215) -- 256 - (28 + 12 + 1) self.socket:send(data) local status, data = self.socket:receive_buf(match.numbytes(256), true)