diff --git a/nselib/snmp.lua b/nselib/snmp.lua
index 6dcf186ea..a2cfff1da 100644
--- a/nselib/snmp.lua
+++ b/nselib/snmp.lua
@@ -136,6 +136,24 @@ function decode(encStr, pos)
return decoder:decode( encStr, pos )
end
+---
+-- Get the best community string for a host
+-- Tries the following in order:
+-- * host.registry.snmpcommunity
+-- * snmpcommunity script-arg
+-- * The fallback parameter
+-- * "public"
+-- @param host The host table to check.
+-- @param fallback An alternate default to use instead of "public"
+-- @return The best-guess SNMP community string to use
+function best_community(host, fallback)
+ if host and host.registry and host.registry.snmpcommunity then
+ return host.registry.snmpcommunity
+ else
+ return nmap.registry.args.snmpcommunity or fallback or "public"
+ end
+end
+
---
-- Create an SNMP packet.
-- @param PDU SNMP Protocol Data Unit to be encapsulated in the packet.
@@ -143,10 +161,7 @@ end
-- @param commStr community string, if not already supplied in registry or as
-- the snmpcommunity script argument.
function buildPacket(PDU, version, commStr)
- local comm = nmap.registry.args.snmpcommunity
- if (not comm) then comm = nmap.registry.snmpcommunity end
- if (not comm) then comm = commStr end
- if (not comm) then comm = "public" end
+ local comm = commStr or best_community()
if (not version) then version = 0 end
local packet = {}
@@ -156,13 +171,17 @@ function buildPacket(PDU, version, commStr)
return packet
end
+--- SNMP options table
+-- @class table
+-- @name snmp.options
+-- @field reqId Request ID.
+-- @field err Error.
+-- @field errIdx Error index.
---
-- Create an SNMP Get Request PDU.
--- @param options A table containing the following fields:
--- * "reqId": Request ID.
--- * "err": Error.
--- * "errIdx": Error index.
+-- @param options SNMP options table
+-- @see snmp.options
-- @param ... Object identifiers to be queried.
-- @return Table representing PDU.
function buildGetRequest(options, ...)
@@ -194,10 +213,8 @@ end
---
-- Create an SNMP Get Next Request PDU.
--- @param options A table containing the following fields:
--- * "reqId": Request ID.
--- * "err": Error.
--- * "errIdx": Error index.
+-- @param options SNMP options table
+-- @see snmp.options
-- @param ... Object identifiers to be queried.
-- @return Table representing PDU.
function buildGetNextRequest(options, ...)
@@ -230,10 +247,8 @@ end
-- Create an SNMP Set Request PDU.
--
-- Takes one OID/value pair or an already prepared table.
--- @param options A table containing the following keys and values:
--- * "reqId": Request ID.
--- * "err": Error.
--- * "errIdx": Error index.
+-- @param options SNMP options table
+-- @see snmp.options
-- @param oid Object identifiers of object to be set.
-- @param value To which value object should be set. If given a table, use the
-- table instead of OID/value pair.
@@ -299,10 +314,8 @@ end
-- Create an SNMP Get Response PDU.
--
-- Takes one OID/value pair or an already prepared table.
--- @param options A table containing the following keys and values:
--- * "reqId": Request ID.
--- * "err": Error.
--- * "errIdx": Error index.
+-- @param options SNMP options table
+-- @see snmp.options
-- @param oid Object identifiers of object to be sent back.
-- @param value If given a table, use the table instead of OID/value pair.
-- @return Table representing PDU.
@@ -445,59 +458,143 @@ function fetchFirst(response)
end
---- Walks the MIB Tree
+--- SNMP Helper class
--
--- @param socket socket already connected to the server
--- @param base_oid string containing the base object ID to walk
--- @return status true on success, false on failure
--- @return table containing oid and value
-function snmpWalk( socket, base_oid )
+-- Handles socket communication, parsing, and setting of community strings
+Helper = {
- local snmp_table = {}
- local oid = base_oid
- local status, err, payload
+ --- Creates a new Helper instance
+ --
+ -- @param host string containing the host name or ip
+ -- @param port number containing the port to connect to
+ -- @param options A table with appropriate options:
+ -- * timeout - the timeout in milliseconds (Default: 5000)
+ -- * version - the SNMP version code (Default: 0 (SNMP V1))
+ -- @return o a new instance of Helper
+ new = function( self, host, port, options )
+ local o = {}
+ setmetatable(o, self)
+ self.__index = self
+ o.host = host
+ o.port = port
+ o.options = options or {
+ timeout = 5000,
+ version = 0
+ }
+ return o
+ end,
- while ( true ) do
+ --- Connect to the server
+ -- For UDP ports, this doesn't send any packets, but it creates the
+ -- socket and locks in the timeout.
+ -- @return status true on success, false on failure
+ connect = function( self )
+ self.socket = nmap.new_socket()
+ self.socket:set_timeout(self.timeout)
+ local status, err = self.socket:connect(self.host, self.port)
+ if ( not(status) ) then return false, err end
- local value, response, snmpdata, options, item = nil, nil, nil, {}, {}
- payload = encode( buildPacket( buildGetNextRequest(options, oid) ) )
+ return true
+ end,
- status, err = socket:send(payload)
- if ( not( status ) ) then
- stdnse.debug1("snmp.snmpWalk: Send failed")
- return false, err
- end
+ --- Communications helper
+ -- Sends an SNMP message and receives a response.
+ -- @param message the result of one of the build*Request functions
+ -- @return status False if there was an error, true otherwise.
+ -- @return response The raw response read from the socket.
+ request = function (self, message)
+ local payload = encode( buildPacket(
+ message,
+ self.version,
+ self.community or self.host.registry.snmpcommunity
+ ) )
- status, response = socket:receive_bytes(1)
- if ( not( status ) ) then
- -- Unless we have a useful error message, don't report it
- if ( response ~= "ERROR" ) then
- stdnse.debug1("snmp.snmpWalk: Received no answer (%s)", response)
- return false, response
+ local status, err = self.socket:send(payload)
+ if not status then
+ stdnse.debug2("snmp.Helper.request: Send to %s failed: %s", self.host.ip, err)
+ return false, err
end
- return false, nil
+
+ local response
+ status, response = self.socket:receive_bytes(1)
+ end,
+
+ --- Sends an SNMP Get Next request
+ -- @param options SNMP options table
+ -- @see snmp.options
+ -- @param ... Object identifiers to be queried.
+ -- @return status False if error, true otherwise
+ -- @return Table with all decoded responses and their OIDs.
+ getnext = function (self, options, ...)
+ local status, response = self:request(buildGetNextRequest(options or {}, ...))
+ if not status then
+ return status, response
+ end
+ return status, fetchResponseValues(response)
+ end,
+
+ --- Sends an SNMP Get request
+ -- @param options SNMP options table
+ -- @see snmp.options
+ -- @param ... Object identifiers to be queried.
+ -- @return status False if error, true otherwise
+ -- @return Table with all decoded responses and their OIDs.
+ get = function (self, options, ...)
+ local status, response = self:request(buildGetRequest(options or {}, ...))
+ if not status then
+ return status, response
+ end
+ return status, fetchResponseValues(response)
+ end,
+
+ --- Sends an SNMP Set request
+ -- @param options SNMP options table
+ -- @see snmp.options
+ -- @param oid Object identifiers of object to be set.
+ -- @param value To which value object should be set. If given a table,
+ -- use the table instead of OID/value pair.
+ -- @return status False if error, true otherwise
+ -- @return Table with all decoded responses and their OIDs.
+ set = function (self, options, oid, setparam)
+ local status, response = self:request(buildSetRequest(options or {}, oid, setparam))
+ if not status then
+ return status, response
+ end
+ return status, fetchResponseValues(response)
+ end,
+
+ --- Walks the MIB Tree
+ --
+ -- @param base_oid string containing the base object ID to walk
+ -- @return status true on success, false on failure
+ -- @return table containing oid and value
+ walk = function (self, base_oid)
+
+ local snmp_table = {}
+ local oid = base_oid
+ local options = {}
+
+ while ( true ) do
+ local status, response = self:getnext(options, oid)
+
+ local snmpdata = fetchResponseValues( response )
+
+ local value = snmpdata[1][1]
+ oid = snmpdata[1][2]
+
+ if not oid:match( base_oid ) or base_oid == oid then
+ break
+ end
+
+ table.insert(snmp_table, { oid = oid, value = value })
+
end
- snmpdata = fetchResponseValues( response )
+ snmp_table.baseoid = base_oid
- value = snmpdata[1][1]
- oid = snmpdata[1][2]
-
- if not oid:match( base_oid ) or base_oid == oid then
- break
- end
-
- item.oid = oid
- item.value = value
-
- table.insert( snmp_table, item )
+ return true, snmp_table
end
-
- snmp_table.baseoid = base_oid
-
- return true, snmp_table
-
-end
+}
return _ENV;
diff --git a/scripts/snmp-brute.nse b/scripts/snmp-brute.nse
index ccf18e8ef..af4b3bf8f 100644
--- a/scripts/snmp-brute.nse
+++ b/scripts/snmp-brute.nse
@@ -34,6 +34,8 @@ No output is reported if no valid account is found.
-- 2011-12-29 Patrik Karlsson - Added lport to sniff_snmp_responses to fix
-- bug preventing multiple scripts from working
-- properly.
+-- 2015-05-31 Gioacchino Mazzurco - Add IPv6 support by making the script IP
+-- version agnostic
---
-- @usage
@@ -273,9 +275,9 @@ action = function(host, port)
local account = creds_iter()
if account then
if account.pass == "" then
- nmap.registry.snmpcommunity = ""
+ host.registry.snmpcommunity = ""
else
- nmap.registry.snmpcommunity = account.pass
+ host.registry.snmpcommunity = account.pass
end
end
end
diff --git a/scripts/snmp-hh3c-logins.nse b/scripts/snmp-hh3c-logins.nse
index 858515549..7f9345d92 100644
--- a/scripts/snmp-hh3c-logins.nse
+++ b/scripts/snmp-hh3c-logins.nse
@@ -122,27 +122,18 @@ end
action = function(host, port)
- local socket = nmap.new_socket()
- local catch = function() socket:close() end
- local try = nmap.new_try(catch)
- local data, oldsnmpoid = nil, "1.3.6.1.4.1.2011.10.2.12.1.1.1"
- local data, newsnmpoid = nil, "1.3.6.1.4.1.25506.2.12.1.1.1"
- local users = {}
- local status
+ local oldsnmpoid = "1.3.6.1.4.1.2011.10.2.12.1.1.1"
+ local newsnmpoid = "1.3.6.1.4.1.25506.2.12.1.1.1"
- socket:set_timeout(5000)
- try(socket:connect(host, port))
+ local snmpHelper = snmp.Helper:new(host, port)
+ snmpHelper:connect()
- status, users = snmp.snmpWalk( socket, oldsnmpoid )
- socket:close()
+ local status, users = snmpHelper:walk( oldsnmpoid )
if (not(status)) or ( users == nil ) or ( #users == 0 ) then
-- no status? try new snmp oid
- socket:set_timeout(5000)
- try(socket:connect(host, port))
- status, users = snmp.snmpWalk( socket, newsnmpoid )
- socket:close()
+ status, users = snmpHelper:walk( newsnmpoid )
if (not(status)) or ( users == nil ) or ( #users == 0 ) then
return users
diff --git a/scripts/snmp-interfaces.nse b/scripts/snmp-interfaces.nse
index 1d2b9d753..05dfdf0bc 100644
--- a/scripts/snmp-interfaces.nse
+++ b/scripts/snmp-interfaces.nse
@@ -390,9 +390,6 @@ end
action = function(host, port)
- local socket = nmap.new_socket()
- local catch = function() socket:close() end
- local try = nmap.new_try(catch)
-- IF-MIB - used to look up network interfaces
local if_oid = "1.3.6.1.2.1.2.2.1"
-- IP-MIB - used to determine IP address information
@@ -411,21 +408,20 @@ action = function(host, port)
srvport = stdnse.get_script_args({"snmp-interfaces.port", "port"})
if srvport then
- srvport = tonumber(srvport)
+ srvport = { number=tonumber(srvport), protocol="udp" }
else
- srvport = 161
+ srvport = { number=tonumber(srvport), protocol="udp" }
end
else
srvhost = host.ip
srvport = port.number
end
- socket:set_timeout(5000)
- try(socket:connect(srvhost, srvport, "udp"))
+ local snmpHelper = snmp.Helper:new(host, port)
+ snmpHelper:connect()
-- retrieve network interface information from IF-MIB
- status, interfaces = snmp.snmpWalk( socket, if_oid )
- socket:close()
+ status, interfaces = snmpHelper:walk(if_oid)
if (not(status)) or ( interfaces == nil ) or ( #interfaces == 0 ) then
return
@@ -437,8 +433,7 @@ action = function(host, port)
interfaces = process_interfaces( interfaces )
-- retrieve IP address information from IP-MIB
- try(socket:connect(srvhost, srvport, "udp"))
- status, ips = snmp.snmpWalk( socket, ip_oid )
+ status, ips = snmpHelper:walk( ip_oid )
-- associate that IP address information with the correct interface
if (not(status)) or ( ips ~= nil ) and ( #ips ~= 0 ) then
diff --git a/scripts/snmp-ios-config.nse b/scripts/snmp-ios-config.nse
index f7c26f2f5..36dbb243f 100644
--- a/scripts/snmp-ios-config.nse
+++ b/scripts/snmp-ios-config.nse
@@ -46,24 +46,6 @@ dependencies = {"snmp-brute"}
portrule = shortport.portnumber(161, "udp", {"open", "open|filtered"})
-local try
-
-local function sendrequest(socket, oid, setparam)
- local payload
- local options = {}
- options.reqId = 28428 -- unnecessary?
- payload = snmp.encode(snmp.buildPacket(snmp.buildSetRequest(options, oid,setparam)))
-
- try(socket:send(payload))
-
- -- read in any response we might get
- local status, response = socket:receive()
- if ( not(status) ) then return status, response end
-
- local result = snmp.fetchFirst(response)
- return true
-end
-
---
-- Sends SNMP packets to host and reads responses
action = function(host, port)
@@ -74,20 +56,10 @@ action = function(host, port)
return "ERROR: tftproot needs to end with slash"
end
- -- create the socket used for our connection
- local socket = nmap.new_socket()
+ local snmpHelper = snmp.Helper:new(host, port)
+ snmpHelper:connect()
- -- set a reasonable timeout value
- socket:set_timeout(5000)
-
- -- do some exception handling / cleanup
- local catch = function() socket:close() end
- try = nmap.new_try(catch)
-
- -- connect to the potential SNMP system
- try(socket:connect(host, port))
-
- local status, tftpserver, _, _, _ = socket:get_info()
+ local status, tftpserver, _, _, _ = snmpHelper.socket:get_info()
if( not(status) ) then
return "ERROR: Failed to determine local ip"
end
@@ -95,7 +67,7 @@ action = function(host, port)
-- build a SNMP v1 packet
-- set value: .1.3.6.1.4.1.9.9.96.1.1.1.1.2.9999 (ConfigCopyProtocol is set to TFTP [1] )
- local request = sendrequest(socket, ".1.3.6.1.4.1.9.9.96.1.1.1.1.2.9999",1)
+ local request = snmpHelper:set({reqiId=28428},".1.3.6.1.4.1.9.9.96.1.1.1.1.2.9999",1)
-- Fail silently if the first request doesn't get a proper response
if ( not(request) ) then return end
@@ -107,13 +79,13 @@ action = function(host, port)
-- build a SNMP v1 packet
-- set value: .1.3.6.1.4.1.9.9.96.1.1.1.1.3 (SourceFileType is set to running-config [4] )
- request = sendrequest(socket, ".1.3.6.1.4.1.9.9.96.1.1.1.1.3.9999",4)
+ request = snmpHelper:set({reqId=28428}, ".1.3.6.1.4.1.9.9.96.1.1.1.1.3.9999",4)
-------------------------------------------------
-- build a SNMP v1 packet
-- set value: .1.3.6.1.4.1.9.9.96.1.1.1.1.4 (DestinationFileType is set to networkfile [1] )
- request = sendrequest(socket, ".1.3.6.1.4.1.9.9.96.1.1.1.1.4.9999",1)
+ request = snmpHelper:set({reqId=28428}, ".1.3.6.1.4.1.9.9.96.1.1.1.1.4.9999",1)
-------------------------------------------------
-- build a SNMP v1 packet
@@ -125,7 +97,7 @@ action = function(host, port)
table.insert(tbl, octet)
end
- request = sendrequest(socket, nil, { { snmp.str2oid(".1.3.6.1.4.1.9.9.96.1.1.1.1.5.9999"), tbl } } )
+ request = snmpHelper:set({reqId=28428}, nil, { { snmp.str2oid(".1.3.6.1.4.1.9.9.96.1.1.1.1.5.9999"), tbl } } )
-- request = sendrequest(".1.3.6.1.4.1.9.9.96.1.1.1.1.5.9999",tftpserver)
@@ -134,26 +106,26 @@ action = function(host, port)
-- set value: .1.3.6.1.4.1.9.9.96.1.1.1.1.15 (ServerAddressType is set 1 for ipv4 )
-- more options - 1:ipv4, 2:ipv6, 3:ipv4z, 4:ipv6z, 16:dns
- request = sendrequest(socket, ".1.3.6.1.4.1.9.9.96.1.1.1.1.15.9999",1)
+ request = snmpHelper:set({reqId=28428}, ".1.3.6.1.4.1.9.9.96.1.1.1.1.15.9999",1)
-------------------------------------------------
-- build a SNMP v1 packet
-- set value: .1.3.6.1.4.1.9.9.96.1.1.1.1.16 (ServerAddress is set to the IP address of the TFTP server )
- request = sendrequest(socket, ".1.3.6.1.4.1.9.9.96.1.1.1.1.16.9999",tftpserver)
+ request = snmpHelper:set({reqId=28428}, ".1.3.6.1.4.1.9.9.96.1.1.1.1.16.9999",tftpserver)
-------------------------------------------------
-- build a SNMP v1 packet
-- set value: .1.3.6.1.4.1.9.9.96.1.1.1.1.6 (CopyFilename is set to IP-config)
- request = sendrequest(socket, ".1.3.6.1.4.1.9.9.96.1.1.1.1.6.9999",host.ip .. "-config")
+ request = snmpHelper:set({reqId=28428}, ".1.3.6.1.4.1.9.9.96.1.1.1.1.6.9999",host.ip .. "-config")
-------------------------------------------------
-- build a SNMP v1 packet
-- set value: .1.3.6.1.4.1.9.9.96.1.1.1.1.14 (Start copying by setting CopyStatus to active [1])
-- more options: 1:active, 2:notInService, 3:notReady, 4:createAndGo, 5:createAndWait, 6:destroy
- request = sendrequest(socket, ".1.3.6.1.4.1.9.9.96.1.1.1.1.14.9999",1)
+ request = snmpHelper:set({reqId=28428}, ".1.3.6.1.4.1.9.9.96.1.1.1.1.14.9999",1)
-- wait for sometime and print the status of filetransfer
tftp.start()
@@ -162,16 +134,8 @@ action = function(host, port)
-- build a SNMP v1 packet
-- get value: .1.3.6.1.4.1.9.9.96.1.1.1.1.10 (Check the status of filetransfer) 1:waiting, 2:running, 3:successful, 4:failed
- local options = {}
- options.reqId = 28428
- local payload = snmp.encode(snmp.buildPacket(snmp.buildGetRequest(options, ".1.3.6.1.4.1.9.9.96.1.1.1.1.10.9999")))
-
- try(socket:send(payload))
-
- local status
local response
- -- read in any response we might get
- status, response = socket:receive()
+ status, response = snmpHelper:get({reqId=28428}, ".1.3.6.1.4.1.9.9.96.1.1.1.1.10.9999")
if (not status) or (response == "TIMEOUT") then
return "\n ERROR: Failed to receive cisco configuration file"
@@ -205,9 +169,8 @@ action = function(host, port)
-- build a SNMP v1 packet
-- set value: .1.3.6.1.4.1.9.9.96.1.1.1.1.14 (Destroy settings by setting CopyStatus to destroy [6])
- request = sendrequest(socket, ".1.3.6.1.4.1.9.9.96.1.1.1.1.14.9999",6)
+ request = snmpHelper:set({reqId=28428}, ".1.3.6.1.4.1.9.9.96.1.1.1.1.14.9999",6)
- try(socket:close())
return result
end
diff --git a/scripts/snmp-netstat.nse b/scripts/snmp-netstat.nse
index b7a8fbee7..29237a5e3 100644
--- a/scripts/snmp-netstat.nse
+++ b/scripts/snmp-netstat.nse
@@ -103,23 +103,19 @@ end
action = function(host, port)
- local socket = nmap.new_socket()
- local catch = function() socket:close() end
- local try = nmap.new_try(catch)
local tcp_oid = "1.3.6.1.2.1.6.13.1.1"
local udp_oid = "1.3.6.1.2.1.7.5.1.1"
local netstat = {}
local status, tcp, udp
- socket:set_timeout(5000)
- try(socket:connect(host, port))
+ local snmpHelper = snmp.Helper:new(host, port)
+ snmpHelper:connect()
- status, tcp = snmp.snmpWalk( socket, tcp_oid )
+ status, tcp = snmpHelper:walk( tcp_oid )
if ( not(status) ) then return end
- status, udp = snmp.snmpWalk( socket, udp_oid )
+ status, udp = snmpHelper:walk( udp_oid )
if ( not(status) ) then return end
- socket:close()
if ( tcp == nil ) or ( #tcp == 0 ) or ( udp==nil ) or ( #udp == 0 ) then
return
@@ -136,7 +132,6 @@ action = function(host, port)
netstat = table_merge( tcp, udp )
nmap.set_port_state(host, port, "open")
- socket:close()
return stdnse.format_output( true, netstat )
end
diff --git a/scripts/snmp-processes.nse b/scripts/snmp-processes.nse
index 35d898d1e..2bb830b44 100644
--- a/scripts/snmp-processes.nse
+++ b/scripts/snmp-processes.nse
@@ -140,18 +140,14 @@ end
action = function(host, port)
- local socket = nmap.new_socket()
- local catch = function() socket:close() end
- local try = nmap.new_try(catch)
local data, snmpoid = nil, "1.3.6.1.2.1.25.4.2"
local shares = {}
local status
- socket:set_timeout(5000)
- try(socket:connect(host, port))
+ local snmpHelper = snmp.Helper:new(host, port)
+ snmpHelper:connect()
- status, shares = snmp.snmpWalk( socket, snmpoid )
- socket:close()
+ status, shares = snmpHelper:walk( snmpoid )
if (not(status)) or ( shares == nil ) or ( #shares == 0 ) then
return
diff --git a/scripts/snmp-sysdescr.nse b/scripts/snmp-sysdescr.nse
index 7f2702f06..8565dc62d 100644
--- a/scripts/snmp-sysdescr.nse
+++ b/scripts/snmp-sysdescr.nse
@@ -31,67 +31,32 @@ portrule = shortport.portnumber(161, "udp", {"open", "open|filtered"})
-- Sends SNMP packets to host and reads responses
action = function(host, port)
- -- create the socket used for our connection
- local socket = nmap.new_socket()
-
- -- set a reasonable timeout value
- socket:set_timeout(5000)
-
- -- do some exception handling / cleanup
- local catch = function()
- socket:close()
- end
-
- local try = nmap.new_try(catch)
-
- -- connect to the potential SNMP system
- try(socket:connect(host, port))
-
- local payload
+ local snmpHelper = snmp.Helper:new(host, port)
+ snmpHelper:connect()
-- build a SNMP v1 packet
-- copied from packet capture of snmpget exchange
-- get value: 1.3.6.1.2.1.1.1.0 (SNMPv2-MIB::sysDescr.0)
- local options = {}
- options.reqId = 28428 -- unnecessary?
- payload = snmp.encode(snmp.buildPacket(snmp.buildGetRequest(options, "1.3.6.1.2.1.1.1.0")))
+ local status, response = snmpHelper:get({reqId=28428}, "1.3.6.1.2.1.1.1.0")
- try(socket:send(payload))
-
- local status
- local response
-
- -- read in any response we might get
- status, response = socket:receive_bytes(1)
-
- if (not status) or (response == "TIMEOUT") then
+ if not status then
return
end
-- since we got something back, the port is definitely open
nmap.set_port_state(host, port, "open")
- local result
- result = snmp.fetchFirst(response)
+ local result = snmp.fetchFirst(response)
-- build a SNMP v1 packet
-- copied from packet capture of snmpget exchange
-- get value: 1.3.6.1.2.1.1.3.0 (SNMPv2-MIB::sysUpTime.0)
- local options = {}
- options.reqId = 28428
- payload = snmp.encode(snmp.buildPacket(snmp.buildGetRequest(options, "1.3.6.1.2.1.1.3.0")))
+ status, response = snmpHelper:get({reqId=28428}, "1.3.6.1.2.1.1.3.0")
- try(socket:send(payload))
-
- -- read in any response we might get
- status, response = socket:receive_bytes(1)
-
- if (not status) or (response == "TIMEOUT") then
+ if not status then
return result
end
- try(socket:close())
-
local uptime = snmp.fetchFirst(response)
if not uptime then
return
diff --git a/scripts/snmp-win32-services.nse b/scripts/snmp-win32-services.nse
index baf6ab44f..042c1a00d 100644
--- a/scripts/snmp-win32-services.nse
+++ b/scripts/snmp-win32-services.nse
@@ -74,18 +74,14 @@ end
action = function(host, port)
- local socket = nmap.new_socket()
- local catch = function() socket:close() end
- local try = nmap.new_try(catch)
local snmpoid = "1.3.6.1.4.1.77.1.2.3.1.1"
local services = {}
local status
- socket:set_timeout(5000)
- try(socket:connect(host, port))
+ local snmpHelper = snmp.Helper:new(host, port)
+ snmpHelper:connect()
- status, services = snmp.snmpWalk( socket, snmpoid )
- socket:close()
+ status, services = snmpHelper:walk( snmpoid )
if ( not(status) ) or ( services == nil ) or ( #services == 0 ) then
return
diff --git a/scripts/snmp-win32-shares.nse b/scripts/snmp-win32-shares.nse
index b6592d2bf..eb14a1ad0 100644
--- a/scripts/snmp-win32-shares.nse
+++ b/scripts/snmp-win32-shares.nse
@@ -78,18 +78,14 @@ end
action = function(host, port)
- local socket = nmap.new_socket()
- local catch = function() socket:close() end
- local try = nmap.new_try(catch)
local data, snmpoid = nil, "1.3.6.1.4.1.77.1.2.27"
local shares = {}
local status
- socket:set_timeout(5000)
- try(socket:connect(host, port))
+ local snmpHelper = snmp.Helper:new(host, port)
+ snmpHelper:connect()
- status, shares = snmp.snmpWalk( socket, snmpoid )
- socket:close()
+ status, shares = snmpHelper:walk( snmpoid )
if (not(status)) or ( shares == nil ) or ( #shares == 0 ) then
return
diff --git a/scripts/snmp-win32-software.nse b/scripts/snmp-win32-software.nse
index f3833e1d8..3a37b97ce 100644
--- a/scripts/snmp-win32-software.nse
+++ b/scripts/snmp-win32-software.nse
@@ -140,18 +140,14 @@ end
action = function(host, port)
- local socket = nmap.new_socket()
- local catch = function() socket:close() end
- local try = nmap.new_try(catch)
local data, snmpoid = nil, "1.3.6.1.2.1.25.6.3.1"
local sw = {}
local status
- socket:set_timeout(5000)
- try(socket:connect(host, port))
+ local snmpHelper = snmp.Helper:new(host, port)
+ snmpHelper:connect()
- status, sw = snmp.snmpWalk( socket, snmpoid )
- socket:close()
+ status, sw = snmpHelper:walk( snmpoid )
if ( not(status) ) or ( sw == nil ) or ( #sw == 0 ) then
return
diff --git a/scripts/snmp-win32-users.nse b/scripts/snmp-win32-users.nse
index 8ee2dde80..6dc057146 100644
--- a/scripts/snmp-win32-users.nse
+++ b/scripts/snmp-win32-users.nse
@@ -66,18 +66,14 @@ end
action = function(host, port)
- local socket = nmap.new_socket()
- local catch = function() socket:close() end
- local try = nmap.new_try(catch)
local snmpoid = "1.3.6.1.4.1.77.1.2.25"
local users = {}
local status
- socket:set_timeout(5000)
- try(socket:connect(host, port))
+ local snmpHelper = snmp.Helper:new(host, port)
+ snmpHelper:connect()
- status, users = snmp.snmpWalk( socket, snmpoid )
- socket:close()
+ status, users = snmpHelper:walk( snmpoid )
if( not(status) ) then
return