Nmap Development mailing list archives

Re: [nmap-svn] r24134 - in nmap: . nselib scripts


From: Gorjan Petrovski <mogi57 () gmail com>
Date: Thu, 7 Jul 2011 00:21:18 +0200

These scripts are missing "require 'creds'", or I'm missing some
important point?

$ grep "creds\." $(grep "require.*creds" -L $(grep "creds" * -l))

domcon-brute.nse:                       return true,
brute.Account:new( username, password, creds.State.VALID)
dpap-brute.nse:                 return true,
brute.Account:new(username, password, creds.State.VALID)
http-brute.nse:                 return true, brute.Account:new(
username, password, creds.State.VALID)
http-form-brute.nse:                    return true,
brute.Account:new( username, password, creds.State.VALID)
informix-brute.nse:                     return true,
brute.Account:new(username, password, creds.State.VALID)
informix-brute.nse:                     return true,
brute.Account:new(username, password, creds.State.VALID)
iscsi-brute.nse:                        return true,
brute.Account:new(username, password, creds.State.VALID)
nping-brute.nse:                        return true,
brute.Account:new("", password, creds.State.VALID)
omp2-brute.nse:      return true, brute.Account:new(username,
password, creds.State.VALID)
oracle-brute.nse:                       return true,
brute.Account:new(username, password, creds.State.VALID)
oracle-brute.nse:                       return true,
brute.Account:new(username, password, creds.State.LOCKED)
sip-brute.nse:          return true, brute.Account:new(username,
password, creds.State.VALID)
svn-brute.nse:                  return true,
brute.Account:new(username, password, creds.State.VALID)
vnc-brute.nse:                  return true, brute.Account:new("",
password, creds.State.VALID)




On Sun, Jun 19, 2011 at 7:18 PM,  <commit-mailer () insecure org> wrote:
Author: patrik
Date: Sun Jun 19 10:18:29 2011
New Revision: 24134

Log:
o [NSE] Added credential storage library (creds.lua) and modified the brute
 library and scripts to make use of it. [Patrik]


Added:
  nmap/nselib/creds.lua
Modified:
  nmap/CHANGELOG
  nmap/nselib/brute.lua
  nmap/scripts/backorifice-brute.nse
  nmap/scripts/domcon-brute.nse
  nmap/scripts/dpap-brute.nse
  nmap/scripts/http-brute.nse
  nmap/scripts/http-form-brute.nse
  nmap/scripts/informix-brute.nse
  nmap/scripts/iscsi-brute.nse
  nmap/scripts/nping-brute.nse
  nmap/scripts/omp2-brute.nse
  nmap/scripts/oracle-brute.nse
  nmap/scripts/sip-brute.nse
  nmap/scripts/svn-brute.nse
  nmap/scripts/vnc-brute.nse

Modified: nmap/CHANGELOG
==============================================================================
--- nmap/CHANGELOG      (original)
+++ nmap/CHANGELOG      Sun Jun 19 10:18:29 2011
@@ -1,5 +1,8 @@
 # Nmap Changelog ($Id$); -*-text-*-

+o [NSE] Added credential storage library (creds.lua) and modified the brute
+  library and scripts to make use of it. [Patrik]
+
 o [NSE] Added a MySQL audit script and a rulebase that supports auditing a
  subset of the MySQL CIS 1.0.2 Benchmark. [Patrik]


Modified: nmap/nselib/brute.lua
==============================================================================
--- nmap/nselib/brute.lua       (original)
+++ nmap/nselib/brute.lua       Sun Jun 19 10:18:29 2011
@@ -164,7 +164,7 @@
 --       by '/'

 --
--- Version 0.6
+-- Version 0.7
 -- Created 06/12/2010 - v0.1 - created by Patrik Karlsson <patrik () cqure net>
 -- Revised 07/13/2010 - v0.2 - added connect, disconnect methods to Driver
 --                                                        <patrik () cqure net>
@@ -176,10 +176,12 @@
 --                             David's request.
 -- Revised 08/30/2010 - v0.6 - added support for custom iterators and did some
 --                             needed cleanup.
+-- Revised 06/19/2010 - v0.7 - added support for creds library

 module(... or "brute", package.seeall)
 require 'unpwdb'
 require 'datafiles'
