local bin = require "bin" local nmap = require "nmap" local shortport = require "shortport" local stdnse = require "stdnse" local string = require "string" local table = require "table" description = [[ Extracts a list of Citrix servers from the ICA Browser service. ]] --- -- @usage sudo ./nmap -sU --script=citrix-enum-servers -p 1604 -- -- @output -- PORT STATE SERVICE -- 1604/udp open unknown -- | citrix-enum-servers: -- | CITRIXSRV01 -- |_ CITRIXSRV02 -- -- Version 0.2 -- Created 11/26/2009 - v0.1 - created by Patrik Karlsson -- Revised 11/26/2009 - v0.2 - minor packet documentation author = "Patrik Karlsson" license = "Same as Nmap--See https://nmap.org/book/man-legal.html" categories = {"discovery", "safe"} portrule = shortport.portnumber(1604, "udp") -- -- process the response from the server -- @param response string, complete server response -- @return string row delimited with \n containing all published applications -- function process_server_response(response) local pos, packet_len = bin.unpack("#query) -- process the first response server_list = process_server_response( packet ) -- -- the byte at offset 31 in the response has a really magic function -- if it is set to zero (0) we have more response packets to process -- if it is set to one (1) we have arrived at the last packet of our journey -- while packet:sub(31,31) ~= "\x01" do packet = try( socket:receive() ) local tmp_table = process_server_response( packet ) for _, v in ipairs(tmp_table) do table.insert(server_list, v) end end if #server_list>0 then nmap.set_port_state(host, port, "open") end socket:close() return stdnse.format_output(true, server_list) end