local shortport = require "shortport" description = [[ Get and return a page info ]] --- -- @args http-get.path Path to get. Default /. -- -- @usage nmap -p80 --script http-info.nse --script-args http-info.path=/ -- -- @output -- status: 200 -- status-line: HTTP/1.1 200 OK\x0D --- categories = {"discovery", "intrusive"} author = "Adrien Malingrey" license = "Same as Nmap--See https://nmap.org/book/man-legal.html" portrule = shortport.service({"http", "https", "ssl"}) local http = require "http" local stdnse = require "stdnse" action = function(host, port) local scheme = "" local hostaddress = (host.name ~= '' and host.name) or host.ip local path = "" local answer local favicon_relative_uri = "favicon.ico" local favicon if (port.service == "ssl") then scheme = "https" else scheme = port.service end if(stdnse.get_script_args('http-get.path')) then path = "/" .. stdnse.get_script_args('http-info.path') end answer = http.get_url(scheme.."://"..hostaddress..":"..port.number.."/"..path) if (answer and answer.status == 200) then favicon_relative_uri = parseIcon(answer.body) or "favicon.ico" end favicon_absolute_uri = scheme.."://"..hostaddress..":"..port.number.."/"..favicon_relative_uri favicon = http.get_url(favicon_absolute_uri) if (favicon and favicon.status == 200) then return {status=answer.status, ["status-line"]=answer["status-line"], favicon=favicon_absolute_uri} else return {status=answer.status, ["status-line"]=answer["status-line"]} end end --- function taken from http_favicon.nse by Vlatko Kosturjak function parseIcon( body ) local _, i, j local rel, href, word -- Loop through link elements. i = 0 while i do _, i = string.find(body, "<%s*[Ll][Ii][Nn][Kk]%s", i + 1) if not i then return nil end -- Loop through attributes. j = i while true do local name, quote, value _, j, name, quote, value = string.find(body, "^%s*(%w+)%s*=%s*([\"'])(.-)%2", j + 1) if not j then break end if string.lower(name) == "rel" then rel = value elseif string.lower(name) == "href" then href = value end end for word in string.gmatch(rel or "", "%S+") do if string.lower(word) == "icon" then return href end end end end