Linux tsuru-no-tsurugi 5.15.0-186-generic #196-Ubuntu SMP Sat Jun 20 16:09:34 UTC 2026 x86_64
Apache/2.4.52 (Ubuntu)
Server IP : 192.168.0.18 & Your IP : 216.73.217.105
Domains :
Cant Read [ /etc/named.conf ]
User : www-data
Terminal
Auto Root
Create File
Create Folder
Localroot Suggester
Backdoor Destroyer
Readme
/
usr /
share /
nmap /
nselib /
Delete
Unzip
Name
Size
Permission
Date
Action
data
[ DIR ]
drwxr-xr-x
2024-08-29 14:21
afp.lua
71.48
KB
-rw-r--r--
2023-01-13 02:40
ajp.lua
16.77
KB
-rw-r--r--
2023-01-13 02:40
amqp.lua
10.41
KB
-rw-r--r--
2023-01-13 02:40
anyconnect.lua
4.31
KB
-rw-r--r--
2023-01-13 02:40
asn1.lua
14.57
KB
-rw-r--r--
2023-01-13 02:40
base32.lua
7.36
KB
-rw-r--r--
2023-01-13 02:40
base64.lua
5.83
KB
-rw-r--r--
2023-01-13 02:40
bin.lua
12.99
KB
-rw-r--r--
2023-01-13 02:40
bitcoin.lua
18.25
KB
-rw-r--r--
2023-01-13 02:40
bits.lua
2.54
KB
-rw-r--r--
2023-01-13 02:40
bittorrent.lua
35.76
KB
-rw-r--r--
2023-01-13 02:40
bjnp.lua
9.55
KB
-rw-r--r--
2023-01-13 02:40
brute.lua
50.64
KB
-rw-r--r--
2023-01-13 02:40
cassandra.lua
5.48
KB
-rw-r--r--
2023-01-13 02:40
citrixxml.lua
16
KB
-rw-r--r--
2023-01-13 02:40
coap.lua
75.1
KB
-rw-r--r--
2023-01-13 02:40
comm.lua
11.03
KB
-rw-r--r--
2023-01-13 02:40
creds.lua
18.26
KB
-rw-r--r--
2023-01-13 02:40
cvs.lua
3.05
KB
-rw-r--r--
2023-01-13 02:40
datafiles.lua
11.05
KB
-rw-r--r--
2023-01-13 02:40
datetime.lua
7.5
KB
-rw-r--r--
2023-01-13 02:40
dhcp.lua
28.57
KB
-rw-r--r--
2023-01-13 02:40
dhcp6.lua
19.86
KB
-rw-r--r--
2023-01-13 02:40
dns.lua
51.07
KB
-rw-r--r--
2023-01-13 02:40
dnsbl.lua
19.01
KB
-rw-r--r--
2023-01-13 02:40
dnssd.lua
12.61
KB
-rw-r--r--
2023-01-13 02:40
drda.lua
24.08
KB
-rw-r--r--
2023-01-13 02:40
eap.lua
7.54
KB
-rw-r--r--
2023-01-13 02:40
eigrp.lua
12.98
KB
-rw-r--r--
2023-01-13 02:40
formulas.lua
5.68
KB
-rw-r--r--
2023-01-13 02:40
ftp.lua
9.03
KB
-rw-r--r--
2023-01-13 02:40
geoip.lua
1.71
KB
-rw-r--r--
2023-01-13 02:40
giop.lua
18.42
KB
-rw-r--r--
2023-01-13 02:40
gps.lua
3.38
KB
-rw-r--r--
2023-01-13 02:40
http.lua
117.07
KB
-rw-r--r--
2023-01-13 02:40
httpspider.lua
36.65
KB
-rw-r--r--
2023-01-13 02:40
iax2.lua
9.58
KB
-rw-r--r--
2023-01-13 02:40
idna.lua
17.14
KB
-rw-r--r--
2023-01-13 02:40
ike.lua
14.63
KB
-rw-r--r--
2023-01-13 02:40
imap.lua
9.59
KB
-rw-r--r--
2023-01-13 02:40
informix.lua
39.93
KB
-rw-r--r--
2023-01-13 02:40
ipOps.lua
29.06
KB
-rw-r--r--
2023-01-13 02:40
ipmi.lua
8.08
KB
-rw-r--r--
2023-01-13 02:40
ipp.lua
12.57
KB
-rw-r--r--
2023-01-13 02:40
irc.lua
757
B
-rw-r--r--
2023-01-13 02:40
iscsi.lua
21.38
KB
-rw-r--r--
2023-01-13 02:40
isns.lua
14.98
KB
-rw-r--r--
2023-01-13 02:40
jdwp.lua
43.52
KB
-rw-r--r--
2023-01-13 02:40
json.lua
11.62
KB
-rw-r--r--
2023-01-13 02:40
knx.lua
2.42
KB
-rw-r--r--
2023-01-13 02:40
ldap.lua
31.94
KB
-rw-r--r--
2023-01-13 02:40
lfs.luadoc
1.68
KB
-rw-r--r--
2023-01-13 02:40
libssh2-utility.lua
4.69
KB
-rw-r--r--
2023-01-13 02:40
libssh2.luadoc
4.75
KB
-rw-r--r--
2023-01-13 02:40
listop.lua
4.66
KB
-rw-r--r--
2023-01-13 02:40
lpeg-utility.lua
5.64
KB
-rw-r--r--
2023-01-13 02:40
lpeg.luadoc
351
B
-rw-r--r--
2023-01-13 02:40
ls.lua
10.96
KB
-rw-r--r--
2023-01-13 02:40
match.lua
2.05
KB
-rw-r--r--
2023-01-13 02:40
membase.lua
9.93
KB
-rw-r--r--
2023-01-13 02:40
mobileme.lua
8.46
KB
-rw-r--r--
2023-01-13 02:40
mongodb.lua
21.3
KB
-rw-r--r--
2023-01-13 02:40
mqtt.lua
28.86
KB
-rw-r--r--
2023-01-13 02:40
msrpc.lua
190.07
KB
-rw-r--r--
2023-01-13 02:40
msrpcperformance.lua
29.65
KB
-rw-r--r--
2023-01-13 02:40
msrpctypes.lua
168.52
KB
-rw-r--r--
2023-01-13 02:40
mssql.lua
109.43
KB
-rw-r--r--
2023-01-13 02:40
multicast.lua
5.97
KB
-rw-r--r--
2023-01-13 02:40
mysql.lua
16.03
KB
-rw-r--r--
2023-01-13 02:40
natpmp.lua
5.11
KB
-rw-r--r--
2023-01-13 02:40
nbd.lua
16.04
KB
-rw-r--r--
2023-01-13 02:40
ncp.lua
35.64
KB
-rw-r--r--
2023-01-13 02:40
ndmp.lua
11.43
KB
-rw-r--r--
2023-01-13 02:40
netbios.lua
14.44
KB
-rw-r--r--
2023-01-13 02:40
nmap.luadoc
40.34
KB
-rw-r--r--
2023-01-13 02:40
nrpc.lua
4.46
KB
-rw-r--r--
2023-01-13 02:40
nsedebug.lua
3.49
KB
-rw-r--r--
2023-01-13 02:40
omp2.lua
4.78
KB
-rw-r--r--
2023-01-13 02:40
oops.lua
3.61
KB
-rw-r--r--
2023-01-13 02:40
openssl.luadoc
7.5
KB
-rw-r--r--
2023-01-13 02:40
ospf.lua
15.29
KB
-rw-r--r--
2023-01-13 02:40
packet.lua
36.18
KB
-rw-r--r--
2023-01-13 02:40
pcre.luadoc
6.79
KB
-rw-r--r--
2023-01-13 02:40
pgsql.lua
20.6
KB
-rw-r--r--
2023-01-13 02:40
pop3.lua
5.74
KB
-rw-r--r--
2023-01-13 02:40
pppoe.lua
29.42
KB
-rw-r--r--
2023-01-13 02:40
proxy.lua
11.37
KB
-rw-r--r--
2023-01-13 02:40
punycode.lua
11.5
KB
-rw-r--r--
2023-01-13 02:40
rand.lua
2.7
KB
-rw-r--r--
2023-01-13 02:40
rdp.lua
14.73
KB
-rw-r--r--
2023-01-13 02:40
re.lua
8.22
KB
-rw-r--r--
2023-01-13 02:40
redis.lua
3.61
KB
-rw-r--r--
2023-01-13 02:40
rmi.lua
47.77
KB
-rw-r--r--
2023-01-13 02:40
rpc.lua
107.64
KB
-rw-r--r--
2023-01-13 02:40
rpcap.lua
11.08
KB
-rw-r--r--
2023-01-13 02:40
rsync.lua
5.22
KB
-rw-r--r--
2023-01-13 02:40
rtsp.lua
8.62
KB
-rw-r--r--
2023-01-13 02:40
sasl.lua
16.51
KB
-rw-r--r--
2023-01-13 02:40
shortport.lua
11.99
KB
-rw-r--r--
2023-01-13 02:40
sip.lua
30.07
KB
-rw-r--r--
2023-01-13 02:40
slaxml.lua
17.9
KB
-rw-r--r--
2023-01-13 02:40
smb.lua
173.22
KB
-rw-r--r--
2023-01-13 02:40
smb2.lua
15.34
KB
-rw-r--r--
2023-01-13 02:40
smbauth.lua
37.33
KB
-rw-r--r--
2023-01-13 02:40
smtp.lua
19.85
KB
-rw-r--r--
2023-01-13 02:40
snmp.lua
16
KB
-rw-r--r--
2023-01-13 02:40
socks.lua
8.25
KB
-rw-r--r--
2023-01-13 02:40
srvloc.lua
10.99
KB
-rw-r--r--
2023-01-13 02:40
ssh1.lua
9.15
KB
-rw-r--r--
2023-01-13 02:40
ssh2.lua
11.73
KB
-rw-r--r--
2023-01-13 02:40
sslcert.lua
33.35
KB
-rw-r--r--
2023-01-13 02:40
sslv2.lua
9.68
KB
-rw-r--r--
2023-01-13 02:40
stdnse.lua
32.64
KB
-rw-r--r--
2023-01-13 02:40
strbuf.lua
4.52
KB
-rw-r--r--
2023-01-13 02:40
strict.lua
2.53
KB
-rw-r--r--
2023-01-13 02:40
stringaux.lua
4.32
KB
-rw-r--r--
2023-01-13 02:40
stun.lua
11.08
KB
-rw-r--r--
2023-01-13 02:40
tab.lua
3.35
KB
-rw-r--r--
2023-01-13 02:40
tableaux.lua
2.06
KB
-rw-r--r--
2023-01-13 02:40
target.lua
3.93
KB
-rw-r--r--
2023-01-13 02:40
tftp.lua
9.41
KB
-rw-r--r--
2023-01-13 02:40
tls.lua
58.05
KB
-rw-r--r--
2023-01-13 02:40
tn3270.lua
46.99
KB
-rw-r--r--
2023-01-13 02:40
tns.lua
64.16
KB
-rw-r--r--
2023-01-13 02:40
unicode.lua
14.23
KB
-rw-r--r--
2023-01-13 02:40
unittest.lua
12.41
KB
-rw-r--r--
2023-01-13 02:40
unpwdb.lua
10.42
KB
-rw-r--r--
2023-01-13 02:40
upnp.lua
11.18
KB
-rw-r--r--
2023-01-13 02:40
url.lua
16.7
KB
-rw-r--r--
2023-01-13 02:40
versant.lua
8.58
KB
-rw-r--r--
2023-01-13 02:40
vnc.lua
25.54
KB
-rw-r--r--
2023-01-13 02:40
vulns.lua
76.45
KB
-rw-r--r--
2023-01-13 02:40
vuzedht.lua
16.21
KB
-rw-r--r--
2023-01-13 02:40
wsdd.lua
11.98
KB
-rw-r--r--
2023-01-13 02:40
xdmcp.lua
12.09
KB
-rw-r--r--
2023-01-13 02:40
xmpp.lua
15.91
KB
-rw-r--r--
2023-01-13 02:40
zlib.luadoc
4.88
KB
-rw-r--r--
2023-01-13 02:40
Save
Rename
local comm = require "comm" local match = require "match" local stdnse = require "stdnse" local string = require "string" _ENV = stdnse.module("nbd", stdnse.seeall) --- -- An implementation of the Network Block Device protocol. -- https://github.com/NetworkBlockDevice/nbd/blob/master/doc/proto.md -- -- @author "Mak Kolybabi <mak@kolybabi.com>" -- @copyright Same as Nmap--See https://nmap.org/book/man-legal.html NBD = { magic = { init_passwd = string.char(0x4E, 0x42, 0x44, 0x4d, 0x41, 0x47, 0x49, 0x43), cliserv_magic_old = string.char(0x00, 0x00, 0x42, 0x02, 0x81, 0x86, 0x12, 0x53), cliserv_magic_new = string.char(0x49, 0x48, 0x41, 0x56, 0x45, 0x4F, 0x50, 0x54), option = string.char(0x00, 0x03, 0xE8, 0x89, 0x04, 0x55, 0x65, 0xA9), cmd_request = string.char(0x25, 0x60, 0x95, 0x13), cmd_reply = string.char(0x67, 0x44, 0x66, 0x98), }, handshake_flags = { FIXED_NEWSTYLE = 0x0001, NO_ZEROES = 0x0002, }, client_flags = { C_FIXED_NEWSTYLE = 0x00000001, C_NO_ZEROES = 0x00000002, }, transmission_flags = { HAS_FLAGS = 0x0001, READ_ONLY = 0x0002, SEND_FLUSH = 0x0004, SEND_FUA = 0x0008, ROTATIONAL = 0x0010, SEND_TRIM = 0x0020, SEND_WRITE_ZEROES = 0x0040, -- WRITE_ZEROES Extension SEND_DF = 0x0080, -- STRUCTURED_REPLY Extension }, opt_req_types = { EXPORT_NAME = 0x00000001, ABORT = 0x00000002, LIST = 0x00000003, PEEK_EXPORT = 0x00000004, -- PEEK_EXPORT Extension STARTTLS = 0x00000005, INFO = 0x00000006, -- INFO Extension GO = 0x00000007, -- INFO Extension STRUCTURED_REPLY = 0x00000008, -- STRUCTURED_REPLY Extension BLOCK_SIZE = 0x00000009, -- INFO Extension }, opt_rep_types = { ACK = 0x00000001, SERVER = 0x00000002, INFO = 0x00000003, -- INFO Extension ERR_UNSUP = 0x80000001, ERR_POLICY = 0x80000002, ERR_INVALID = 0x80000003, ERR_PLATFORM = 0x80000004, ERR_TLS_REQD = 0x80000005, ERR_UNKNOWN = 0x80000006, -- INFO Extension ERR_SHUTDOWN = 0x80000007, ERR_BLOCK_SIZE_REQD = 0x80000008, -- INFO Extension }, opt_rep_ext_types = { info = { EXPORT = 0x0000, NAME = 0x0001, DESCRIPTION = 0x0002, BLOCK_SIZE = 0x0003, }, }, cmd_req_flags = { FUA = 0x0001, NO_HOLE = 0x0002, -- WRITE_ZEROES Extension DF = 0x0004, -- STRUCTURED_REPLY Extension }, cmd_req_types = { READ = 0x0000, WRITE = 0x0001, DISC = 0x0002, FLUSH = 0x0003, TRIM = 0x0004, CACHE = 0x0005, -- XNBD custom request types WRITE_ZEROES = 0x0006, -- WRITE_ZEROES Extension }, errors = { EPERM = 0x00000001, EIO = 0x00000005, ENOMEM = 0x0000000C, EINVAL = 0x00000016, ENOSPC = 0x0000001C, EOVERFLOW = 0x0000004B, ESHUTDOWN = 0x0000006C, }, } Comm = { --- Creates a new client instance. -- -- @name Comm.new -- -- @param host Table as received by the action method. -- @param port Table as received by the action method. -- -- @return o Instance of Client. new = function(self, host, port) local o = {host = host, port = port, exports = {}} setmetatable(o, self) self.__index = self return o end, --- Connects to the NBD server. -- -- @name Comm.connect -- -- @return status true on success, false on failure. connect = function(self) -- NBD servers send a response when we connect. We are using -- tryssl here as a precaution since there are several -- implementations of the protocol and no reason it can't be -- wrapped. IANA has rejected assigning another port for NBD over -- TLS. local sd, err, proto, rep = comm.tryssl(self.host, self.port, "", {recv_before = true}) if not sd then return false, err end -- The socket connected successfully over whichever protocol. -- Store the connection information. self.socket = sd self.protocol = {ssl_tls = (proto == "ssl")} if #rep < 8 then stdnse.debug1("Failed to receive first 64 bits of magic from server: %s", rep) self:close() return false end -- We may have received 8-100+ bytes of data, depending on timing. To make -- the code simpler, we will seed a buffer to be used by this object's -- receive function until empty. self.receive_buffer = rep:sub(9) rep = rep:sub(1, 8) if rep ~= NBD.magic.init_passwd then stdnse.debug1("First 64 bits from server don't match expected magic: %s", stdnse.tohex(rep, {separator = ":"})) self:close() return false end local status, rep = self:receive(8) if not status then stdnse.debug1("Failed to receive second 64 bits of magic from server: %s", rep) return false end if rep == NBD.magic.cliserv_magic_new then self.protocol.negotiation = "newstyle" return self:connect_new() end if rep == NBD.magic.cliserv_magic_old then self.protocol.negotiation = "oldstyle" return self:connect_old() end self.protocol.negotiation = "unrecognized" stdnse.debug1("Second 64 bits from server don't match any known protocol magic: %s", stdnse.tohex(rep, {separator = ":"})) self:close() return true end, --- Cycles the connection to the server. -- -- @name Comm.reconnect -- -- @return status true on success, false on failure. reconnect = function(self) self:close() return self:connect(self.connect_options) end, --- Attaches to an named share on the server. -- -- @name Comm.attach -- -- @return status true on success, false on failure. attach = function(self, name) assert(self.protocol.negotiation == "newstyle" or self.protocol.negotiation == "fixed newstyle") assert(type(name) == "string") local req = self:build_opt_req("EXPORT_NAME", {export_name = name}) local status, err = self:send(req) if not status then stdnse.debug1("Failed to send attach request for '%s': %s", name, err) self:close() return end local status, size = self:receive(8) if not status then stdnse.debug1("Failed to receive response to attach request for '%s': %s", name, size) self:close() return end local size, pos = (">I8"):unpack(size) if pos ~= 9 then stdnse.debug1("Failed to unpack size of exported block device from server.") self:close() return false end local status, tflags = self:receive(2) if not status then stdnse.debug1("Failed to receive transmission flags from server while attaching to export: %s", tflags) self:close() return false end local tflags, pos = (">I2"):unpack(tflags) if pos ~= 3 then stdnse.debug1("Failed to unpack transmission flags from server.") self:close() return false end tflags = self:parse_transmission_flags(tflags) if self.protocol.zero_pad == "required" then local status, err = self:receive(124) if not status then stdnse.debug1("Failed to receive zero pad from server while attaching to export: %s", err) self:close() return false end end self.exports[name] = { size = size, tflags = tflags, } return true end, --- Sends data to the server -- -- @name Comm.send -- -- @param pkt String containing the bytes to send. -- -- @return status true on success, false on failure. -- @return err string containing the error message on failure. send = function(self, data) assert(type(data) == "string") return self.socket:send(data) end, --- Receives data from the server. -- -- @name Comm.receive -- -- @param len Number of bytes to receive. -- -- @return status True on success, false on failure. -- @return response String representing bytes received on success, -- string containing the error message on failure. receive = function(self, len) assert(type(len) == "number") -- Try to answer this request from the buffer. if #self.receive_buffer >= len then local rep = self.receive_buffer:sub(1, len) self.receive_buffer = self.receive_buffer:sub(len + 1) return true, rep end return self.socket:receive_buf(match.numbytes(len), true) end, --- Disconnects from the server. -- -- @name Comm.close close = function(self) assert(self.socket) self.socket:close() self.socket = nil end, --- Continue in-progress newstyle handshake with server. -- -- @name Comm.connect_new -- -- @param len Number of bytes to receive. -- -- @return status True on success, false on failure. -- @return response String representing bytes received on success, -- string containing the error message on failure. connect_new = function(self) local status, flags = self:receive(2) if not status then stdnse.debug1("Failed to receive handshake flags from server: %s", flags) self:close() return false end -- Receive and parse the handshake flags from the server, and use -- them to build the client flags. local hflags, pos = (">I2"):unpack(flags) if pos ~= 3 then stdnse.debug1("Failed to unpack handshake flags from server.") self:close() return false end local cflags = 0x0000 if hflags & NBD.handshake_flags.FIXED_NEWSTYLE then cflags = cflags | NBD.client_flags.C_FIXED_NEWSTYLE self.protocol.negotiation = "fixed newstyle" end self.protocol.zero_pad = "required" if hflags & NBD.handshake_flags.NO_ZEROES then cflags = cflags | NBD.client_flags.C_NO_ZEROES self.protocol.zero_pad = "optional" end -- Send the client flags to the server. local req = (">I4"):pack(cflags) local status, err = self:send(req) if not status then stdnse.debug1("Failed to send client flags: %s", err) self:close() return false end return true end, --- Continue in-progress oldstyle handshake with server. -- -- @name Comm.connect_old -- -- @return response String representing bytes received on success, -- string containing the error message on failure. connect_old = function(self) local status, size = self:receive(8) if not status then stdnse.debug1("Failed to receive size of exported block device from server: %s", size) self:close() return false end local size, pos = (">I8"):unpack(size) if pos ~= 9 then stdnse.debug1("Failed to unpack size of exported block device from server.") self:close() return false end local status, hflags = self:receive(4) if not status then stdnse.debug1("Failed to receive handshake flags from server: %s", hflags) self:close() return false end local hflags, pos = (">I4"):unpack(hflags) if pos ~= 5 then stdnse.debug1("Failed to unpack handshake flags from server.") self:close() return false end local status, pad = self:receive(124) if not status then stdnse.debug1("Failed to receive zero pad from server: %s", pad) self:close() return false end self.exports["(default)"] = { size = size, hflags = hflags, } return true end, --- Receives an option reply. -- -- @name Comm.receive_opt_rep -- -- @return reply Table representing option reply on success, false -- on failure. receive_opt_rep = function(self) -- Receive the static header of the option. local status, hdr = self:receive(20) if not status then stdnse.debug1("Failed to receive option reply header: %s", hdr) return false end local len, pos = (">I4"):unpack(hdr, 17) if pos ~= 21 then stdnse.debug1("Failed to parse option reply header during receive.") return false end local magic = hdr:sub(1, 8) if magic ~= NBD.magic.option then stdnse.debug1("First 64 bits of option reply don't match expected magic: %s", stdnse.tohex(magic, {separator = ":"})) return false end if len == 0 then return self:parse_opt_rep(hdr) end -- Receive the variable body of the option. local status, body = self:receive(len) if not status then stdnse.debug1("Failed to receive option reply: %s", body) return false end return self:parse_opt_rep(hdr .. body) end, --- Builds an option request. -- -- @name Comm.build_opt_req -- -- @param name String naming the option type. -- @param options Table containing options. -- -- @return req String representing the option request. build_opt_req = function(self, name, options) assert(type(name) == "string") if not options then options = {} end assert(type(options) == "table") local otype = NBD.opt_req_types[name] assert(otype) local payload = "" if name == "EXPORT_NAME" then assert(options.export_name) payload = options.export_name end return NBD.magic.cliserv_magic_new .. (">I4s4"):pack(otype, payload) end, --- Parses an option reply. -- -- @name Comm.parse_opt_rep -- -- @param buf String to be parsed. -- @param rep Table representing the fields of the reply that have -- already been parsed by the caller. -- -- @return reply Table representing option reply on success, false -- on failure. parse_opt_rep = function(self, buf) assert(type(buf) == "string") if 20 - 1 > #buf then stdnse.debug1("Buffer is too short to be parsed as an option reply.") return false end local magic, otype, rtype, rlen, pos = (">c8I4I4I4"):unpack(buf) if magic ~= NBD.magic.option then stdnse.debug1("First 64 bits of option reply don't match expected magic: %s", stdnse.tohex(magic, {separator = ":"})) return false end local otype_name = find_key(NBD.opt_req_types, otype) local rtype_name = find_key(NBD.opt_rep_types, rtype) local rep = { otype = otype, otype_name = otype_name, rtype = rtype, rtype_name = rtype_name, } if pos + rlen - 1 > #buf then stdnse.debug1("Option reply payload length extends past end of buffer.") return false end if rtype_name == "ACK" then return rep end if rtype_name == "SERVER" then if rlen < 4 then stdnse.debug1("SERVER option reply payload length must be 4 or greater, but is %d.", rlen) return false end local nlen, pos = (">I4"):unpack(buf, pos) if pos + nlen - 1 > #buf then stdnse.debug1("SERVER option reply payload name length extends past end of buffer.") return false end -- An empty name represents the default export. local name = "" if nlen > 0 then name = buf:sub(pos, pos + nlen - 1) pos = pos + nlen end rep.export_name = name return rep end return rep end, --- Parses the transmission flags describing an export. -- -- @name Comm.parse_transmission_flags -- -- @param flags Transmission flags sent by server. -- -- @return Table of parsed flags as keys. parse_transmission_flags = function(self, flags) assert(type(flags) == "number") -- This flag must always be set according to the standard. if (flags & NBD.transmission_flags.HAS_FLAGS) == 0 then stdnse.debug1("Transmission flags were not in a valid format, skipping.") return {} end local tbl = {} for k, v in pairs(NBD.transmission_flags) do if (flags & v) ~= 0 then tbl[k] = true end end return tbl end, } --- Finds a key corresponding with a value. -- -- @name find_key -- -- @param tbl Table in which to search. -- @param val Value to search for. -- -- @return key String on success, nil on failure find_key = function(tbl, val) assert(type(tbl) == "table") assert(val ~= nil) for k, v in pairs(tbl) do if v == val then return k end end return nil end return _ENV;