summaryrefslogtreecommitdiffstats
path: root/scripts/broadcast-novell-locate.nse
blob: 610c37649649e8f6154e27d50724b21d6826d7ce (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
local ipOps = require "ipOps"
local srvloc = require "srvloc"
local stdnse = require "stdnse"
local stringaux = require "stringaux"
local table = require "table"

description = [[
Attempts to use the Service Location Protocol to discover Novell NetWare Core Protocol (NCP) servers.
]]

---
--
--@output
-- Pre-scan script results:
-- | broadcast-novell-locate:
-- |   Tree name: CQURE-LABTREE
-- |   Server name: linux-l84t
-- |   Addresses
-- |_    192.168.56.33
--
--

-- Version 0.1
-- Created 04/26/2011 - v0.1 - created by Patrik Karlsson

author = "Patrik Karlsson"
license = "Same as Nmap--See https://nmap.org/book/man-legal.html"
categories = {"broadcast", "safe"}


prerule = function() return true end

function action()

  local helper = srvloc.Helper:new()

  local status, bindery = helper:ServiceRequest("bindery.novell", "DEFAULT")
  if ( not(status) or not(bindery) ) then
    helper:close()
    return
  end
  bindery = bindery[1]
  local srvname = bindery:match("%/%/%/(.*)$")

  local status, attrib = helper:AttributeRequest(bindery, "DEFAULT", "svcaddr-ws")
  helper:close()
  attrib = attrib:match("^%(svcaddr%-ws=(.*)%)$")
  if ( not(attrib) ) then return end

  local attribs = stringaux.strsplit(",", attrib)
  if ( not(attribs) ) then return end

  local addrs = { name = "Addresses"}
  local ips = {}
  for _, attr in ipairs(attribs) do
    local addr = attr:match("^%d*%-%d*%-%d*%-(........)")
    if ( addr ) then
      local ip = ipOps.str_to_ip(stdnse.fromhex(addr))

      if ( not(ips[ip]) ) then
        table.insert(addrs, ip)
        ips[ip] = ip
      end
    end
  end

  local output = {}
  local status, treename = helper:ServiceRequest("ndap.novell", "DEFAULT")
  if ( status ) then
    treename = treename[1]
    treename = treename:match("%/%/%/(.*)%.$")
    table.insert(output, ("Tree name: %s"):format(treename))
  end
  table.insert(output, ("Server name: %s"):format(srvname))
  table.insert(output, addrs)

  return stdnse.format_output(true, output)
end