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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
|
local http = require "http"
local nmap = require "nmap"
local shortport = require "shortport"
local stdnse = require "stdnse"
local string = require "string"
local table = require "table"
local target = require "target"
description = [[
Retrieves information from an Apache HBase (Hadoop database) master HTTP status page.
Information gathered:
* Hbase version
* Hbase compile date
* Hbase root directory
* Hadoop version
* Hadoop compile date
* Average load
* Zookeeper quorum server
* Associated region servers
]]
---
-- @usage
-- nmap --script hbase-master-info -p 60010 host
--
-- @output
-- | hbase-master-info:
-- | Hbase Version: 0.90.1
-- | Hbase Compiled: Wed May 11 22:33:44 PDT 2011, bob
-- | HBase Root Directory: hdfs://master.example.com:8020/hbase
-- | Hadoop Version: 0.20 f415ef415ef415ef415ef415ef415ef415ef415e
-- | Hadoop Compiled: Wed May 11 22:33:44 PDT 2011, bob
-- | Average Load: 0.12
-- | Zookeeper Quorum: zookeeper.example.com:2181
-- | Region Servers:
-- | region1.example.com:60030
-- |_ region2.example.com:60030
-- @xmloutput
-- <elem key="Hbase Version">0.90.1</elem>
-- <elem key="Hbase Compiled">Wed May 11 22:33:44 PDT 2011, bob</elem>
-- <elem key="HBase Root Directory">hdfs://master.example.com:8020/hbase</elem>
-- <elem key="Hadoop Version">0.20 f415ef415ef415ef415ef415ef415ef415ef415e</elem>
-- <elem key="Hadoop Compiled">Wed May 11 22:33:44 PDT 2011, bob</elem>
-- <elem key="Average Load">0.12</elem>
-- <elem key="Zookeeper Quorum">zookeeper.example.com:2181</elem>
-- <table key="Region Servers">
-- <elem>region1.example.com:60030</elem>
-- <elem>region2.example.com:60030</elem>
-- </table>
author = "John R. Bond"
license = "Simplified (2-clause) BSD license--See https://nmap.org/svn/docs/licenses/BSD-simplified"
categories = {"default", "discovery", "safe"}
portrule = function(host, port)
-- Run for the special port number, or for any HTTP-like service that is
-- not on a usual HTTP port.
return shortport.port_or_service ({60010}, "hbase-master")(host, port)
or (shortport.service(shortport.LIKELY_HTTP_SERVICES)(host, port) and not shortport.portnumber(shortport.LIKELY_HTTP_PORTS)(host, port))
end
action = function( host, port )
local result = stdnse.output_table()
local region_servers = {}
local uri = "/master.jsp"
stdnse.debug1("HTTP GET %s:%s%s", host.targetname or host.ip, port.number, uri)
local response = http.get( host, port, uri )
stdnse.debug1("Status %s",response['status-line'] or "No Response")
if not (response['status-line'] and response['status-line']:match("200%s+OK") and response['body']) then
return nil
end
local body = response['body']:gsub("%%","%%%%")
stdnse.debug2("Body %s\n",body)
if body:match("HBase%s+Version</td><td>([^][<]+)") then
local version = body:match("HBase%s+Version</td><td>([^][<]+)"):gsub("%s+", " ")
stdnse.debug1("Hbase Version %s",version)
result["Hbase Version"] = version
port.version.version = version
end
if body:match("HBase%s+Compiled</td><td>([^][<]+)") then
local compiled = body:match("HBase%s+Compiled</td><td>([^][<]+)"):gsub("%s+", " ")
stdnse.debug1("Hbase Compiled %s",compiled)
result["Hbase Compiled"] = compiled
end
if body:match("Directory</td><td>([^][<]+)") then
local compiled = body:match("Directory</td><td>([^][<]+)"):gsub("%s+", " ")
stdnse.debug1("HBase RootDirectory %s",compiled)
result["HBase Root Directory"] = compiled
end
if body:match("Hadoop%s+Version</td><td>([^][<]+)") then
local version = body:match("Hadoop%s+Version</td><td>([^][<]+)"):gsub("%s+", " ")
stdnse.debug1("Hadoop Version %s",version)
result["Hadoop Version"] = version
end
if body:match("Hadoop%s+Compiled</td><td>([^][<]+)") then
local compiled = body:match("Hadoop%s+Compiled</td><td>([^][<]+)"):gsub("%s+", " ")
stdnse.debug1("Hadoop Compiled %s",compiled)
result["Hadoop Compiled"] = compiled
end
if body:match("average</td><td>([^][<]+)") then
local average = body:match("average</td><td>([^][<]+)"):gsub("%s+", " ")
stdnse.debug1("Average Load %s",average)
result["Average Load"] = average
end
if body:match("Quorum</td><td>([^][<]+)") then
local quorum = body:match("Quorum</td><td>([^][<]+)"):gsub("%s+", " ")
stdnse.debug1("Zookeeper Quorum %s",quorum)
result["Zookeeper Quorum"] = quorum
if target.ALLOW_NEW_TARGETS then
if quorum:match("([%w%.]+)") then
local newtarget = quorum:match("([%w%.]+)")
stdnse.debug1("Added target: %s", newtarget)
local status,err = target.add(newtarget)
end
end
end
for line in string.gmatch(body, "[^\n]+") do
stdnse.debug3("Line %s\n",line)
if line:match("maxHeap") then
local region_server= line:match("\">([^][<]+)</a>")
stdnse.debug1("Region Server %s",region_server)
table.insert(region_servers, region_server)
if target.ALLOW_NEW_TARGETS then
if region_server:match("([%w%.]+)") then
local newtarget = region_server:match("([%w%.]+)")
stdnse.debug1("Added target: %s", newtarget)
local status,err = target.add(newtarget)
end
end
end
end
if next(region_servers) then
result["Region Servers"] = region_servers
end
if #result > 0 then
port.version.name = "hbase-master"
port.version.product = "Apache Hadoop Hbase"
nmap.set_port_version(host, port)
return result
end
end
|