+require 'creds'

 -- Options that can be set through --script-args
 Options = {
@@ -244,12 +246,9 @@
       --        following <code>OPEN</code>, <code>LOCKED</code>,
       --        <code>DISABLED</code>.
       new = function(self, username, password, state)
-               local o = {}
+               local o = { username = username, password = password, state = state }
               setmetatable(o, self)
        self.__index = self
-               o.username = username
-               o.password = password
-               o.state = state
               return o
       end,

@@ -258,27 +257,12 @@
       -- @return string representation of object
       toString = function( self )
               local creds
-
               if ( #self.username > 0 ) then
                       creds = ("%s:%s"):format( self.username, #self.password > 0 and self.password or "<empty>" )
               else
                       creds = ("%s"):format( ( self.password and #self.password > 0 ) and self.password or "<empty>" 
)
               end
-
-               -- An account have the following states
-               --
-               -- OPEN - Login was successful
-               -- LOCKED - The account was locked
-               -- DISABLED - The account was disabled
-               if ( self.state == "OPEN" ) then
-                       return ("%s => Login correct"):format( creds )
-               elseif ( self.state == "LOCKED" ) then
-                       return ("%s => Account locked"):format( creds )
-               elseif ( self.state == "DISABLED" ) then
-                       return ("%s => Account disabled"):format( creds )
-               else
-                       return ("%s => Account has unknown state (%s)"):format( creds, self.state )
-               end
+               return ( "%s => %s"):format(creds, self.state.msg )
       end,

 }
@@ -290,11 +274,9 @@
       retry = false,

       new = function(self, msg)
-               local o = {}
+               local o = { msg = msg, done = false }
               setmetatable(o, self)
        self.__index = self
-               o.msg = msg
-               o.done = false
               return o
       end,

@@ -340,8 +322,7 @@
 Engine =
 {
       STAT_INTERVAL = 20,
-       terminate_all = false,
-
+
       --- Creates a new Engine instance
       --
       -- @param driver, the driver class that should be instantiated
@@ -350,21 +331,23 @@
       -- @param options table containing any script specific options
       -- @return o new Engine instance
       new = function(self, driver, host, port, options)
-               local o = {}
+               local o = {
+                       driver = driver,
+                       host = host,
+                       port = port,
+                       driver_options = options,
+                       terminate_all = false,
+                       error = nil,
+                       counter = 0,
+                       threads = {},
+                       tps = {},
+                       iterators = {},
+                       found_accounts = {},
+                       options = Options:new(),
+               }
               setmetatable(o, self)
        self.__index = self
-               o.driver = driver
-               o.driver_options = options
-               o.host = host
-               o.port = port
-               o.options = Options:new()
-               o.found_accounts = {}
-               o.threads = {}
-               o.counter = 0
-               o.max_threads = tonumber(nmap.registry.args["brute.threads"]) or 10
-               o.iterators = {}
-               o.error = nil
-               o.tps = {}
+               o.max_threads = stdnse.get_script_args("brute.threads") or 10
               return o
       end,

@@ -509,31 +492,31 @@
               return status, response
       end,

-       login = function(self, valid_accounts )
-
-               local condvar = nmap.condvar( valid_accounts )
+       login = function(self, cvar )
+               local condvar = nmap.condvar( cvar )
               local thread_data = self.threads[coroutine.running()]
               local interval_start = os.time()

               while( true ) do
                       -- Should we terminate all threads?
-                       if ( Engine.terminate_all or thread_data.terminate ) then break end
+                       if ( self.terminate_all or thread_data.terminate ) then break   end

                       local status, response = self:doAuthenticate()

                       if ( status ) then
                               -- Prevent locked accounts from appearing several times
                               if ( not(self.found_accounts) or self.found_accounts[response.username] == nil ) then
+                                       creds.Credentials:new( self.options.script_name, self.host, self.port 
):add(response.username, response.password, response.state )
+
                                       stdnse.print_debug("Discovered account: %s", response:toString())
-                                       table.insert( valid_accounts, response:toString() )
                                       self.found_accounts[response.username] = true

                                       -- Check if firstonly option was set, if so abort all threads
-                                       if ( self.options.firstonly ) then Engine.terminate_all = true end
+                                       if ( self.options.firstonly ) then self.terminate_all = true end
                               end
                       else
                               if ( response and response:isAbort() ) then
-                                       Engine.terminate_all = true
+                                       self.terminate_all = true
                                       self.error = response:getMessage()
                                       break
                               elseif( response and response:isDone() ) then
@@ -559,7 +542,7 @@
                       -- if delay was speciefied, do sleep
                       if ( self.options.delay > 0 ) then stdnse.sleep( self.options.delay ) end
               end
-               condvar("broadcast")
+               condvar "broadcast"
       end,

       --- Starts the brute-force
@@ -568,8 +551,11 @@
       -- @return err string containing error message on failure
       start = function(self)

-               local result, valid_accounts, stats = {}, {}, {}
-               local condvar = nmap.condvar( valid_accounts )
+               local result, cvar, stats = {}, {}, {}
+               local condvar = nmap.condvar( cvar )
+
+               assert(self.options.script_name, "SCRIPT_NAME was not set in options.script_name")
+               assert(self.port.number and self.port.protocol and self.port.service, "Invalid port table detected")

               -- Only run the check method if it exist. We should phase this out
               -- in favor of a check in the action function of the script
@@ -629,16 +615,18 @@

               -- Startup all worker threads
               for i=1, self.max_threads do
-                       local co = stdnse.new_thread( self.login, self, valid_accounts )
+                       local co = stdnse.new_thread( self.login, self, cvar )
                       self.threads[co] = {}
                       self.threads[co].running = true
               end

               -- wait for all threads to finnish running
-               while self:threadCount()>0 do condvar("wait") end
+               while self:threadCount()>0 do condvar "wait" end
+
+               local valid_accounts = creds.Credentials:new(self.options.script_name, self.host, 
self.port):getTable()

               -- Did we find any accounts, if so, do formatting
-               if ( #valid_accounts > 0 ) then
+               if ( valid_accounts and #valid_accounts > 0 ) then
                       valid_accounts.name = "Accounts"
                       table.insert( result, valid_accounts )
               else
@@ -661,7 +649,7 @@

               -- Did any error occure? If so add this to the result.
               if ( self.error ) then
-                       result = result .. ("  \n\n  ERROR: %s"):format( self.error )
+                       result = result .. ("  \n ERROR: %s"):format( self.error )
                       return false, result
               end
               return true, result

Added: nmap/nselib/creds.lua
==============================================================================
--- (empty file)
+++ nmap/nselib/creds.lua       Sun Jun 19 10:18:29 2011
@@ -0,0 +1,210 @@
+--- The credential class stores found credentials in the Nmap registry
+--
+--
+-- @author "Patrik Karlsson <patrik () cqure net>"
+-- @copyright Same as Nmap--See http://nmap.org/book/man-legal.html
+
+-- Version 0.1
+-- Created 2011/02/06 - v0.1 - created by Patrik Karlsson <patrik () cqure net>
+module(... or "creds", package.seeall)
+
+require('ipOps')
+
+-- Table containing the different account states
+State = {
+       LOCKED = { msg = 'Account is locked' },
+       VALID = { msg = 'Account is valid' },
+       DISABLED = { msg = 'Account is disabled' },
+       CHANGEPW = { msg = 'Password needs to be changed at next logon' },
+}
+
+ALL_DATA = "all_script_data"
+
+-- The RegStorage class
+RegStorage = {
+
+       --- Creates a new RegStorage instance
+       --
+       -- @return a new instance
+       new = function(self)
+               local o = {}
+               setmetatable(o, self)
+        self.__index = self
+               o.filter = {}
+               return o
+       end,
+
+       --- Add credentials to storage
+       --
+       -- @param scriptname the name of the script adding the credentials
+       -- @param host host table, name or ip
+       -- @param port number containing the port of the service
+       -- @param service the name of the service
+       -- @param user the name of the user
+       -- @param pass the password of the user
+       -- @param state of the account
+       add = function( self, scriptname, host, port, service, user, pass, state )
+               local cred = {
+                       scriptname = scriptname,
+                       host = host,
+                       port = port,
+                       service = service,
+                       user = user,
+                       pass = pass,
+                       state = state
+               }
+               nmap.registry.creds = nmap.registry.creds or {}
+               table.insert( nmap.registry.creds, cred )
+       end,
+
+       --- Sets the storage filter
+       --
+       -- @param host table containing the host
+       -- @param port table containign the port
+       setFilter = function( self, host, port )
+               self.filter.host = host
+               self.filter.port = port
+       end,
+
+       --- Retrieves the table containing all credential records
+       --
+       -- @return table containing all credential records
+       getAll = function( self )
+               local tbl = nmap.registry.creds
+               local new_tbl = {}
+               local host, port = self.filter.host, self.filter.port
+
+               if ( not(tbl) ) then return end
+
+               for _, v in pairs(tbl) do
+                       local h = ( v.host.ip or v.host )
+                       if ( not(host) and not(port) ) then
+                               table.insert(new_tbl, v)
+                       elseif ( not(host) and ( port == v.port ) ) then
+                               table.insert(new_tbl, v)
+                       elseif ( ( host and ( h == host or h == host.ip ) ) and not(port) ) then
+                               table.insert(new_tbl, v)
+                       elseif ( ( host and ( h == host or h == host.ip ) ) and port.number == v.port ) then
+                               table.insert(new_tbl, v)
+                       end
+               end
+               return new_tbl
+       end,
+
+}
+
+-- The credentials class
+Credentials = {
+
+       --- Creates a new instance of the Credentials class
+       -- @param scriptname string containing the name of the script
+       -- @param host table as received by the scripts action method
+       -- @param port table as received by the scripts action method
+       new = function(self, scriptname, host, port)
+               local o = {}
+               setmetatable(o, self)
+        self.__index = self
+               o.storage = RegStorage:new()
+               o.storage:setFilter(host, port)
+               o.host = host
+               o.port = ( port and port.number ) and port.number
+               o.service = ( port and port.service ) and port.service
+               o.scriptname = scriptname
+               return o
+       end,
+
+       --- Add a discovered credential
+       --
+       -- @param host host table, name or ip
+       -- @param port number containing the port of the service
+       -- @param service the name of the service
+       -- @param user the name of the user
+       -- @param pass the password of the user
+       -- @param state of the account
+       add = function( self, user, pass, state )
+               local pass = ( pass and #pass > 0 ) and pass or "<empty>"
+               assert( self.host, "No host supplied" )
+               assert( self.port, "No port supplied" )
+               assert( state, "No state supplied")
+               assert( self.scriptname, "No scriptname supplied")
+
+               -- there are cases where we will only get a user or password
+               -- so as long we have one of them, we're good
+               if ( user or pass ) then
+                       self.storage:add( self.scriptname, self.host, self.port, self.service, user, pass, state )
+               end
+       end,
+
+       --- Returns a table of credentials
+       --
+       -- @return tbl table containing the discovered credentials
+       getTable = function(self)
+               local result = {}
+               local all = self.storage:getAll()
+
+               if ( not(all) ) then return end
+
+               for _, v in pairs(self.storage:getAll()) do
+                       local h = ( v.host.ip or v.host )
+                       local svc = ("%s/%s"):format(v.port,v.service)
+                       local c
+                       if ( v.user and #v.user > 0 ) then
+                               c = ("%s:%s - %s"):format(v.user, v.pass, v.state.msg)
+                       else
+                               c = ("%s - %s"):format(v.pass, v.state.msg)
+                       end
+                       local script = v.scriptname
+                       assert(type(h)=="string", "Could not determine a valid host")
+
+                       if ( script == self.scriptname or self.scriptname == ALL_DATA ) then
+                               result[h] = result[h] or {}
+                               result[h][svc] = result[h][svc] or {}
+                               table.insert( result[h][svc], c )
+                       end
+               end
+
+               local output = {}
+               for hostname, host in pairs(result) do
+                       local host_tbl = { name = hostname }
+                       for svcname, service in pairs(host) do
+                               local svc_tbl = { name = svcname }
+                               for _, account in ipairs(service) do
+                                       table.insert(svc_tbl, account)
+                               end
+                               -- sort the accounts
+                               table.sort( svc_tbl, function(a,b) return a<b end)
+                               table.insert( host_tbl, svc_tbl )
+                       end
+                       -- sort the services
+                       table.sort( host_tbl,
+                       function(a,b)
+                               return tonumber(a.name:match("^(%d+)")) < tonumber(b.name:match("^(%d+)"))
+                       end
+                       )
+                       table.insert( output, host_tbl )
+               end
+
+               -- sort the IP addresses
+               table.sort( output, function(a, b) return ipOps.compare_ip(a.name, "le", b.name) end )
+               if ( self.host and self.port and #output > 0 ) then
+                       output = output[1][1]
+                       output.name = nil
+               elseif ( self.host and #output > 0 ) then
+                       output = output[1]
+                       output.name = nil
+               end
+               return output
+       end,
+
+       --- Get credentials with optional host and port filter
+       -- If no filters are supplied all records are returned
+       --
+       -- @param host table or string containing the host to filter
+       -- @param port number containing the port to filter
+       -- @return table suitable from <code>stdnse.format_output</code>
+       __tostring = function(self)
+               local all = self:getTable()
+               if ( all ) then return stdnse.format_output(true, all) end
+       end,
+
+}

Modified: nmap/scripts/backorifice-brute.nse
==============================================================================
--- nmap/scripts/backorifice-brute.nse  (original)
+++ nmap/scripts/backorifice-brute.nse  Sun Jun 19 10:18:29 2011
@@ -262,7 +262,7 @@
                               nmap.registry.credentials['backorifice'] = {}
                       end
                       table.insert( nmap.registry.credentials.backorifice, { password = password } )
-                       return true, brute.Account:new("", password, "OPEN")
+                       return true, brute.Account:new("", password, creds.State.VALID)
               else
                       -- The only indication that the password is incorrect is a timeout
                       local err = brute.Error:new( "Incorrect password" )
@@ -271,9 +271,6 @@
               end
       end,

-       check = function( self )
-               return true
-       end
 }

 action = function( host, port )
@@ -283,6 +280,7 @@

       engine.options.firstonly = true
       engine.options.passonly = true
+       engine.options.script_name = SCRIPT_NAME

       status, result = engine:start()


Modified: nmap/scripts/domcon-brute.nse
==============================================================================
--- nmap/scripts/domcon-brute.nse       (original)
+++ nmap/scripts/domcon-brute.nse       Sun Jun 19 10:18:29 2011
@@ -136,7 +136,7 @@
               if ( status and data:match("NOT_REG_ADMIN") ) then
                       not_admins[username] = true
               elseif( status and data:match("VALID_USER") ) then
-                       return true, brute.Account:new( username, password, "OPEN")
+                       return true, brute.Account:new( username, password, creds.State.VALID)
               end

               return false, brute.Error:new( "Incorrect password" )
@@ -146,11 +146,7 @@
       disconnect = function( self )
               self.sockpool:releaseSocket( self.socket )
       end,
-
-       check = function( self )
-               return true
-       end,
-
+
 }


@@ -159,6 +155,7 @@
       local pool = SocketPool:new(10)
       local engine = brute.Engine:new(Driver, host, port, pool )

+       engine.options.script_name = SCRIPT_NAME
       status, result = engine:start()
       pool:shutdown()


Modified: nmap/scripts/dpap-brute.nse
==============================================================================
--- nmap/scripts/dpap-brute.nse (original)
+++ nmap/scripts/dpap-brute.nse Sun Jun 19 10:18:29 2011
@@ -55,8 +55,8 @@
                       "Client-DPAP-Version: 1.1\r\n" ..
                       "\r\n\r\n"

-               local creds = base64.enc("nmap:" .. password)
-               data = data:format( self.host.ip, self.port.number, self.host.ip, creds )
+               local c = base64.enc("nmap:" .. password)
+               data = data:format( self.host.ip, self.port.number, self.host.ip, c )

               local status = self.socket:send( data )
               if ( not(status) ) then
@@ -73,7 +73,7 @@
               end

               if ( data:match("^HTTP/1.1 200 OK") ) then
-                       return true, brute.Account:new(username, password, "OPEN")
+                       return true, brute.Account:new(username, password, creds.State.VALID)
               end

               return false, brute.Error:new( "Incorrect password" )
@@ -111,7 +111,8 @@

       engine.options.firstonly = true
       engine.options:setOption( "passonly", true )
-
+       engine.options.script_name = SCRIPT_NAME
+
       status, result = engine:start()

       return result

Modified: nmap/scripts/http-brute.nse
==============================================================================
--- nmap/scripts/http-brute.nse (original)
+++ nmap/scripts/http-brute.nse Sun Jun 19 10:18:29 2011
@@ -79,7 +79,7 @@
                               nmap.registry.credentials['http'] = {}
                       end
                       table.insert( nmap.registry.credentials.http, { username = username, password = password } )
-                       return true, brute.Account:new( username, password, "OPEN")
+                       return true, brute.Account:new( username, password, creds.State.VALID)
               end
               return false, brute.Error:new( "Incorrect password" )
       end,
@@ -105,7 +105,8 @@
       local path = nmap.registry.args['http-brute.path']
       local method = string.upper(nmap.registry.args['http-brute.method'] or "GET")
       local engine = brute.Engine:new(Driver, host, port, method )
-
+       engine.options.script_name = SCRIPT_NAME
+
       if ( not(path) ) then
               return "  \n  ERROR: No path was specified (see http-brute.path)"
       end

Modified: nmap/scripts/http-form-brute.nse
==============================================================================
--- nmap/scripts/http-form-brute.nse    (original)
+++ nmap/scripts/http-form-brute.nse    Sun Jun 19 10:18:29 2011
@@ -135,7 +135,7 @@
                       nmap.registry['credentials'] = nmap.registry['credentials'] or {}
                       nmap.registry.credentials['http'] = nmap.registry.credentials['http'] or {}
                       table.insert( nmap.registry.credentials.http, { username = username, password = password } )
-                       return true, brute.Account:new( username, password, "OPEN")
+                       return true, brute.Account:new( username, password, creds.State.VALID)
               end

               return false, brute.Error:new( "Incorrect password" )
@@ -235,6 +235,8 @@
       -- there's a bug in http.lua that does not allow it to be called by
       -- multiple threads
       engine:setMaxThreads(1)
+       engine.options.script_name = SCRIPT_NAME
+
       if ( not(uservar) ) then
               engine.options:setOption( "passonly", true )
       end

Modified: nmap/scripts/informix-brute.nse
==============================================================================
--- nmap/scripts/informix-brute.nse     (original)
+++ nmap/scripts/informix-brute.nse     Sun Jun 19 10:18:29 2011
@@ -78,10 +78,10 @@
                               nmap.registry['informix-brute'] = {}
                       end
                       table.insert( nmap.registry['informix-brute'], { ["username"] = username, ["password"] = 
password } )
-                       return true, brute.Account:new(username, password, "OPEN")
+                       return true, brute.Account:new(username, password, creds.State.VALID)
               -- Check for account locked message
               elseif ( data:match("INFORMIXSERVER does not match either DBSERVERNAME or DBSERVERALIASES") ) then
-                       return true, brute.Account:new(username, password, "OPEN")
+                       return true, brute.Account:new(username, password, creds.State.VALID)
               end

               return false, brute.Error:new( data )
@@ -93,21 +93,13 @@
               self.helper:Close()
       end,

-       --- Perform a connection with the helper, this makes sure that the Informix
-       -- instance is correct.
-       --
-       -- @return status true on success false on failure
-       -- @return err containing the error message on failure
-       check = function( self )
-               return true
-       end,
-
 }


 action = function(host, port)
       local status, result
       local engine = brute.Engine:new(Driver, host, port )
+       engine.options.script_name = SCRIPT_NAME

       status, result = engine:start()


Modified: nmap/scripts/iscsi-brute.nse
==============================================================================
--- nmap/scripts/iscsi-brute.nse        (original)
+++ nmap/scripts/iscsi-brute.nse        Sun Jun 19 10:18:29 2011
@@ -47,7 +47,7 @@
               local status = self.helper:login( self.target, username, password, "CHAP")

               if ( status ) then
-                       return true, brute.Account:new(username, password, "OPEN")
+                       return true, brute.Account:new(username, password, creds.State.VALID)
               end

               return false, brute.Error:new( "Incorrect password" )
@@ -78,7 +78,10 @@
       if ( status ) then return "No authentication required" end

       local accounts
-       status, accounts = brute.Engine:new(Driver, host, port):start()
+
+       local engine = brute.Engine:new(Driver, host, port)
+       engine.options.script_name = SCRIPT_NAME
+       status, accounts = engine:start()

       if ( status ) then return accounts end
 end
\ No newline at end of file

Modified: nmap/scripts/nping-brute.nse
==============================================================================
--- nmap/scripts/nping-brute.nse        (original)
+++ nmap/scripts/nping-brute.nse        Sun Jun 19 10:18:29 2011
@@ -165,7 +165,7 @@

       login = function(self, _, password)
               if self:testpass(password) then
-                       return true, brute.Account:new("", password, "OPEN")
+                       return true, brute.Account:new("", password, creds.State.VALID)
               end
               return false, brute.Error:new("Incorrect password")
       end,
@@ -173,16 +173,13 @@
       disconnect = function(self)
               return self.socket:close()
       end,
-
-       check = function(self) --deprecated
-               return true
-       end,
 }

 action = function(host, port)
       local engine = brute.Engine:new(Driver, host, port)
       engine.options.firstonly = true
       engine.options:setOption("passonly", true)
+       engine.options.script_name = SCRIPT_NAME
       local status, result = engine:start()
       return result
 end

Modified: nmap/scripts/omp2-brute.nse
==============================================================================
--- nmap/scripts/omp2-brute.nse (original)
+++ nmap/scripts/omp2-brute.nse Sun Jun 19 10:18:29 2011
@@ -64,20 +64,18 @@
    if self.session:authenticate(username, password) then
      -- store the account for possible future use
      omp2.add_account(self.host, username, password)
-      return true, brute.Account:new(username, password, "OPEN")
+      return true, brute.Account:new(username, password, creds.State.VALID)
    else
      return false, brute.Error:new("login failed")
    end
  end,

-  --- Deprecated
-  check = function(self)
-    return true
-  end,
 }

 action = function(host, port)
-  local status, result = brute.Engine:new(Driver, host, port):start()
+  local engine = brute.Engine:new(Driver, host, port)
+  engine.options.script_name = SCRIPT_NAME
+  local status, result = engine:start()
  return result
 end


Modified: nmap/scripts/oracle-brute.nse
==============================================================================
--- nmap/scripts/oracle-brute.nse       (original)
+++ nmap/scripts/oracle-brute.nse       Sun Jun 19 10:18:29 2011
@@ -100,10 +100,10 @@$ grep "creds\." $(grep "require.*creds" -L $(grep "creds" * -l))
domcon-brute.nse:                       return true,
brute.Account:new( username, password, creds.State.VALID)
dpap-brute.nse:                 return true,
brute.Account:new(username, password, creds.State.VALID)
http-brute.nse:                 return true, brute.Account:new(
username, password, creds.State.VALID)
http-form-brute.nse:                    return true,
brute.Account:new( username, password, creds.State.VALID)
informix-brute.nse:                     return true,
brute.Account:new(username, password, creds.State.VALID)
informix-brute.nse:                     return true,
brute.Account:new(username, password, creds.State.VALID)
iscsi-brute.nse:                        return true,
brute.Account:new(username, password, creds.State.VALID)
nping-brute.nse:                        return true,
brute.Account:new("", password, creds.State.VALID)
omp2-brute.nse:      return true, brute.Account:new(username,
password, creds.State.VALID)
oracle-brute.nse:                       return true,
brute.Account:new(username, password, creds.State.VALID)
oracle-brute.nse:                       return true,
brute.Account:new(username, password, creds.State.LOCKED)
sip-brute.nse:          return true, brute.Account:new(username,
password, creds.State.VALID)
svn-brute.nse:                  return true,
brute.Account:new(username, password, creds.State.VALID)
vnc-brute.nse:                  return true, brute.Account:new("",
password, creds.State.VALID)

               local status, data = self.helper:Login( username, password )

               if ( status ) then
-                       return true, brute.Account:new(username, password, "OPEN")
+                       return true, brute.Account:new(username, password, creds.State.VALID)
               -- Check for account locked message
               elseif ( data:match("ORA[-]28000") ) then
-                       return true, brute.Account:new(username, password, "LOCKED")
+                       return true, brute.Account:new(username, password, creds.State.LOCKED)
               -- check for any other message
               elseif ( data:match("ORA[-]%d+")) then
                       stdnse.print_debug(3, "username: %s, password: %s, error: %s", username, password, data )
@@ -147,6 +147,7 @@
 action = function(host, port)
       local status, result
       local engine = brute.Engine:new(Driver, host, port )
+       engine.options.script_name = SCRIPT_NAME

       if ( not( nmap.registry.args['oracle-brute.sid'] ) and not( nmap.registry.args['tns.sid'] ) ) then
               return "ERROR: Oracle instance not set (see oracle-brute.sid or tns.sid)"

Modified: nmap/scripts/sip-brute.nse
==============================================================================
--- nmap/scripts/sip-brute.nse  (original)
+++ nmap/scripts/sip-brute.nse  Sun Jun 19 10:18:29 2011
@@ -61,7 +61,7 @@
                       end
                       return false, brute.Error:new( "Incorrect password" )
               end
-               return true, brute.Account:new(username, password, "OPEN")
+               return true, brute.Account:new(username, password, creds.State.VALID)
       end,

       disconnect = function(self)     return self.helper:close() end,
@@ -100,6 +100,7 @@
               end
       end
       local engine = brute.Engine:new(Driver, host, port)
+       engine.options.script_name = SCRIPT_NAME
       local status, result = engine:start()
       return result
 end

Modified: nmap/scripts/svn-brute.nse
==============================================================================
--- nmap/scripts/svn-brute.nse  (original)
+++ nmap/scripts/svn-brute.nse  Sun Jun 19 10:18:29 2011
@@ -207,7 +207,7 @@
                       self.invalid_users[username] = true
                       return false, brute.Error:new("Username not found")
               elseif ( status and msg:match("success") ) then
-                       return true, brute.Account:new(username, password, "OPEN")
+                       return true, brute.Account:new(username, password, creds.State.VALID)
               else
                       return false, brute.Error:new( "Incorrect password" )
               end
@@ -250,12 +250,14 @@
               return "  \n  Anonymous SVN detected, no authentication needed"
       end

-       if ( not( svn.auth_mech["CRAM-MD5"] ) ) then
+       if ( not(svn.auth_mech) or not( svn.auth_mech["CRAM-MD5"] ) ) then
               return "  \n  No supported authentication mechanisms detected"
       end

       local invalid_users = {}
-       status, accounts = brute.Engine:new(Driver, host, port, invalid_users):start()
+       local engine = brute.Engine:new(Driver, host, port, invalid_users)
+       engine.options.script_name = SCRIPT_NAME
+       status, accounts = engine:start()
       if( not(status) ) then
               return accounts
       end

Modified: nmap/scripts/vnc-brute.nse
==============================================================================
--- nmap/scripts/vnc-brute.nse  (original)
+++ nmap/scripts/vnc-brute.nse  Sun Jun 19 10:18:29 2011
@@ -69,7 +69,8 @@
       login = function( self, username, password )

               local status, data = self.vnc:handshake()
-               if ( not(status) and data:match("Too many authentication failures") ) then
+               if ( not(status) and ( data:match("Too many authentication failures") or
+                       data:match("Your connection has been rejected.") ) ) then
                       local err = brute.Error:new( data )
                       err:setAbort( true )
                       return false, err
@@ -83,7 +84,7 @@
               status, data = self.vnc:login( nil, password )

               if ( status ) then
-                       return true, brute.Account:new("", password, "OPEN")
+                       return true, brute.Account:new("", password, creds.State.VALID)
               elseif ( not( data:match("Authentication failed") ) ) then
                       local err = brute.Error:new( data )
                       -- This might be temporary, set the retry flag
@@ -132,6 +133,7 @@
       local status, result
       local engine = brute.Engine:new(Driver, host, port )

+       engine.options.script_name = SCRIPT_NAME
       engine.options.firstonly = true
       engine.options:setOption( "passonly", true )


_______________________________________________
Sent through the nmap-svn mailing list
http://cgi.insecure.org/mailman/listinfo/nmap-svn




-- 
Gorjan
_______________________________________________
Sent through the nmap-dev mailing list
http://cgi.insecure.org/mailman/listinfo/nmap-dev
Archived at http://seclists.org/nmap-dev/


Current thread: