Merge branch 'master' of https://github.com/rapid7/metasploit-framework
commit
094a5f1b18
|
@ -1,10 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'msf/base'
|
|
||||||
|
|
||||||
class Msf::Sessions::CommandShell::UnitTest < Test::Unit::TestCase
|
|
||||||
def test_cmdshell
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -92,6 +92,39 @@ module Auxiliary
|
||||||
Msf::Simple::Auxiliary.run_simple(self, opts, &block)
|
Msf::Simple::Auxiliary.run_simple(self, opts, &block)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
#
|
||||||
|
# Initiates a check, setting up the exploit to be used. The following
|
||||||
|
# options can be specified:
|
||||||
|
#
|
||||||
|
# LocalInput
|
||||||
|
#
|
||||||
|
# The local input handle that data can be read in from.
|
||||||
|
#
|
||||||
|
# LocalOutput
|
||||||
|
#
|
||||||
|
# The local output through which data can be displayed.
|
||||||
|
#
|
||||||
|
def self.check_simple(mod, opts)
|
||||||
|
if opts['LocalInput']
|
||||||
|
mod.init_ui(opts['LocalInput'], opts['LocalOutput'])
|
||||||
|
end
|
||||||
|
|
||||||
|
# Validate the option container state so that options will
|
||||||
|
# be normalized
|
||||||
|
mod.validate
|
||||||
|
|
||||||
|
# Run check
|
||||||
|
mod.check
|
||||||
|
end
|
||||||
|
|
||||||
|
#
|
||||||
|
# Calls the class method.
|
||||||
|
#
|
||||||
|
def check_simple(opts)
|
||||||
|
Msf::Simple::Auxiliary.check_simple(self, opts)
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
protected
|
protected
|
||||||
|
|
||||||
#
|
#
|
||||||
|
|
|
@ -1,41 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'msf/core/exceptions'
|
|
||||||
|
|
||||||
module Msf
|
|
||||||
module Exceptions
|
|
||||||
|
|
||||||
class UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
def test_exceptions
|
|
||||||
Msf.constants.each { |const|
|
|
||||||
mod = Msf.const_get(const)
|
|
||||||
|
|
||||||
if ((mod.kind_of?(Class) == false) ||
|
|
||||||
(mod.ancestors.include?(Msf::Exception) == false))
|
|
||||||
next
|
|
||||||
end
|
|
||||||
|
|
||||||
begin
|
|
||||||
raise mod.new
|
|
||||||
rescue mod => detail
|
|
||||||
assert_respond_to(detail, 'to_s', "#{mod} does not implement to_s")
|
|
||||||
assert_not_nil(detail.to_s, "invalid to_s")
|
|
||||||
end
|
|
||||||
}
|
|
||||||
|
|
||||||
begin
|
|
||||||
raise OptionValidateError.new([ 'test', 'best' ])
|
|
||||||
rescue OptionValidateError => detail
|
|
||||||
assert_match(/^The following/, detail.to_s)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -415,16 +415,6 @@ class Exploit < Msf::Module
|
||||||
#
|
#
|
||||||
##
|
##
|
||||||
|
|
||||||
#
|
|
||||||
# Checks to see if the target is vulnerable, returning unsupported if it's
|
|
||||||
# not supported.
|
|
||||||
#
|
|
||||||
# This method is designed to be overriden by exploit modules.
|
|
||||||
#
|
|
||||||
def check
|
|
||||||
CheckCode::Unsupported
|
|
||||||
end
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Kicks off the actual exploit. Prior to this call, the framework will
|
# Kicks off the actual exploit. Prior to this call, the framework will
|
||||||
# have validated the data store using the options associated with this
|
# have validated the data store using the options associated with this
|
||||||
|
|
|
@ -1,38 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'msf/core'
|
|
||||||
|
|
||||||
module Msf
|
|
||||||
|
|
||||||
class Exploit::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
class StubExploit < Msf::Exploit
|
|
||||||
end
|
|
||||||
|
|
||||||
class Stub2Exploit < Msf::Exploit
|
|
||||||
def check
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_support
|
|
||||||
assert_equal(false, Exploit.new.supports_check?, "auto target support check failed")
|
|
||||||
assert_equal(false, StubExploit.new.supports_check?, "auto target deriv enabled support check failed")
|
|
||||||
assert_equal(true, Stub2Exploit.new.supports_check?, "auto target deriv disabled support check failed")
|
|
||||||
assert_equal(false, Exploit.new.capabilities['check'], "auto target capabilities check failed")
|
|
||||||
assert_equal(false, StubExploit.new.capabilities['check'], "auto target deriv enabled capabilities check failed")
|
|
||||||
assert_equal(true, Stub2Exploit.new.capabilities['check'], "auto target deriv disabled capabilities check failed")
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_defaults
|
|
||||||
e = Exploit.new
|
|
||||||
|
|
||||||
assert_equal(Msf::Exploit::CheckCode::Unsupported, e.check, "invalid default check")
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
|
@ -1,28 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..', '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'msf/core'
|
|
||||||
|
|
||||||
module Msf
|
|
||||||
|
|
||||||
class Exploit::Remote::DCERPC::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
class Stub < Msf::Exploit::Remote
|
|
||||||
include Msf::Exploit::Remote::DCERPC
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_tcp
|
|
||||||
e = Stub.new
|
|
||||||
|
|
||||||
assert_equal(true, e.options.get('RHOST').required?, "invalid RHOST requirement")
|
|
||||||
assert_equal(true, e.options.get('RPORT').required?, "invalid RPORT requirement")
|
|
||||||
assert_equal(135, e.options.get('RPORT').default, "invalid RPORT default")
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
|
@ -1,29 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'rex'
|
|
||||||
require 'msf/core'
|
|
||||||
require 'msf/core/exploit/seh'
|
|
||||||
|
|
||||||
module Msf
|
|
||||||
|
|
||||||
class Exploit::Seh::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
class Stub < Msf::Exploit::Remote
|
|
||||||
include Msf::Exploit::Seh
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_seh
|
|
||||||
e = Stub.new
|
|
||||||
r = e.generate_seh_record(0x41414141)
|
|
||||||
|
|
||||||
assert_equal("\xeb\x06", r[0, 2])
|
|
||||||
assert_equal("\x41\x41\x41\x41", r[4, 4])
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
|
@ -1,26 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..', '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'msf/core'
|
|
||||||
|
|
||||||
module Msf
|
|
||||||
|
|
||||||
class Exploit::Remote::Tcp::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
class Stub < Msf::Exploit::Remote
|
|
||||||
include Msf::Exploit::Remote::Tcp
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_tcp
|
|
||||||
e = Stub.new
|
|
||||||
|
|
||||||
assert_equal(true, e.options.get('RHOST').required?, "invalid RHOST requirement")
|
|
||||||
assert_equal(true, e.options.get('RPORT').required?, "invalid RPORT requirement")
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
|
@ -1,53 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'msf/core'
|
|
||||||
require 'msf/core/handler/bind_tcp'
|
|
||||||
|
|
||||||
module Msf
|
|
||||||
|
|
||||||
class Handler::BindTcp::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
class Stub < Msf::Payload
|
|
||||||
end
|
|
||||||
|
|
||||||
module Foo
|
|
||||||
def handle_connection(client, opts={})
|
|
||||||
self.success = 1
|
|
||||||
end
|
|
||||||
|
|
||||||
attr_accessor :success, :session
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_handler
|
|
||||||
c = Class.new(Stub)
|
|
||||||
|
|
||||||
c.include(Foo, Msf::Handler::BindTcp)
|
|
||||||
|
|
||||||
h = c.new({})
|
|
||||||
|
|
||||||
begin
|
|
||||||
t = Rex::Socket::TcpServer.create(
|
|
||||||
'LocalPort' => 4444)
|
|
||||||
|
|
||||||
h.datastore['RHOST'] = "127.0.0.1"
|
|
||||||
h.datastore['LPORT'] = 4444
|
|
||||||
|
|
||||||
h.start_handler
|
|
||||||
|
|
||||||
Rex::ThreadSafe.sleep(1)
|
|
||||||
|
|
||||||
assert_equal(1, h.success)
|
|
||||||
ensure
|
|
||||||
t.close if (t)
|
|
||||||
h.stop_handler if (h)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
|
@ -1,64 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'msf/core'
|
|
||||||
require 'msf/core/handler/reverse_tcp'
|
|
||||||
|
|
||||||
module Msf
|
|
||||||
|
|
||||||
class Handler::ReverseTcp::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
class Stub < Msf::Payload
|
|
||||||
include Msf::Handler::ReverseTcp
|
|
||||||
end
|
|
||||||
|
|
||||||
module Foo
|
|
||||||
def handle_connection(client, opts={})
|
|
||||||
self.success = 1
|
|
||||||
end
|
|
||||||
|
|
||||||
attr_accessor :success, :session
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_handler
|
|
||||||
c = Class.new(Stub)
|
|
||||||
c.include(Foo)
|
|
||||||
|
|
||||||
h = c.new({})
|
|
||||||
|
|
||||||
begin
|
|
||||||
h.datastore['LPORT'] = 4444
|
|
||||||
|
|
||||||
h.setup_handler
|
|
||||||
h.start_handler
|
|
||||||
|
|
||||||
5.times {
|
|
||||||
t = Rex::Socket::Tcp.create(
|
|
||||||
'PeerHost' => "127.0.0.1",
|
|
||||||
'PeerPort' => 4444)
|
|
||||||
|
|
||||||
assert_not_nil(t)
|
|
||||||
|
|
||||||
begin
|
|
||||||
Rex::ThreadSafe.sleep(1)
|
|
||||||
|
|
||||||
assert_equal(1, h.success)
|
|
||||||
|
|
||||||
h.success = 0
|
|
||||||
ensure
|
|
||||||
t.close
|
|
||||||
end
|
|
||||||
}
|
|
||||||
ensure
|
|
||||||
h.stop_handler if (h)
|
|
||||||
h.cleanup_handler if (h)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
|
@ -355,6 +355,16 @@ class Module
|
||||||
date_str = Date.parse(module_info['DisclosureDate'].to_s) rescue nil
|
date_str = Date.parse(module_info['DisclosureDate'].to_s) rescue nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
#
|
||||||
|
# Checks to see if the target is vulnerable, returning unsupported if it's
|
||||||
|
# not supported.
|
||||||
|
#
|
||||||
|
# This method is designed to be overriden by exploit modules.
|
||||||
|
#
|
||||||
|
def check
|
||||||
|
Msf::Exploit::CheckCode::Unsupported
|
||||||
|
end
|
||||||
|
|
||||||
#
|
#
|
||||||
# Returns the hash that describes this module's compatibilities.
|
# Returns the hash that describes this module's compatibilities.
|
||||||
#
|
#
|
||||||
|
|
|
@ -1,24 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'msf/core'
|
|
||||||
|
|
||||||
module Msf
|
|
||||||
|
|
||||||
class Module::Author::UnitTest < Test::Unit::TestCase
|
|
||||||
def test_known
|
|
||||||
assert_match(/^skape /, Author.from_s('skape').to_s)
|
|
||||||
assert_equal('skape <mmiller@hick.org>', Author.from_s('skape').to_s)
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_raw
|
|
||||||
assert_equal('skapino', Author.from_s('skapino <johnson@jones.com>').name)
|
|
||||||
assert_equal('johnson@jones.com', Author.from_s('skapino <johnson@jones.com>').email)
|
|
||||||
assert_equal('skapino <johnson@jones.com>', Author.from_s('skapino <johnson@jones.com>').to_s)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
|
@ -1,54 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'msf/core'
|
|
||||||
require 'msf/core/module/platform_list'
|
|
||||||
|
|
||||||
class Msf::Module::PlatformList::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
def test_range
|
|
||||||
assert_equal(
|
|
||||||
[ Msf::Module::Platform::Windows::XP::SP0,
|
|
||||||
Msf::Module::Platform::Windows::XP::SP1
|
|
||||||
], Msf::Module::PlatformList.new('winxpsp0' .. 'winxpsp1').platforms
|
|
||||||
)
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_names
|
|
||||||
assert_equal([ 'Windows XP SP2' ], Msf::Module::PlatformList.new('winxpsp2').names)
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_transform
|
|
||||||
assert_equal([ 'Windows XP SP2' ], Msf::Module::PlatformList.transform('winxpsp2').names)
|
|
||||||
assert_equal([ 'Windows XP SP2' ], Msf::Module::PlatformList.transform(['winxpsp2']).names)
|
|
||||||
assert_equal([ 'Windows 2000 SP3' ], Msf::Module::PlatformList.transform(['win2000sp3']).names)
|
|
||||||
assert_equal([ 'Windows 2000 SP3' ], Msf::Module::PlatformList.transform(['win2ksp3']).names)
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_all
|
|
||||||
assert_equal( [ Msf::Module::Platform ], Msf::Module::PlatformList.new('').platforms)
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_supports
|
|
||||||
l1 = Msf::Module::PlatformList.new('win')
|
|
||||||
l2 = Msf::Module::PlatformList.new('win xp sp0', 'win xp sp2')
|
|
||||||
assert_equal( true, l1.supports?(l2) )
|
|
||||||
assert_equal( false, l2.supports?(l1) )
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_intersect
|
|
||||||
l1 = Msf::Module::PlatformList.new('win')
|
|
||||||
l2 = Msf::Module::PlatformList.new('win xp sp0', 'win xp sp2')
|
|
||||||
assert_equal(
|
|
||||||
[ Msf::Module::Platform::Windows::XP::SP0,
|
|
||||||
Msf::Module::Platform::Windows::XP::SP2
|
|
||||||
], (l1 & l2).platforms
|
|
||||||
)
|
|
||||||
|
|
||||||
l1 = Msf::Module::PlatformList.new('win xp sp1')
|
|
||||||
assert_equal( [ ], (l1 & l2).platforms )
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,27 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'msf/core'
|
|
||||||
|
|
||||||
module Msf
|
|
||||||
|
|
||||||
class Module::Reference::UnitTest < Test::Unit::TestCase
|
|
||||||
def test_ref
|
|
||||||
assert_equal('some cool book', Reference.from_s('some cool book').to_s)
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_site_ref
|
|
||||||
assert_equal('ftp://www.google.com', SiteReference.from_s('ftp://www.google.com').to_s)
|
|
||||||
assert_equal('http://www.google.com', SiteReference.from_s('http://www.google.com').to_s)
|
|
||||||
assert_equal('https://www.google.com', SiteReference.from_s('https://www.google.com').to_s)
|
|
||||||
assert_equal('http://www.osvdb.org/1', SiteReference.from_a([ 'OSVDB', 1 ]).to_s)
|
|
||||||
assert_equal('http://www.osvdb.org/1', SiteReference.from_a([ 'OSVDB', 1 ]).to_s)
|
|
||||||
assert_equal('jones (a)', SiteReference.from_a([ 'jones', 'a' ]).to_s)
|
|
||||||
assert_nil(SiteReference.from_s('whatever invalid shizzy'))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
|
@ -1,26 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'msf/core'
|
|
||||||
|
|
||||||
module Msf
|
|
||||||
|
|
||||||
class Module::Target::UnitTest < Test::Unit::TestCase
|
|
||||||
def test_target
|
|
||||||
t = Target.from_a(['Universal', {
|
|
||||||
'Platform' => 'winxpsp0',
|
|
||||||
'Ret' => 0x12345678
|
|
||||||
}])
|
|
||||||
|
|
||||||
assert_equal('Universal', t.name)
|
|
||||||
assert_equal(true, t.platform.supports?(Msf::Module::PlatformList.transform('winxpsp0')))
|
|
||||||
assert_equal(false, t.platform.supports?(Msf::Module::PlatformList.transform('winxpsp1')))
|
|
||||||
assert_equal(0x12345678, t['Ret'])
|
|
||||||
assert_equal(0x12345678, t.ret)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
|
@ -1,140 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'msf/core/option_container'
|
|
||||||
|
|
||||||
module Msf
|
|
||||||
|
|
||||||
class OptionContainer::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
# Tests the initialization of the OptionContainer object
|
|
||||||
def test_initialize
|
|
||||||
# Make sure initialization works
|
|
||||||
options = nil
|
|
||||||
|
|
||||||
assert_block("initialize failed") {
|
|
||||||
options = OptionContainer.new(
|
|
||||||
'rhost' => [ OptAddress, true, nil, 'host.com' ],
|
|
||||||
'rport' => [ OptPort, true, nil, 1234 ])
|
|
||||||
|
|
||||||
if (options == nil)
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
true
|
|
||||||
}
|
|
||||||
|
|
||||||
# Make sure there are 2 options
|
|
||||||
assert_equal(2, options.length, "invalid number of options #{options.length}")
|
|
||||||
|
|
||||||
# Make sure that the constructor raises an argument error when
|
|
||||||
# an invalid option is supplied
|
|
||||||
assert_raise(ArgumentError, "initialize invalid failed") {
|
|
||||||
OptionContainer.new(
|
|
||||||
'rhost' => 'invalid');
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
# Tests getting the value of an option
|
|
||||||
def test_get
|
|
||||||
options = OptionContainer.new(
|
|
||||||
'rport' => [ OptPort, true, nil, 1234 ])
|
|
||||||
|
|
||||||
assert_equal(1234, options.get('rport').default,
|
|
||||||
"option default does not match")
|
|
||||||
assert_equal(true, options.get('rport').required?,
|
|
||||||
"option required does not match")
|
|
||||||
assert_equal('rport', options['rport'].name,
|
|
||||||
"option name does not match")
|
|
||||||
end
|
|
||||||
|
|
||||||
# Tests validation
|
|
||||||
def test_validate
|
|
||||||
# Test validating required options
|
|
||||||
options = OptionContainer.new(
|
|
||||||
'rhost' => [ OptAddress, true ],
|
|
||||||
'rport' => [ OptPort, true ],
|
|
||||||
'Lib' => [ OptString ])
|
|
||||||
|
|
||||||
ds = DataStore.new
|
|
||||||
|
|
||||||
assert_raise(OptionValidateError, "required validation failed") {
|
|
||||||
options.validate(ds)
|
|
||||||
}
|
|
||||||
|
|
||||||
ds['rhost'] = 'www.invalid.host.tldinvalid'
|
|
||||||
ds['rport'] = 1234
|
|
||||||
|
|
||||||
assert_raise(OptionValidateError, "host validation failed") {
|
|
||||||
options.validate(ds)
|
|
||||||
}
|
|
||||||
|
|
||||||
# Make sure address validation does work
|
|
||||||
ds['rhost'] = 'www.google.com'
|
|
||||||
|
|
||||||
assert_equal(true, options.validate(ds), "overall validation failed")
|
|
||||||
|
|
||||||
# Make sure port validation does work
|
|
||||||
ds['rport'] = 23423423
|
|
||||||
|
|
||||||
assert_raise(OptionValidateError, "port validation failed") {
|
|
||||||
options.validate(ds)
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
# Make sure advanced additions work
|
|
||||||
def test_advanced
|
|
||||||
options = OptionContainer.new
|
|
||||||
|
|
||||||
options.add_advanced_options(
|
|
||||||
'DONKEY' => [ OptString, false ])
|
|
||||||
|
|
||||||
assert_equal(true, options.get('DONKEY').advanced?,
|
|
||||||
"advanced option failed")
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_builtin
|
|
||||||
options = OptionContainer.new
|
|
||||||
|
|
||||||
options.add_options(
|
|
||||||
[
|
|
||||||
Opt::RHOST,
|
|
||||||
Opt::RPORT(135),
|
|
||||||
Opt::LHOST('127.0.0.1'),
|
|
||||||
Opt::SSL
|
|
||||||
])
|
|
||||||
|
|
||||||
assert_equal(135, options.get('RPORT').default, "invalid RPORT default")
|
|
||||||
assert_equal(true, options.get('RPORT').required?, "invalid RPORT require")
|
|
||||||
assert_equal('127.0.0.1', options.get('LHOST').default, "invalid LHOST default")
|
|
||||||
assert_equal('LHOST', options.get('LHOST').name, "invalid LHOST name")
|
|
||||||
assert_equal(false, options.get('SSL').default, "invalid SSL default")
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_enum
|
|
||||||
options = OptionContainer.new(
|
|
||||||
'testenum' => [ OptEnum, true, 'desc', nil, ['none','one','done']]
|
|
||||||
)
|
|
||||||
|
|
||||||
ds = DataStore.new
|
|
||||||
|
|
||||||
assert_raise(OptionValidateError, "enum required") {
|
|
||||||
options.validate(ds)
|
|
||||||
}
|
|
||||||
|
|
||||||
ds['testenum'] = 'done'
|
|
||||||
assert_equal(true, options.validate(ds), "enum valid")
|
|
||||||
|
|
||||||
ds['testenum'] = 'foo'
|
|
||||||
assert_raise(OptionValidateError, "enum invalid") {
|
|
||||||
options.validate(ds)
|
|
||||||
}
|
|
||||||
|
|
||||||
assert_equal('desc (accepted: none, one, done)', options['testenum'].desc, 'desc')
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
|
@ -1,23 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..','..','..','..','..', 'lib'))
|
|
||||||
|
|
||||||
require 'msf/core/post/windows/registry'
|
|
||||||
require 'test/unit'
|
|
||||||
|
|
||||||
module Msf
|
|
||||||
class Post
|
|
||||||
module Windows
|
|
||||||
class Registry::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
def test_include
|
|
||||||
assert_nothing_raised do
|
|
||||||
Msf::Post.new.extend(Msf::Post::Windows::Registry)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,23 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..','..','..','..','..', 'lib'))
|
|
||||||
|
|
||||||
require 'msf/core/post/windows/user_profiles'
|
|
||||||
require 'test/unit'
|
|
||||||
|
|
||||||
module Msf
|
|
||||||
class Post
|
|
||||||
module Windows
|
|
||||||
class UserProfiles::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
def test_include
|
|
||||||
assert_nothing_raised do
|
|
||||||
Msf::Post.new.extend(Msf::Post::Windows::UserProfiles)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,76 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'msf/core/session_manager'
|
|
||||||
|
|
||||||
module Msf
|
|
||||||
|
|
||||||
class SessionManager::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
class UtSessionEvent
|
|
||||||
include SessionEvent
|
|
||||||
|
|
||||||
def on_session_open(session)
|
|
||||||
self.open_session = session
|
|
||||||
end
|
|
||||||
def on_session_close(session,reason='')
|
|
||||||
self.close_session = session
|
|
||||||
end
|
|
||||||
|
|
||||||
attr_accessor :open_session, :close_session
|
|
||||||
end
|
|
||||||
|
|
||||||
#
|
|
||||||
# Tests to make sure session registration functions properly
|
|
||||||
#
|
|
||||||
def test_registration
|
|
||||||
framework = Framework.new
|
|
||||||
manager = SessionManager.new(framework)
|
|
||||||
|
|
||||||
session = Class.new
|
|
||||||
session.extend(Session)
|
|
||||||
|
|
||||||
assert_equal(1, manager.register(session), "Did not get expected sid")
|
|
||||||
assert_equal(1, session.sid,
|
|
||||||
"Session sid was not initialized properly")
|
|
||||||
assert_equal(framework, session.framework,
|
|
||||||
"Session framework was not initialized properly")
|
|
||||||
assert_equal(1, manager.entries.length,
|
|
||||||
"Number of session manager entries is not one")
|
|
||||||
assert_equal(session, manager[session.sid],
|
|
||||||
"Index of sid did not return session")
|
|
||||||
|
|
||||||
manager.deregister(session)
|
|
||||||
|
|
||||||
assert_equal(0, manager.entries.length,
|
|
||||||
"Number of session manager entries is not zero")
|
|
||||||
end
|
|
||||||
|
|
||||||
#
|
|
||||||
# Test session notification events
|
|
||||||
#
|
|
||||||
def test_notify
|
|
||||||
framework = Framework.new
|
|
||||||
manager = SessionManager.new(framework)
|
|
||||||
handler = UtSessionEvent.new
|
|
||||||
session = Class.new
|
|
||||||
session.extend(Session)
|
|
||||||
|
|
||||||
framework.events.add_session_subscriber(handler)
|
|
||||||
|
|
||||||
manager.register(session)
|
|
||||||
assert_equal(handler.open_session, session,
|
|
||||||
"Open session handler not called")
|
|
||||||
|
|
||||||
manager.deregister(session)
|
|
||||||
assert_equal(handler.close_session, session,
|
|
||||||
"Close session handler not called")
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
|
@ -29,7 +29,6 @@ class Exploit
|
||||||
#
|
#
|
||||||
def commands
|
def commands
|
||||||
super.update({
|
super.update({
|
||||||
"check" => "Check to see if a target is vulnerable",
|
|
||||||
"exploit" => "Launch an exploit attempt",
|
"exploit" => "Launch an exploit attempt",
|
||||||
"rcheck" => "Reloads the module and checks if the target is vulnerable",
|
"rcheck" => "Reloads the module and checks if the target is vulnerable",
|
||||||
"rexploit" => "Reloads the module and launches an exploit attempt",
|
"rexploit" => "Reloads the module and launches an exploit attempt",
|
||||||
|
@ -46,44 +45,6 @@ class Exploit
|
||||||
"Exploit"
|
"Exploit"
|
||||||
end
|
end
|
||||||
|
|
||||||
#
|
|
||||||
# Checks to see if a target is vulnerable.
|
|
||||||
#
|
|
||||||
def cmd_check(*args)
|
|
||||||
defanged?
|
|
||||||
|
|
||||||
begin
|
|
||||||
|
|
||||||
code = mod.check_simple(
|
|
||||||
'LocalInput' => driver.input,
|
|
||||||
'LocalOutput' => driver.output)
|
|
||||||
|
|
||||||
if (code and code.kind_of?(Array) and code.length > 1)
|
|
||||||
|
|
||||||
if (code == Msf::Exploit::CheckCode::Vulnerable)
|
|
||||||
print_good(code[1])
|
|
||||||
else
|
|
||||||
print_status(code[1])
|
|
||||||
end
|
|
||||||
|
|
||||||
else
|
|
||||||
print_error("Check failed: The state could not be determined.")
|
|
||||||
end
|
|
||||||
|
|
||||||
rescue ::Interrupt
|
|
||||||
raise $!
|
|
||||||
rescue ::Exception => e
|
|
||||||
print_error("Exploit check failed: #{e.class} #{e}")
|
|
||||||
if(e.class.to_s != 'Msf::OptionValidateError')
|
|
||||||
print_error("Call stack:")
|
|
||||||
e.backtrace.each do |line|
|
|
||||||
break if line =~ /lib.msf.base.simple/
|
|
||||||
print_error(" #{line}")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Launches an exploitation attempt.
|
# Launches an exploitation attempt.
|
||||||
#
|
#
|
||||||
|
|
|
@ -17,7 +17,8 @@ module ModuleCommandDispatcher
|
||||||
def commands
|
def commands
|
||||||
{
|
{
|
||||||
"pry" => "Open a Pry session on the current module",
|
"pry" => "Open a Pry session on the current module",
|
||||||
"reload" => "Reload the current module from disk"
|
"reload" => "Reload the current module from disk",
|
||||||
|
"check" => "Check to see if a target is vulnerable"
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -35,6 +36,38 @@ module ModuleCommandDispatcher
|
||||||
self.driver.active_module = m
|
self.driver.active_module = m
|
||||||
end
|
end
|
||||||
|
|
||||||
|
#
|
||||||
|
# Checks to see if a target is vulnerable.
|
||||||
|
#
|
||||||
|
def cmd_check(*args)
|
||||||
|
defanged?
|
||||||
|
begin
|
||||||
|
code = mod.check_simple(
|
||||||
|
'LocalInput' => driver.input,
|
||||||
|
'LocalOutput' => driver.output)
|
||||||
|
if (code and code.kind_of?(Array) and code.length > 1)
|
||||||
|
if (code == Msf::Exploit::CheckCode::Vulnerable)
|
||||||
|
print_good(code[1])
|
||||||
|
else
|
||||||
|
print_status(code[1])
|
||||||
|
end
|
||||||
|
else
|
||||||
|
print_error("Check failed: The state could not be determined.")
|
||||||
|
end
|
||||||
|
rescue ::Interrupt
|
||||||
|
raise $!
|
||||||
|
rescue ::Exception => e
|
||||||
|
print_error("Exploit check failed: #{e.class} #{e}")
|
||||||
|
if(e.class.to_s != 'Msf::OptionValidateError')
|
||||||
|
print_error("Call stack:")
|
||||||
|
e.backtrace.each do |line|
|
||||||
|
break if line =~ /lib.msf.base.simple/
|
||||||
|
print_error(" #{line}")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def cmd_pry_help
|
def cmd_pry_help
|
||||||
print_line "Usage: pry"
|
print_line "Usage: pry"
|
||||||
print_line
|
print_line
|
||||||
|
|
|
@ -1,92 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'net/ssh'
|
|
||||||
|
|
||||||
$_SSH_TEST_SERVERNAME = 'dbsrv' # Name or IP, default: dbsrv
|
|
||||||
$_SSH_TEST_SERVERPORT = 22 # Default: 22
|
|
||||||
$_SSH_TEST_USERNAME = 'user' # Default: scott
|
|
||||||
$_SSH_TEST_PASSWORD = 'useruser' # Default: tiger
|
|
||||||
$_SSH_TEST_OS = 'Linux' # Default: Linux
|
|
||||||
|
|
||||||
class Net::SSH::UnitTest < ::Test::Unit::TestCase
|
|
||||||
|
|
||||||
# Need to do this or else we're talking about
|
|
||||||
# some other Net::SSH.
|
|
||||||
def test_local_version
|
|
||||||
if Net::SSH::Version::CURRENT.respond_to? :msf3
|
|
||||||
assert Net::SSH::Version::CURRENT.msf3
|
|
||||||
else
|
|
||||||
flunk "Not testing the MSF3 bundled version of SSH"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# Tests that a connection happens, that failed logins
|
|
||||||
# are recorded, and that we're using Rex sockets instead
|
|
||||||
# of standard sockets.
|
|
||||||
def test_connection
|
|
||||||
|
|
||||||
assert_nothing_raised do
|
|
||||||
conn = Net::SSH.start(
|
|
||||||
$_SSH_TEST_SERVERNAME,
|
|
||||||
$_SSH_TEST_USERNAME,
|
|
||||||
:password => $_SSH_TEST_PASSWORD,
|
|
||||||
:auth_methods => ['password'],
|
|
||||||
:port => $_SSH_TEST_SERVERPORT
|
|
||||||
)
|
|
||||||
conn.close
|
|
||||||
end
|
|
||||||
|
|
||||||
assert_raise Net::SSH::AuthenticationFailed do
|
|
||||||
conn = Net::SSH.start(
|
|
||||||
$_SSH_TEST_SERVERNAME,
|
|
||||||
$_SSH_TEST_USERNAME,
|
|
||||||
:password => $_SSH_TEST_PASSWORD+"bad",
|
|
||||||
:auth_methods => ['password'],
|
|
||||||
:port => $_SSH_TEST_SERVERPORT
|
|
||||||
)
|
|
||||||
conn.close
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_rex_sockets
|
|
||||||
conn = Net::SSH.start(
|
|
||||||
$_SSH_TEST_SERVERNAME,
|
|
||||||
$_SSH_TEST_USERNAME,
|
|
||||||
:password => $_SSH_TEST_PASSWORD,
|
|
||||||
:auth_methods => ['password'],
|
|
||||||
:port => $_SSH_TEST_SERVERPORT
|
|
||||||
)
|
|
||||||
assert_kind_of Rex::Socket::Tcp, conn.transport.socket
|
|
||||||
conn.close
|
|
||||||
end
|
|
||||||
|
|
||||||
def _do_uname(host,user,pass)
|
|
||||||
ret = nil
|
|
||||||
conn = Net::SSH.start(
|
|
||||||
host,
|
|
||||||
user,
|
|
||||||
:password => pass,
|
|
||||||
:auth_methods => ['password'],
|
|
||||||
:port => 22
|
|
||||||
) do |ssh|
|
|
||||||
ret = ssh.exec!('/bin/uname -a')
|
|
||||||
ssh.loop
|
|
||||||
end
|
|
||||||
return ret
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_simple_exec
|
|
||||||
uname_ret = nil
|
|
||||||
assert_nothing_raised do
|
|
||||||
uname_ret = _do_uname(
|
|
||||||
$_SSH_TEST_SERVERNAME,
|
|
||||||
$_SSH_TEST_USERNAME,
|
|
||||||
$_SSH_TEST_PASSWORD
|
|
||||||
)
|
|
||||||
end
|
|
||||||
|
|
||||||
assert_match(/^#{$_SSH_TEST_OS}/, uname_ret)
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,185 +0,0 @@
|
||||||
# -*- coding: binary -*-
|
|
||||||
require 'net/ssh'
|
|
||||||
require 'test/unit'
|
|
||||||
|
|
||||||
# Unit tests for Net::SSH::Utils::Key.fingerprint. Not going
|
|
||||||
# to mess around with this weird story testing that the rest
|
|
||||||
# of Net::SSH uses.
|
|
||||||
#
|
|
||||||
# By the way, it would be extremely silly to actually use these
|
|
||||||
# keys for anything. They're passwordless and now quite effectively
|
|
||||||
# compromised. :)
|
|
||||||
class Fingerprint < Test::Unit::TestCase
|
|
||||||
|
|
||||||
def test_rsa_private
|
|
||||||
rsa_private = <<-EOM
|
|
||||||
-----BEGIN RSA PRIVATE KEY-----
|
|
||||||
MIIEpAIBAAKCAQEA/kDqlZOy4FE7+0m5rO/x1YDMxMnsj2SFIAtxF6TAAyxqPt7s
|
|
||||||
wJtuVhQv8xNvRYjoL2E7JH95gtIRmwOxLReRd0kVyrCi9mf9T7ninSKLb264IUfQ
|
|
||||||
VdivGdFGJbTxlxp2w9oXLt9jrUXWgYAn5z/4cauOtGQvvAJz4m/G+eJyafuvi83i
|
|
||||||
rnOP2v7fPtPY1Xzok0PvdOHDw9Vk8rOLAB4quOf0kSP2DMFOr5Kyk2qQvOar2wnd
|
|
||||||
npxdEaDgKrdnE6hQ1yv/uctEgP7/5UJ8RHrMp/D9DcTRYZMxxnCawt72jxYqgelL
|
|
||||||
3m/329ER/6StAsVce+sFPDIBsFssLwnJtJjzdwIBIwKCAQEArlhmV/BAJMn9Ppj0
|
|
||||||
WVQTixZ9yMT5++0oFfk3my8klHY6Ob1vJPzd8eH0/nO6A8uX5fmHo/+jx2t5yWGe
|
|
||||||
EEqs5BTbvi/6t5fDpGI0/gkPJ9bkqRtNB6qGsp4hePEasMGwhkxnqxzWorOLxoPD
|
|
||||||
l0HO7twKFUwDeZtIJj4EyJtHJBjumimnG7cpjZi0w84XMQqpUyAcTkXhCICIiMtV
|
|
||||||
UwAfjsxiB+cyd9B3riWHtyyo8SCqH1qFELOB9goOVI7moXIB0Z6TwUrvBiDC7cDO
|
|
||||||
Qajj97kpeuQHRFSkqwZHVGkZ0Hy1mm7VTRNOfE590rv4daJDQTG5W2JbETAknbW8
|
|
||||||
3El+CwKBgQD/iDIgEChLxufEKO4CpKFIHki+PmaFCm6zLILHbD6fV8oPL4iSF5T+
|
|
||||||
9OmFXgTmscl6C4J3g2+mzuxN9uDiyUE6lVIDiKZzzd7Y+sdbmC1oUkrMviq9Uuc1
|
|
||||||
lisPMKdfz2Xf6GJU52j6l0hg9FRAkcut0CkvGwZqOPrfBI5OYVtTzwKBgQD+uB8E
|
|
||||||
QIrSJZhoza6fCVa+28Gymaqr4lXqqV2R0CoIBjPWa2o6W8b2h10cn5neViLkYc4O
|
|
||||||
uCbuETs9Tdtz9Et+RX1kt0I0H4W1T8Hz4eHCjGLT0bg0IFs2ttxjjHOmb6UXGE//
|
|
||||||
5qAqz0DkN/5MxW0Ml1lSe+bSqPoXxH0dPKfH2QKBgQCvONHqGbU7RpBL/s8XwVim
|
|
||||||
eyqRFNiVvgLEAUO78nQVfgbl13OXYKCu09NUIzaPj9qc1LE8AlswjePdsJo1HEn8
|
|
||||||
SSJLkOcq1k+qupdUwB8i9pmw923Dpo/qOxY2TT+SJ9DUDRA6OEf8SnrGI+IAY/lh
|
|
||||||
PkggTQu2jXjTcNacJYBz+wKBgQD3cQgwBC8VSRe2RCX5lAsfzingsoiJt0wlyRkR
|
|
||||||
Td+wBgZ4hZpkk6tV4pT3O/SO11UYXwKvNow3uPe35TuVNnU41cpElMP4Hp8lKOhL
|
|
||||||
///hj7B1/u10dzQJQ+wI7ta+8By3WXJJC+wMVE2qf4lR5FtOD14VnO7bRRA0WHmK
|
|
||||||
HapNGwKBgQCx09+WsoCTH6jIkfroT77t+DAMHrzH67AZy+hu1+dBCEyN4Mkw8CD6
|
|
||||||
sRMIIcy/R5W1mlRFFaYMbtJogjtWwDUjzTEPvIU6tdJhj8GOg1pxPLqD+r/Mwc88
|
|
||||||
228W9YHRSybK5kK61QmoWHDS13OJCOa+xA59ym1GpE1KyliwpsPajg==
|
|
||||||
-----END RSA PRIVATE KEY-----
|
|
||||||
EOM
|
|
||||||
|
|
||||||
fp = Net::SSH::Utils::Key.fingerprint(:data => rsa_private)
|
|
||||||
assert_equal("af:76:e4:f8:37:7b:52:8c:77:61:5b:d3:b0:d3:05:e4",fp)
|
|
||||||
|
|
||||||
fp = Net::SSH::Utils::Key.fingerprint(
|
|
||||||
:data => rsa_private,
|
|
||||||
:format => :compact
|
|
||||||
)
|
|
||||||
assert_equal("af76e4f8377b528c77615bd3b0d305e4",fp)
|
|
||||||
|
|
||||||
fp = Net::SSH::Utils::Key.fingerprint(
|
|
||||||
:data => rsa_private,
|
|
||||||
:format => :bin
|
|
||||||
)
|
|
||||||
assert_equal("\xaf\x76\xe4\xf8\x37\x7b\x52\x8c\x77\x61\x5b\xd3\xb0\xd3\x05\xe4", fp)
|
|
||||||
|
|
||||||
assert_raise OpenSSL::PKey::PKeyError do
|
|
||||||
Net::SSH::Utils::Key.fingerprint(
|
|
||||||
:data => rsa_private,
|
|
||||||
:public => true
|
|
||||||
)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_rsa_public
|
|
||||||
rsa_public = <<-EOM
|
|
||||||
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA/kDqlZOy4FE7+0m5rO/x1YDMxMnsj2SFIAtxF6TAAyxqPt7swJtuVhQv8xNvRYjoL2E7JH95gtIRmwOxLReRd0kVyrCi9mf9T7ninSKLb264IUfQVdivGdFGJbTxlxp2w9oXLt9jrUXWgYAn5z/4cauOtGQvvAJz4m/G+eJyafuvi83irnOP2v7fPtPY1Xzok0PvdOHDw9Vk8rOLAB4quOf0kSP2DMFOr5Kyk2qQvOar2wndnpxdEaDgKrdnE6hQ1yv/uctEgP7/5UJ8RHrMp/D9DcTRYZMxxnCawt72jxYqgelL3m/329ER/6StAsVce+sFPDIBsFssLwnJtJjzdw== user@msf3
|
|
||||||
EOM
|
|
||||||
|
|
||||||
fp = Net::SSH::Utils::Key.fingerprint(
|
|
||||||
:data => rsa_public,
|
|
||||||
:public => true
|
|
||||||
)
|
|
||||||
assert_equal("af:76:e4:f8:37:7b:52:8c:77:61:5b:d3:b0:d3:05:e4",fp)
|
|
||||||
|
|
||||||
fp = Net::SSH::Utils::Key.fingerprint(
|
|
||||||
:data => rsa_public,
|
|
||||||
:format => :compact,
|
|
||||||
:public => true
|
|
||||||
)
|
|
||||||
|
|
||||||
assert_equal("af76e4f8377b528c77615bd3b0d305e4",fp)
|
|
||||||
|
|
||||||
fp = Net::SSH::Utils::Key.fingerprint(
|
|
||||||
:data => rsa_public,
|
|
||||||
:format => :bin,
|
|
||||||
:public => true
|
|
||||||
)
|
|
||||||
assert_equal("\xaf\x76\xe4\xf8\x37\x7b\x52\x8c\x77\x61\x5b\xd3\xb0\xd3\x05\xe4", fp)
|
|
||||||
|
|
||||||
assert_raise OpenSSL::PKey::PKeyError do
|
|
||||||
Net::SSH::Utils::Key.fingerprint(
|
|
||||||
:data => rsa_public,
|
|
||||||
:public => false
|
|
||||||
)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_dsa_private
|
|
||||||
dsa_private = <<-EOM
|
|
||||||
-----BEGIN DSA PRIVATE KEY-----
|
|
||||||
MIIBugIBAAKBgQDee7R8F36phQQ5fnBf1HcOctMcWWXX6/2EXdOZMykRXgPpGloK
|
|
||||||
FaO/Wjo1Lnlot+O0rweu0VlOepNtpBCJu/kDHePci3kH8Uo/AMCUKb+72kZumJPr
|
|
||||||
N46WU3v4Shck4MUOXKW56/EkMXaHAQxM7wgFSRUbTYeyIxTOG+qH3Cc9KQIVANjT
|
|
||||||
p28ydND3lmXzw1YVwRSDO5LfAoGAatFZrDKn0DOKiJlPMGF/ES3Ktr+GpltAwrdp
|
|
||||||
WCgG8grKphnzpnfgcKra3TgMOzipovA362o91RQ9OO0UK2fnrzSpphl6AgAEQZ7m
|
|
||||||
+qgRWj4hfQZCik2p6rP2F1rgLlZw10OPJE4ECcgHJ5zXZMEzrc4ihGnIs0SF0Lbs
|
|
||||||
hgdI0N4CgYAjYXbR4tVZb9SrSjRw86n0p/90ec7zgyBZTZVF+ImkstVlnQFh5H3/
|
|
||||||
Rf35YUjgsppnBo3sRT/aCEQmbBdzFBXwo0XLBkqFdg21ZtuJZCv6NrNr/Mn8zeVI
|
|
||||||
rtPv0QRjA/92/OQ5T6Gj7m8gqKEshzW5gj17KH3pdOnNaLBkfJVYvQIUHzk1VI9A
|
|
||||||
2NbDpCiAmhnqoeYeTXU=
|
|
||||||
-----END DSA PRIVATE KEY-----
|
|
||||||
EOM
|
|
||||||
|
|
||||||
fp = Net::SSH::Utils::Key.fingerprint(:data => dsa_private)
|
|
||||||
assert_equal("ad:64:88:d8:f6:78:65:d4:da:a9:ba:56:61:74:a5:1c",fp)
|
|
||||||
|
|
||||||
fp = Net::SSH::Utils::Key.fingerprint(
|
|
||||||
:data => dsa_private,
|
|
||||||
:format => :compact
|
|
||||||
)
|
|
||||||
assert_equal("ad6488d8f67865d4daa9ba566174a51c",fp)
|
|
||||||
|
|
||||||
fp = Net::SSH::Utils::Key.fingerprint(
|
|
||||||
:data => dsa_private,
|
|
||||||
:format => :bin
|
|
||||||
)
|
|
||||||
assert_equal("\xad\x64\x88\xd8\xf6\x78\x65\xd4\xda\xa9\xba\x56\x61\x74\xa5\x1c",fp)
|
|
||||||
|
|
||||||
assert_raise OpenSSL::PKey::PKeyError do
|
|
||||||
Net::SSH::Utils::Key.fingerprint(
|
|
||||||
:data => dsa_private,
|
|
||||||
:public => true
|
|
||||||
)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_dsa_public
|
|
||||||
dsa_public = <<-EOM
|
|
||||||
ssh-dss AAAAB3NzaC1kc3MAAACBAN57tHwXfqmFBDl+cF/Udw5y0xxZZdfr/YRd05kzKRFeA+kaWgoVo79aOjUueWi347SvB67RWU56k22kEIm7+QMd49yLeQfxSj8AwJQpv7vaRm6Yk+s3jpZTe/hKFyTgxQ5cpbnr8SQxdocBDEzvCAVJFRtNh7IjFM4b6ofcJz0pAAAAFQDY06dvMnTQ95Zl88NWFcEUgzuS3wAAAIBq0VmsMqfQM4qImU8wYX8RLcq2v4amW0DCt2lYKAbyCsqmGfOmd+BwqtrdOAw7OKmi8Dfraj3VFD047RQrZ+evNKmmGXoCAARBnub6qBFaPiF9BkKKTanqs/YXWuAuVnDXQ48kTgQJyAcnnNdkwTOtziKEacizRIXQtuyGB0jQ3gAAAIAjYXbR4tVZb9SrSjRw86n0p/90ec7zgyBZTZVF+ImkstVlnQFh5H3/Rf35YUjgsppnBo3sRT/aCEQmbBdzFBXwo0XLBkqFdg21ZtuJZCv6NrNr/Mn8zeVIrtPv0QRjA/92/OQ5T6Gj7m8gqKEshzW5gj17KH3pdOnNaLBkfJVYvQ== user@msf3
|
|
||||||
EOM
|
|
||||||
|
|
||||||
fp = Net::SSH::Utils::Key.fingerprint(
|
|
||||||
:data => dsa_public,
|
|
||||||
:public => true
|
|
||||||
)
|
|
||||||
assert_equal("ad:64:88:d8:f6:78:65:d4:da:a9:ba:56:61:74:a5:1c",fp)
|
|
||||||
|
|
||||||
fp = Net::SSH::Utils::Key.fingerprint(
|
|
||||||
:data => dsa_public,
|
|
||||||
:format => :compact,
|
|
||||||
:public => true
|
|
||||||
)
|
|
||||||
|
|
||||||
assert_equal("ad6488d8f67865d4daa9ba566174a51c",fp)
|
|
||||||
|
|
||||||
fp = Net::SSH::Utils::Key.fingerprint(
|
|
||||||
:data => dsa_public,
|
|
||||||
:format => :bin,
|
|
||||||
:public => true
|
|
||||||
)
|
|
||||||
assert_equal("\xad\x64\x88\xd8\xf6\x78\x65\xd4\xda\xa9\xba\x56\x61\x74\xa5\x1c",fp)
|
|
||||||
|
|
||||||
assert_raise OpenSSL::PKey::PKeyError do
|
|
||||||
Net::SSH::Utils::Key.fingerprint(
|
|
||||||
:data => dsa_public,
|
|
||||||
:public => false
|
|
||||||
)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# Notice how it's currently impossible to tell if a key is
|
|
||||||
# simply mistyped as a public or private key, or if it's a
|
|
||||||
# badly formatted key. Too bad.
|
|
||||||
def test_bogus_raise
|
|
||||||
bogus_key = "Oh hey I'm a key. Ok, not really."
|
|
||||||
assert_raise OpenSSL::PKey::PKeyError do
|
|
||||||
Net::SSH::Utils::Key.fingerprint(:data => bogus_key)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
|
@ -1,55 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'postgres_msf'
|
|
||||||
|
|
||||||
$_POSTGRESQL_TEST_SERVERNAME = 'dbsrv' # Name or IP, default: dbsrv
|
|
||||||
$_POSTGRESQL_TEST_SERVERPORT = 5432 # Default: 5432
|
|
||||||
$_POSTGRESQL_TEST_DATABASE = 'mydb' # Default: mydb
|
|
||||||
$_POSTGRESQL_TEST_USERNAME = 'scott' # Default: scott
|
|
||||||
$_POSTGRESQL_TEST_PASSWORD = 'tiger' # Default: tiger
|
|
||||||
|
|
||||||
class Msf::Db::PostgresPR::UnitTest < ::Test::Unit::TestCase
|
|
||||||
|
|
||||||
def test_connection
|
|
||||||
srv = "tcp://#{$_POSTGRESQL_TEST_SERVERNAME}:#{$_POSTGRESQL_TEST_SERVERPORT}"
|
|
||||||
conn = Msf::Db::PostgresPR::Connection.new($_POSTGRESQL_TEST_DATABASE,
|
|
||||||
$_POSTGRESQL_TEST_USERNAME,
|
|
||||||
$_POSTGRESQL_TEST_PASSWORD,
|
|
||||||
srv)
|
|
||||||
assert_kind_of Msf::Db::PostgresPR::Connection, conn
|
|
||||||
assert_kind_of Rex::Socket::Tcp, conn.conn, "should use Rex sockets for TCP"
|
|
||||||
assert_nothing_raised { conn.close }
|
|
||||||
end
|
|
||||||
|
|
||||||
# Note that this will drop the "test" table for the named database.
|
|
||||||
# This is a destructive act!
|
|
||||||
def test_query
|
|
||||||
srv = "tcp://#{$_POSTGRESQL_TEST_SERVERNAME}:#{$_POSTGRESQL_TEST_SERVERPORT}"
|
|
||||||
conn = Msf::Db::PostgresPR::Connection.new($_POSTGRESQL_TEST_DATABASE,
|
|
||||||
$_POSTGRESQL_TEST_USERNAME,
|
|
||||||
$_POSTGRESQL_TEST_PASSWORD,
|
|
||||||
srv)
|
|
||||||
|
|
||||||
begin
|
|
||||||
conn.query("drop table test")
|
|
||||||
rescue RuntimeError # Cleanup, it may or may not be there.
|
|
||||||
end
|
|
||||||
|
|
||||||
assert_nothing_raised do
|
|
||||||
conn.query("CREATE TABLE test (i int, v varchar(5))")
|
|
||||||
conn.query(%q{INSERT INTO test VALUES (1, 'foo')})
|
|
||||||
conn.query(%q{INSERT INTO test VALUES (2, 'bar')})
|
|
||||||
end
|
|
||||||
|
|
||||||
resp = conn.query("select * from test")
|
|
||||||
assert_equal(2, resp.rows.size)
|
|
||||||
assert_equal(2, resp.fields.size)
|
|
||||||
assert_equal("SELECT", resp.cmd_tag)
|
|
||||||
assert_nothing_raised { conn.query("drop table test") }
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
|
@ -1,19 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'rex/text'
|
|
||||||
require 'rex/arch/sparc'
|
|
||||||
|
|
||||||
class Rex::Arch::Sparc::UnitTest < ::Test::Unit::TestCase
|
|
||||||
|
|
||||||
Klass = Rex::Arch::Sparc
|
|
||||||
|
|
||||||
def test_set
|
|
||||||
assert_equal("\x88\x10\x20\x02", Klass.set(0x2, 'g4'))
|
|
||||||
assert_equal("\x09\x00\x00\x08\x88\x11\x22\x22", Klass.set(0x2222, 'g4'))
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
|
@ -1,94 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'rex/text'
|
|
||||||
require 'rex/arch/x86'
|
|
||||||
|
|
||||||
class Rex::Arch::X86::UnitTest < ::Test::Unit::TestCase
|
|
||||||
|
|
||||||
Klass = Rex::Arch::X86
|
|
||||||
|
|
||||||
def test_reg_number
|
|
||||||
assert_equal(Klass.reg_number('eax'), Klass::EAX)
|
|
||||||
assert_equal(Klass.reg_number('EsP'), Klass::ESP)
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_push_byte
|
|
||||||
assert_raise(::ArgumentError) { Klass.push_byte(-129) }
|
|
||||||
assert_raise(::ArgumentError) { Klass.push_byte(8732) }
|
|
||||||
assert_equal("\x6a\x10", Klass.push_byte(16))
|
|
||||||
assert_equal("\x6a\xff", Klass.push_byte(-1))
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_push_dword
|
|
||||||
assert_equal("\x68\x78\x56\x34\x12", Klass.push_dword(0x12345678))
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_mov_dword
|
|
||||||
assert_equal("\xb8\x78\x56\x34\x12", Klass.mov_dword(Klass::EAX, 0x12345678))
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_mov_word
|
|
||||||
assert_equal("\x66\xbc\x37\x13", Klass.mov_word(Klass::SP, 0x1337))
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_mov_byte
|
|
||||||
assert_raise(::RangeError) { Klass.mov_byte(Klass::AL, 0x100) }
|
|
||||||
assert_raise(::RangeError) { Klass.mov_byte(Klass::AL, -1) }
|
|
||||||
assert_equal("\xb2\xb2", Klass.mov_byte(Klass::DL, 0xb2))
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_check_reg
|
|
||||||
assert_raise(::ArgumentError) { Klass._check_reg(8) }
|
|
||||||
assert_raise(::ArgumentError) { Klass._check_reg(-1) }
|
|
||||||
|
|
||||||
0.upto(7) { |reg|
|
|
||||||
assert_nothing_raised { Klass._check_reg(reg) }
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_pop_dword
|
|
||||||
assert_raise(::ArgumentError) { Klass.pop_dword(8) }
|
|
||||||
assert_raise(::ArgumentError) { Klass.pop_dword(-1) }
|
|
||||||
|
|
||||||
assert_equal("\x58", Klass.pop_dword(Klass::EAX))
|
|
||||||
assert_equal("\x5a", Klass.pop_dword(Klass::EDX))
|
|
||||||
assert_equal("\x5c", Klass.pop_dword(Klass::ESP))
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_sub
|
|
||||||
assert_equal("\x83\xe8\x04", Klass.sub(4, Klass::EAX)[2, 3])
|
|
||||||
assert_equal("\x66\x81\xe8\x80\xff", Klass.sub(-128, Klass::EAX)[2, 5])
|
|
||||||
assert_equal("\x81\xe8\x00\x00\x01\x00", Klass.sub(65536, Klass::EAX)[2, 6])
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_add
|
|
||||||
assert_equal("\x83\xc4\x47", Klass.add(0x47, Klass::ESP)[2,6])
|
|
||||||
assert_equal("\x83\xc4\x47", Klass.add(0x47, Klass::ESP, '', true))
|
|
||||||
assert_equal("\x81\xc4\x11\x11\x01\x00", Klass.add(0x11111, Klass::ESP, '', true))
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_clear
|
|
||||||
assert_equal("\x33\xc0", Klass.clear(Klass::EAX, "\x29\x2b\x31"))
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_searcher
|
|
||||||
s = "\xbe"+ # mov esi, Tag - 1
|
|
||||||
"\x03\x03\x02\x01"+
|
|
||||||
"\x46"+ # inc esi
|
|
||||||
"\x47"+ # inc edi (end_search:)
|
|
||||||
"\x39\x37"+ # cmp [edi],esi
|
|
||||||
"\x75\xfb"+ # jnz 0xa (end_search)
|
|
||||||
"\x46"+ # inc esi
|
|
||||||
"\x4f"+ # dec edi (start_search:)
|
|
||||||
"\x39\x77\xfc"+ # cmp [edi-0x4],esi
|
|
||||||
"\x75\xfa"+ # jnz 0x10 (start_search)
|
|
||||||
"\xff\xe7" # jmp edi
|
|
||||||
|
|
||||||
assert_equal(s, Klass.searcher("\x04\x03\x02\x01"))
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
|
@ -1,23 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'rex/text'
|
|
||||||
require 'rex/assembly/nasm'
|
|
||||||
|
|
||||||
class Rex::Assembly::Nasm::UnitTest < ::Test::Unit::TestCase
|
|
||||||
|
|
||||||
Klass = Rex::Assembly::Nasm
|
|
||||||
|
|
||||||
def test_assemble
|
|
||||||
assert_equal("\x6a\x00", Klass.assemble("push byte 0x00"))
|
|
||||||
assert_equal("\xb2\xb4", Klass.assemble("mov dl, 0xb4"))
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_disassemble
|
|
||||||
assert_equal("00000000 31C0 xor eax,eax\n", Klass.disassemble("\x31\xc0"))
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
|
@ -1,45 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..'))
|
|
||||||
|
|
||||||
require 'rex/test'
|
|
||||||
require 'rex/exceptions'
|
|
||||||
require 'rex/encoder/ndr'
|
|
||||||
|
|
||||||
class Rex::Encoder::NDR::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
Klass = Rex::Encoder::NDR
|
|
||||||
|
|
||||||
def test_align
|
|
||||||
assert_equal(0, Klass.align('').length, 'align 0')
|
|
||||||
assert_equal(3, Klass.align('f').length, 'align 1')
|
|
||||||
assert_equal(2, Klass.align('fo').length, 'align 2')
|
|
||||||
assert_equal(1, Klass.align('foo').length, 'align 3')
|
|
||||||
assert_equal(0, Klass.align('fooo').length, 'align 4')
|
|
||||||
assert_equal(3, Klass.align('foooo').length, 'align 5')
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_numbers
|
|
||||||
assert_equal("\x0a\x00\x00\x00", Klass.long(10), 'long')
|
|
||||||
assert_equal("\x0a\x00", Klass.short(10), 'short')
|
|
||||||
assert_equal("\x0a", Klass.byte(10), 'byte')
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_conformant_array
|
|
||||||
assert_equal("\x05\x00\x00\x00aaaaa", Klass.UniConformantArray('aaaaa').slice(0,9), 'UniConformantArray')
|
|
||||||
assert_equal(12, Klass.UniConformantArray('aaaaa').length, 'UniConformantArray length')
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_string
|
|
||||||
assert_equal("\x06\x00\x00\x00" + "\x00\x00\x00\x00" + "\x06\x00\x00\x00" "aaaaa\x00", Klass.string('aaaaa').slice(0,4+4+4+6), 'string')
|
|
||||||
assert_equal(20, Klass.string('aaaaa').length, 'string length')
|
|
||||||
|
|
||||||
assert_equal("\x06\x00\x00\x00" + "\x00\x00\x00\x00" + "\x06\x00\x00\x00" "a\x00a\x00a\x00a\x00a\x00\x00\x00", Klass.wstring('aaaaa').slice(0,4+4+4+12), 'wstring')
|
|
||||||
assert_equal(24, Klass.wstring('aaaaa').length, 'wstring length')
|
|
||||||
|
|
||||||
assert_equal("\x02\x00\x00\x00" + "\x00\x00\x00\x00" + "\x02\x00\x00\x00" "aa\x00\x00", Klass.wstring_prebuilt('aa' + "\x00\x00"), 'wstring_prebuilt')
|
|
||||||
assert_equal(16, Klass.wstring_prebuilt('aa' + "\x00\x00").length, 'wstring_prebuilt length')
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
|
@ -1,30 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'rex/exceptions'
|
|
||||||
require 'rex/encoder/xdr'
|
|
||||||
|
|
||||||
class Rex::Encoder::XDR::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
def test_encode
|
|
||||||
assert_equal("\000\000\004\322", Rex::Encoder::XDR.encode_int(1234), 'encode_int')
|
|
||||||
assert_equal("\377\377\377\322", Rex::Encoder::XDR.encode_lchar(1234), 'encode_lchar')
|
|
||||||
assert_equal("\000\000\000\003abc\000", Rex::Encoder::XDR.encode_string('abc'), 'encode_string')
|
|
||||||
assert_equal("\000\000\000\003abc\000", Rex::Encoder::XDR.encode_string('abc', 4), 'encode_string with maxlen')
|
|
||||||
assert_raises(Rex::ArgumentError) {
|
|
||||||
Rex::Encoder::XDR.encode_string('abc', 2)
|
|
||||||
}
|
|
||||||
assert_equal("\000\000\000\003\000\000\000\001\000\000\000\002\000\000\000\003", Rex::Encoder::XDR.encode_varray([1,2,3]) {|i| Rex::Encoder::XDR.encode_int(i) }, 'encode_varray')
|
|
||||||
assert_equal("\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\001\000\000\000\003foo\000\000\000\000\003bar\000", Rex::Encoder::XDR.encode(0, [0, 1], "foo", ["bar", 4]), 'encode')
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_decode
|
|
||||||
assert_equal(1234, Rex::Encoder::XDR.decode_int!("\000\000\004\322"), 'decode_int!')
|
|
||||||
assert_equal('abc', Rex::Encoder::XDR.decode_string!("\000\000\000\003abc\000"), 'decode_string')
|
|
||||||
assert_equal([1,2,3], Rex::Encoder::XDR.decode_varray!("\000\000\000\003\000\000\000\001\000\000\000\002\000\000\000\003") { |i| Rex::Encoder::XDR.decode_int!(i) } , 'decode_varray!')
|
|
||||||
assert_equal(1234, Rex::Encoder::XDR.decode_lchar!("\377\377\377\322"), 'decode_lchar!')
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,13 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..'))
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..', 'dev', 'machinetest'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'rex/encoders/xor_dword_additive'
|
|
||||||
require 'rex/encoders/xor_dword.rb.ut'
|
|
||||||
|
|
||||||
class Rex::Encoders::XorDwordAdditive::UnitTest < Rex::Encoders::XorDword::UnitTest
|
|
||||||
Klass = Rex::Encoders::XorDwordAdditive
|
|
||||||
end
|
|
|
@ -1,22 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
|
|
||||||
|
|
||||||
require 'rex/encoding/xor/byte'
|
|
||||||
require 'rex/encoding/xor/generic.rb.ut'
|
|
||||||
|
|
||||||
#
|
|
||||||
# I suck because I want to inherit a test case, but this will
|
|
||||||
# also cause it to run the test case I'm inheriting, so this runs both the
|
|
||||||
# Byte and Generic tests, oh well for now...
|
|
||||||
#
|
|
||||||
|
|
||||||
module Rex::Encoding::Xor
|
|
||||||
class Byte::UnitTest < Generic::UnitTest
|
|
||||||
|
|
||||||
def enc
|
|
||||||
Byte
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,16 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
|
|
||||||
|
|
||||||
require 'rex/encoding/xor/dword'
|
|
||||||
require 'rex/encoding/xor/byte.rb.ut'
|
|
||||||
|
|
||||||
module Rex::Encoding::Xor
|
|
||||||
class Dword::UnitTest < Byte::UnitTest
|
|
||||||
|
|
||||||
def enc
|
|
||||||
Dword
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,16 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
|
|
||||||
|
|
||||||
require 'rex/encoding/xor/dword_additive'
|
|
||||||
require 'rex/encoding/xor/byte.rb.ut'
|
|
||||||
|
|
||||||
module Rex::Encoding::Xor
|
|
||||||
class DwordAdditive::UnitTest < Byte::UnitTest
|
|
||||||
|
|
||||||
def enc
|
|
||||||
DwordAdditive
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,121 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'rex/encoding/xor/generic'
|
|
||||||
|
|
||||||
module Rex::Encoding::Xor
|
|
||||||
|
|
||||||
class Generic::UnitTest < ::Test::Unit::TestCase
|
|
||||||
|
|
||||||
def enc
|
|
||||||
Generic
|
|
||||||
end
|
|
||||||
|
|
||||||
def hook_static_encode(data, key, expected)
|
|
||||||
if enc.keysize != 0 && key.length != enc.keysize
|
|
||||||
assert_raise(::ArgumentError) { enc.encode(data,key) }
|
|
||||||
else
|
|
||||||
assert_equal(enc.encode(data, key), [ expected, key ])
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_static_encode
|
|
||||||
# Test key of zero length
|
|
||||||
assert_raise(::ArgumentError) { enc.encode("\x00", "") }
|
|
||||||
|
|
||||||
# Test non-string key
|
|
||||||
assert_raise(::ArgumentError) { enc.encode("\x00\x01", 1) }
|
|
||||||
|
|
||||||
# some simple single byte tests with 0x00
|
|
||||||
30.times {
|
|
||||||
byte = rand(256).chr
|
|
||||||
hook_static_encode("\x00" * 3, byte, byte * 3)
|
|
||||||
}
|
|
||||||
|
|
||||||
# misc tests, see below
|
|
||||||
misc_tests.each { |test|
|
|
||||||
hook_static_encode(test[0], test[1], test[2])
|
|
||||||
}
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
#
|
|
||||||
# Misc (mostly) autogenerated tests, we need more with
|
|
||||||
# different keysizes!
|
|
||||||
#
|
|
||||||
|
|
||||||
def misc_tests
|
|
||||||
[
|
|
||||||
|
|
||||||
# a 3 byte key test
|
|
||||||
[
|
|
||||||
"\x54\x9a\x04\x02\x8f",
|
|
||||||
"\x6d\x4b\x3c",
|
|
||||||
"9\3218o\304"
|
|
||||||
],
|
|
||||||
|
|
||||||
# a 4 byte key test
|
|
||||||
[
|
|
||||||
"\312/\216e\265\301\323\026Y\315",
|
|
||||||
"m2{b",
|
|
||||||
"\247\035\365\a\330\363\250t4\377"
|
|
||||||
],
|
|
||||||
|
|
||||||
# randomly generated 2 byte key tests...
|
|
||||||
[
|
|
||||||
"\x82\x3f\xb4\x77\x55\x16\x4a\x56\x87\xad\x5b\xf5",
|
|
||||||
"\x33\xdb",
|
|
||||||
"\xb1\xe4\x87\xac\x66\xcd\x79\x8d\xb4\x76\x68\x2e"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"\x9c\xbd\xaa\x83\x8d\x7e\x76\xd9\x4b\xb2\x04\xd5\x2b\x58\x66",
|
|
||||||
"\xda\x10",
|
|
||||||
"\x46\xad\x70\x93\x57\x6e\xac\xc9\x91\xa2\xde\xc5\xf1\x48\xbc"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"\x7f\x3b\xfb\x3b\xce\x8c\xe8\x3d\x65\x40\x2d\x5a\x19",
|
|
||||||
"\x62\x28",
|
|
||||||
"\x1d\x13\x99\x13\xac\xa4\x8a\x15\x07\x68\x4f\x72\x7b"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"\xc8\xab\xa4\x56\xd5\xf0",
|
|
||||||
"\x1a\xd0",
|
|
||||||
"\xd2\x7b\xbe\x86\xcf\x20"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"\xcc\x5a\x84\xe0\x6c\x00\x7a\x20\xa0\xc9",
|
|
||||||
"\xe6\xb6",
|
|
||||||
"\x2a\xec\x62\x56\x8a\xb6\x9c\x96\x46\x7f"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"\x46\x96\x83\x1f\x6a\x79\xfe\xec\x24\xe0\xc3\x20\xe9\xa5\x3a\x76",
|
|
||||||
"\x36\x5e",
|
|
||||||
"\x70\xc8\xb5\x41\x5c\x27\xc8\xb2\x12\xbe\xf5\x7e\xdf\xfb\x0c\x28"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"\x74\x7c\xe9\x21\x30\x33\xb3\xe6\x77\x9e\x07\xbc\x6c\xee\xc5\x06",
|
|
||||||
"\x02\xa0",
|
|
||||||
"\x76\xdc\xeb\x81\x32\x93\xb1\x46\x75\x3e\x05\x1c\x6e\x4e\xc7\xa6"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"\x64\x8c\xc3\x41\x5d\xe5\x18\x36\xda\xc4\x86",
|
|
||||||
"\xe3\xb9",
|
|
||||||
"\x87\x35\x20\xf8\xbe\x5c\xfb\x8f\x39\x7d\x65"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"\xdb\xbb\xb2\x7c\xda\x1f\xd6\xa5\x34\x00\xad",
|
|
||||||
"\x20\xfc",
|
|
||||||
"\xfb\x47\x92\x80\xfa\xe3\xf6\x59\x14\xfc\x8d"
|
|
||||||
],
|
|
||||||
[
|
|
||||||
"\xc1\x2e\xfc\x7b\x98\x41\xec\xe3\x40\x98\x0b\xfd\x2c",
|
|
||||||
"\x4a\xd7",
|
|
||||||
"\x8b\xf9\xb6\xac\xd2\x96\xa6\x34\x0a\x4f\x41\x2a\x66"
|
|
||||||
]
|
|
||||||
]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,14 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
|
|
||||||
|
|
||||||
require 'rex/encoding/xor/word'
|
|
||||||
require 'rex/encoding/xor/byte.rb.ut'
|
|
||||||
|
|
||||||
class Rex::Encoding::Xor::Word::UnitTest < Rex::Encoding::Xor::Byte::UnitTest
|
|
||||||
|
|
||||||
def enc
|
|
||||||
Rex::Encoding::Xor::Word
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,45 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'rex/exceptions'
|
|
||||||
|
|
||||||
module Rex
|
|
||||||
module Exceptions
|
|
||||||
|
|
||||||
class UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
def test_exceptions
|
|
||||||
Rex.constants.each { |const|
|
|
||||||
mod = Rex.const_get(const)
|
|
||||||
|
|
||||||
if ((mod.kind_of?(Class) == false) ||
|
|
||||||
(mod.ancestors.include?(Rex::Exception) == false))
|
|
||||||
next
|
|
||||||
end
|
|
||||||
|
|
||||||
begin
|
|
||||||
raise mod.new
|
|
||||||
rescue ::ArgumentError
|
|
||||||
rescue mod => detail
|
|
||||||
assert_respond_to(detail, 'to_s', "#{mod} does not implement to_s")
|
|
||||||
assert_not_nil(detail.to_s, "invalid to_s")
|
|
||||||
end
|
|
||||||
}
|
|
||||||
|
|
||||||
# Test communication error detail strings
|
|
||||||
begin
|
|
||||||
raise ConnectionRefused.new('127.0.0.1', 4444)
|
|
||||||
rescue HostCommunicationError => detail
|
|
||||||
assert_match(/^The connection(.*)\(127.0.0.1:4444\)/, detail.to_s)
|
|
||||||
assert_equal('127.0.0.1', detail.host)
|
|
||||||
assert_equal(4444, detail.port)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,28 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'rex/exploitation/egghunter'
|
|
||||||
|
|
||||||
class Rex::Exploitation::Egghunter::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
Klass = Rex::Exploitation::Egghunter
|
|
||||||
|
|
||||||
def test_egghunter
|
|
||||||
payload = "\xcc" * 1023
|
|
||||||
|
|
||||||
r = Klass.new('bogus')
|
|
||||||
assert_nil(r.generate(payload))
|
|
||||||
|
|
||||||
r = Klass.new('win')
|
|
||||||
assert_nil(r.generate(payload))
|
|
||||||
|
|
||||||
r = Klass.new('win', ARCH_X86)
|
|
||||||
assert_not_nil(r.generate(payload))
|
|
||||||
assert_not_nil(r.generate(payload)[0])
|
|
||||||
assert_not_nil(r.generate(payload)[1])
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
|
@ -1,27 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'rex/exploitation/omelet'
|
|
||||||
|
|
||||||
class Rex::Exploitation::Omelet::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
Klass = Rex::Exploitation::Omelet
|
|
||||||
|
|
||||||
def test_generate
|
|
||||||
x = Klass.new('win', ARCH_X86)
|
|
||||||
|
|
||||||
om = x.generate("\xcc" * 1024, '', {
|
|
||||||
#:eggsize => 31336, # default: 123
|
|
||||||
#:eggtag => "b00", # default: 00w
|
|
||||||
#:searchforward => false, # default: true
|
|
||||||
#:reset => true, # default: false
|
|
||||||
#:startreg => "EBP", # default: none
|
|
||||||
:checksum => true # default: false
|
|
||||||
})
|
|
||||||
# XXX: TODO: assertions!
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
|
@ -1,280 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'rex/exploitation/opcodedb'
|
|
||||||
require 'rex/socket'
|
|
||||||
|
|
||||||
class Rex::Exploitation::OpcodeDb::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
Klass = Rex::Exploitation::OpcodeDb::Client
|
|
||||||
SrvPort = 60000
|
|
||||||
|
|
||||||
def test_meta_types
|
|
||||||
srv_cli
|
|
||||||
|
|
||||||
begin
|
|
||||||
proc_req_resp(%q{<Array><Hash><Entry name="id">1</Entry><Entry name="name">foo</Entry></Hash><Hash><Entry name="id">2</Entry><Entry name="name">dog</Entry></Hash></Array>})
|
|
||||||
|
|
||||||
mt = @r.meta_types
|
|
||||||
|
|
||||||
assert_kind_of(Array, mt)
|
|
||||||
assert_equal(2, mt.length)
|
|
||||||
assert_equal(1, mt[0].id)
|
|
||||||
assert_equal("foo", mt[0].name)
|
|
||||||
assert_equal(2, mt[1].id)
|
|
||||||
assert_equal("dog", mt[1].name)
|
|
||||||
ensure
|
|
||||||
@s.close
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_groups
|
|
||||||
srv_cli
|
|
||||||
|
|
||||||
begin
|
|
||||||
proc_req_resp(%q{<Array><Hash><Entry name="id">47</Entry><Entry name="name">foo</Entry></Hash><Hash><Entry name="id">2</Entry><Entry name="name">dog</Entry></Hash></Array>})
|
|
||||||
|
|
||||||
mt = @r.groups
|
|
||||||
|
|
||||||
assert_kind_of(Array, mt)
|
|
||||||
assert_equal(2, mt.length)
|
|
||||||
assert_equal(47, mt[0].id)
|
|
||||||
assert_equal("foo", mt[0].name)
|
|
||||||
assert_equal(2, mt[1].id)
|
|
||||||
assert_equal("dog", mt[1].name)
|
|
||||||
ensure
|
|
||||||
@s.close
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_platforms
|
|
||||||
srv_cli
|
|
||||||
|
|
||||||
begin
|
|
||||||
proc_req_resp(%q{<Array><Hash><Entry name="id">12</Entry><Entry name="name">Windows XP SP2</Entry><Entry name="desc">Windows Coolness</Entry><Entry name="maj_ver">5</Entry><Entry name="min_ver">1</Entry><Entry name="maj_patch_level">2</Entry><Entry name="min_patch_level">0</Entry><Entry name="modules">10</Entry></Hash></Array>})
|
|
||||||
|
|
||||||
osv = @r.platforms
|
|
||||||
|
|
||||||
assert_kind_of(Array, osv)
|
|
||||||
assert_equal(1, osv.length)
|
|
||||||
assert_equal(12, osv[0].id)
|
|
||||||
assert_equal("Windows XP SP2", osv[0].name)
|
|
||||||
assert_equal("Windows Coolness", osv[0].desc)
|
|
||||||
assert_equal(5, osv[0].maj_ver)
|
|
||||||
assert_equal(1, osv[0].min_ver)
|
|
||||||
assert_equal(2, osv[0].maj_patch_level)
|
|
||||||
assert_equal(0, osv[0].min_patch_level)
|
|
||||||
assert_equal(10, osv[0].modules)
|
|
||||||
ensure
|
|
||||||
@s.close
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_modules
|
|
||||||
srv_cli
|
|
||||||
|
|
||||||
begin
|
|
||||||
proc_req_resp(%q{<Array><Hash>
|
|
||||||
<Entry name="id">1</Entry>
|
|
||||||
<Entry name="name">kernel32.dll</Entry>
|
|
||||||
<Entry name="locale">
|
|
||||||
<Hash>
|
|
||||||
<Entry name="id">4</Entry>
|
|
||||||
<Entry name="name">English</Entry>
|
|
||||||
</Hash>
|
|
||||||
</Entry>
|
|
||||||
<Entry name="maj_maj_ver">4</Entry>
|
|
||||||
<Entry name="maj_min_ver">100</Entry>
|
|
||||||
<Entry name="min_maj_ver">2</Entry>
|
|
||||||
<Entry name="min_min_ver">7</Entry>
|
|
||||||
<Entry name="timestamp">403242822</Entry>
|
|
||||||
<Entry name="base_address">100000000</Entry>
|
|
||||||
<Entry name="image_size">40000</Entry>
|
|
||||||
<Entry name="segments">
|
|
||||||
<Array>
|
|
||||||
<Hash>
|
|
||||||
<Entry name="type">text</Entry>
|
|
||||||
<Entry name="base_address">3228094</Entry>
|
|
||||||
<Entry name="segment_size">4000</Entry>
|
|
||||||
<Entry name="writable">true</Entry>
|
|
||||||
<Entry name="readable">true</Entry>
|
|
||||||
<Entry name="executable">false</Entry>
|
|
||||||
</Hash>
|
|
||||||
</Array>
|
|
||||||
</Entry>
|
|
||||||
<Entry name="imports">
|
|
||||||
<Array>
|
|
||||||
<Hash>
|
|
||||||
<Entry name="name">FoolFunction</Entry>
|
|
||||||
<Entry name="address">3242344</Entry>
|
|
||||||
<Entry name="ordinal">5</Entry>
|
|
||||||
</Hash>
|
|
||||||
</Array>
|
|
||||||
</Entry>
|
|
||||||
<Entry name="exports">
|
|
||||||
<Array>
|
|
||||||
<Hash>
|
|
||||||
<Entry name="name">FoolFunctionExport</Entry>
|
|
||||||
<Entry name="address">32423445</Entry>
|
|
||||||
<Entry name="ordinal">51</Entry>
|
|
||||||
</Hash>
|
|
||||||
</Array>
|
|
||||||
</Entry>
|
|
||||||
</Hash></Array>})
|
|
||||||
|
|
||||||
m = @r.modules
|
|
||||||
|
|
||||||
assert_kind_of(Array, m)
|
|
||||||
assert_equal(1, m[0].id)
|
|
||||||
assert_equal("kernel32.dll", m[0].name)
|
|
||||||
assert_equal(4, m[0].locale.id)
|
|
||||||
assert_equal("English", m[0].locale.name)
|
|
||||||
assert_equal(4, m[0].maj_maj_ver)
|
|
||||||
assert_equal(100, m[0].maj_min_ver)
|
|
||||||
assert_equal(2, m[0].min_maj_ver)
|
|
||||||
assert_equal(7, m[0].min_min_ver)
|
|
||||||
assert_equal(403242822, m[0].timestamp.to_i)
|
|
||||||
assert_equal(100000000, m[0].base_address)
|
|
||||||
assert_equal(40000, m[0].image_size)
|
|
||||||
assert_kind_of(Array, m[0].segments)
|
|
||||||
assert_equal("text", m[0].segments[0].type)
|
|
||||||
assert_equal(3228094, m[0].segments[0].base_address)
|
|
||||||
assert_equal(4000, m[0].segments[0].size)
|
|
||||||
assert_equal(true, m[0].segments[0].writable)
|
|
||||||
assert_equal(true, m[0].segments[0].readable)
|
|
||||||
assert_equal(false, m[0].segments[0].executable)
|
|
||||||
assert_kind_of(Array, m[0].imports)
|
|
||||||
assert_equal("FoolFunction", m[0].imports[0].name)
|
|
||||||
assert_equal(3242344, m[0].imports[0].address)
|
|
||||||
assert_equal(5, m[0].imports[0].ordinal)
|
|
||||||
assert_kind_of(Array, m[0].exports)
|
|
||||||
assert_equal("FoolFunctionExport", m[0].exports[0].name)
|
|
||||||
assert_equal(32423445, m[0].exports[0].address)
|
|
||||||
assert_equal(51, m[0].exports[0].ordinal)
|
|
||||||
ensure
|
|
||||||
@s.close
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_locales
|
|
||||||
srv_cli
|
|
||||||
|
|
||||||
begin
|
|
||||||
proc_req_resp(%q{<Array><Hash>
|
|
||||||
<Entry name="id">4</Entry>
|
|
||||||
<Entry name="name">English</Entry>
|
|
||||||
</Hash>
|
|
||||||
<Hash>
|
|
||||||
<Entry name="id">5</Entry>
|
|
||||||
<Entry name="name">French</Entry>
|
|
||||||
</Hash></Array>})
|
|
||||||
|
|
||||||
l = @r.locales
|
|
||||||
|
|
||||||
assert_kind_of(Array, l)
|
|
||||||
assert_equal(2, l.length)
|
|
||||||
assert_equal(4, l[0].id)
|
|
||||||
assert_equal("English", l[0].name)
|
|
||||||
assert_equal(5, l[1].id)
|
|
||||||
assert_equal("French", l[1].name)
|
|
||||||
ensure
|
|
||||||
@s.close
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_search
|
|
||||||
srv_cli
|
|
||||||
|
|
||||||
begin
|
|
||||||
proc_req_resp(%q{
|
|
||||||
<Array>
|
|
||||||
<Hash>
|
|
||||||
<Entry name="id">400</Entry>
|
|
||||||
<Entry name="address">34242324</Entry>
|
|
||||||
<Entry name="type">
|
|
||||||
<Hash>
|
|
||||||
<Entry name="id">4</Entry>
|
|
||||||
<Entry name="name">jmp esp</Entry>
|
|
||||||
<Entry name="group">
|
|
||||||
<Hash>
|
|
||||||
<Entry name="id">40</Entry>
|
|
||||||
<Entry name="name">reg</Entry>
|
|
||||||
</Hash>
|
|
||||||
</Entry>
|
|
||||||
</Hash>
|
|
||||||
</Entry>
|
|
||||||
</Hash>
|
|
||||||
</Array>})
|
|
||||||
|
|
||||||
o = @r.search
|
|
||||||
|
|
||||||
assert_kind_of(Array, o)
|
|
||||||
assert_equal(1, o.length)
|
|
||||||
assert_equal(400, o[0].id)
|
|
||||||
assert_equal(34242324, o[0].address)
|
|
||||||
assert_equal(4, o[0].type.id)
|
|
||||||
assert_equal("jmp esp", o[0].type.name)
|
|
||||||
assert_equal(40, o[0].group.id)
|
|
||||||
assert_equal("reg", o[0].group.name)
|
|
||||||
ensure
|
|
||||||
@s.close
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_statistics
|
|
||||||
srv_cli
|
|
||||||
|
|
||||||
begin
|
|
||||||
proc_req_resp(%q{
|
|
||||||
<Hash>
|
|
||||||
<Entry name="modules">40</Entry>
|
|
||||||
<Entry name="opcodes">50</Entry>
|
|
||||||
<Entry name="opcode_types">60</Entry>
|
|
||||||
<Entry name="platforms">70</Entry>
|
|
||||||
<Entry name="architectures">80</Entry>
|
|
||||||
<Entry name="module_segments">90</Entry>
|
|
||||||
<Entry name="module_imports">100</Entry>
|
|
||||||
<Entry name="module_exports">110</Entry>
|
|
||||||
<Entry name="last_update">120</Entry>
|
|
||||||
</Hash>
|
|
||||||
})
|
|
||||||
|
|
||||||
s = @r.statistics
|
|
||||||
|
|
||||||
assert_equal(40, s.modules)
|
|
||||||
assert_equal(50, s.opcodes)
|
|
||||||
assert_equal(60, s.opcode_types)
|
|
||||||
assert_equal(70, s.platforms)
|
|
||||||
assert_equal(80, s.architectures)
|
|
||||||
assert_equal(90, s.module_segments)
|
|
||||||
assert_equal(100, s.module_imports)
|
|
||||||
assert_equal(110, s.module_exports)
|
|
||||||
assert_equal(120, s.last_update.to_i)
|
|
||||||
ensure
|
|
||||||
@s.close
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
protected
|
|
||||||
|
|
||||||
def srv_cli
|
|
||||||
@r = Klass.new('127.0.0.1', SrvPort)
|
|
||||||
@s = Rex::Socket::TcpServer.create(
|
|
||||||
'LocalHost' => '127.0.0.1',
|
|
||||||
'LocalPort' => SrvPort)
|
|
||||||
end
|
|
||||||
|
|
||||||
def proc_req_resp(buf)
|
|
||||||
thr = Thread.new {
|
|
||||||
cli = @s.accept
|
|
||||||
@buffer = cli.get
|
|
||||||
|
|
||||||
cli.put("HTTP/1.0 200 OK\r\nConnection: close\r\n\r\n#{buf}")
|
|
||||||
cli.close
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
|
@ -1,20 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'rex/exploitation/seh'
|
|
||||||
|
|
||||||
class Rex::Exploitation::Seh::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
Klass = Rex::Exploitation::Seh
|
|
||||||
|
|
||||||
def test_static_record
|
|
||||||
r = Klass.new
|
|
||||||
record = r.generate_static_seh_record(0x41414141)
|
|
||||||
assert_equal("\xeb\x06", record[0, 2])
|
|
||||||
assert_equal("\x41\x41\x41\x41", record[4, 4])
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
|
@ -1,17 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'rex/file'
|
|
||||||
|
|
||||||
class Rex::FileUtils::UnitTest < ::Test::Unit::TestCase
|
|
||||||
Klass = Rex::FileUtils
|
|
||||||
|
|
||||||
def test_find_full_path
|
|
||||||
assert_not_nil(Klass.find_full_path("ls"))
|
|
||||||
assert_nil(Klass.find_full_path("cookie monster cake"))
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
|
@ -1,135 +0,0 @@
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'rex/socket'
|
|
||||||
require 'rex/io/ring_buffer'
|
|
||||||
|
|
||||||
#
|
|
||||||
# TODO: Mock up the socket so this test doesn't take so long
|
|
||||||
#
|
|
||||||
class Rex::IO::RingBuffer::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
def setup
|
|
||||||
server = Rex::Socket.create_tcp_server('LocalPort' => 0)
|
|
||||||
lport = server.getsockname[2]
|
|
||||||
@client = Rex::Socket.create_tcp('PeerHost' => '127.0.0.1', 'PeerPort' => lport)
|
|
||||||
conn = server.accept
|
|
||||||
#server.close
|
|
||||||
|
|
||||||
@r = Rex::IO::RingBuffer.new(conn, {:size => 64})
|
|
||||||
@r.start_monitor
|
|
||||||
end
|
|
||||||
|
|
||||||
def teardown
|
|
||||||
begin
|
|
||||||
@client.close
|
|
||||||
@r.stop_monitor
|
|
||||||
rescue ::Exception
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_single_read_data
|
|
||||||
@client.put("123")
|
|
||||||
@r.wait(0)
|
|
||||||
s,d = @r.read_data
|
|
||||||
|
|
||||||
assert_equal("123", d)
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_sequential_read_data
|
|
||||||
@r.clear_data
|
|
||||||
|
|
||||||
s = nil
|
|
||||||
0.upto(10) do |num|
|
|
||||||
@client.put(num.to_s)
|
|
||||||
@r.wait(s)
|
|
||||||
s,d = @r.read_data(s)
|
|
||||||
assert_equal(num.to_s, d)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_wrap
|
|
||||||
@r.clear_data
|
|
||||||
0.upto(@r.size - 1) {
|
|
||||||
@client.put("a")
|
|
||||||
# Need to sleep so the socket doesn't get all the data in one read()
|
|
||||||
sleep 0.05
|
|
||||||
}
|
|
||||||
s,d = @r.read_data
|
|
||||||
|
|
||||||
@client.put("b")
|
|
||||||
sleep 0.01
|
|
||||||
s,d = @r.read_data(s)
|
|
||||||
|
|
||||||
assert_equal("b", d)
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
=begin
|
|
||||||
client.put("4")
|
|
||||||
client.put("5")
|
|
||||||
client.put("6")
|
|
||||||
s,d = r.read_data(s)
|
|
||||||
|
|
||||||
client.put("7")
|
|
||||||
client.put("8")
|
|
||||||
client.put("9")
|
|
||||||
s,d = r.read_data(s)
|
|
||||||
|
|
||||||
client.put("0")
|
|
||||||
s,d = r.read_data(s)
|
|
||||||
|
|
||||||
test_counter = 11
|
|
||||||
1.upto(100) do
|
|
||||||
client.put( "X" )
|
|
||||||
test_counter += 1
|
|
||||||
end
|
|
||||||
|
|
||||||
sleep(1)
|
|
||||||
|
|
||||||
s,d = r.read_data
|
|
||||||
p s
|
|
||||||
p d
|
|
||||||
|
|
||||||
fdata = ''
|
|
||||||
File.open("/bin/ls", "rb") do |fd|
|
|
||||||
fdata = fd.read(fd.stat.size)
|
|
||||||
fdata = fdata * 10
|
|
||||||
client.put(fdata)
|
|
||||||
end
|
|
||||||
|
|
||||||
sleep(1)
|
|
||||||
|
|
||||||
s,vdata = r.read_data(s)
|
|
||||||
|
|
||||||
if vdata != fdata
|
|
||||||
puts "DATA FAILED"
|
|
||||||
else
|
|
||||||
puts "DATA VERIFIED"
|
|
||||||
end
|
|
||||||
|
|
||||||
r.clear_data
|
|
||||||
|
|
||||||
a = r.create_stream
|
|
||||||
b = r.create_stream
|
|
||||||
|
|
||||||
client.put("ABC123")
|
|
||||||
sleep(1)
|
|
||||||
|
|
||||||
p a.read
|
|
||||||
p b.read
|
|
||||||
|
|
||||||
client.put("$$$$$$")
|
|
||||||
sleep(1)
|
|
||||||
|
|
||||||
p a.read
|
|
||||||
p b.read
|
|
||||||
|
|
||||||
c = r.create_stream
|
|
||||||
p c.read
|
|
||||||
|
|
||||||
end
|
|
||||||
=end
|
|
|
@ -1,24 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'rex/nop/opty2'
|
|
||||||
|
|
||||||
class Rex::Nop::Opty2::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
Klass = Rex::Nop::Opty2
|
|
||||||
|
|
||||||
# TODO: machine test
|
|
||||||
def test_opty2
|
|
||||||
o = Klass.new
|
|
||||||
|
|
||||||
100.times {
|
|
||||||
s = o.generate_sled(100)
|
|
||||||
|
|
||||||
assert_equal(s.length, 100)
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
|
@ -1,68 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'rex/parser/arguments'
|
|
||||||
|
|
||||||
class Rex::Parser::Arguments::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
def test_parse
|
|
||||||
args =
|
|
||||||
[
|
|
||||||
"-b",
|
|
||||||
"foo",
|
|
||||||
"-c",
|
|
||||||
"-f",
|
|
||||||
"-g",
|
|
||||||
"arg",
|
|
||||||
"none"
|
|
||||||
]
|
|
||||||
|
|
||||||
b = nil
|
|
||||||
c = false
|
|
||||||
f = false
|
|
||||||
g = nil
|
|
||||||
none = nil
|
|
||||||
|
|
||||||
Rex::Parser::Arguments.new(
|
|
||||||
'-b' => [ true, "bee" ],
|
|
||||||
'-c' => [ false, "cee" ],
|
|
||||||
'-f' => [ false, "eff" ],
|
|
||||||
'-g' => [ true, "gee" ]).parse(args) { |opt, idx, val|
|
|
||||||
case opt
|
|
||||||
when nil
|
|
||||||
none = val
|
|
||||||
when '-b'
|
|
||||||
b = val
|
|
||||||
when '-c'
|
|
||||||
c = true
|
|
||||||
when '-f'
|
|
||||||
f = true
|
|
||||||
when '-g'
|
|
||||||
g = val
|
|
||||||
end
|
|
||||||
}
|
|
||||||
|
|
||||||
assert_equal(b, "foo")
|
|
||||||
assert_equal(c, true)
|
|
||||||
assert_equal(f, true)
|
|
||||||
assert_equal(g, "arg")
|
|
||||||
assert_equal(none, "none")
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_from_s
|
|
||||||
args = Rex::Parser::Arguments.from_s(
|
|
||||||
"this is a test \"of the emergency pimping\" system \\\"buh lee dat\\\" yup")
|
|
||||||
|
|
||||||
assert_equal(args[0], "this")
|
|
||||||
assert_equal(args[3], "test")
|
|
||||||
assert_equal(args[4], "of the emergency pimping")
|
|
||||||
assert_equal(args[5], "system")
|
|
||||||
assert_equal(args[6], "\"buh")
|
|
||||||
assert_equal(args[8], "dat\"")
|
|
||||||
assert_equal(args[9], "yup")
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
|
@ -1,30 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'rex/parser/ini'
|
|
||||||
|
|
||||||
class Rex::Parser::Ini::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
Klass = Rex::Parser::Ini
|
|
||||||
TestIni = <<END
|
|
||||||
[group1]
|
|
||||||
cat=dog
|
|
||||||
bird=frog
|
|
||||||
|
|
||||||
[group2]
|
|
||||||
salad=cake
|
|
||||||
END
|
|
||||||
|
|
||||||
def test_parse
|
|
||||||
ini = Klass.from_s(TestIni)
|
|
||||||
|
|
||||||
assert_equal('dog', ini['group1']['cat'])
|
|
||||||
assert_equal('frog', ini['group1']['bird'])
|
|
||||||
assert_equal('cake', ini['group2']['salad'])
|
|
||||||
assert_equal(TestIni + "\n", ini.to_s)
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
|
@ -1,39 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..','..','..','..'))
|
|
||||||
|
|
||||||
require 'rex/post/meterpreter/extensions/stdapi/railgun/api_constants'
|
|
||||||
require 'rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager'
|
|
||||||
require 'rex/text'
|
|
||||||
require 'test/unit'
|
|
||||||
|
|
||||||
module Rex
|
|
||||||
module Post
|
|
||||||
module Meterpreter
|
|
||||||
module Extensions
|
|
||||||
module Stdapi
|
|
||||||
module Railgun
|
|
||||||
class ApiConstants::UnitTest < Test::Unit::TestCase
|
|
||||||
def test_manager
|
|
||||||
const_manager = ApiConstants.manager
|
|
||||||
|
|
||||||
assert_equal(0, const_manager.parse('SUCCESS'),
|
|
||||||
"ApiConstants.manager should return a functional constant manager for WinAPI constants")
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_add_constants
|
|
||||||
const_manager = WinConstManager.new
|
|
||||||
|
|
||||||
ApiConstants.add_constants(const_manager)
|
|
||||||
|
|
||||||
assert_equal(0, const_manager.parse('SUCCESS'),
|
|
||||||
"ApiConstants.add_constants should have added WinAPI constants to given constant manager")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,37 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..','..','..','..','..', 'lib'))
|
|
||||||
|
|
||||||
require 'rex/post/meterpreter/extensions/stdapi/railgun/buffer_item'
|
|
||||||
require 'test/unit'
|
|
||||||
|
|
||||||
module Rex
|
|
||||||
module Post
|
|
||||||
module Meterpreter
|
|
||||||
module Extensions
|
|
||||||
module Stdapi
|
|
||||||
module Railgun
|
|
||||||
class BufferItem::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
def test_initialization
|
|
||||||
target_belongs_to_param_n = 1
|
|
||||||
target_addr = 232323
|
|
||||||
target_length_in_bytes = 4
|
|
||||||
target_datatype = "DWORD"
|
|
||||||
|
|
||||||
item = BufferItem.new(target_belongs_to_param_n, target_addr,
|
|
||||||
target_length_in_bytes, target_datatype)
|
|
||||||
|
|
||||||
assert_equal(target_belongs_to_param_n, item.belongs_to_param_n)
|
|
||||||
assert_equal(target_addr, item.addr)
|
|
||||||
assert_equal(target_length_in_bytes, item.length_in_bytes)
|
|
||||||
assert_equal(target_datatype, item.datatype)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,52 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..','..','..','..','..', 'lib'))
|
|
||||||
|
|
||||||
require 'rex/post/meterpreter/extensions/stdapi/railgun/dll'
|
|
||||||
require 'rex/post/meterpreter/extensions/stdapi/railgun/mock_magic'
|
|
||||||
require 'test/unit'
|
|
||||||
|
|
||||||
module Rex
|
|
||||||
module Post
|
|
||||||
module Meterpreter
|
|
||||||
module Extensions
|
|
||||||
module Stdapi
|
|
||||||
module Railgun
|
|
||||||
class DLL::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
include MockMagic
|
|
||||||
|
|
||||||
def test_add_function
|
|
||||||
mock_function_descriptions.each do |func|
|
|
||||||
dll = DLL.new(func[:dll_name], nil)
|
|
||||||
dll.add_function(func[:name], func[:return_type], func[:params])
|
|
||||||
|
|
||||||
assert(dll.functions.has_key?(func[:name]),
|
|
||||||
"add_function should expand the list of available functions")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_call_function
|
|
||||||
mock_function_descriptions.each do |func|
|
|
||||||
client = make_mock_client(func[:platform], func[:request_to_client], func[:response_from_client])
|
|
||||||
dll = DLL.new(func[:dll_name], nil)
|
|
||||||
|
|
||||||
dll.add_function(func[:name], func[:return_type], func[:params])
|
|
||||||
|
|
||||||
actual_returned_hash = dll.call_function(func[:name].to_sym, func[:ruby_args], client)
|
|
||||||
|
|
||||||
assert(func[:returned_hash].has_key?('GetLastError'),
|
|
||||||
"process_function_call should add the result of GetLastError to the key GetLastError")
|
|
||||||
|
|
||||||
assert_equal(func[:returned_hash], actual_returned_hash,
|
|
||||||
"process_function_call convert function result to a ruby hash")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,43 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..','..','..','..','..', 'lib'))
|
|
||||||
|
|
||||||
require 'rex/post/meterpreter/extensions/stdapi/railgun/dll_function'
|
|
||||||
require 'test/unit'
|
|
||||||
|
|
||||||
module Rex
|
|
||||||
module Post
|
|
||||||
module Meterpreter
|
|
||||||
module Extensions
|
|
||||||
module Stdapi
|
|
||||||
module Railgun
|
|
||||||
class DLLFunction::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
VALID_RETURN_TYPE = 'DWORD'
|
|
||||||
NON_RETURN_DATATYPE = 'INVALID_RETURN_TYPE'
|
|
||||||
|
|
||||||
VALID_DIRECTION = 'out'
|
|
||||||
UNKNOWN_DIRECTION = 'unknown'
|
|
||||||
|
|
||||||
VALID_DATATYPE = 'PBLOB'
|
|
||||||
UNKNOWN_DATATYPE = 'UNKNOWN_DATATYPE'
|
|
||||||
|
|
||||||
def test_initialize
|
|
||||||
# TODO: haven't gotten around to writing this yet. Feel free to
|
|
||||||
# skip("incomplete test coverage")
|
|
||||||
#
|
|
||||||
# assert_nothing_raised("valid initialization should not raise") do
|
|
||||||
# end
|
|
||||||
#
|
|
||||||
# assert_raised(ArgumentError, "check_type_exists should raise ArgumentError on unknown datatypes") do
|
|
||||||
# end
|
|
||||||
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,128 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..','..','..','..','..', 'lib'))
|
|
||||||
|
|
||||||
require 'rex/post/meterpreter/extensions/stdapi/railgun/dll_helper'
|
|
||||||
require 'rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager'
|
|
||||||
require 'rex/text'
|
|
||||||
require 'test/unit'
|
|
||||||
|
|
||||||
module Rex
|
|
||||||
module Post
|
|
||||||
module Meterpreter
|
|
||||||
module Extensions
|
|
||||||
module Stdapi
|
|
||||||
module Railgun
|
|
||||||
class DLLHelper::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
###
|
|
||||||
# We will test against this instance of DLLHelper (a module)
|
|
||||||
#
|
|
||||||
# We freeze the instance and make the reference constant to ensure consistency
|
|
||||||
##
|
|
||||||
TEST_DLL_HELPER = Object.new.extend(DLLHelper).freeze
|
|
||||||
|
|
||||||
def test_str_to_ascii_z
|
|
||||||
original_string = '23 Skidoo!'
|
|
||||||
|
|
||||||
# converts ruby string to zero-terminated ASCII string
|
|
||||||
zero_terminated_ascii_attempt = TEST_DLL_HELPER.str_to_ascii_z(original_string)
|
|
||||||
|
|
||||||
assert(zero_terminated_ascii_attempt =~ /\x00$/,
|
|
||||||
"str_to_ascii_z should result in a 0 terminated string")
|
|
||||||
|
|
||||||
assert(zero_terminated_ascii_attempt =~ /^#{original_string}/,
|
|
||||||
"str_to_ascii_z should still start with original string")
|
|
||||||
|
|
||||||
assert_equal(original_string.length + 1, zero_terminated_ascii_attempt.length,
|
|
||||||
"str_to_ascii_z should have length of original pluss room for a terminal 0")
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_asciiz_to_str
|
|
||||||
target_string = '23 Skidoo!'
|
|
||||||
post_zero_noise = 'Loud noises!'
|
|
||||||
zero_terminated_string = target_string + "\x00" + post_zero_noise
|
|
||||||
|
|
||||||
actual_string = TEST_DLL_HELPER.asciiz_to_str(zero_terminated_string)
|
|
||||||
|
|
||||||
assert(actual_string =~ /^#{target_string}/,
|
|
||||||
"asciiz_to_str should preserve string before zero")
|
|
||||||
|
|
||||||
assert(actual_string !~ /#{post_zero_noise}$/,
|
|
||||||
"asciiz_to_str should ignore characters after zero")
|
|
||||||
|
|
||||||
assert_equal(target_string, actual_string,
|
|
||||||
"asciiz_to_str should only return the contents of the string before (exclusive) the zero")
|
|
||||||
|
|
||||||
assert_equal(target_string, TEST_DLL_HELPER.asciiz_to_str(target_string),
|
|
||||||
"asciiz_to_str should return input verbatim should that input not be zero-terminated")
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_str_to_uni_z
|
|
||||||
ruby_string = "If I were a rich man..."
|
|
||||||
|
|
||||||
target_zero_terminated_unicode = Rex::Text.to_unicode(ruby_string) + "\x00\x00"
|
|
||||||
actual_zero_terminated_unicode = TEST_DLL_HELPER.str_to_uni_z(ruby_string)
|
|
||||||
|
|
||||||
assert(actual_zero_terminated_unicode =~ /\x00\x00$/,
|
|
||||||
"str_to_uni_z should result in a double-zero terminated string")
|
|
||||||
|
|
||||||
assert_equal(target_zero_terminated_unicode, actual_zero_terminated_unicode,
|
|
||||||
"str_to_uni_z should convert ruby string to zero-terminated WCHAR string")
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_uniz_to_str
|
|
||||||
target_string = 'Foo bar baz'
|
|
||||||
|
|
||||||
zero_terminated_unicode = Rex::Text.to_unicode(target_string) + "\x00\x00"
|
|
||||||
|
|
||||||
assert_equal(target_string, TEST_DLL_HELPER.uniz_to_str(zero_terminated_unicode),
|
|
||||||
'uniz_to_str should convert 0-terminated UTF16 to ruby string')
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_assemble_buffer
|
|
||||||
# TODO: provide test coverage
|
|
||||||
#skip("Currently DLLHelper.assemble_buffer does not have coverage")
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_param_to_number
|
|
||||||
consts_manager = WinConstManager.new
|
|
||||||
|
|
||||||
x_key = 'X'
|
|
||||||
x_value = 23
|
|
||||||
|
|
||||||
y_key = 'Y'
|
|
||||||
y_value = 5
|
|
||||||
|
|
||||||
logical_or = x_key + '|' + y_key
|
|
||||||
target_result_of_logical_or = x_value | y_value
|
|
||||||
|
|
||||||
consts_manager.add_const(y_key, y_value)
|
|
||||||
consts_manager.add_const(x_key, x_value)
|
|
||||||
|
|
||||||
assert_equal(x_value, TEST_DLL_HELPER.param_to_number(x_key, consts_manager),
|
|
||||||
"param_to_number should return the appropriate value for a given constant")
|
|
||||||
|
|
||||||
assert_equal(y_value, TEST_DLL_HELPER.param_to_number(y_key, consts_manager),
|
|
||||||
"param_to_number should return the appropriate value for a given constant")
|
|
||||||
|
|
||||||
assert_equal(0, TEST_DLL_HELPER.param_to_number(nil, consts_manager),
|
|
||||||
"param_to_number should return zero when given nil")
|
|
||||||
|
|
||||||
assert_equal(target_result_of_logical_or, TEST_DLL_HELPER.param_to_number(logical_or, consts_manager),
|
|
||||||
"param_to_number should perform an OR should the input be in the form '#{logical_or}'")
|
|
||||||
|
|
||||||
assert_raise(ArgumentError, 'param_to_number should raise an error when a given key does not exist') do
|
|
||||||
TEST_DLL_HELPER.param_to_number('DOESNT_EXIST', consts_manager)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,64 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..','..','..','..','..', 'lib'))
|
|
||||||
|
|
||||||
require 'rex/post/meterpreter/extensions/stdapi/railgun/dll'
|
|
||||||
require 'rex/post/meterpreter/extensions/stdapi/railgun/dll_wrapper'
|
|
||||||
require 'rex/post/meterpreter/extensions/stdapi/railgun/mock_magic'
|
|
||||||
require 'test/unit'
|
|
||||||
|
|
||||||
module Rex
|
|
||||||
module Post
|
|
||||||
module Meterpreter
|
|
||||||
module Extensions
|
|
||||||
module Stdapi
|
|
||||||
module Railgun
|
|
||||||
class DLLWrapper::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
include MockMagic
|
|
||||||
|
|
||||||
def test_functions
|
|
||||||
mock_function_descriptions.each do |func|
|
|
||||||
client = make_mock_client(func[:platform], func[:request_to_client], func[:response_from_client])
|
|
||||||
dll = DLL.new(func[:dll_name], client)
|
|
||||||
|
|
||||||
dll_wrapper = DLLWrapper.new(dll, client)
|
|
||||||
|
|
||||||
# This represents how people check if a function doesn't exist
|
|
||||||
assert(!dll_wrapper.functions[func[:name]], 'Function non-existence can be chucked via .functions')
|
|
||||||
|
|
||||||
dll.add_function(func[:name], func[:return_type], func[:params])
|
|
||||||
|
|
||||||
# This represents how people check if a function exist
|
|
||||||
assert(dll_wrapper.functions[func[:name]], 'Function existence can be chucked via .functions')
|
|
||||||
|
|
||||||
actual_returned_hash = dll_wrapper.send(:method_missing, func[:name].to_sym, *func[:ruby_args])
|
|
||||||
|
|
||||||
assert_equal(func[:returned_hash], actual_returned_hash,
|
|
||||||
"method_missing should result in a successful call to specified function")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_method_missing
|
|
||||||
mock_function_descriptions.each do |func|
|
|
||||||
client = make_mock_client(func[:platform], func[:request_to_client], func[:response_from_client])
|
|
||||||
dll = DLL.new(func[:dll_name], client)
|
|
||||||
|
|
||||||
dll.add_function(func[:name], func[:return_type], func[:params])
|
|
||||||
|
|
||||||
dll_wrapper = DLLWrapper.new(dll, client)
|
|
||||||
|
|
||||||
actual_returned_hash = dll_wrapper.send(:method_missing, func[:name].to_sym, *func[:ruby_args])
|
|
||||||
|
|
||||||
assert_equal(func[:returned_hash], actual_returned_hash,
|
|
||||||
"method_missing should result in a successful call to specified function")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,29 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..','..','..','..','..', '..', '..', 'lib'))
|
|
||||||
|
|
||||||
require 'rex/post/meterpreter/extensions/stdapi/railgun/platform_util'
|
|
||||||
require 'rex/post/meterpreter/extensions/stdapi/railgun/mock_magic'
|
|
||||||
require 'test/unit'
|
|
||||||
|
|
||||||
module Rex
|
|
||||||
module Post
|
|
||||||
module Meterpreter
|
|
||||||
module Extensions
|
|
||||||
module Stdapi
|
|
||||||
module Railgun
|
|
||||||
class PlatformUtil::UnitTest < Test::Unit::TestCase
|
|
||||||
def test_parse_client_platform
|
|
||||||
assert_equal(PlatformUtil.parse_client_platform('x86/win32'), PlatformUtil::X86_32,
|
|
||||||
'parse_client_platform should translate Win32 client platforms')
|
|
||||||
assert_equal(PlatformUtil.parse_client_platform('x86/win64'), PlatformUtil::X86_64,
|
|
||||||
'parse_client_platform should translate Win64 client platforms')
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,155 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..','..','..','..','..', 'lib'))
|
|
||||||
|
|
||||||
require 'rex/post/meterpreter/extensions/stdapi/railgun/railgun'
|
|
||||||
require 'rex/post/meterpreter/extensions/stdapi/railgun/mock_magic'
|
|
||||||
require 'test/unit'
|
|
||||||
require 'benchmark'
|
|
||||||
|
|
||||||
module Rex
|
|
||||||
module Post
|
|
||||||
module Meterpreter
|
|
||||||
module Extensions
|
|
||||||
module Stdapi
|
|
||||||
module Railgun
|
|
||||||
class Railgun::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
# DLLs we know should be available at the time of this writing,
|
|
||||||
# and DLLs that because of changes since then should be available
|
|
||||||
STOCK_DLLS = [
|
|
||||||
'kernel32',
|
|
||||||
'ntdll',
|
|
||||||
'user32',
|
|
||||||
'ws2_32',
|
|
||||||
'iphlpapi',
|
|
||||||
'advapi32',
|
|
||||||
'shell32',
|
|
||||||
'netapi32',
|
|
||||||
'crypt32',
|
|
||||||
] | Railgun::BUILTIN_DLLS
|
|
||||||
|
|
||||||
include MockMagic
|
|
||||||
|
|
||||||
def test_known_dll_names
|
|
||||||
railgun = Railgun.new(make_mock_client())
|
|
||||||
|
|
||||||
dll_names = railgun.known_dll_names
|
|
||||||
|
|
||||||
assert_equal(dll_names.length, dll_names.uniq.length,
|
|
||||||
"known_dll_names should not have duplicates")
|
|
||||||
|
|
||||||
STOCK_DLLS.each do |name|
|
|
||||||
assert(dll_names.include?(name),
|
|
||||||
"known_dll_names should include #{name}")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
#
|
|
||||||
# TODO:
|
|
||||||
# def test_multi
|
|
||||||
# mock_function_descriptions.each do |func|
|
|
||||||
# railgun = Railgun.new(make_mock_client(func[:platform]))
|
|
||||||
#
|
|
||||||
# functions = [
|
|
||||||
# [func[:dll_name], func[:name], func[:ruby_args]]
|
|
||||||
# ]
|
|
||||||
#
|
|
||||||
# results = railgun.multi(functions)
|
|
||||||
# end
|
|
||||||
# end
|
|
||||||
#
|
|
||||||
def test_const
|
|
||||||
railgun = Railgun.new(make_mock_client())
|
|
||||||
|
|
||||||
assert_equal(0, railgun.const('SUCCESS'),
|
|
||||||
"const should look up constants like SUCCESS")
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_add_dll
|
|
||||||
railgun = Railgun.new(make_mock_client())
|
|
||||||
|
|
||||||
target_dll_name = 'discordia'
|
|
||||||
target_windows_name = 'C:\look\behind\you'
|
|
||||||
|
|
||||||
railgun.add_dll(target_dll_name, target_windows_name)
|
|
||||||
|
|
||||||
actual_dll = railgun.get_dll(target_dll_name);
|
|
||||||
|
|
||||||
assert_not_nil(actual_dll,
|
|
||||||
"add_dll should make a DLL accessible via get_dll")
|
|
||||||
|
|
||||||
assert_equal(actual_dll.dll_path, target_windows_name,
|
|
||||||
"add_dll should set a dll path when specified")
|
|
||||||
|
|
||||||
wrapper = railgun.send(target_dll_name.to_sym)
|
|
||||||
|
|
||||||
assert_same(wrapper._dll, actual_dll,
|
|
||||||
"railgun instance responds with dll wrapper of requested dll")
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_method_missing
|
|
||||||
railgun = Railgun.new(make_mock_client())
|
|
||||||
|
|
||||||
STOCK_DLLS.each do |dll_name|
|
|
||||||
assert_nothing_raised do
|
|
||||||
railgun.send(dll_name.to_sym)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_get_dll
|
|
||||||
railgun = Railgun.new(make_mock_client())
|
|
||||||
|
|
||||||
STOCK_DLLS.each do |dll_name|
|
|
||||||
dll = railgun.get_dll(dll_name)
|
|
||||||
|
|
||||||
# We want to ensure autoloading is working
|
|
||||||
assert(dll.instance_of?(DLL),
|
|
||||||
"get_dll should be able to return a value for dll #{dll_name}")
|
|
||||||
|
|
||||||
assert(dll.frozen?,
|
|
||||||
"Stock DLLs loaded lazily in get_dll should be frozen")
|
|
||||||
|
|
||||||
# adding a function should create a local unfrozen instance
|
|
||||||
railgun.add_function(dll_name, '__lolz', 'VOID', [])
|
|
||||||
|
|
||||||
unfrozen_dll = railgun.get_dll(dll_name)
|
|
||||||
|
|
||||||
assert_not_same(dll, unfrozen_dll,
|
|
||||||
"add_function should create a local unfrozen instance that get_dll can then access")
|
|
||||||
|
|
||||||
assert(!unfrozen_dll.frozen?,
|
|
||||||
"add_function should create a local unfrozen instance that get_dll can then access")
|
|
||||||
|
|
||||||
railgun2 = Railgun.new(make_mock_client())
|
|
||||||
|
|
||||||
assert(!railgun2.get_dll(dll_name).functions.has_key?('__lolz'),
|
|
||||||
"functions added to one instance of railgun should not be accessible to others")
|
|
||||||
|
|
||||||
assert_not_same(!railgun2.get_dll(dll_name).functions, unfrozen_dll.functions,
|
|
||||||
"function hash should have been duplicated during unfreeze")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_add_function
|
|
||||||
mock_function_descriptions.each do |func|
|
|
||||||
railgun = Railgun.new(make_mock_client(func[:platform]))
|
|
||||||
|
|
||||||
dll_name = func[:dll_name]
|
|
||||||
function_name = func[:name]
|
|
||||||
|
|
||||||
railgun.add_dll(dll_name)
|
|
||||||
railgun.add_function(dll_name, function_name, func[:return_type], func[:params])
|
|
||||||
|
|
||||||
assert(railgun.get_dll(dll_name).functions.has_key?(function_name),
|
|
||||||
"add_function should add a function to the DLL specified")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,128 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..','..','..','..','..', '..', '..', 'lib'))
|
|
||||||
|
|
||||||
require 'rex/post/meterpreter/extensions/stdapi/railgun/type/pointer_util'
|
|
||||||
require 'rex/post/meterpreter/extensions/stdapi/railgun/platform_util'
|
|
||||||
require 'rex/post/meterpreter/extensions/stdapi/railgun/mock_magic'
|
|
||||||
require 'test/unit'
|
|
||||||
|
|
||||||
module Rex
|
|
||||||
module Post
|
|
||||||
module Meterpreter
|
|
||||||
module Extensions
|
|
||||||
module Stdapi
|
|
||||||
module Railgun
|
|
||||||
module Type
|
|
||||||
class PlatformUtil::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
include Rex::Post::Meterpreter::Extensions::Stdapi::Railgun::MockMagic
|
|
||||||
|
|
||||||
# memread value of win x86 pointer mapped to target unpack value
|
|
||||||
X86_32_POINTERS = {
|
|
||||||
"8D\x15\x00" => 1393720,
|
|
||||||
"\x1C\x84\x15\x00" => 1410076,
|
|
||||||
"\x0E\x84\x15\x00" => 1410062,
|
|
||||||
"\x02\x84\x15\x00" => 1410050,
|
|
||||||
"\xE6\x83\x15\x00" => 1410022,
|
|
||||||
"\xC4\x83\x15\x00" => 1409988,
|
|
||||||
"\x00\x00\x00\x00" => 0,
|
|
||||||
}
|
|
||||||
X86_64_POINTERS = {
|
|
||||||
"\x10^ \x00\x00\x00\x00\x00" => 2121232,
|
|
||||||
"\xCA\x9D \x00\x00\x00\x00\x00" => 2137546,
|
|
||||||
"\xC8\x9D \x00\x00\x00\x00\x00" => 2137544,
|
|
||||||
"Z\x9D \x00\x00\x00\x00\x00" => 2137434,
|
|
||||||
"X\x9D \x00\x00\x00\x00\x00" => 2137432,
|
|
||||||
"\x00\x00\x00\x00\x00\x00\x00\x00" => 0,
|
|
||||||
}
|
|
||||||
|
|
||||||
X86_64_NULL_POINTER = "\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
||||||
X86_32_NULL_POINTER = "\x00\x00\x00\x00"
|
|
||||||
|
|
||||||
X86_64 = PlatformUtil::X86_64
|
|
||||||
X86_32 = PlatformUtil::X86_32
|
|
||||||
|
|
||||||
def test_pack_pointer
|
|
||||||
X86_64_POINTERS.invert.each_pair do |unpacked, packed|
|
|
||||||
assert_equal(packed, PointerUtil.pack_pointer(unpacked.to_i, X86_64),
|
|
||||||
"pack_pointer should pack 64-bit numberic pointers")
|
|
||||||
end
|
|
||||||
|
|
||||||
X86_32_POINTERS.invert.each_pair do |unpacked, packed|
|
|
||||||
assert_equal(packed, PointerUtil.pack_pointer(unpacked.to_i, X86_32),
|
|
||||||
"pack_pointer should pack 32-bit numberic pointers")
|
|
||||||
end
|
|
||||||
|
|
||||||
assert_equal(X86_64_NULL_POINTER, PointerUtil.pack_pointer(nil, X86_64),
|
|
||||||
'pack_pointer should pack "nil" as a null pointer for x86_64')
|
|
||||||
|
|
||||||
assert_equal(X86_32_NULL_POINTER, PointerUtil.pack_pointer(nil, X86_32),
|
|
||||||
'pack_pointer should pack "nil" as a null pointer for x86_32')
|
|
||||||
|
|
||||||
assert_equal(X86_64_NULL_POINTER, PointerUtil.pack_pointer(0, X86_64),
|
|
||||||
'pack_pointer should pack numeric 0 as a null pointer for x86_64')
|
|
||||||
|
|
||||||
assert_equal(X86_32_NULL_POINTER, PointerUtil.pack_pointer(0, X86_32),
|
|
||||||
'pack_pointer should pack numeric 9 as a null pointer for x86_32')
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_unpack_pointer
|
|
||||||
X86_64_POINTERS.each_pair do |packed, unpacked|
|
|
||||||
assert_equal(unpacked, PointerUtil.unpack_pointer(packed, X86_64),
|
|
||||||
"unpack_pointer should unpack 64-bit pointers")
|
|
||||||
end
|
|
||||||
|
|
||||||
X86_32_POINTERS.each_pair do |packed, unpacked|
|
|
||||||
assert_equal(unpacked, PointerUtil.unpack_pointer(packed, X86_32),
|
|
||||||
"unpack_pointer should unpack 32-bit pointers")
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_is_null_pointer
|
|
||||||
[X86_32, X86_64].each do |platform|
|
|
||||||
assert(PointerUtil.is_null_pointer?(nil, platform), 'nil should be a null pointer')
|
|
||||||
assert(PointerUtil.is_null_pointer?(0, platform), 'numeric 0 should be a null pointer')
|
|
||||||
end
|
|
||||||
|
|
||||||
assert_equal(true, PointerUtil.is_null_pointer?(X86_32_NULL_POINTER, X86_32),
|
|
||||||
'is_null_pointer? should return true for packed 32-bit null pointers')
|
|
||||||
|
|
||||||
assert_equal(true, PointerUtil.is_null_pointer?(X86_64_NULL_POINTER, X86_64),
|
|
||||||
'is_null_pointer? should return true for packed 64-bit null pointers')
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_pointer_size
|
|
||||||
assert_equal(8, PointerUtil.pointer_size(X86_64),
|
|
||||||
'pointer_size should report X86_64 arch as 8 (bytes)')
|
|
||||||
|
|
||||||
assert_equal(4, PointerUtil.pointer_size(X86_32),
|
|
||||||
'pointer_size should report X86_32 arch as 4 (bytes)')
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_is_pointer_type
|
|
||||||
assert_equal(true, PointerUtil.is_pointer_type?(:pointer),
|
|
||||||
'pointer_type should return true for the symbol :pointer')
|
|
||||||
|
|
||||||
assert_equal(true, PointerUtil.is_pointer_type?('LPVOID'),
|
|
||||||
'pointer_type should return true if string begins with LP')
|
|
||||||
|
|
||||||
assert_equal(true, PointerUtil.is_pointer_type?('PDWORD'),
|
|
||||||
'pointer_type should return true if string begins with P')
|
|
||||||
|
|
||||||
assert_equal(false, PointerUtil.is_pointer_type?('LOLZ'),
|
|
||||||
'pointer_type should return false if not a pointer type')
|
|
||||||
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,124 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..','..','..','..','..', 'lib'))
|
|
||||||
|
|
||||||
require 'rex/post/meterpreter/extensions/stdapi/railgun/win_const_manager'
|
|
||||||
require 'test/unit'
|
|
||||||
|
|
||||||
module Rex
|
|
||||||
module Post
|
|
||||||
module Meterpreter
|
|
||||||
module Extensions
|
|
||||||
module Stdapi
|
|
||||||
module Railgun
|
|
||||||
class WinConstManager::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
def test_select_const_names
|
|
||||||
const_manager = WinConstManager.new
|
|
||||||
|
|
||||||
names = %w(W WW WWW)
|
|
||||||
|
|
||||||
names.each do |name|
|
|
||||||
const_manager.add_const(name, 23)
|
|
||||||
end
|
|
||||||
|
|
||||||
assert(const_manager.select_const_names(23).sort == names,
|
|
||||||
'select_const_names should return all names for given value')
|
|
||||||
|
|
||||||
const_manager.add_const('Skidoo!', 23)
|
|
||||||
|
|
||||||
assert(const_manager.select_const_names(23, /^\w{1,3}$/).sort == names,
|
|
||||||
'select_const_names should filter names with provided regex')
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_is_parseable
|
|
||||||
const_manager = WinConstManager.new
|
|
||||||
|
|
||||||
first_key = 'SOME_NUMBER'
|
|
||||||
second_key = 'SOME_OTHER_NUMBER'
|
|
||||||
boolean_logic = first_key + ' | ' + second_key
|
|
||||||
|
|
||||||
# XXX: Should check (un)parseability before adding constants too?
|
|
||||||
|
|
||||||
const_manager.add_const(first_key, 43123)
|
|
||||||
const_manager.add_const(second_key, 234)
|
|
||||||
|
|
||||||
assert(const_manager.is_parseable(boolean_logic),
|
|
||||||
"is_parseable should consider boolean logic statements parseable")
|
|
||||||
|
|
||||||
assert(const_manager.is_parseable(first_key),
|
|
||||||
"is_parseable should consider constants parseable")
|
|
||||||
|
|
||||||
assert(! const_manager.is_parseable(5),
|
|
||||||
"is_parseable should not consider non-string keys as parseable")
|
|
||||||
|
|
||||||
assert(! const_manager.is_parseable('| FOO |'),
|
|
||||||
"is_parseable should not consider malformed boolean expressions parseable")
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_add_const
|
|
||||||
target_key = 'VALID_KEY'
|
|
||||||
target_value = 23
|
|
||||||
|
|
||||||
const_manager = WinConstManager.new
|
|
||||||
|
|
||||||
const_manager.add_const(target_key, target_value)
|
|
||||||
|
|
||||||
assert_equal(target_value, const_manager.parse(target_key),
|
|
||||||
"add_const should add a constant/value pair that can be trieved with parse")
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_initialization
|
|
||||||
target_key = 'VALID_KEY'
|
|
||||||
target_value = 23
|
|
||||||
|
|
||||||
const_manager = WinConstManager.new(target_key => target_value)
|
|
||||||
|
|
||||||
assert_equal(target_value, const_manager.parse(target_key),
|
|
||||||
"upon initialization, should add any provided constants.")
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_parse
|
|
||||||
target_key = 'VALID_KEY'
|
|
||||||
target_value = 23
|
|
||||||
invalid_key = 8
|
|
||||||
|
|
||||||
const_manager = WinConstManager.new
|
|
||||||
|
|
||||||
const_manager.add_const(target_key, target_value)
|
|
||||||
|
|
||||||
assert_equal(target_value, const_manager.parse(target_key),
|
|
||||||
"parse should retrieve the corresponding value when a key is provided")
|
|
||||||
|
|
||||||
# From API: "should not throw an exception given an invalid key"
|
|
||||||
assert_nothing_thrown do
|
|
||||||
const_manager.parse(invalid_key)
|
|
||||||
end
|
|
||||||
|
|
||||||
assert_equal(nil, const_manager.parse(invalid_key),
|
|
||||||
"parse should return nil when an invalid key is provided")
|
|
||||||
|
|
||||||
x_key = 'X'
|
|
||||||
x_value = 228
|
|
||||||
y_key = 'Y'
|
|
||||||
y_value = 15
|
|
||||||
|
|
||||||
boolean_logic = x_key + ' | ' + y_key
|
|
||||||
target_boolean_logic_result = x_value | y_value
|
|
||||||
|
|
||||||
const_manager.add_const(x_key, x_value)
|
|
||||||
const_manager.add_const(y_key, y_value)
|
|
||||||
|
|
||||||
assert_equal(target_boolean_logic_result, const_manager.parse(boolean_logic),
|
|
||||||
"parse should evaluate boolean expressions consisting of OR")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,492 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
|
|
||||||
|
|
||||||
require 'rex/test'
|
|
||||||
require 'rex/socket'
|
|
||||||
require 'rex/proto/dcerpc/client'
|
|
||||||
require 'rex/proto/dcerpc/handle'
|
|
||||||
|
|
||||||
begin
|
|
||||||
require 'flexmock'
|
|
||||||
|
|
||||||
class Rex::Proto::DCERPC::Client::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
Klass = Rex::Proto::DCERPC::Client
|
|
||||||
|
|
||||||
def setup
|
|
||||||
@handle = Rex::Proto::DCERPC::Handle.new(['6bffd098-a112-3610-9833-46c3f87e345a', '1.0'], 'ncacn_ip_tcp', '1.2.3.4', [1026])
|
|
||||||
end
|
|
||||||
|
|
||||||
def setup_test(read, write, force_mock = false)
|
|
||||||
srand(0)
|
|
||||||
mock_unmake() # always do this, just to be sure. yes, it slows it down. but...
|
|
||||||
|
|
||||||
if (force_mock or !$_REX_TEST_NO_MOCK)
|
|
||||||
mock_make(read,write)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def mock_make(read, write)
|
|
||||||
func = '
|
|
||||||
require "flexmock"
|
|
||||||
def self.create_tcp(opts = {})
|
|
||||||
read = ' + read.inspect + '
|
|
||||||
write = ' + write.inspect + '
|
|
||||||
write_size = ' + write.size.to_s + '
|
|
||||||
mock = FlexMock.new
|
|
||||||
mock.should_receive(:type?).returns("tcp")
|
|
||||||
mock.should_receive(:peerport).returns(opts["PeerPort"])
|
|
||||||
mock.mock_handle(:close) { nil }
|
|
||||||
mock.mock_handle(:read) { read.shift }
|
|
||||||
mock.mock_handle(:get_once) { read.shift }
|
|
||||||
mock.mock_handle(:write) { |data|
|
|
||||||
expected = write.shift
|
|
||||||
if data != expected
|
|
||||||
write_id = write_size - write.size
|
|
||||||
require "pp"
|
|
||||||
raise "write #{write_id} failed\n\n<#{expected.inspect}> was expected but was\n<#{data.inspect}>"
|
|
||||||
end
|
|
||||||
data.length
|
|
||||||
}
|
|
||||||
mock.mock_handle(:put) { |data|
|
|
||||||
expected = write.shift
|
|
||||||
if data != expected
|
|
||||||
write_id = write_size - write.size
|
|
||||||
require "pp"
|
|
||||||
raise "write #{write_id} failed\n\n<#{expected.inspect}> was expected but was\n<#{data.inspect}>"
|
|
||||||
end
|
|
||||||
data.length
|
|
||||||
}
|
|
||||||
# mock.should_ignore_missing()
|
|
||||||
return mock
|
|
||||||
end
|
|
||||||
'
|
|
||||||
Rex::Socket.module_eval(func)
|
|
||||||
end
|
|
||||||
|
|
||||||
def mock_unmake
|
|
||||||
if Rex::Socket.create_tcp.class != 'Socket'
|
|
||||||
func = '
|
|
||||||
def self.create_tcp(opts = {})
|
|
||||||
return create_param(Rex::Socket::Parameters.from_hash(opts.merge("Proto" => "tcp")))
|
|
||||||
end
|
|
||||||
'
|
|
||||||
Rex::Socket.module_eval(func)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# undo the mock object stuff, just in case...
|
|
||||||
def teardown
|
|
||||||
mock_unmake()
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_instance_no_setup
|
|
||||||
setup_test([],[])
|
|
||||||
handle = Rex::Proto::DCERPC::Handle.new(['6bffd098-a112-3610-9833-46c3f87e345a', '1.0'], 'ncacn_ip_tcp', $_REX_TEST_SMB_HOST, [1026])
|
|
||||||
s = Rex::Socket.create_tcp( 'PeerHost' => $_REX_TEST_SMB_HOST, 'PeerPort' => 1026)
|
|
||||||
c = Klass.new(@handle, s, 'no_autobind' => 1, 'no_socketsetup' => 1)
|
|
||||||
assert_instance_of(Rex::Proto::DCERPC::Client, c, 'instance')
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_bind
|
|
||||||
write = ["\005\000\v\003\020\000\000\000H\000\000\000\000\000\000\000\320\026\320\026\000\000\000\000\001\000\000\000\000\000\001\000\010\203\257\341\037]\311\021\221\244\010\000+\024\240\372\003\000\000\000\004]\210\212\353\034\311\021\237\350\010\000+\020H`\002\000\000\000"]
|
|
||||||
read = ["\x05\x00\x0C\x03\x10\x00\x00\x00\x44\x00\x00\x00\x00\x00\x00\x00\xB8\x10\xB8\x10\xB2\x73\x00\x00\x0C\x00\x5C\x50\x49\x50\x45\x5C\x6C\x73\x61\x73\x73\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x04\x5D\x88\x8A\xEB\x1C\xC9\x11\x9F\xE8\x08\x00\x2B\x10\x48\x60\x02\x00\x00\x00",]
|
|
||||||
setup_test(read, write)
|
|
||||||
socket = Rex::Socket.create_tcp( 'PeerHost' => $_REX_TEST_SMB_HOST, 'PeerPort' => 135)
|
|
||||||
handle = Rex::Proto::DCERPC::Handle.new(['E1AF8308-5D1F-11C9-91A4-08002B14A0FA', '3.0'], 'ncacn_ip_tcp', $_REX_TEST_SMB_HOST, [135])
|
|
||||||
c = Klass.new(handle, socket)
|
|
||||||
assert_instance_of(Rex::Proto::DCERPC::Client, c, 'instance')
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_bind_fail
|
|
||||||
write = ["\x05\x00\x0b\x03\x10\x00\x00\x00\x48\x00\x00\x00\x00\x00\x00\x00\xd0\x16\xd0\x16\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x01\x00\xbb\xbb\xaa\xaa\x00\x00\x10\x36\x98\x33\x46\xc3\xf8\x7e\x34\x5a\x02\x00\x00\x00\x04\x5d\x88\x8a\xeb\x1c\xc9\x11\x9f\xe8\x08\x00\x2b\x10\x48\x60\x02\x00\x00\x00"]
|
|
||||||
read = [ "\x05\x00\x0c\x03\x10\x00\x00\x00\x3c\x00\x00\x00\x00\x00\x00\x00\xd0\x16\xd0\x16\x6c\x66\x00\x00\x04\x00\x31\x33\x35\x00\x92\xc0\x01\x00\x00\x00\x02\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"]
|
|
||||||
setup_test(read, write)
|
|
||||||
socket = Rex::Socket.create_tcp('PeerHost' => $_REX_TEST_SMB_HOST, 'PeerPort' => 135)
|
|
||||||
handle = Rex::Proto::DCERPC::Handle.new(['AAAABBBB-0000-3610-9833-46c3f87e345a', '2.0'], 'ncacn_ip_tcp', $_REX_TEST_SMB_HOST, [135])
|
|
||||||
|
|
||||||
assert_raise(RuntimeError) {
|
|
||||||
c = Klass.new(handle, socket)
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_call
|
|
||||||
write = [
|
|
||||||
"\x05\x00\x0b\x03\x10\x00\x00\x00\x48\x00\x00\x00\x00\x00\x00\x00\xd0\x16\xd0\x16\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x01\x00\x98\xd0\xff\x6b\x12\xa1\x10\x36\x98\x33\x46\xc3\xf8\x7e\x34\x5a\x01\x00\x00\x00\x04\x5d\x88\x8a\xeb\x1c\xc9\x11\x9f\xe8\x08\x00\x2b\x10\x48\x60\x02\x00\x00\x00",
|
|
||||||
"\x05\x00\x00\x03\x10\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x0a\x00ABCD"
|
|
||||||
]
|
|
||||||
read = [
|
|
||||||
"\x05\x00\x0C\x03\x10\x00\x00\x00\x44\x00\x00\x00\x00\x00\x00\x00\xB8\x10\xB8\x10\xB2\x73\x00\x00\x0C\x00\x5C\x50\x49\x50\x45\x5C\x6C\x73\x61\x73\x73\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x04\x5D\x88\x8A\xEB\x1C\xC9\x11\x9F\xE8\x08\x00\x2B\x10\x48\x60\x02\x00\x00\x00",
|
|
||||||
"\x05\x00\x02\x23\x10\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\x00\x01\x1C\x00\x00\x00\x00foo"
|
|
||||||
]
|
|
||||||
setup_test(read, write, true)
|
|
||||||
socket = Rex::Socket.create_tcp('PeerHost' => $_REX_TEST_SMB_HOST, 'PeerPort' => 135)
|
|
||||||
|
|
||||||
c = Klass.new(@handle, socket)
|
|
||||||
assert_instance_of(Rex::Proto::DCERPC::Client, c, 'instance')
|
|
||||||
response = c.call(10, "ABCD")
|
|
||||||
assert_equal(response, 'foo', 'call')
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_fault
|
|
||||||
write = [
|
|
||||||
"\005\000\v\003\020\000\000\000H\000\000\000\000\000\000\000\320\026\320\026\000\000\000\000\001\000\000\000\000\000\001\000\010\203\257\341\037]\311\021\221\244\010\000+\024\240\372\003\000\000\000\004]\210\212\353\034\311\021\237\350\010\000+\020H`\002\000\000\000",
|
|
||||||
"\x05\x00\x00\x03\x10\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x0a\x00ABCD"
|
|
||||||
]
|
|
||||||
read = [
|
|
||||||
"\x05\x00\x0C\x03\x10\x00\x00\x00\x44\x00\x00\x00\x00\x00\x00\x00\xB8\x10\xB8\x10\xB2\x73\x00\x00\x0C\x00\x5C\x50\x49\x50\x45\x5C\x6C\x73\x61\x73\x73\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x04\x5D\x88\x8A\xEB\x1C\xC9\x11\x9F\xE8\x08\x00\x2B\x10\x48\x60\x02\x00\x00\x00",
|
|
||||||
"\x05\x00\x03\x23\x10\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x01\x1c\x00\x00\x00\x00"
|
|
||||||
]
|
|
||||||
setup_test(read, write)
|
|
||||||
|
|
||||||
socket = Rex::Socket.create_tcp('PeerHost' => $_REX_TEST_SMB_HOST, 'PeerPort' => 135)
|
|
||||||
handle = Rex::Proto::DCERPC::Handle.new(['E1AF8308-5D1F-11C9-91A4-08002B14A0FA', '3.0'], 'ncacn_ip_tcp', $_REX_TEST_SMB_HOST, [135])
|
|
||||||
|
|
||||||
c = Klass.new(handle, socket)
|
|
||||||
assert_instance_of(Rex::Proto::DCERPC::Client, c, 'instance')
|
|
||||||
assert_raise(Rex::Proto::DCERPC::Exceptions::Fault) {
|
|
||||||
response = c.call(10, "ABCD")
|
|
||||||
}
|
|
||||||
# UGLY!
|
|
||||||
assert_equal(c.last_response.status, 0x1C010002, 'call op 10 with stub response')
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_segmented_read_writes
|
|
||||||
bind_expected = "\005\000\v\003\020\000\000\000H\000\000\000\000\000\000\000\320\026\320\026\000\000\000\000\001\000\000\000\000\000\001\000\230\320\377k\022\241\0206\2303F\303\370~4Z\001\000\000\000\004]\210\212\353\034\311\021\237\350\010\000+\020H`\002\000\000\000"
|
|
||||||
bind_response = "\x05\x00\x0C\x03\x10\x00\x00\x00\x44\x00\x00\x00\x00\x00\x00\x00\xB8\x10\xB8\x10\xB2\x73\x00\x00\x0C\x00\x5C\x50\x49\x50\x45\x5C\x6C\x73\x61\x73\x73\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x04\x5D\x88\x8A\xEB\x1C\xC9\x11\x9F\xE8\x08\x00\x2B\x10\x48\x60\x02\x00\x00\x00"
|
|
||||||
|
|
||||||
socket = FlexMock.new
|
|
||||||
#socket.should_ignore_missing()
|
|
||||||
|
|
||||||
@write_data = ''
|
|
||||||
|
|
||||||
socket.mock_handle(:write) {
|
|
||||||
|data|
|
|
||||||
@write_data += data
|
|
||||||
data.length
|
|
||||||
}
|
|
||||||
|
|
||||||
read_data = bind_response.dup
|
|
||||||
socket.mock_handle(:read) {
|
|
||||||
|size|
|
|
||||||
if size.nil?
|
|
||||||
size = read_data.size
|
|
||||||
end
|
|
||||||
data = read_data.slice!(0, size)
|
|
||||||
if data.length == 0
|
|
||||||
data = nil
|
|
||||||
end
|
|
||||||
data
|
|
||||||
}
|
|
||||||
socket.mock_handle(:get_once) {
|
|
||||||
|timeout, size|
|
|
||||||
if size.nil?
|
|
||||||
size = read_data.size
|
|
||||||
end
|
|
||||||
data = read_data.slice!(0, size)
|
|
||||||
if data.length == 0
|
|
||||||
data = nil
|
|
||||||
end
|
|
||||||
data
|
|
||||||
}
|
|
||||||
socket.should_receive(:type?).returns('tcp')
|
|
||||||
|
|
||||||
c = Klass.new(@handle, socket, 'segment_write' => 1, 'segment_read' => 1)
|
|
||||||
assert_equal(bind_expected, @write_data, 'bind')
|
|
||||||
assert_instance_of(Rex::Proto::DCERPC::Client, c, 'instance')
|
|
||||||
|
|
||||||
# XXX - would be nice to test a success, as well as a failure, but
|
|
||||||
# hell... we don't care if the decoder is "right" here, just that it
|
|
||||||
# returns data. Test the decoder in the decoder I say!
|
|
||||||
call_data = "\005\000\000\003\020\000\000\000\034\000\000\000\000\000\000\000\004\000\000\000\000\000\n\000ABCD"
|
|
||||||
call_response = "\x05\x00\x02\x23\x10\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x03\x00\x01\x1C\x00\x00\x00\x00foo"
|
|
||||||
read_data = call_response
|
|
||||||
@write_data = ''
|
|
||||||
socket.mock_handle(:write) {
|
|
||||||
|data|
|
|
||||||
@write_data += data
|
|
||||||
data.length
|
|
||||||
}
|
|
||||||
read_data = call_response.dup
|
|
||||||
socket.mock_handle(:read) {
|
|
||||||
|size|
|
|
||||||
data = read_data.slice!(0, size)
|
|
||||||
if data.length == 0
|
|
||||||
data = nil
|
|
||||||
else
|
|
||||||
end
|
|
||||||
data
|
|
||||||
}
|
|
||||||
|
|
||||||
response = c.call(10, "ABCD")
|
|
||||||
assert_equal(response, 'foo', 'response')
|
|
||||||
assert_equal(@write_data, call_data, 'write')
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_dcerpc_over_smb
|
|
||||||
write = [
|
|
||||||
"\x00\x00\x00\x54\xff\x53\x4d\x42\x72\x00\x00\x00\x00\x18\x01\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2f\xaa\x00\x00\xac\x0a\x00\x31\x00\x02\x4c\x41\x4e\x4d\x41\x4e\x31\x2e\x30\x00\x02\x4c\x4d\x31\x2e\x32\x58\x30\x30\x32\x00\x02\x4e\x54\x20\x4c\x41\x4e\x4d\x41\x4e\x20\x31\x2e\x30\x00\x02\x4e\x54\x20\x4c\x4d\x20\x30\x2e\x31\x32\x00",
|
|
||||||
"\x00\x00\x00\xb0\xff\x53\x4d\x42\x73\x00\x00\x00\x00\x18\x01\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2f\xaa\x00\x00\xac\x0a\x0c\xff\x00\x00\x00\xdf\xff\x02\x00\x01\x00\x00\x00\x00\x00\x52\x00\x00\x00\x00\x00\x5c\xd0\x00\x80\x75\x00\x60\x50\x06\x06\x2b\x06\x01\x05\x05\x02\xa0\x46\x30\x44\xa0\x0e\x30\x0c\x06\x0a\x2b\x06\x01\x04\x01\x82\x37\x02\x02\x0a\xa2\x32\x04\x30\x4e\x54\x4c\x4d\x53\x53\x50\x00\x01\x00\x00\x00\x01\x02\x08\x00\x00\x00\x00\x00\x20\x00\x00\x00\x10\x00\x10\x00\x20\x00\x00\x00\x31\x41\x44\x37\x44\x6e\x4a\x54\x56\x79\x6b\x58\x47\x59\x59\x4d\x57\x69\x6e\x64\x6f\x77\x73\x20\x32\x30\x30\x30\x20\x32\x31\x39\x35\x00\x57\x69\x6e\x64\x6f\x77\x73\x20\x32\x30\x30\x30\x20\x35\x2e\x30\x00",
|
|
||||||
"\x00\x00\x00\xfa\xff\x53\x4d\x42\x73\x00\x00\x00\x00\x18\x01\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2f\xaa\x00\x08\xac\x0a\x0c\xff\x00\x00\x00\xdf\xff\x02\x00\x01\x00\x00\x00\x00\x00\x9c\x00\x00\x00\x00\x00\x5c\xd0\x00\x80\xbf\x00\xa1\x81\x99\x30\x81\x96\xa2\x81\x93\x04\x81\x90\x4e\x54\x4c\x4d\x53\x53\x50\x00\x03\x00\x00\x00\x18\x00\x18\x00\x40\x00\x00\x00\x18\x00\x18\x00\x58\x00\x00\x00\x00\x00\x00\x00\x70\x00\x00\x00\x00\x00\x00\x00\x70\x00\x00\x00\x20\x00\x20\x00\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x08\x00\x3a\xc1\xe6\x27\x57\xae\x58\x51\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x11\x48\x4d\x21\x82\x94\x0e\xb8\xf1\xe3\x71\xbd\x12\x19\x97\x88\x90\x8b\xa2\x23\xad\x71\x89\x4a\x31\x00\x41\x00\x44\x00\x37\x00\x44\x00\x6e\x00\x4a\x00\x54\x00\x56\x00\x79\x00\x6b\x00\x58\x00\x47\x00\x59\x00\x59\x00\x4d\x00\x57\x69\x6e\x64\x6f\x77\x73\x20\x32\x30\x30\x30\x20\x32\x31\x39\x35\x00\x57\x69\x6e\x64\x6f\x77\x73\x20\x32\x30\x30\x30\x20\x35\x2e\x30\x00",
|
|
||||||
"\x00\x00\x00\x62\xff\x53\x4d\x42\x73\x00\x00\x00\x00\x18\x01\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2f\xaa\x00\x00\xac\x0a\x0d\xff\x00\x00\x00\xdf\xff\x02\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x25\x00\x00\x00\x57\x69\x6e\x64\x6f\x77\x73\x20\x32\x30\x30\x30\x20\x32\x31\x39\x35\x00\x57\x69\x6e\x64\x6f\x77\x73\x20\x32\x30\x30\x30\x20\x35\x2e\x30\x00",
|
|
||||||
"\x00\x00\x00\x37\xff\x53\x4d\x42\x75\x00\x00\x00\x00\x18\x01\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2f\xaa\x01\x08\xac\x0a\x04\xff\x00\x00\x00\x00\x00\x01\x00\x0c\x00\x00\x49\x50\x43\x24\x00\x3f\x3f\x3f\x3f\x3f\x00",
|
|
||||||
"\x00\x00\x00\x5c\xff\x53\x4d\x42\xa2\x00\x00\x00\x00\x18\x01\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x2f\xaa\x01\x08\xac\x0a\x18\xff\x00\x00\x00\x00\x08\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x09\x00\x5c\x42\x52\x4f\x57\x53\x45\x52\x00",
|
|
||||||
"\x00\x00\x00\x87\xff\x53\x4d\x42\x2f\x00\x00\x00\x00\x18\x01\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x2f\xaa\x01\x08\xac\x0a\x0e\xff\x00\x00\x00\x00\x40\x00\x00\x00\x00\xff\xff\xff\xff\x08\x00\x48\x00\x00\x00\x48\x00\x3f\x00\x00\x00\x00\x00\x48\x00\x05\x00\x0b\x03\x10\x00\x00\x00\x48\x00\x00\x00\x00\x00\x00\x00\xd0\x16\xd0\x16\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x01\x00\xc8\x4f\x32\x4b\x70\x16\xd3\x01\x12\x78\x5a\x47\xbf\x6e\xe1\x88\x03\x00\x00\x00\x04\x5d\x88\x8a\xeb\x1c\xc9\x11\x9f\xe8\x08\x00\x2b\x10\x48\x60\x02\x00\x00\x00",
|
|
||||||
"\x00\x00\x00\x37\xff\x53\x4d\x42\x2e\x00\x00\x00\x00\x18\x01\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x2f\xaa\x01\x08\xac\x0a\x0a\xff\x00\x00\x00\x00\x40\x00\x00\x00\x00\x80\xbb\x80\xbb\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
||||||
]
|
|
||||||
|
|
||||||
read = [
|
|
||||||
"\x00\x00\x00\x55\xff\x53\x4d\x42\x72\x00\x00\x00\x00\x98\x01\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2f\xaa\x00\x00\xac\x0a\x11\x03\x00\x03\x0a\x00\x01\x00\x04\x11\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\xfd\xe3\x00\x80\x16\x12\x0a\x27\x2e\xfc\xc5\x01\xe0\x01\x00\x10\x00\x8b\x3c\x73\xd2\x53\x9e\x28\x48\xa2\xac\x68\xae\xd1\x2e\x41\x5a",
|
|
||||||
"\x00\x00\x01\xb3\xff\x53\x4d\x42\x73\x16\x00\x00\xc0\x98\x01\x68\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2f\xaa\x00\x08\xac\x0a\x04\xff\x00\xb3\x01\x00\x00\x63\x01\x88\x01\xa1\x82\x01\x5f\x30\x82\x01\x5b\xa0\x03\x0a\x01\x01\xa1\x0c\x06\x0a\x2b\x06\x01\x04\x01\x82\x37\x02\x02\x0a\xa2\x81\xa1\x04\x81\x9e\x4e\x54\x4c\x4d\x53\x53\x50\x00\x02\x00\x00\x00\x12\x00\x12\x00\x30\x00\x00\x00\x05\x02\x8a\x00\x08\x78\x80\x62\x32\xc8\xeb\xe7\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x00\x5c\x00\x42\x00\x00\x00\x57\x00\x49\x00\x4e\x00\x32\x00\x4b\x00\x42\x00\x41\x00\x53\x00\x45\x00\x02\x00\x12\x00\x57\x00\x49\x00\x4e\x00\x32\x00\x4b\x00\x42\x00\x41\x00\x53\x00\x45\x00\x01\x00\x12\x00\x57\x00\x49\x00\x4e\x00\x32\x00\x4b\x00\x42\x00\x41\x00\x53\x00\x45\x00\x04\x00\x12\x00\x77\x00\x69\x00\x6e\x00\x32\x00\x6b\x00\x62\x00\x61\x00\x73\x00\x65\x00\x03\x00\x12\x00\x77\x00\x69\x00\x6e\x00\x32\x00\x6b\x00\x62\x00\x61\x00\x73\x00\x65\x00\x00\x00\x00\x00\xa3\x81\xa1\x04\x81\x9e\x4e\x54\x4c\x4d\x53\x53\x50\x00\x02\x00\x00\x00\x12\x00\x12\x00\x30\x00\x00\x00\x05\x02\x8a\x00\x08\x78\x80\x62\x32\xc8\xeb\xe7\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x00\x5c\x00\x42\x00\x00\x00\x57\x00\x49\x00\x4e\x00\x32\x00\x4b\x00\x42\x00\x41\x00\x53\x00\x45\x00\x02\x00\x12\x00\x57\x00\x49\x00\x4e\x00\x32\x00\x4b\x00\x42\x00\x41\x00\x53\x00\x45\x00\x01\x00\x12\x00\x57\x00\x49\x00\x4e\x00\x32\x00\x4b\x00\x42\x00\x41\x00\x53\x00\x45\x00\x04\x00\x12\x00\x77\x00\x69\x00\x6e\x00\x32\x00\x6b\x00\x62\x00\x61\x00\x73\x00\x65\x00\x03\x00\x12\x00\x77\x00\x69\x00\x6e\x00\x32\x00\x6b\x00\x62\x00\x61\x00\x73\x00\x65\x00\x00\x00\x00\x00\x57\x69\x6e\x64\x6f\x77\x73\x20\x35\x2e\x30\x00\x57\x69\x6e\x64\x6f\x77\x73\x20\x32\x30\x30\x30\x20\x4c\x41\x4e\x20\x4d\x61\x6e\x61\x67\x65\x72\x00",
|
|
||||||
"\x00\x00\x00\x23\xff\x53\x4d\x42\x73\x6d\x00\x00\xc0\x98\x01\x68\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2f\xaa\x00\x08\xac\x0a\x00\x00\x00",
|
|
||||||
"\x00\x00\x00\x58\xff\x53\x4d\x42\x73\x00\x00\x00\x00\x98\x01\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2f\xaa\x01\x08\xac\x0a\x03\xff\x00\x58\x00\x00\x00\x2f\x00\x57\x69\x6e\x64\x6f\x77\x73\x20\x35\x2e\x30\x00\x57\x69\x6e\x64\x6f\x77\x73\x20\x32\x30\x30\x30\x20\x4c\x41\x4e\x20\x4d\x61\x6e\x61\x67\x65\x72\x00\x57\x4f\x52\x4b\x47\x52\x4f\x55\x50\x00",
|
|
||||||
"\x00\x00\x00\x2e\xff\x53\x4d\x42\x75\x00\x00\x00\x00\x98\x01\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x2f\xaa\x01\x08\xac\x0a\x03\xff\x00\x2e\x00\x01\x00\x05\x00\x49\x50\x43\x00\x00",
|
|
||||||
"\x00\x00\x00\x87\xff\x53\x4d\x42\xa2\x00\x00\x00\x00\x98\x01\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x2f\xaa\x01\x08\xac\x0a\x2a\xff\x00\x87\x00\x00\x00\x40\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xff\x05\x00\x00\x00\x00\x00\x00\x00\x00\x04\x5d\x88\x8a\xeb\x1c\xc9\x11\x9f\xe8\x08\x00\x2b\x10\x48\x60\x02\x9b\x01\x12\x00\x9b\x01\x12\x00\x00\x00",
|
|
||||||
"\x00\x00\x00\x2f\xff\x53\x4d\x42\x2f\x00\x00\x00\x00\x98\x01\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x2f\xaa\x01\x08\xac\x0a\x06\xff\x00\x2f\x00\x48\x00\xff\xff\x00\x00\x00\x00\x00\x00",
|
|
||||||
"\x00\x00\x00\x80\xff\x53\x4d\x42\x2e\x00\x00\x00\x00\x98\x01\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x2f\xaa\x01\x08\xac\x0a\x0c\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x00\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x00\x00\x05\x00\x0c\x03\x10\x00\x00\x00\x44\x00\x00\x00\x00\x00\x00\x00\xb8\x10\xb8\x10\xdd\xe2\x00\x00\x0d\x00\x5c\x50\x49\x50\x45\x5c\x6e\x74\x73\x76\x63\x73\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x04\x5d\x88\x8a\xeb\x1c\xc9\x11\x9f\xe8\x08\x00\x2b\x10\x48\x60\x02\x00\x00\x00",
|
|
||||||
]
|
|
||||||
setup_test(read, write)
|
|
||||||
require 'rex/proto/smb/simpleclient'
|
|
||||||
begin
|
|
||||||
Timeout.timeout($_REX_TEST_TIMEOUT) {
|
|
||||||
s = Rex::Socket.create_tcp( 'PeerHost' => $_REX_TEST_SMB_HOST, 'PeerPort' => 445)
|
|
||||||
|
|
||||||
smb = Rex::Proto::SMB::SimpleClient.new(s, true)
|
|
||||||
assert_instance_of(Rex::Proto::SMB::SimpleClient, smb, 'instance of smb')
|
|
||||||
|
|
||||||
user = ''
|
|
||||||
pass = ''
|
|
||||||
|
|
||||||
smb.login('*SMBSERVER', user, pass)
|
|
||||||
smb.connect('IPC$')
|
|
||||||
f = smb.create_pipe('\BROWSER')
|
|
||||||
assert_instance_of(Rex::Proto::SMB::SimpleClient::OpenPipe, f, 'pipe')
|
|
||||||
|
|
||||||
handle = Rex::Proto::DCERPC::Handle.new(['4b324fc8-1670-01d3-1278-5a47bf6ee188', '3.0'], 'ncacn_np', $_REX_TEST_SMB_HOST, ['\BROWSER'])
|
|
||||||
assert_instance_of(Rex::Proto::DCERPC::Handle, handle, 'handle')
|
|
||||||
dcerpc = Rex::Proto::DCERPC::Client.new(handle, f) # , 'segment_read' => 0)
|
|
||||||
assert_instance_of(Rex::Proto::DCERPC::Client, dcerpc, 'bind')
|
|
||||||
s.close
|
|
||||||
}
|
|
||||||
rescue Timeout::Error
|
|
||||||
flunk('timeout')
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_ncacn_ip_tcp
|
|
||||||
write = [
|
|
||||||
"\x05\x00\x0b\x03\x10\x00\x00\x00\x48\x00\x00\x00\x00\x00\x00\x00\xd0\x16\xd0\x16\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x01\x00\x08\x83\xaf\xe1\x1f\x5d\xc9\x11\x91\xa4\x08\x00\x2b\x14\xa0\xfa\x03\x00\x00\x00\x04\x5d\x88\x8a\xeb\x1c\xc9\x11\x9f\xe8\x08\x00\x2b\x10\x48\x60\x02\x00\x00\x00",
|
|
||||||
"\x05\x00\x00\x03\x10\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x28\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00"
|
|
||||||
]
|
|
||||||
read = [
|
|
||||||
"\x05\x00\x0c\x03\x10\x00\x00\x00\x3c\x00\x00\x00\x00\x00\x00\x00\xd0\x16\xd0\x16\x12\x66\x00\x00\x04\x00\x31\x33\x35\x00\xec\xd7\x01\x00\x00\x00\x00\x00\x00\x00\x04\x5d\x88\x8a\xeb\x1c\xc9\x11\x9f\xe8\x08\x00\x2b\x10\x48\x60\x02\x00\x00\x00",
|
|
||||||
"\x05\x00\x02\x03\x10\x00\x00\x00\xb4\x00\x00\x00\x00\x00\x00\x00\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc4\x49\xc2\xb8\x92\x78\x4e\x4f\xb3\xe7\xbf\x7e\x00\x2a\xd3\x39\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x4b\x00\x00\x00\x4b\x00\x00\x00\x05\x00\x13\x00\x0d\x80\xa9\x88\x10\xe5\xea\xd0\x11\x8d\x9b\x00\xa0\x24\x53\xc3\x37\x01\x00\x02\x00\x00\x00\x13\x00\x0d\x04\x5d\x88\x8a\xeb\x1c\xc9\x11\x9f\xe8\x08\x00\x2b\x10\x48\x60\x02\x00\x02\x00\x00\x00\x01\x00\x0b\x02\x00\x00\x00\x01\x00\x07\x02\x00\x08\x39\x01\x00\x09\x04\x00\x0a\x04\x0a\x3a\x00\x00\x00\x00\x00"
|
|
||||||
]
|
|
||||||
setup_test(read, write)
|
|
||||||
begin
|
|
||||||
Timeout.timeout($_REX_TEST_TIMEOUT) {
|
|
||||||
s = Rex::Socket.create_tcp('PeerHost' => $_REX_TEST_SMB_HOST, 'PeerPort' => 135)
|
|
||||||
handle = Rex::Proto::DCERPC::Handle.new(['E1AF8308-5D1F-11C9-91A4-08002B14A0FA', '3.0'], 'ncacn_ip_tcp', $_REX_TEST_SMB_HOST, [135])
|
|
||||||
assert_instance_of(Rex::Proto::DCERPC::Handle, handle, 'handle')
|
|
||||||
dcerpc = Rex::Proto::DCERPC::Client.new(handle, s)
|
|
||||||
assert_instance_of(Rex::Proto::DCERPC::Client, dcerpc, 'bind')
|
|
||||||
|
|
||||||
stub = "\x00" * (4 * 9) + "\x01\x00\x00\x00"
|
|
||||||
got = dcerpc.call(0x02, stub)
|
|
||||||
s.close
|
|
||||||
}
|
|
||||||
rescue Timeout::Error
|
|
||||||
flunk('timeout')
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_ncacn_ip_tcp_objectid
|
|
||||||
write = [
|
|
||||||
"\x05\x00\x0b\x03\x10\x00\x00\x00\x48\x00\x00\x00\x00\x00\x00\x00\xd0\x16\xd0\x16\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x01\x00\x08\x83\xaf\xe1\x1f\x5d\xc9\x11\x91\xa4\x08\x00\x2b\x14\xa0\xfa\x03\x00\x00\x00\x04\x5d\x88\x8a\xeb\x1c\xc9\x11\x9f\xe8\x08\x00\x2b\x10\x48\x60\x02\x00\x00\x00",
|
|
||||||
"\x05\x00\x00\x83\x10\x00\x00\x00\x50\x00\x00\x00\x00\x00\x00\x00\x28\x00\x00\x00\x00\x00\x02\x00\010\203\257\341\037]\311\021\221\244\010\000+\024\240\372\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00"
|
|
||||||
]
|
|
||||||
read = [
|
|
||||||
"\x05\x00\x0c\x03\x10\x00\x00\x00\x3c\x00\x00\x00\x00\x00\x00\x00\xd0\x16\xd0\x16\x12\x66\x00\x00\x04\x00\x31\x33\x35\x00\xec\xd7\x01\x00\x00\x00\x00\x00\x00\x00\x04\x5d\x88\x8a\xeb\x1c\xc9\x11\x9f\xe8\x08\x00\x2b\x10\x48\x60\x02\x00\x00\x00",
|
|
||||||
"\x05\x00\x02\x03\x10\x00\x00\x00\xb4\x00\x00\x00\x00\x00\x00\x00\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc4\x49\xc2\xb8\x92\x78\x4e\x4f\xb3\xe7\xbf\x7e\x00\x2a\xd3\x39\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x4b\x00\x00\x00\x4b\x00\x00\x00\x05\x00\x13\x00\x0d\x80\xa9\x88\x10\xe5\xea\xd0\x11\x8d\x9b\x00\xa0\x24\x53\xc3\x37\x01\x00\x02\x00\x00\x00\x13\x00\x0d\x04\x5d\x88\x8a\xeb\x1c\xc9\x11\x9f\xe8\x08\x00\x2b\x10\x48\x60\x02\x00\x02\x00\x00\x00\x01\x00\x0b\x02\x00\x00\x00\x01\x00\x07\x02\x00\x08\x39\x01\x00\x09\x04\x00\x0a\x04\x0a\x3a\x00\x00\x00\x00\x00"
|
|
||||||
]
|
|
||||||
setup_test(read, write)
|
|
||||||
begin
|
|
||||||
Timeout.timeout($_REX_TEST_TIMEOUT) {
|
|
||||||
s = Rex::Socket.create_tcp('PeerHost' => $_REX_TEST_SMB_HOST, 'PeerPort' => 135)
|
|
||||||
handle = Rex::Proto::DCERPC::Handle.new(['E1AF8308-5D1F-11C9-91A4-08002B14A0FA', '3.0'], 'ncacn_ip_tcp', $_REX_TEST_SMB_HOST, [135])
|
|
||||||
assert_instance_of(Rex::Proto::DCERPC::Handle, handle, 'handle')
|
|
||||||
dcerpc = Rex::Proto::DCERPC::Client.new(handle, s, {'object_call' => 1})
|
|
||||||
assert_instance_of(Rex::Proto::DCERPC::Client, dcerpc, 'bind')
|
|
||||||
|
|
||||||
stub = "\x00" * (4 * 9) + "\x01\x00\x00\x00"
|
|
||||||
got = dcerpc.call(0x02, stub)
|
|
||||||
s.close
|
|
||||||
}
|
|
||||||
rescue Timeout::Error
|
|
||||||
flunk('timeout')
|
|
||||||
end
|
|
||||||
end
|
|
||||||
def test_ncacn_ip_tcp_objectid_random
|
|
||||||
write = [
|
|
||||||
"\x05\x00\x0b\x03\x10\x00\x00\x00\x48\x00\x00\x00\x00\x00\x00\x00\xd0\x16\xd0\x16\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x01\x00\x08\x83\xaf\xe1\x1f\x5d\xc9\x11\x91\xa4\x08\x00\x2b\x14\xa0\xfa\x03\x00\x00\x00\x04\x5d\x88\x8a\xeb\x1c\xc9\x11\x9f\xe8\x08\x00\x2b\x10\x48\x60\x02\x00\x00\x00",
|
|
||||||
"\005\000\000\203\020\000\000\000P\000\000\000\000\000\000\000(\000\000\000\000\000\002\000\254/u\300C\373\303g\t\323\025\362$WF\330\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000"
|
|
||||||
]
|
|
||||||
read = [
|
|
||||||
"\x05\x00\x0c\x03\x10\x00\x00\x00\x3c\x00\x00\x00\x00\x00\x00\x00\xd0\x16\xd0\x16\x12\x66\x00\x00\x04\x00\x31\x33\x35\x00\xec\xd7\x01\x00\x00\x00\x00\x00\x00\x00\x04\x5d\x88\x8a\xeb\x1c\xc9\x11\x9f\xe8\x08\x00\x2b\x10\x48\x60\x02\x00\x00\x00",
|
|
||||||
"\x05\x00\x02\x03\x10\x00\x00\x00\xb4\x00\x00\x00\x00\x00\x00\x00\x9c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc4\x49\xc2\xb8\x92\x78\x4e\x4f\xb3\xe7\xbf\x7e\x00\x2a\xd3\x39\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x4b\x00\x00\x00\x4b\x00\x00\x00\x05\x00\x13\x00\x0d\x80\xa9\x88\x10\xe5\xea\xd0\x11\x8d\x9b\x00\xa0\x24\x53\xc3\x37\x01\x00\x02\x00\x00\x00\x13\x00\x0d\x04\x5d\x88\x8a\xeb\x1c\xc9\x11\x9f\xe8\x08\x00\x2b\x10\x48\x60\x02\x00\x02\x00\x00\x00\x01\x00\x0b\x02\x00\x00\x00\x01\x00\x07\x02\x00\x08\x39\x01\x00\x09\x04\x00\x0a\x04\x0a\x3a\x00\x00\x00\x00\x00"
|
|
||||||
]
|
|
||||||
setup_test(read, write)
|
|
||||||
begin
|
|
||||||
Timeout.timeout($_REX_TEST_TIMEOUT) {
|
|
||||||
s = Rex::Socket.create_tcp('PeerHost' => $_REX_TEST_SMB_HOST, 'PeerPort' => 135)
|
|
||||||
handle = Rex::Proto::DCERPC::Handle.new(['E1AF8308-5D1F-11C9-91A4-08002B14A0FA', '3.0'], 'ncacn_ip_tcp', $_REX_TEST_SMB_HOST, [135])
|
|
||||||
assert_instance_of(Rex::Proto::DCERPC::Handle, handle, 'handle')
|
|
||||||
dcerpc = Rex::Proto::DCERPC::Client.new(handle, s, {'random_object_id' => 1})
|
|
||||||
assert_instance_of(Rex::Proto::DCERPC::Client, dcerpc, 'bind')
|
|
||||||
|
|
||||||
stub = "\x00" * (4 * 9) + "\x01\x00\x00\x00"
|
|
||||||
got = dcerpc.call(0x02, stub)
|
|
||||||
s.close
|
|
||||||
}
|
|
||||||
rescue Timeout::Error
|
|
||||||
flunk('timeout')
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# this test is the same as test_ncanc_ip_tcp
|
|
||||||
def test_setup_socket_ncacn_ip_tcp
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_setup_socket_ncacn_ip_tcp_nil_socket
|
|
||||||
read = ["\x05\x00\x0c\x03\x10\x00\x00\x00\x3c\x00\x00\x00\x00\x00\x00\x00\xd0\x16\xd0\x16\x56\x66\x00\x00\x04\x00\x31\x33\x35\x00\xcd\x71\x01\x00\x00\x00\x00\x00\x00\x00\x04\x5d\x88\x8a\xeb\x1c\xc9\x11\x9f\xe8\x08\x00\x2b\x10\x48\x60\x02\x00\x00\x00"]
|
|
||||||
write = ["\005\000\v\003\020\000\000\000H\000\000\000\000\000\000\000\320\026\320\026\000\000\000\000\001\000\000\000\000\000\001\000\010\203\257\341\037]\311\021\221\244\010\000+\024\240\372\003\000\000\000\004]\210\212\353\034\311\021\237\350\010\000+\020H`\002\000\000\000"]
|
|
||||||
setup_test(read, write)
|
|
||||||
begin
|
|
||||||
Timeout.timeout($_REX_TEST_TIMEOUT) {
|
|
||||||
handle = Rex::Proto::DCERPC::Handle.new(['E1AF8308-5D1F-11C9-91A4-08002B14A0FA', '3.0'], 'ncacn_ip_tcp', $_REX_TEST_SMB_HOST, [135])
|
|
||||||
assert_instance_of(Rex::Proto::DCERPC::Handle, handle, 'handle')
|
|
||||||
dcerpc = Rex::Proto::DCERPC::Client.new(handle, nil)
|
|
||||||
assert_instance_of(Rex::Proto::DCERPC::Client, dcerpc, 'bind')
|
|
||||||
}
|
|
||||||
rescue Timeout::Error
|
|
||||||
flunk('timeout')
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_setup_socket_ncacn_np_socket
|
|
||||||
read = ["\x82\x00\x00\x00",
|
|
||||||
"\x00\x00\x00\x55\xff\x53\x4d\x42\x72\x00\x00\x00\x00\x98\x01\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2f\xaa\x00\x00\xac\x0a\x11\x03\x00\x03\x0a\x00\x01\x00\x04\x11\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\xfd\xe3\x00\x80\xca\x3d\x91\x3c\x0b\xfd\xc5\x01\xe0\x01\x00\x10\x00\x8b\x3c\x73\xd2\x53\x9e\x28\x48\xa2\xac\x68\xae\xd1\x2e\x41\x5a",
|
|
||||||
"\x00\x00\x01\xb3\xff\x53\x4d\x42\x73\x16\x00\x00\xc0\x98\x01\x68\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2f\xaa\x00\x08\xac\x0a\x04\xff\x00\xb3\x01\x00\x00\x63\x01\x88\x01\xa1\x82\x01\x5f\x30\x82\x01\x5b\xa0\x03\x0a\x01\x01\xa1\x0c\x06\x0a\x2b\x06\x01\x04\x01\x82\x37\x02\x02\x0a\xa2\x81\xa1\x04\x81\x9e\x4e\x54\x4c\x4d\x53\x53\x50\x00\x02\x00\x00\x00\x12\x00\x12\x00\x30\x00\x00\x00\x05\x02\x8a\x00\x4a\xda\x31\xb4\x0f\x33\x09\x9f\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x00\x5c\x00\x42\x00\x00\x00\x57\x00\x49\x00\x4e\x00\x32\x00\x4b\x00\x42\x00\x41\x00\x53\x00\x45\x00\x02\x00\x12\x00\x57\x00\x49\x00\x4e\x00\x32\x00\x4b\x00\x42\x00\x41\x00\x53\x00\x45\x00\x01\x00\x12\x00\x57\x00\x49\x00\x4e\x00\x32\x00\x4b\x00\x42\x00\x41\x00\x53\x00\x45\x00\x04\x00\x12\x00\x77\x00\x69\x00\x6e\x00\x32\x00\x6b\x00\x62\x00\x61\x00\x73\x00\x65\x00\x03\x00\x12\x00\x77\x00\x69\x00\x6e\x00\x32\x00\x6b\x00\x62\x00\x61\x00\x73\x00\x65\x00\x00\x00\x00\x00\xa3\x81\xa1\x04\x81\x9e\x4e\x54\x4c\x4d\x53\x53\x50\x00\x02\x00\x00\x00\x12\x00\x12\x00\x30\x00\x00\x00\x05\x02\x8a\x00\x4a\xda\x31\xb4\x0f\x33\x09\x9f\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x00\x5c\x00\x42\x00\x00\x00\x57\x00\x49\x00\x4e\x00\x32\x00\x4b\x00\x42\x00\x41\x00\x53\x00\x45\x00\x02\x00\x12\x00\x57\x00\x49\x00\x4e\x00\x32\x00\x4b\x00\x42\x00\x41\x00\x53\x00\x45\x00\x01\x00\x12\x00\x57\x00\x49\x00\x4e\x00\x32\x00\x4b\x00\x42\x00\x41\x00\x53\x00\x45\x00\x04\x00\x12\x00\x77\x00\x69\x00\x6e\x00\x32\x00\x6b\x00\x62\x00\x61\x00\x73\x00\x65\x00\x03\x00\x12\x00\x77\x00\x69\x00\x6e\x00\x32\x00\x6b\x00\x62\x00\x61\x00\x73\x00\x65\x00\x00\x00\x00\x00\x57\x69\x6e\x64\x6f\x77\x73\x20\x35\x2e\x30\x00\x57\x69\x6e\x64\x6f\x77\x73\x20\x32\x30\x30\x30\x20\x4c\x41\x4e\x20\x4d\x61\x6e\x61\x67\x65\x72\x00",
|
|
||||||
"\x00\x00\x00\x23\xff\x53\x4d\x42\x73\x6d\x00\x00\xc0\x98\x01\x68\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2f\xaa\x00\x08\xac\x0a\x00\x00\x00",
|
|
||||||
"\x00\x00\x00\x58\xff\x53\x4d\x42\x73\x00\x00\x00\x00\x98\x01\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2f\xaa\x01\x08\xac\x0a\x03\xff\x00\x58\x00\x00\x00\x2f\x00\x57\x69\x6e\x64\x6f\x77\x73\x20\x35\x2e\x30\x00\x57\x69\x6e\x64\x6f\x77\x73\x20\x32\x30\x30\x30\x20\x4c\x41\x4e\x20\x4d\x61\x6e\x61\x67\x65\x72\x00\x57\x4f\x52\x4b\x47\x52\x4f\x55\x50\x00",
|
|
||||||
"\x00\x00\x00\x2e\xff\x53\x4d\x42\x75\x00\x00\x00\x00\x98\x01\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x2f\xaa\x01\x08\xac\x0a\x03\xff\x00\x2e\x00\x01\x00\x05\x00\x49\x50\x43\x00\x00",
|
|
||||||
"\x00\x00\x00\x87\xff\x53\x4d\x42\xa2\x00\x00\x00\x00\x98\x01\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x2f\xaa\x01\x08\xac\x0a\x2a\xff\x00\x87\x00\x00\x00\x40\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xff\x05\x00\x00\x00\x70\x00\x00\x00\x00\x00\x00\x00\x70\x00\x00\x00\x20\x00\x20\x00\x70\x00\x00\x00\x00\x00\x9b\x01\x12\x00\x9b\x01\x12\x00\x08\x00",
|
|
||||||
"\x00\x00\x00\x2f\xff\x53\x4d\x42\x2f\x00\x00\x00\x00\x98\x01\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x2f\xaa\x01\x08\xac\x0a\x06\xff\x00\x2f\x00\x48\x00\xff\xff\x00\x00\x00\x00\x00\x00",
|
|
||||||
"\x00\x00\x00\x80\xff\x53\x4d\x42\x2e\x00\x00\x00\x00\x98\x01\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x2f\xaa\x01\x08\xac\x0a\x0c\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x00\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x00\x00\x05\x00\x0c\x03\x10\x00\x00\x00\x44\x00\x00\x00\x00\x00\x00\x00\xb8\x10\xb8\x10\x98\x2d\x01\x00\x0d\x00\x5c\x50\x49\x50\x45\x5c\x6e\x74\x73\x76\x63\x73\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x04\x5d\x88\x8a\xeb\x1c\xc9\x11\x9f\xe8\x08\x00\x2b\x10\x48\x60\x02\x00\x00\x00",
|
|
||||||
"\x00\x00\x00\x2f\xff\x53\x4d\x42\x2f\x00\x00\x00\x00\x98\x01\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x2f\xaa\x01\x08\xac\x0a\x06\xff\x00\x2f\x00\x64\x00\xff\xff\x00\x00\x00\x00\x00\x00",
|
|
||||||
"\x00\x00\x00\x70\xff\x53\x4d\x42\x2e\x00\x00\x00\x00\x98\x01\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x2f\xaa\x01\x08\xac\x0a\x0c\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\x00\x00\x05\x00\x02\x03\x10\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\xc0"
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
write = [
|
|
||||||
"\x81\x00\x00\x44\x20\x43\x4b\x46\x44\x45\x4e\x45\x43\x46\x44\x45\x46\x46\x43\x46\x47\x45\x46\x46\x43\x43\x41\x43\x41\x43\x41\x43\x41\x43\x41\x43\x41\x00\x20\x43\x41\x43\x41\x43\x41\x43\x41\x43\x41\x43\x41\x43\x41\x43\x41\x43\x41\x43\x41\x43\x41\x43\x41\x43\x41\x43\x41\x43\x41\x41\x41\x00",
|
|
||||||
"\x00\x00\x00\x54\xff\x53\x4d\x42\x72\x00\x00\x00\x00\x18\x01\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2f\xaa\x00\x00\xac\x0a\x00\x31\x00\x02\x4c\x41\x4e\x4d\x41\x4e\x31\x2e\x30\x00\x02\x4c\x4d\x31\x2e\x32\x58\x30\x30\x32\x00\x02\x4e\x54\x20\x4c\x41\x4e\x4d\x41\x4e\x20\x31\x2e\x30\x00\x02\x4e\x54\x20\x4c\x4d\x20\x30\x2e\x31\x32\x00",
|
|
||||||
"\x00\x00\x00\xb0\xff\x53\x4d\x42\x73\x00\x00\x00\x00\x18\x01\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2f\xaa\x00\x00\xac\x0a\x0c\xff\x00\x00\x00\xdf\xff\x02\x00\x01\x00\x00\x00\x00\x00\x52\x00\x00\x00\x00\x00\x5c\xd0\x00\x80\x75\x00\x60\x50\x06\x06\x2b\x06\x01\x05\x05\x02\xa0\x46\x30\x44\xa0\x0e\x30\x0c\x06\x0a\x2b\x06\x01\x04\x01\x82\x37\x02\x02\x0a\xa2\x32\x04\x30\x4e\x54\x4c\x4d\x53\x53\x50\x00\x01\x00\x00\x00\x01\x02\x08\x00\x00\x00\x00\x00\x20\x00\x00\x00\x10\x00\x10\x00\x20\x00\x00\x00\x31\x41\x44\x37\x44\x6e\x4a\x54\x56\x79\x6b\x58\x47\x59\x59\x4d\x57\x69\x6e\x64\x6f\x77\x73\x20\x32\x30\x30\x30\x20\x32\x31\x39\x35\x00\x57\x69\x6e\x64\x6f\x77\x73\x20\x32\x30\x30\x30\x20\x35\x2e\x30\x00",
|
|
||||||
"\x00\x00\x00\xfa\xff\x53\x4d\x42\x73\x00\x00\x00\x00\x18\x01\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2f\xaa\x00\x08\xac\x0a\x0c\xff\x00\x00\x00\xdf\xff\x02\x00\x01\x00\x00\x00\x00\x00\x9c\x00\x00\x00\x00\x00\x5c\xd0\x00\x80\xbf\x00\xa1\x81\x99\x30\x81\x96\xa2\x81\x93\x04\x81\x90\x4e\x54\x4c\x4d\x53\x53\x50\x00\x03\x00\x00\x00\x18\x00\x18\x00\x40\x00\x00\x00\x18\x00\x18\x00\x58\x00\x00\x00\x00\x00\x00\x00\x70\x00\x00\x00\x00\x00\x00\x00\x70\x00\x00\x00\x20\x00\x20\x00\x70\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x02\x08\x00\x3a\xc1\xe6\x27\x57\xae\x58\x51\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8c\x4d\x20\xdf\x63\xbd\xda\xdc\x62\x0d\x49\xe7\xf2\x7a\x86\x88\xe9\x5f\x03\x95\xbb\x9b\xc6\x85\x31\x00\x41\x00\x44\x00\x37\x00\x44\x00\x6e\x00\x4a\x00\x54\x00\x56\x00\x79\x00\x6b\x00\x58\x00\x47\x00\x59\x00\x59\x00\x4d\x00\x57\x69\x6e\x64\x6f\x77\x73\x20\x32\x30\x30\x30\x20\x32\x31\x39\x35\x00\x57\x69\x6e\x64\x6f\x77\x73\x20\x32\x30\x30\x30\x20\x35\x2e\x30\x00",
|
|
||||||
"\x00\x00\x00\x62\xff\x53\x4d\x42\x73\x00\x00\x00\x00\x18\x01\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2f\xaa\x00\x00\xac\x0a\x0d\xff\x00\x00\x00\xdf\xff\x02\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x25\x00\x00\x00\x57\x69\x6e\x64\x6f\x77\x73\x20\x32\x30\x30\x30\x20\x32\x31\x39\x35\x00\x57\x69\x6e\x64\x6f\x77\x73\x20\x32\x30\x30\x30\x20\x35\x2e\x30\x00",
|
|
||||||
"\x00\x00\x00\x37\xff\x53\x4d\x42\x75\x00\x00\x00\x00\x18\x01\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2f\xaa\x01\x08\xac\x0a\x04\xff\x00\x00\x00\x00\x00\x01\x00\x0c\x00\x00\x49\x50\x43\x24\x00\x3f\x3f\x3f\x3f\x3f\x00",
|
|
||||||
"\x00\x00\x00\x5c\xff\x53\x4d\x42\xa2\x00\x00\x00\x00\x18\x01\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x2f\xaa\x01\x08\xac\x0a\x18\xff\x00\x00\x00\x00\x08\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x09\x00\x5c\x42\x52\x4f\x57\x53\x45\x52\x00",
|
|
||||||
"\x00\x00\x00\x87\xff\x53\x4d\x42\x2f\x00\x00\x00\x00\x18\x01\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x2f\xaa\x01\x08\xac\x0a\x0e\xff\x00\x00\x00\x00\x40\x00\x00\x00\x00\xff\xff\xff\xff\x08\x00\x48\x00\x00\x00\x48\x00\x3f\x00\x00\x00\x00\x00\x48\x00\x05\x00\x0b\x03\x10\x00\x00\x00\x48\x00\x00\x00\x00\x00\x00\x00\xd0\x16\xd0\x16\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x01\x00\xc8\x4f\x32\x4b\x70\x16\xd3\x01\x12\x78\x5a\x47\xbf\x6e\xe1\x88\x03\x00\x00\x00\x04\x5d\x88\x8a\xeb\x1c\xc9\x11\x9f\xe8\x08\x00\x2b\x10\x48\x60\x02\x00\x00\x00",
|
|
||||||
"\000\000\0007\377SMB.\000\000\000\000\030\001 \000\000\000\000\000\000\000\000\000\000\000\000\000\010/\252\001\010\254\n\n\377\000\000\000\000@\000\000\000\000\200\273\200\273\000\000\000\000\000\000\000\000"
|
|
||||||
]
|
|
||||||
setup_test(read, write)
|
|
||||||
begin
|
|
||||||
Timeout.timeout($_REX_TEST_TIMEOUT) {
|
|
||||||
s = Rex::Socket.create_tcp('PeerHost' => $_REX_TEST_SMB_HOST, 'PeerPort' => 139)
|
|
||||||
|
|
||||||
handle = Rex::Proto::DCERPC::Handle.new(['4b324fc8-1670-01d3-1278-5a47bf6ee188', '3.0'], 'ncacn_np', $_REX_TEST_SMB_HOST, ['\BROWSER'])
|
|
||||||
assert_instance_of(Rex::Proto::DCERPC::Handle, handle, 'handle')
|
|
||||||
dcerpc = Rex::Proto::DCERPC::Client.new(handle, s)
|
|
||||||
assert_instance_of(Rex::Proto::DCERPC::Client, dcerpc, 'bind')
|
|
||||||
}
|
|
||||||
rescue Timeout::Error
|
|
||||||
flunk('timeout')
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# this test is the same as test_dcerpc_over_smb
|
|
||||||
def test_setup_socket_ncacn_np_filehandle
|
|
||||||
end
|
|
||||||
|
|
||||||
# test connect to a dcerpc service via ncacn_np, without passing a socket.
|
|
||||||
# this should test the autosocket & autosmb foo
|
|
||||||
def test_setup_socket_ncacn_np_nil_socket
|
|
||||||
|
|
||||||
write = [
|
|
||||||
"\x00\x00\x00\x54\xff\x53\x4d\x42\x72\x00\x00\x00\x00\x18\x01\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2f\xaa\x00\x00\xac\x0a\x00\x31\x00\x02\x4c\x41\x4e\x4d\x41\x4e\x31\x2e\x30\x00\x02\x4c\x4d\x31\x2e\x32\x58\x30\x30\x32\x00\x02\x4e\x54\x20\x4c\x41\x4e\x4d\x41\x4e\x20\x31\x2e\x30\x00\x02\x4e\x54\x20\x4c\x4d\x20\x30\x2e\x31\x32\x00",
|
|
||||||
"\x00\x00\x00\xb0\xff\x53\x4d\x42\x73\x00\x00\x00\x00\x18\x01\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2f\xaa\x00\x00\xac\x0a\x0c\xff\x00\x00\x00\xdf\xff\x02\x00\x01\x00\x00\x00\x00\x00\x52\x00\x00\x00\x00\x00\x5c\xd0\x00\x80\x75\x00\x60\x50\x06\x06\x2b\x06\x01\x05\x05\x02\xa0\x46\x30\x44\xa0\x0e\x30\x0c\x06\x0a\x2b\x06\x01\x04\x01\x82\x37\x02\x02\x0a\xa2\x32\x04\x30\x4e\x54\x4c\x4d\x53\x53\x50\x00\x01\x00\x00\x00\x01\x02\x08\x00\x00\x00\x00\x00\x20\x00\x00\x00\x10\x00\x10\x00\x20\x00\x00\x00\x31\x41\x44\x37\x44\x6e\x4a\x54\x56\x79\x6b\x58\x47\x59\x59\x4d\x57\x69\x6e\x64\x6f\x77\x73\x20\x32\x30\x30\x30\x20\x32\x31\x39\x35\x00\x57\x69\x6e\x64\x6f\x77\x73\x20\x32\x30\x30\x30\x20\x35\x2e\x30\x00",
|
|
||||||
"\000\000\000\372\377SMBs\000\000\000\000\030\001(\000\000\000\000\000\000\000\000\000\000\000\000\000\000/\252\000\010\254\n\f\377\000\000\000\337\377\002\000\001\000\000\000\000\000\234\000\000\000\000\000\\\320\000\200\277\000\241\201\2310\201\226\242\201\223\004\201\220NTLMSSP\000\003\000\000\000\030\000\030\000@\000\000\000\030\000\030\000X\000\000\000\000\000\000\000p\000\000\000\000\000\000\000p\000\000\000 \000 \000p\000\000\000\000\000\000\000\000\000\000\000\001\002\010\000:\301\346'W\256XQ\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\314\256\352Sm%S:f/\335\230\200\327K\023\241\366\353vX\016\256\3571\000A\000D\0007\000D\000n\000J\000T\000V\000y\000k\000X\000G\000Y\000Y\000M\000Windows 2000 2195\000Windows 2000 5.0\000",
|
|
||||||
"\x00\x00\x00\x62\xff\x53\x4d\x42\x73\x00\x00\x00\x00\x18\x01\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2f\xaa\x00\x00\xac\x0a\x0d\xff\x00\x00\x00\xdf\xff\x02\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x25\x00\x00\x00\x57\x69\x6e\x64\x6f\x77\x73\x20\x32\x30\x30\x30\x20\x32\x31\x39\x35\x00\x57\x69\x6e\x64\x6f\x77\x73\x20\x32\x30\x30\x30\x20\x35\x2e\x30\x00",
|
|
||||||
"\x00\x00\x00\x37\xff\x53\x4d\x42\x75\x00\x00\x00\x00\x18\x01\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2f\xaa\x01\x08\xac\x0a\x04\xff\x00\x00\x00\x00\x00\x01\x00\x0c\x00\x00\x49\x50\x43\x24\x00\x3f\x3f\x3f\x3f\x3f\x00",
|
|
||||||
"\x00\x00\x00\x5c\xff\x53\x4d\x42\xa2\x00\x00\x00\x00\x18\x01\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x2f\xaa\x01\x08\xac\x0a\x18\xff\x00\x00\x00\x00\x08\x00\x16\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x09\x00\x5c\x42\x52\x4f\x57\x53\x45\x52\x00",
|
|
||||||
"\x00\x00\x00\x87\xff\x53\x4d\x42\x2f\x00\x00\x00\x00\x18\x01\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x2f\xaa\x01\x08\xac\x0a\x0e\xff\x00\x00\x00\x00\x40\x00\x00\x00\x00\xff\xff\xff\xff\x08\x00\x48\x00\x00\x00\x48\x00\x3f\x00\x00\x00\x00\x00\x48\x00\x05\x00\x0b\x03\x10\x00\x00\x00\x48\x00\x00\x00\x00\x00\x00\x00\xd0\x16\xd0\x16\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x01\x00\xc8\x4f\x32\x4b\x70\x16\xd3\x01\x12\x78\x5a\x47\xbf\x6e\xe1\x88\x03\x00\x00\x00\x04\x5d\x88\x8a\xeb\x1c\xc9\x11\x9f\xe8\x08\x00\x2b\x10\x48\x60\x02\x00\x00\x00",
|
|
||||||
"\000\000\0007\377SMB.\000\000\000\000\030\001 \000\000\000\000\000\000\000\000\000\000\000\000\000\010/\252\001\010\254\n\n\377\000\000\000\000@\000\000\000\000\200\273\200\273\000\000\000\000\000\000\000\000",
|
|
||||||
"\x00\x00\x00\xa3\xff\x53\x4d\x42\x2f\x00\x00\x00\x00\x18\x01\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x2f\xaa\x01\x08\xac\x0a\x0e\xff\x00\x00\x00\x00\x40\x00\x00\x00\x00\xff\xff\xff\xff\x08\x00\x64\x00\x00\x00\x64\x00\x3f\x00\x00\x00\x00\x00\x64\x00\x05\x00\x00\x03\x10\x00\x00\x00\x64\x00\x00\x00\x00\x00\x00\x00\x4c\x00\x00\x00\x00\x00\x30\x00\x01\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x41\x00\x41\x00\x41\x00\x41\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x03\x00\x04\x00\x00\x00\x41\x41\x41\x41\x05\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x42\x00\x42\x00\x42\x00\x42\x00\x00\x00\x00\x00\x04\x00\x00\x00\x0a\x00\x00\x00",
|
|
||||||
"\000\000\0007\377SMB.\000\000\000\000\030\001 \000\000\000\000\000\000\000\000\000\000\000\000\000\010/\252\001\010\254\n\n\377\000\000\000\000@\000\000\000\000\200\273\200\273\000\000\000\000\000\000\000\000"
|
|
||||||
]
|
|
||||||
read = [
|
|
||||||
"\x00\x00\x00\x55\xff\x53\x4d\x42\x72\x00\x00\x00\x00\x98\x01\x28\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2f\xaa\x00\x00\xac\x0a\x11\x03\x00\x03\x0a\x00\x01\x00\x04\x11\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\xfd\xe3\x00\x80\x20\x5f\xf5\x32\x11\xfd\xc5\x01\xe0\x01\x00\x10\x00\x8b\x3c\x73\xd2\x53\x9e\x28\x48\xa2\xac\x68\xae\xd1\x2e\x41\x5a",
|
|
||||||
"\x00\x00\x01\xb3\xff\x53\x4d\x42\x73\x16\x00\x00\xc0\x98\x01\x68\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2f\xaa\x00\x08\xac\x0a\x04\xff\x00\xb3\x01\x00\x00\x63\x01\x88\x01\xa1\x82\x01\x5f\x30\x82\x01\x5b\xa0\x03\x0a\x01\x01\xa1\x0c\x06\x0a\x2b\x06\x01\x04\x01\x82\x37\x02\x02\x0a\xa2\x81\xa1\x04\x81\x9e\x4e\x54\x4c\x4d\x53\x53\x50\x00\x02\x00\x00\x00\x12\x00\x12\x00\x30\x00\x00\x00\x05\x02\x8a\x00\xf5\xe4\x8c\x90\x50\xe3\xcd\x63\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x00\x5c\x00\x42\x00\x00\x00\x57\x00\x49\x00\x4e\x00\x32\x00\x4b\x00\x42\x00\x41\x00\x53\x00\x45\x00\x02\x00\x12\x00\x57\x00\x49\x00\x4e\x00\x32\x00\x4b\x00\x42\x00\x41\x00\x53\x00\x45\x00\x01\x00\x12\x00\x57\x00\x49\x00\x4e\x00\x32\x00\x4b\x00\x42\x00\x41\x00\x53\x00\x45\x00\x04\x00\x12\x00\x77\x00\x69\x00\x6e\x00\x32\x00\x6b\x00\x62\x00\x61\x00\x73\x00\x65\x00\x03\x00\x12\x00\x77\x00\x69\x00\x6e\x00\x32\x00\x6b\x00\x62\x00\x61\x00\x73\x00\x65\x00\x00\x00\x00\x00\xa3\x81\xa1\x04\x81\x9e\x4e\x54\x4c\x4d\x53\x53\x50\x00\x02\x00\x00\x00\x12\x00\x12\x00\x30\x00\x00\x00\x05\x02\x8a\x00\xf5\xe4\x8c\x90\x50\xe3\xcd\x63\x00\x00\x00\x00\x00\x00\x00\x00\x5c\x00\x5c\x00\x42\x00\x00\x00\x57\x00\x49\x00\x4e\x00\x32\x00\x4b\x00\x42\x00\x41\x00\x53\x00\x45\x00\x02\x00\x12\x00\x57\x00\x49\x00\x4e\x00\x32\x00\x4b\x00\x42\x00\x41\x00\x53\x00\x45\x00\x01\x00\x12\x00\x57\x00\x49\x00\x4e\x00\x32\x00\x4b\x00\x42\x00\x41\x00\x53\x00\x45\x00\x04\x00\x12\x00\x77\x00\x69\x00\x6e\x00\x32\x00\x6b\x00\x62\x00\x61\x00\x73\x00\x65\x00\x03\x00\x12\x00\x77\x00\x69\x00\x6e\x00\x32\x00\x6b\x00\x62\x00\x61\x00\x73\x00\x65\x00\x00\x00\x00\x00\x57\x69\x6e\x64\x6f\x77\x73\x20\x35\x2e\x30\x00\x57\x69\x6e\x64\x6f\x77\x73\x20\x32\x30\x30\x30\x20\x4c\x41\x4e\x20\x4d\x61\x6e\x61\x67\x65\x72\x00",
|
|
||||||
"\x00\x00\x00\x23\xff\x53\x4d\x42\x73\x6d\x00\x00\xc0\x98\x01\x68\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2f\xaa\x00\x08\xac\x0a\x00\x00\x00",
|
|
||||||
"\x00\x00\x00\x58\xff\x53\x4d\x42\x73\x00\x00\x00\x00\x98\x01\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x2f\xaa\x01\x08\xac\x0a\x03\xff\x00\x58\x00\x00\x00\x2f\x00\x57\x69\x6e\x64\x6f\x77\x73\x20\x35\x2e\x30\x00\x57\x69\x6e\x64\x6f\x77\x73\x20\x32\x30\x30\x30\x20\x4c\x41\x4e\x20\x4d\x61\x6e\x61\x67\x65\x72\x00\x57\x4f\x52\x4b\x47\x52\x4f\x55\x50\x00",
|
|
||||||
"\x00\x00\x00\x2e\xff\x53\x4d\x42\x75\x00\x00\x00\x00\x98\x01\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x2f\xaa\x01\x08\xac\x0a\x03\xff\x00\x2e\x00\x01\x00\x05\x00\x49\x50\x43\x00\x00",
|
|
||||||
"\x00\x00\x00\x87\xff\x53\x4d\x42\xa2\x00\x00\x00\x00\x98\x01\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x2f\xaa\x01\x08\xac\x0a\x2a\xff\x00\x87\x00\x00\x00\x40\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xff\x05\x00\x00\x00\x00\x00\x00\x00\x00\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\xff\x9b\x01\x12\x00\x9b\x01\x12\x00\x12\x00",
|
|
||||||
"\x00\x00\x00\x2f\xff\x53\x4d\x42\x2f\x00\x00\x00\x00\x98\x01\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x2f\xaa\x01\x08\xac\x0a\x06\xff\x00\x2f\x00\x48\x00\xff\xff\x00\x00\x00\x00\x00\x00",
|
|
||||||
"\x00\x00\x00\x80\xff\x53\x4d\x42\x2e\x00\x00\x00\x00\x98\x01\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x2f\xaa\x01\x08\xac\x0a\x0c\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x44\x00\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x45\x00\x00\x05\x00\x0c\x03\x10\x00\x00\x00\x44\x00\x00\x00\x00\x00\x00\x00\xb8\x10\xb8\x10\xbe\x2f\x01\x00\x0d\x00\x5c\x50\x49\x50\x45\x5c\x6e\x74\x73\x76\x63\x73\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x04\x5d\x88\x8a\xeb\x1c\xc9\x11\x9f\xe8\x08\x00\x2b\x10\x48\x60\x02\x00\x00\x00",
|
|
||||||
"\x00\x00\x00\x2f\xff\x53\x4d\x42\x2f\x00\x00\x00\x00\x98\x01\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x2f\xaa\x01\x08\xac\x0a\x06\xff\x00\x2f\x00\x64\x00\xff\xff\x00\x00\x00\x00\x00\x00",
|
|
||||||
"\x00\x00\x00\x70\xff\x53\x4d\x42\x2e\x00\x00\x00\x00\x98\x01\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x2f\xaa\x01\x08\xac\x0a\x0c\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x3c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x35\x00\x25\x05\x00\x02\x03\x10\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x1c\x00\x00\x00\x00\x00\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x34\x00\x00\xc0",
|
|
||||||
]
|
|
||||||
setup_test(read, write)
|
|
||||||
|
|
||||||
Timeout.timeout($_REX_TEST_TIMEOUT) {
|
|
||||||
handle = Rex::Proto::DCERPC::Handle.new(['4b324fc8-1670-01d3-1278-5a47bf6ee188', '3.0'], 'ncacn_np', $_REX_TEST_SMB_HOST, ['\BROWSER'])
|
|
||||||
dcerpc = Rex::Proto::DCERPC::Client.new(handle, nil)
|
|
||||||
assert_instance_of(Rex::Proto::DCERPC::Client, dcerpc, 'bind')
|
|
||||||
|
|
||||||
require 'rex/proto/dcerpc/ndr'
|
|
||||||
stub =
|
|
||||||
Rex::Proto::DCERPC::NDR.long(1) +
|
|
||||||
Rex::Proto::DCERPC::NDR.UnicodeConformantVaryingString('AAAA') +
|
|
||||||
|
|
||||||
# Type 33
|
|
||||||
Rex::Proto::DCERPC::NDR.long(1) +
|
|
||||||
Rex::Proto::DCERPC::NDR.short(2) +
|
|
||||||
Rex::Proto::DCERPC::NDR.short(3) +
|
|
||||||
Rex::Proto::DCERPC::NDR.UniConformantArray('AAAA') +
|
|
||||||
|
|
||||||
Rex::Proto::DCERPC::NDR.UnicodeConformantVaryingString('BBBB') +
|
|
||||||
Rex::Proto::DCERPC::NDR.long(4) +
|
|
||||||
Rex::Proto::DCERPC::NDR.long(10);
|
|
||||||
|
|
||||||
response = dcerpc.call(48, stub)
|
|
||||||
assert_equal(response.length, 28, 'response')
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
# makes two calls to create_tcp, first should raise Rex::ConnectionRefused, second should connect
|
|
||||||
def test_setup_socket_ncacn_np_nil_socket_first_connect_refused
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_read
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_write
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
rescue LoadError
|
|
||||||
end
|
|
||||||
|
|
|
@ -1,86 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
|
|
||||||
|
|
||||||
require 'rex/test'
|
|
||||||
require 'rex/exceptions'
|
|
||||||
require 'rex/proto/dcerpc/handle'
|
|
||||||
|
|
||||||
class Rex::Proto::DCERPC::Handle::UnitTest < Test::Unit::TestCase
|
|
||||||
Klass = Rex::Proto::DCERPC::Handle
|
|
||||||
|
|
||||||
def test_ncacn_np
|
|
||||||
uuid = ['6bffd098-a112-3610-9833-46c3f87e345a', '1.0']
|
|
||||||
protocol = 'ncacn_np'
|
|
||||||
host = '1.2.3.4'
|
|
||||||
options = ['\wkssvc']
|
|
||||||
i = Klass.new(uuid, protocol, host, options)
|
|
||||||
assert(i, 'new')
|
|
||||||
assert_equal('6bffd098-a112-3610-9833-46c3f87e345a:1.0@ncacn_np:1.2.3.4[\wkssvc]', i.to_s, 'as string')
|
|
||||||
assert_equal(uuid, i.uuid, 'uuid')
|
|
||||||
assert_equal(protocol, i.protocol, 'protocol')
|
|
||||||
assert_equal(options, i.options, 'options')
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_ncacn_ip_tcp
|
|
||||||
uuid = ['6bffd098-a112-3610-9833-46c3f87e345a', '1.0']
|
|
||||||
protocol = 'ncacn_ip_tcp'
|
|
||||||
host = '1.2.3.4'
|
|
||||||
options = [80]
|
|
||||||
i = Klass.new(uuid, protocol, host, options)
|
|
||||||
assert(i, 'new')
|
|
||||||
assert_equal('6bffd098-a112-3610-9833-46c3f87e345a:1.0@ncacn_ip_tcp:1.2.3.4[80]', i.to_s, 'as string')
|
|
||||||
assert_equal(uuid, i.uuid, 'uuid')
|
|
||||||
assert_equal(protocol, i.protocol, 'protocol')
|
|
||||||
assert_equal(options, i.options, 'options')
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_ncacn_ip_udp
|
|
||||||
uuid = ['6bffd098-a112-3610-9833-46c3f87e345a', '1.0']
|
|
||||||
protocol = 'ncacn_ip_udp'
|
|
||||||
host = '1.2.3.4'
|
|
||||||
options = [80]
|
|
||||||
i = Klass.new(uuid, protocol, host, options)
|
|
||||||
assert(i, 'new')
|
|
||||||
assert_equal('6bffd098-a112-3610-9833-46c3f87e345a:1.0@ncacn_ip_udp:1.2.3.4[80]', i.to_s, 'as string')
|
|
||||||
assert_equal(uuid, i.uuid, 'uuid')
|
|
||||||
assert_equal(protocol, i.protocol, 'protocol')
|
|
||||||
assert_equal(options, i.options, 'options')
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_ncacn_http
|
|
||||||
uuid = ['6bffd098-a112-3610-9833-46c3f87e345a', '1.0']
|
|
||||||
protocol = 'ncacn_http'
|
|
||||||
host = '1.2.3.4'
|
|
||||||
options = [80]
|
|
||||||
i = Klass.new(uuid, protocol, host, options)
|
|
||||||
assert(i, 'new')
|
|
||||||
assert_equal(i.to_s, '6bffd098-a112-3610-9833-46c3f87e345a:1.0@ncacn_http:1.2.3.4[80]', 'as string')
|
|
||||||
assert_equal(uuid, i.uuid, 'uuid')
|
|
||||||
assert_equal(protocol, i.protocol, 'protocol')
|
|
||||||
assert_equal(options, i.options, 'options')
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_invalid
|
|
||||||
assert_raise(Rex::ArgumentError, 'invalid uuid') { Klass.new(['a', '1.0'], 'ncacn_ip_tcp', '1.2.3.4', [80]) }
|
|
||||||
assert_raise(Rex::ArgumentError, 'invalid uuid version') { Klass.new(['6bffnd098-a112-3610-9833-46c3f87e345a', 'b'], 'ncacn_ip_tcp', '1.2.3.4', [80]) }
|
|
||||||
assert_raise(Rex::ArgumentError, 'invalid proto') { Klass.new(['6bffnd098-a112-3610-9833-46c3f87e345a', '1.0'], 'ncacn_ip_bmc', '1.2.3.4', [80]) }
|
|
||||||
assert_raise(Rex::ArgumentError, 'invalid empty uuid') { Klass.new([nil, '1.0'], 'ncacn_ip_tcp', '1.2.3.4', [80]) }
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_parser
|
|
||||||
handle = '6bffd098-a112-3610-9833-46c3f87e345a:1.0@ncacn_ip_tcp:10.4.10.10[80]'
|
|
||||||
i = Klass.parse( handle )
|
|
||||||
assert(i)
|
|
||||||
assert_equal(['6bffd098-a112-3610-9833-46c3f87e345a', '1.0'], i.uuid, 'uuid')
|
|
||||||
assert_equal('ncacn_ip_tcp', i.protocol, 'protocol')
|
|
||||||
assert_equal('10.4.10.10', i.address, 'address')
|
|
||||||
assert_equal(['80'], i.options, 'options')
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_parser_invalid
|
|
||||||
handle = '6bffd098-a112-3610-9833-46c3f87e345a:1.0@ncacn_ip_tcp:10.4.10.10[80'
|
|
||||||
assert_raise(Rex::ArgumentError, 'invalid handle (parser)') { Klass.parse(handle) }
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,42 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
|
|
||||||
|
|
||||||
require 'rex/test'
|
|
||||||
require 'rex/exceptions'
|
|
||||||
require 'rex/proto/dcerpc/ndr'
|
|
||||||
|
|
||||||
class Rex::Proto::DCERPC::NDR::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
Klass = Rex::Proto::DCERPC::NDR
|
|
||||||
|
|
||||||
def test_align
|
|
||||||
assert_equal(0, Klass.align('').length, 'align 0')
|
|
||||||
assert_equal(3, Klass.align('f').length, 'align 1')
|
|
||||||
assert_equal(2, Klass.align('fo').length, 'align 2')
|
|
||||||
assert_equal(1, Klass.align('foo').length, 'align 3')
|
|
||||||
assert_equal(0, Klass.align('fooo').length, 'align 4')
|
|
||||||
assert_equal(3, Klass.align('foooo').length, 'align 5')
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_numbers
|
|
||||||
assert_equal("\x0a\x00\x00\x00", Klass.long(10), 'long')
|
|
||||||
assert_equal("\x0a\x00", Klass.short(10), 'short')
|
|
||||||
assert_equal("\x0a", Klass.byte(10), 'byte')
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_conformant_array
|
|
||||||
assert_equal("\x05\x00\x00\x00aaaaa", Klass.UniConformantArray('aaaaa').slice(0,9), 'UniConformantArray')
|
|
||||||
assert_equal(12, Klass.UniConformantArray('aaaaa').length, 'UniConformantArray length')
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_conformant_string
|
|
||||||
assert_equal("\x06\x00\x00\x00" + "\x00\x00\x00\x00" + "\x06\x00\x00\x00" "a\x00a\x00a\x00a\x00a\x00\x00\x00", Klass.UnicodeConformantVaryingString('aaaaa').slice(0,4+4+4+12), 'UniConformantVaryingString')
|
|
||||||
assert_equal(24, Klass.UnicodeConformantVaryingString('aaaaa').length, 'UniConformantVaryingString length')
|
|
||||||
|
|
||||||
assert_equal("\x02\x00\x00\x00" + "\x00\x00\x00\x00" + "\x02\x00\x00\x00" "aa\x00\x00", Klass.UnicodeConformantVaryingStringPreBuilt('aa' + "\x00\x00"), 'UniConformantVaryingStringPreBuilt')
|
|
||||||
assert_equal(16, Klass.UnicodeConformantVaryingStringPreBuilt('aa' + "\x00\x00").length, 'UniConformantVaryingStringPreBuilt length')
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
|
@ -1,57 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
|
|
||||||
|
|
||||||
require 'rex/test'
|
|
||||||
require 'rex/proto/dcerpc/packet'
|
|
||||||
|
|
||||||
class Rex::Proto::DCERPC::Packet::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
Klass = Rex::Proto::DCERPC::Packet
|
|
||||||
|
|
||||||
def test_parse
|
|
||||||
|
|
||||||
actual = Klass.make_bind('367abb81-9844-35f1-ad32-98f038001003', '2.0')
|
|
||||||
expected = ["\005\000\v\003\020\000\000\000H\000\000\000\000\000\000\000\320\026\320\026\000\000\000\000\001\000\000\000\000\000\001\000\201\273z6D\230\3615\2552\230\3608\000\020\003\002\000\000\000\004]\210\212\353\034\311\021\237\350\010\000+\020H`\002\000\000\000", 0]
|
|
||||||
assert_equal(expected, actual, 'bind')
|
|
||||||
|
|
||||||
srand(0)
|
|
||||||
actual = Klass.make_bind_fake_multi('367abb81-9844-35f1-ad32-98f038001003', '2.0')
|
|
||||||
expected = [ "\005\000\v\003\020\000\000\0004\003\000\000\000\000\000\000\320\026\320\026\000\000\000\000\022\000\000\000\000\000\001\000u\300C\373\303g\t\323\025\362$WF\330X\214\002\000\001\000\004]\210\212\353\034\311\021\237\350\010\000+\020H`\002\000\000\000\001\000\001\000\346'W\256XQ\245\031MH\t\224s\320\363\305\000\000\002\000\004]\210\212\353\034\311\021\237\350\010\000+\020H`\002\000\000\000\002\000\001\000c\330\261\363\035\223\223\216\247 \301\t\271\177 \037\002\000\000\000\004]\210\212\353\034\311\021\237\350\010\000+\020H`\002\000\000\000\003\000\001\000\227\243\376\313r\267\034\"\200\200\2445\205&\350\364\001\000\003\000\004]\210\212\353\034\311\021\237\350\010\000+\020H`\002\000\000\000\004\000\001\000\204i*\272\037x\001A\347\2519#fw\v\256\002\000\003\000\004]\210\212\353\034\311\021\237\350\010\000+\020H`\002\000\000\000\005\000\001\000\200\216c5\214y\252T\313D\006\304/\177\364\203\004\000\000\000\004]\210\212\353\034\311\021\237\350\010\000+\020H`\002\000\000\000\006\000\001\000\264\350N\217\224\343\272\027\317\215uU01E\251\003\000\000\000\004]\210\212\353\034\311\021\237\350\010\000+\020H`\002\000\000\000\a\000\001\000_\305^\000q\262$\2420]\203b*\315p\347\005\000\001\000\004]\210\212\353\034\311\021\237\350\010\000+\020H`\002\000\000\000\010\000\001\000\177\000\212r+\272\177\027\273\202yb>\243\336{\003\000\002\000\004]\210\212\353\034\311\021\237\350\010\000+\020H`\002\000\000\000\t\000\001\000\256\343\224\3212\233\016):\301$\nV+h\v\002\000\003\000\004]\210\212\353\034\311\021\237\350\010\000+\020H`\002\000\000\000\n\000\001\000P \266\200&\023\256*s\270\274\350M\036\030}\002\000\003\000\004]\210\212\353\034\311\021\237\350\010\000+\020H`\002\000\000\000\v\000\001\000^\342k\rp(H\023_H\232\302\370\264C\354\005\000\002\000\004]\210\212\353\034\311\021\237\350\010\000+\020H`\002\000\000\000\f\000\001\000`\004\303\355\213\374V\315ymK\270\020\230\235\225\001\000\000\000\004]\210\212\353\034\311\021\237\350\010\000+\020H`\002\000\000\000\r\000\001\000\274yvu\275S\241h\240\344\373\373yF\325\037\005\000\003\000\004]\210\212\353\034\311\021\237\350\010\000+\020H`\002\000\000\000\016\000\001\000\201\273z6D\230\3615\2552\230\3608\000\020\003\002\000\000\000\004]\210\212\353\034\311\021\237\350\010\000+\020H`\002\000\000\000\017\000\001\000\270\230O)\022(\266\317\v\246o]\371\201\337v\004\000\000\000\004]\210\212\353\034\311\021\237\350\010\000+\020H`\002\000\000\000\020\000\001\000}\030C\322\357\003\352\314\346#\326\376\275\305\327+\000\000\003\000\004]\210\212\353\034\311\021\237\350\010\000+\020H`\002\000\000\000\021\000\001\000h\324\212\266\353\245}\234o\350\002\e\323\331\2275\003\000\002\000\004]\210\212\353\034\311\021\237\350\010\000+\020H`\002\000\000\000", 14]
|
|
||||||
assert_equal(expected, actual, 'bind fake multi')
|
|
||||||
|
|
||||||
actual = Klass.make_alter_context('367abb81-9844-35f1-ad32-98f038001003', '2.0')
|
|
||||||
expected = "\005\000\016\003\020\000\000\000H\000\000\000\000\000\000\000\320\026\320\026\000\000\000\000\001\000\000\000\000\000\001\000\201\273z6D\230\3615\2552\230\3608\000\020\003\002\000\000\000\004]\210\212\353\034\311\021\237\350\010\000+\020H`\002\000\000\000"
|
|
||||||
assert_equal(expected, actual, 'alter context')
|
|
||||||
|
|
||||||
actual = Klass.make_request(1337, '', 1024, 7331)
|
|
||||||
expected = ["\005\000\000\003\020\000\000\000\030\000\000\000\000\000\000\000\000\000\000\000\243\0349\005"]
|
|
||||||
assert_equal(expected, actual, 'make_request with no stub')
|
|
||||||
|
|
||||||
actual = Klass.make_request(1337, 'ABCD', 1024, 7331)
|
|
||||||
expected = ["\005\000\000\003\020\000\000\000\034\000\000\000\000\000\000\000\004\000\000\000\243\0349\005ABCD"]
|
|
||||||
assert_equal(expected, actual, 'make_request with stub')
|
|
||||||
|
|
||||||
actual = Klass.make_request(1337, 'ABCD', 3, 7331)
|
|
||||||
expected = ["\005\000\000\001\020\000\000\000\e\000\000\000\000\000\000\000\003\000\000\000\243\0349\005ABC", "\005\000\000\002\020\000\000\000\031\000\000\000\000\000\000\000\001\000\000\000\243\0349\005D"]
|
|
||||||
assert_equal(expected, actual, 'make_request with 2 frags')
|
|
||||||
|
|
||||||
actual = Klass.make_request(1337, 'ABCD', 1, 7331)
|
|
||||||
expected = ["\005\000\000\001\020\000\000\000\031\000\000\000\000\000\000\000\001\000\000\000\243\0349\005A", "\005\000\000\000\020\000\000\000\031\000\000\000\000\000\000\000\001\000\000\000\243\0349\005B", "\005\000\000\000\020\000\000\000\031\000\000\000\000\000\000\000\001\000\000\000\243\0349\005C", "\005\000\000\002\020\000\000\000\031\000\000\000\000\000\000\000\001\000\000\000\243\0349\005D"]
|
|
||||||
assert_equal(expected, actual, 'make_request with 4 frags')
|
|
||||||
|
|
||||||
|
|
||||||
actual = Klass.make_request(1337, '', 1024, 7331, '367abb81-9844-35f1-ad32-98f038001003')
|
|
||||||
expected = ["\005\000\000\x83\020\000\000\000\030\000\000\000\000\000\000\000\000\000\000\000\243\0349\005\201\273z6D\230\3615\2552\230\3608\000\020\003"]
|
|
||||||
assert_equal(expected, actual, 'make_request with no stub, with object_id')
|
|
||||||
|
|
||||||
actual = Klass.make_request(1337, 'ABCD', 1024, 7331, '367abb81-9844-35f1-ad32-98f038001003')
|
|
||||||
expected = ["\005\000\000\x83\020\000\000\000\034\000\000\000\000\000\000\000\004\000\000\000\243\0349\005\201\273z6D\230\3615\2552\230\3608\000\020\003ABCD"]
|
|
||||||
assert_equal(expected, actual, 'make_request with stub, with object_id')
|
|
||||||
|
|
||||||
actual = Klass.make_request(1337, 'ABCD', 1, 7331, '367abb81-9844-35f1-ad32-98f038001003')
|
|
||||||
expected = ["\005\000\000\x81\020\000\000\000\031\000\000\000\000\000\000\000\001\000\000\000\243\0349\005\201\273z6D\230\3615\2552\230\3608\000\020\003A", "\005\000\000\x80\020\000\000\000\031\000\000\000\000\000\000\000\001\000\000\000\243\0349\005\201\273z6D\230\3615\2552\230\3608\000\020\003B", "\005\000\000\x80\020\000\000\000\031\000\000\000\000\000\000\000\001\000\000\000\243\0349\005\201\273z6D\230\3615\2552\230\3608\000\020\003C", "\005\000\000\x82\020\000\000\000\031\000\000\000\000\000\000\000\001\000\000\000\243\0349\005\201\273z6D\230\3615\2552\230\3608\000\020\003D"]
|
|
||||||
assert_equal(expected, actual, 'make_request with 4 frags')
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,16 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
|
|
||||||
|
|
||||||
require 'rex/test'
|
|
||||||
require 'rex/proto/dcerpc/response'
|
|
||||||
|
|
||||||
class Rex::Proto::DCERPC::Response::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
Klass = Rex::Proto::DCERPC::Response
|
|
||||||
|
|
||||||
def test_parse
|
|
||||||
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,47 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
|
|
||||||
|
|
||||||
require 'rex/test'
|
|
||||||
require 'rex/exceptions'
|
|
||||||
require 'rex/proto/dcerpc/uuid'
|
|
||||||
|
|
||||||
class Rex::Proto::DCERPC::UUID::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
Klass = Rex::Proto::DCERPC::UUID
|
|
||||||
|
|
||||||
def test_is_uuid
|
|
||||||
assert(Klass.is?('afa8bd80-7d8a-11c9-bef4-08002b102989'), 'valid')
|
|
||||||
assert(!Klass.is?('afa8bd80-7d8a-11c9-bef4-08002b10298'), 'too short')
|
|
||||||
assert(!Klass.is?('afa8bd80-7d8a-11c9-bef4-08002b10298Z'), 'invalid character')
|
|
||||||
assert(!Klass.is?('afa8bd80-7d8a-11c9-bef4a08002b10298a'), 'missing dash')
|
|
||||||
assert(!Klass.is?('afa8bd80-7d8a-11c9-bef-a08002b10298a'), 'dash in wrong place')
|
|
||||||
assert_raise(Rex::ArgumentError, 'pack - too short') { Klass.is?(nil) }
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_lookup
|
|
||||||
assert_equal(Klass.uuid_by_name('MGMT'), 'afa8bd80-7d8a-11c9-bef4-08002b102989', 'uuid_by_name')
|
|
||||||
assert_equal(Klass.vers_by_name('MGMT'), '2.0', 'vers_by_name')
|
|
||||||
assert(!Klass.uuid_by_name('NO_SUCH_UUID'), 'uuid_by_name - invalid')
|
|
||||||
assert(!Klass.vers_by_name('NO_SUCH_UUID'), 'vers_by_name - invalid')
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_packing
|
|
||||||
uuid = '367abb81-9844-35f1-ad32-98f038001003'
|
|
||||||
assert_equal(Klass.uuid_pack(uuid), "\201\273z6D\230\3615\2552\230\3608\000\020\003", 'pack')
|
|
||||||
assert_equal(Klass.uuid_unpack("\201\273z6D\230\3615\2552\230\3608\000\020\003"), uuid, 'unpack')
|
|
||||||
assert_raise(Rex::ArgumentError, 'pack - too short') { Klass.uuid_pack('foo') }
|
|
||||||
assert_raise(Rex::ArgumentError, 'unpack - too short') { Klass.uuid_unpack('foo') }
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_xfer
|
|
||||||
assert_equal(Klass.xfer_syntax_uuid(), "\004]\210\212\353\034\311\021\237\350\010\000+\020H`", 'xfer_syntax_uuid')
|
|
||||||
assert_equal(Klass.xfer_syntax_vers(), '2.0', 'xfer_syntax_vers')
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_vers
|
|
||||||
assert_equal(Klass.vers_to_nums('2.0'), [2, 0], 'vers_to_nums')
|
|
||||||
assert_equal(Klass.vers_to_nums('2'), [2, 0], 'vers_to_nums (short)')
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,24 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
|
|
||||||
|
|
||||||
require 'rex/test'
|
|
||||||
require 'rex/proto/drda/constants'
|
|
||||||
|
|
||||||
class Rex::Proto::DRDA::Constants::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
Konst = Rex::Proto::DRDA::Constants
|
|
||||||
|
|
||||||
def test_defines
|
|
||||||
assert_equal(Konst::EXCSAT, 0x1041)
|
|
||||||
assert_equal(Konst::MGRLVLLS, 0x1404)
|
|
||||||
assert_equal(Konst::SECCHKCD, 0x11a4)
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_const_values
|
|
||||||
assert_kind_of(Array, Konst.const_values)
|
|
||||||
assert Konst.const_values.include? Konst::EXCSAT
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
|
@ -1,110 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
|
|
||||||
|
|
||||||
require 'rex/test'
|
|
||||||
require 'rex/proto/drda/packet'
|
|
||||||
|
|
||||||
class Rex::Proto::DRDA::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
Klass = Rex::Proto::DRDA
|
|
||||||
Konst = Rex::Proto::DRDA::Constants
|
|
||||||
|
|
||||||
# Test a sample param
|
|
||||||
def test_mgrlvlls_param
|
|
||||||
p = Klass::MGRLVLLS_PARAM.new
|
|
||||||
assert_kind_of(Struct, p)
|
|
||||||
assert_equal(Konst::MGRLVLLS, p.codepoint)
|
|
||||||
end
|
|
||||||
|
|
||||||
# Test a sample ddm
|
|
||||||
def test_secchk_ddm
|
|
||||||
d = Klass::SECCHK_DDM.new
|
|
||||||
assert_kind_of Struct, d
|
|
||||||
assert_equal Konst::SECCHK, d.codepoint
|
|
||||||
end
|
|
||||||
|
|
||||||
# All parameter names should have a corresponding codepoint,
|
|
||||||
# except "DDM_PARAM" (a generic parameter).
|
|
||||||
def test_all_param_codepoints
|
|
||||||
params = Klass.constants.map {|x| x if x =~ /PARAM$/}.compact
|
|
||||||
assert_operator params.size, :>=, 6 # Allow for more later.
|
|
||||||
params.each do |p|
|
|
||||||
cp = p.split(/_PARAM/).first
|
|
||||||
next if cp == "DDM"
|
|
||||||
assert Konst.const_defined? cp
|
|
||||||
assert_kind_of Numeric, Konst.const_get(cp)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# Similarly, so should DDM Structs.
|
|
||||||
def test_all_ddm_codepoints
|
|
||||||
ddms = Klass.constants.map {|x| x if x =~ /DDM$/}.compact
|
|
||||||
assert_operator ddms.size, :>=, 4 # Allow for more later.
|
|
||||||
ddms.each do |p|
|
|
||||||
cp = p.split(/_DDM/).first
|
|
||||||
next if cp == "BASIC"
|
|
||||||
assert_kind_of Numeric, Konst.const_get(cp)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# Ensure that all params have the same struct.
|
|
||||||
def test_param_struct
|
|
||||||
params = Klass.constants.map {|x| x if x =~ /PARAM$/}.compact
|
|
||||||
params.each do |p|
|
|
||||||
obj = Klass.const_get(p).new
|
|
||||||
assert_equal 3, obj.size
|
|
||||||
assert_respond_to obj, :codepoint
|
|
||||||
assert_respond_to obj, :length
|
|
||||||
assert_respond_to obj, :payload
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# Make some similiar assertions about DDMs, though specific DDMs
|
|
||||||
# will have particular elements after the codepoint, usually more
|
|
||||||
# than one.
|
|
||||||
def test_ddm_struct
|
|
||||||
ddms = Klass.constants.map {|x| x if x =~ /DDM$/}.compact
|
|
||||||
ddms.each do |d|
|
|
||||||
obj = Klass.const_get(d).new
|
|
||||||
assert_operator obj.size, :>=, 7
|
|
||||||
assert_respond_to obj, :length
|
|
||||||
assert_respond_to obj, :magic
|
|
||||||
assert_respond_to obj, :format
|
|
||||||
assert_respond_to obj, :correlid
|
|
||||||
assert_respond_to obj, :length2
|
|
||||||
assert_respond_to obj, :codepoint
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# The server packet is special since it's an Array of BASIC_DDM's,
|
|
||||||
# and doesn't have a particular, fixed struct. (It would be nice
|
|
||||||
# to build those up on the fly, but we're not really interested in
|
|
||||||
# validating most server responses right now.
|
|
||||||
def test_server_packet_structure
|
|
||||||
s = Klass::SERVER_PACKET.new
|
|
||||||
assert_kind_of Array, s
|
|
||||||
assert_respond_to s, :to_s
|
|
||||||
assert_respond_to s, :sz
|
|
||||||
assert_respond_to s, :read
|
|
||||||
end
|
|
||||||
|
|
||||||
# Exercise the SERVER_PACKET#read function with a sample packet.
|
|
||||||
def test_server_packet_read
|
|
||||||
pkt = "0015d0420001000f1219000611490000000511a4000050d0520002004a2201000611490000000c112ee2d8d3f0f8f0f2f4000d002fd8e3c4e2d8d3e7f8f6000a00350006119c033300062103022e00172135c3f0c1f8f6c1f0f14bc5c6f1f2070402195612008cd0030002008624080000000000303030303053514c303830323400ffffffff0200000000000000030000000000000000000000202020202020202020202000124d59444232444220202020202020202020200000003331ff383139ff4d59555345522020ff4d594442324442ff514442322f4c494e5558ff353538ff353538ff30ff31323038ff30ffff".scan(/../).map {|x| x.to_i(16).chr}.join
|
|
||||||
s = Klass::SERVER_PACKET.new
|
|
||||||
assert_equal 0, s.size
|
|
||||||
s.read(pkt)
|
|
||||||
assert_equal 3, s.size
|
|
||||||
assert_equal Konst::SECCHKRM, s[0].codepoint
|
|
||||||
assert_equal Konst::ACCRDBRM, s[1].codepoint
|
|
||||||
assert_equal Konst::SQLCARD, s[2].codepoint
|
|
||||||
assert_equal 0xd0, s[0].magic
|
|
||||||
assert_equal 0x52, s[1].format
|
|
||||||
assert_equal 134, s[2].length2
|
|
||||||
assert_equal 21+80+140, s.sz
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
|
@ -1,85 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
|
|
||||||
|
|
||||||
require 'rex/test'
|
|
||||||
require 'rex/proto/drda/utils'
|
|
||||||
require 'rex/socket'
|
|
||||||
|
|
||||||
class Rex::Proto::DRDA::Utils::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
Klass = Rex::Proto::DRDA
|
|
||||||
|
|
||||||
def test_socket_connectivity
|
|
||||||
assert_nothing_raised do
|
|
||||||
socket = Rex::Socket.create_tcp(
|
|
||||||
'PeerHost' => $_REX_TEST_DRDA_HOST.to_s, # PeerHost can be nil!
|
|
||||||
'PeerPort' => 50000
|
|
||||||
)
|
|
||||||
assert_kind_of Socket, socket
|
|
||||||
assert !socket.closed?
|
|
||||||
socket.close
|
|
||||||
assert socket.closed?
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_client_probe_create
|
|
||||||
probe_pkt = Klass::Utils.client_probe
|
|
||||||
assert_equal 54, probe_pkt.size
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_client_probe
|
|
||||||
probe_pkt = Klass::Utils.client_probe('toolsdb')
|
|
||||||
begin
|
|
||||||
Timeout.timeout($_REX_TEST_TIMEOUT) do
|
|
||||||
socket = Rex::Socket.create_tcp(
|
|
||||||
'PeerHost' => $_REX_TEST_DRDA_HOST.to_s,
|
|
||||||
'PeerPort' => 50000
|
|
||||||
)
|
|
||||||
sent = socket.put probe_pkt
|
|
||||||
assert_equal 76, sent
|
|
||||||
probe_reply = socket.get_once
|
|
||||||
assert_operator probe_reply.size, :>=, 10
|
|
||||||
parsed_reply = Klass::SERVER_PACKET.new.read probe_reply
|
|
||||||
assert_kind_of Array, parsed_reply
|
|
||||||
assert_equal parsed_reply[0].codepoint, Klass::Constants::EXCSATRD
|
|
||||||
socket.close
|
|
||||||
end
|
|
||||||
rescue Timeout::Error
|
|
||||||
flunk("Timed out")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# Client auth requires a successful probe. This is a complete authentication
|
|
||||||
# sequence, culminating in info[:db_login_sucess] returning either true or
|
|
||||||
# false.
|
|
||||||
def test_client_auth
|
|
||||||
probe_pkt = Klass::Utils.client_probe('toolsdb')
|
|
||||||
auth_pkt = Klass::Utils.client_auth(:dbname => 'toolsdb',
|
|
||||||
:dbuser => $_REX_TEST_DRDA_USER.to_s,
|
|
||||||
:dbpass => $_REX_TEST_DRDA_PASS.to_s
|
|
||||||
)
|
|
||||||
begin
|
|
||||||
Timeout.timeout($_REX_TEST_TIMEOUT) do
|
|
||||||
socket = Rex::Socket.create_tcp(
|
|
||||||
'PeerHost' => $_REX_TEST_DRDA_HOST.to_s,
|
|
||||||
'PeerPort' => 50000
|
|
||||||
)
|
|
||||||
sent = socket.put probe_pkt
|
|
||||||
probe_reply = socket.get_once
|
|
||||||
sent = socket.put auth_pkt
|
|
||||||
assert_equal(75, sent)
|
|
||||||
auth_reply = socket.get_once
|
|
||||||
parsed_auth_reply = Klass::SERVER_PACKET.new.read auth_reply
|
|
||||||
info = Klass::Utils.server_packet_info(parsed_auth_reply)
|
|
||||||
assert info[:db_login_success]
|
|
||||||
socket.close
|
|
||||||
end
|
|
||||||
rescue Timeout::Error
|
|
||||||
flunk("Timed out")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
|
@ -1,96 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'rex/proto/http'
|
|
||||||
|
|
||||||
class Rex::Proto::Http::Client::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
Klass = Rex::Proto::Http::Client
|
|
||||||
|
|
||||||
def test_parse
|
|
||||||
c = Klass.new('www.metasploit.com')
|
|
||||||
|
|
||||||
# Set request factory parameters
|
|
||||||
c.set_config(
|
|
||||||
'vhost' => 'www.metasploit.com',
|
|
||||||
'agent' => 'Metasploit Framework/3.3',
|
|
||||||
'version' => '1.1',
|
|
||||||
'cookie' => 'NoCookie=NotACookie'
|
|
||||||
)
|
|
||||||
|
|
||||||
# Set client parameters
|
|
||||||
c.set_config(
|
|
||||||
'read_max_data' => 1024 * 1024
|
|
||||||
)
|
|
||||||
|
|
||||||
#
|
|
||||||
# Request the main web page
|
|
||||||
#
|
|
||||||
r = c.request_raw(
|
|
||||||
'method' => 'GET',
|
|
||||||
'uri' => '/'
|
|
||||||
)
|
|
||||||
|
|
||||||
resp = c.send_recv(r)
|
|
||||||
|
|
||||||
assert_equal(200, resp.code)
|
|
||||||
assert_equal('OK', resp.message)
|
|
||||||
assert_equal('1.1', resp.proto)
|
|
||||||
|
|
||||||
#
|
|
||||||
# Request a file that does not exist
|
|
||||||
#
|
|
||||||
r = c.request_raw(
|
|
||||||
'method' => 'GET',
|
|
||||||
'uri' => '/NoFileHere.404'
|
|
||||||
)
|
|
||||||
|
|
||||||
resp = c.send_recv(r)
|
|
||||||
|
|
||||||
assert_equal(404, resp.code)
|
|
||||||
assert_equal('Not Found', resp.message)
|
|
||||||
assert_equal('1.1', resp.proto)
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# Send a POST request that results in a 302
|
|
||||||
#
|
|
||||||
c = Klass.new('beta.microsoft.com')
|
|
||||||
c.set_config('vhost' => 'beta.microsoft.com')
|
|
||||||
|
|
||||||
r = c.request_cgi(
|
|
||||||
'method' => 'POST',
|
|
||||||
'uri' => '/',
|
|
||||||
'vars_post' => { 'var' => 'val' },
|
|
||||||
'ctype' => 'application/x-www-form-urlencoded'
|
|
||||||
)
|
|
||||||
|
|
||||||
resp = c.send_recv(r)
|
|
||||||
|
|
||||||
#assert_equal(200, resp.code)
|
|
||||||
#assert_equal('OK', resp.message)
|
|
||||||
assert_equal(301, resp.code)
|
|
||||||
assert_equal('Moved Permanently', resp.message)
|
|
||||||
assert_equal('1.1', resp.proto)
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_ssl
|
|
||||||
c = Klass.new('www.metasploit.com', 443, {}, true)
|
|
||||||
c.set_config('vhost' => 'www.metasploit.com')
|
|
||||||
r = c.request_raw(
|
|
||||||
'method' => 'GET',
|
|
||||||
'uri' => '/'
|
|
||||||
)
|
|
||||||
resp = c.send_recv(r)
|
|
||||||
|
|
||||||
assert_equal(200, resp.code)
|
|
||||||
assert_equal('OK', resp.message)
|
|
||||||
assert_equal('1.0', resp.proto)
|
|
||||||
c.close
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
|
@ -1,22 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..', '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'rex/proto/http'
|
|
||||||
|
|
||||||
class Rex::Proto::Http::Handler::Erb::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
Klass = Rex::Proto::Http::Handler::Erb
|
|
||||||
Request = Rex::Proto::Http::Request
|
|
||||||
|
|
||||||
def test_erb
|
|
||||||
k = Klass.new(nil, File.dirname(__FILE__))
|
|
||||||
r = k.on_request(nil, Request::Get.new("/erb.rb.ut.rb.rhtml"))
|
|
||||||
|
|
||||||
assert_not_nil(r)
|
|
||||||
assert_equal("foo 4\n", r.body)
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
|
@ -1 +0,0 @@
|
||||||
foo <%= 2 + 2 %>
|
|
|
@ -1,25 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..', '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'rex/proto/http'
|
|
||||||
|
|
||||||
class Rex::Proto::Http::Handler::Proc::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
Klass = Rex::Proto::Http::Handler::Proc
|
|
||||||
Request = Rex::Proto::Http::Request
|
|
||||||
|
|
||||||
def test_proc
|
|
||||||
cool = 0
|
|
||||||
k = Klass.new(nil, Proc.new { |cli, req|
|
|
||||||
cool = 1
|
|
||||||
})
|
|
||||||
|
|
||||||
r = k.on_request(nil, Request::Get.new("/erb.rb.ut.rb.rhtml"))
|
|
||||||
|
|
||||||
assert_equal(1, cool)
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
|
@ -1,47 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'rex/proto/http'
|
|
||||||
|
|
||||||
class Rex::Proto::Http::Packet::Header::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
Klass = Rex::Proto::Http::Packet::Header
|
|
||||||
|
|
||||||
def test_to_s
|
|
||||||
h = Klass.new
|
|
||||||
|
|
||||||
h['Foo'] = 'Fishing'
|
|
||||||
h['Chicken'] = 47
|
|
||||||
|
|
||||||
assert_equal(
|
|
||||||
"Foo: Fishing\r\n" +
|
|
||||||
"Chicken: 47\r\n\r\n", h.to_s)
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_from_s
|
|
||||||
h = Klass.new
|
|
||||||
|
|
||||||
h.from_s(
|
|
||||||
"POST /foo HTTP/1.0\r\n" +
|
|
||||||
"Lucifer: Beast\r\n" +
|
|
||||||
"HoHo: Satan\r\n" +
|
|
||||||
"Eat: Babies\r\n" +
|
|
||||||
"\r\n")
|
|
||||||
|
|
||||||
assert_equal('Babies', h['Eat'], 'header')
|
|
||||||
assert_equal('Satan', h['HoHo'], 'header')
|
|
||||||
assert_equal('Satan', h['hOhO'], 'header')
|
|
||||||
|
|
||||||
assert_equal("POST /foo HTTP/1.0\r\n", h.cmd_string, 'cmd_string')
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_just_cmdstring
|
|
||||||
h = Klass.new
|
|
||||||
|
|
||||||
h.from_s("POST /foo HTTP/1.0")
|
|
||||||
assert_equal("POST /foo HTTP/1.0\r\n", h.cmd_string, 'just cmd_string')
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,166 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'rex/proto/http'
|
|
||||||
|
|
||||||
class Rex::Proto::Http::Packet::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
Klass = Rex::Proto::Http::Packet
|
|
||||||
|
|
||||||
def test_junk_headers
|
|
||||||
srand(0)
|
|
||||||
h = Klass.new
|
|
||||||
h.headers.cmd_string = "GET / HTTP/1.0\r\n"
|
|
||||||
h.headers['TestMe'] = 'bob'
|
|
||||||
h.headers.junk_headers = 1
|
|
||||||
expected = "GET / HTTP/1.0\r\nX-v1AD7DnJTVykXGYYM: BmnXuYRlZNIJUzQzFPvASjYxzdTTOngBJ5gfK0XjLy3ciAAk1Fmo0RPEpq6f4BBnp5jm3LuSbAOj1M5qULEGEv0DMk0oOPUj6XPN1VwxFpjAfFeAxykiwdDiqNwnVJAKyr6X7C5ije7DSujURybOp6BkKWroLCzQg2AmTuqz48oNeY9CDeirNwoITfIaC40Ds9OgEDtL8WN5tL4QYdVuZQ85219Thogk775GVfNH4YPpSo2PLmvd5Bf2sY9YDSvDqMmjW9FXrgLoUK2rl9cvoCbTZX1zuU1dDjnJJpXDuaysDfJKbtHn9VhsiiY\r\nX-FokALi: 1QI9BRwj4bo0kwZDn8jyedxhSRdU9CFlMs19CvbVnnLWeRGHScrTxpduVJZygbJcrRp6AWQqkeY0DzI4bd7uXgTIHXN6R403ALckZgqOWcUSEWj6THI9NFAIPP1LEnctaK0uxbzjpS1ize16r388StXBGq1we7Qa8j6xqJsN5GmnIN4HQ4W4PZIjGRHUZC8Q4ytXYE\r\nX-sxXe2ZUhl: Xbdhz13zW2HpxJ2AT4kRU1wDqBUkEQwvKtoebrfUGJ8bvjTMSxKihrDMk6BxAnY6kjFGDi5o8hcEag4tzJ1FhH9eI2UHDVbsDmUHTfAFbreJTHVlcIruAozmZKzi7XgTaOgzGhs75ytpE5dbRjCUt5P3kpExyNetXijJa3a2WMPiazmuQ98v6oAKLNHeGt1ePpm1rSHcBpCycOlb2kfdy8udyhMgpQCIz9Kwab44BAFYiPD8ulrTYGUGczGCccml7FtJk2NV7fRjtz6IZVtlWQZu3lBFGMaK72OIHtFv7qDKy5bZD9OSF6ERFeYDFok6x3YhShOxH1ruw0hRdM2u2gizX8Zuyr0puAM2JSEHDwMl0twtSzxHaxudDKUqB3UQqycaX0wCmJC0spZ81kaEpKMohlng6hajZyYSUecISZYnq7cYSDsTt2AKDGbj5GTiyymUr2AktpChMP2hXMFmBKG9GmmLyVyyzCMdJzIF01rBrPMvMV4SZNecspVGkwoaeFPll7xfgwQgKMdAdanWTFkTkFcMaxTMmH0QdAXPK8D9DQwJU0l44wR15JsPmOhEQkHXbuH9Wie2QbvvyLXOneai2RjHt7wlE1NlTrIgRF8kB9dFQm4oWeTEUqK7DW8l6dpo8Rzo7qedheulYQjnd8BXIAXlvaZZGY3PlpRQwruF2TvWtLLhH3awHv\r\nX-gkSXVCIKFmmkB17kFFmjYxPUyJ3: xYeCTDNLNkRaGviVUq65RlZ0V3kEviLihuTwLhZhftGZYtmzQXaDau6dCF5HPOj0n2Hzm5zd3xLDN63Y784E1zW5dmLOSZsDlHdOLJLQ87n7BS1cAVYJISLc1zR3PDqYVc6VO\r\nX-BMLZnLatiBQBQhhsmoIN: TygXEfWAlfPTPz5MtK0pQGVeDQABygr7SS5WPPcHbY56YMNSOOUH3sr1bsP9XLNdfuSEcBxxX5QpawCvRUmAGsWPKiom2Vi1gqsjp5nb7wK\r\nX-RDleXdm7e: Cd8Hz0JXAwRozVeaPwRKRDnJdDHQiE9akGgR321l3bzO7WfI4dcfi6RcvQI73sHMgUrLdoAUtcNlv9nyEuM53lwEpkQSle1ujwAx5JyhwxMG8zkjmkeyTmsjOdz84RDdbDh1z2bk4VnqKdxd96YyQAki7NB7CCT06MenVNxazMxABkKqgc6CcBNTvRkH1GJPSd18qSCdRj4T\r\nX-XMjt4CUDRsmqKlqovbEzW: jeHYYvPKTNn4lnSH8Ygsn0ov0kqQ0aoQugeUXPsT33ibtiRXbNwXeF5nhxic0BEVI8yh2jwjZFBjHBBHZkNsybgrTitkQwq5rDITuA0UgirFVYC99HsLzc2fBQySOVvvFhqCbo3TPHsdjhwxQ4Y6Fz69qTRtgWhmJFM9q3Q7RE8ZOt91RdGcKFkkU3yyW1Kr7e7Ozw494BoHFP3p0gXOidzZ1EA7aUF6YRE4gxRIJkfeJswjgO9Xg4crhyusIl4CRPDVwydl4WSH3xa4EtZa8zvTOS5gbkmUsDSNzxfhSMvbniHetQBYQtblyYwMEwzuoOxKbOmNEWPdOqZLfbWurU39CZ94Af4uGSWu7ZNMlTf3c74Too5Zvdc0qKURAnmiBwWt6xWncBVCgyGmj1kXz6SmZuPxbVBJzRLA3D592kUTvFU9EpQQ5FgWDIcpKmcfsLibxHnm36FJYMoh7OtPEW0CHtIFnPPpZWZZTdJL9janSIBjyxu3KKYfrbNO3FXqnxlmL14rYRVeSZdlxoxqfnL41OgB51Bk6ZMIyMYTDKH0cOIujjRX911MtH6vuneTqtyBrSO7Zl44IyiaLsLokxMRfKwKLdiKMxnwKC5vLuz0p6bDQANmEDTRQHYLW8bCIIZm0hYVEfzLlHW8q7f2JzzSXTZ5FZtvYz7sa4\r\nX-r5geOHg9B2v8t2raPEKVnqreWA: 6Mbr29vWf0iiqE6kTsRwvGGwJcN4JVCJu4kc0AK8NrClHXeRDviQzSy9qScj1axnquFcrTKKJbjLgmfzWb5Vh9spzrjp6X9o0X6Ipt8vPkBelqATGdDfdQDa9GplLR39rDUb3cOOQj1mrbmXU7XigBWV5EtonYWR0aIFhW6SKdLeH6eqVHZs22TZt5qD0UxT5lh8sZH8lU6iQtonhhBJXEYGhy8Y90735Kdv4cYDSVGUV3baZAuD1lH4QLLsC2FR69OFORpuseiDAdsssz9ARdbiyzk7Ve4lRmPBPpWtRs1WNyvCLJyo2zvEKxG2sIIIslSCFd5lkqdbR6LxIYDwL5yP5D2k8nVd1D4L3PtaPhL3Fe6E7glr98td6bnbdILhOmLK2ZgyoGeW7LjUEEx0d9bvToaaJyfeRH4zjJcvw3H1D7HIlFh3cumxI6BCQ9CLfKUkO40HdFOyuPzgX5bGJ4BLX8Go8kMjF6MSABUNawrVONoDpRFabrtpNtw46RWfZcNHaRErve9c5I6bGH134a7LldxUd3493cX5JAmTHymD8el4pF7Qa9fGZLRffUan1yKmE7nPNjm7LnLw2k\r\nX-Lzi6QcJlIRwscZe7l77e576: MBbKD9Qb8GAHZD740ksVx2IvmqhkEbNNpIGeMiDoQFo3d1WlX76kr7iGGYMRfwlAKxsEf8KdhpwNTpMszrQ4ylOkyEyvAxlLsFouQQKFXvDmwSeQfqvVh3KsfTCTfyTnn9hs0s2e6nMQQGEtU6eM71haSG4CauZNb5ltVr4F5xZM0Gv9JKIaQfelmw8GwG3BvB9VuAWkaUUnixu9ebkJI0UXwn7rqN4v5JbaliGptlG6VDLqLdOTarQj0RQK58JjZazPbEmVnx1XsmrrWcu\r\nX-GNNRo9eESwCbIrPz: veNcuOyuthE0K0SkI36JuNMdOoNJu8MldtLspxY7IP2gsQyzsyxLPZVWRc6bsIbcnrnje0p2J20rRyQAaH2S6L56MNIoSRqsiLXGOu2yrBOlG5vsJDJ707ieBmOQeyNWujXldtqaSWGKrBJawPRTTBbzkjJpN1GYK5rlFo0POVAjhOGY2DElofbypDipNxRqotKmqDb8PyikqnysU0ZLsRFT\r\nX-EfdqybgrpSdN: sJ2IZhRxvQxHeQW7lJuMY91W4OthEF9MpMAFWphxzBKG6QHbmrUpSzqGmixKnoobe7ki7Zb46fwrDAl3nMULM4ybv5VsMvRnfvd3BlAXNIU1SQNIGbljoaeM5tQ6XyqI32Q19SKPm9YkvADaUvvhYSoJIHcvpTWD3O3CXrYUj6ugiqclkS3qjnjBdUljuibx7OqebzEEGppDnskbNsAKdOAAg0LdFF5eSqQ3RLJJaMAnc2NX65wbrZUvMYFiM7rP7VkxsMwiFU8fiXTVv6GEJYvgKabQiW9ccxOlZFCjLzNj4feFdb51B9oacnnhpvtg5E2ALzjEaPxcqQ0G4fC8RyBghmEeE7PV5zmKQCu9uugnX9BkZIvbAjav0qWfBdDDi0kquUpFYT2lDTXweeZHqMEwbMvK8r1uKzrGHAzigXAHeSgCmMA8IDNaDmGGU6CVv06uSQ5rhqFdPZt1Yk85A9NMGxxDgzxjNLREXvKm01mwkdZjHAAIDGl8HzNS4RDIvr9DsL1xyKrPbmjS91jVc7hZKB6VZK4pNzCSUHo4VluTa3GAI8V7vlDuopc53knBz9tF6bfoJ14HjvFpc26VLDSjupRvb2vJTHHlrsuuihK3FcugTnefvvBgox3t3u2AlVWbFtjtj8oDcb7JrDrLzWqqEd8sCeFvMRP4pYVoD8uwfGzhvLnID3r2np2ZtGHodFmDHyrXYydzR4rhwOqqQv1Bq1Az4PQIpU92rZA7xnCGDeNU0LLFwQNIbGs2qEopP8AnlGzd6vZMA0yxc6HBswyHoao9wuWOfV0HkQGqUmEQiv47vOvnPYOK2EUpo0L81dD0sa8bC8C9Xtc51Sv7BEkRYZrMiV4yJkrpGRf6yvsGyQecLgmZmdCTMSApWRqEESFOKydTiDIaSEHqdjPutD6DGClY37jDHbyCwHKt7w5F0oW0rBGcFoKHdkSv87Cpdgx80ZkTg1ba44ctXSFBViBdtiOqeJ2bHMdkmcxVXlUNtoyp2BI\r\nContent-Length: 0\r\nTestMe: bob\r\n\r\n"
|
|
||||||
assert_equal(expected, h.to_s, 'junk headers')
|
|
||||||
h.headers.cmd_string = "HTTP/1.0 OK\r\n"
|
|
||||||
h.headers.fold = 1
|
|
||||||
expected = "HTTP/1.0 OK\r\nX-nsJxRxZX5o5zKaNf8VhtBgr3Gieuamk:\r\n\twM0v0nww3ZA8mepvkmcqXPmmWwHlyCNUudg03Tss4WWsl8i92mVcwi9B2tuR0irNRfVitBFvymfcm6ywElHD2VV5aCcvglhj6gnRJjsWFWJ2B9rFqEH2Tyzm13NLXm21Lo1fD39CHCZuFQyIR4ycO4GN4cDs7mvEALmGzU4GQAD7Fv9n7QZ5ebLoAhZ0Owi0oyyr3mTqimVUajbDZ8HEE1JEhxKX5wgNVcXwF9CAJHdVQOTlaMPTSqCQ4LjJ5JeWqUpTEuPhAvPNJxqKxninwssqBIALaerqTVvB68ScL7x0nJYEa0r2VOdBOAPhg9zlFe2pvy6J1HeVepIBtVI5tx0AbywZdHafO5TIndXNoBZYepQ8LnHmVYlr7kgJxoQj3Dnl6Do6jBDLDu7MgnyA22vXH7BiN4eVRXjhGYi3o5mJYdFwwZEumA7OJkvycPCkHRfrpPc202q4fW5yX8EARGELgQC6Knm28n93AJLs0RkpvFpwmkE7xLndrtLqgBsviqqsKq8ounPtaposwQrcAs9CW8YsTeNHTj11dUIKpiu9L9I13V0EvH44VWGTrGg7lWpV0LrDgdVRFvbBhorn5rzleS2P8ztodE4w4qUQ1VCUt4YrUtPhYYob9DTMysKJc1ufXNFtoHpuQynjqc\r\nX-RlBRei0DhrZBi4xnoSp2VvcBpm:\r\n\tPcZ7y1WbNhO1IEu2VtcWOAyl2yJh0oozHady5RKrhBm9TdGFEC3ooQHoYX06WpG4OznYfUSjgUYgbs6kSWifyS8OHLK56mpWAiRq0GDo7bMnVZAri9BwrlurZXqzE0HdBXXYZFWxQfwAyDhfG0AIYGLE1lH3ZzqFlE8q5MQ5FNLWqnAYwb3eYcYe50ug9ujWvIDk0O8k7R7TYYjyBMUHWs4PghNBDn4kmb6itmvZQwyJZAP1Qq9kHXxomtlxlEiW86xe7hbHNZlfk6xv1nISUZndCoyRonhDa1vYxez5BqSHrF6olTiVkYeBAYtv4EAk8y3UEF9OWPTM9ng5eUU6FKYLV8GB0NPvrVDdJ2Y3k8634xUl19uToDlDUmehZps3WlC5buzl64c8j\r\nX-hZ2KnIRZHzdnpUhx48KM:\r\n\tCgY1FTARXuU6kkMskPl2Yt0U68HuXUFHkvJFZhUAhTJCQX96yZ6qQRo8R69xlpmMGvYhOFJlmLZQT96Xy5wJqppna32qLHbg9eWdgCWvovY2zOCDhqkAYym3M9PaX4dQSth2D6mH5UwYC8KziYAGNmZbvFt9pXz2YNVNC4pB6t0A58OkHwJsxEQQ5QDo2Cg5GVcWb5xEEfCZeLKCLMUJ6jzGfbKwIZlPaFSAkglSNTCv5opAmAJxDFR8StLA1mspRsSGP28nAlkHtLEGm8oGQiQg4ckgxwIVyYQVKgI7lGaqb6tZUUNiEwOYBnrNkhMQ5Fh7fIh2AgfCqbQXCHltUAHZYBjeiciVXRFDZV7G9TWXVMW8KOs5pFn1zK9aaTu0QBTOJs8jjIa4zotN9Zs0OwN6Gr8ImzOucdfeIrC4P44cilqmlYFO4iLQfyM67A9i5A45QEkDFe7yqUwtPlp1cb377t39hLbiYNHYBjSuo3BqbPPpNG6gc40GOfGh66uazg87ufHxnBFlbmtXMJddNXYJEl4LW8Yloo01iuh6NhHMJudM\r\nX-w2ji68BRrw3J359QDpWvUYh76UVk:\r\n\tMaC66WuT5SifDAbwuW0D8gLwYcoJCO70KEJtar9Ilois2mbw66x1Tjk8KxSEYPxeNzQ3otL9iRGYddCL6uoRnJraU5EqC0nT0HfgE0bYq3Is1ambirMvIo4tgAvRMQ14LPczAuck8SRZoZEKhWhuSjwUF6jvNoneLI5aofaylT38fGzlLPs1EjyRsZ26MAgGjpoT7jdqXZU7sImWny1PELaLaMcAF5mNW77Y9aFSsucDXJzFahBgU59vbqMftb6DzUKzJFN8oR6tZDA2O0OXGPF2AnH9Rg6dfPLrfSrmWH0jTFxArBy186O05SpGkrxgLX7YyI1TCycm4urh0NthKzX9NzueArHDuAfIDLXUBGu8Eqj8vWemL0i3DxqAGhdVO0WbDxenuXYrNggy2xZJlsRXj75jiUFUGIA9sZmHJ6GdFkdnTvWDH4dUISWWVun4i8iQNc47Nh6aN59K6XVbt38VfmSb9aXHNUejKjFlWhSAfsetCVSQjMI8a8jJfsxrvAt82Ucmkehjp2auSYYOcypTCqx6dBV2R3ZO5WPySL2YFrG9p8rvMMtlSJI1oIAgM0U571yPX2sRXJtigpG3bjTmBhlhhDWl6yhDNiPrhepcJLZw85J8gVkLj45sCgck4Kjd9rpXldh9jqQUhDftkIYZZlKgDVoNgqFVoNbiA35snwvz7Rg4gLqGShz0FR2KMpRfDoiqeGAEEsAzjWendWXxa24LCVMQCbM155pjA9NlS\r\nX-KTsbJwm6:\r\n\tvmxmFWMC7AxYqdcgEIStcHIQWqPUwVXhCwaLYPvZFW2zidMs68UuhLueu4LGfipVKbRm5GL9wdNuT5H5QGoPCKpqodKKfR7jkk9RxVbZv2Ih6vJLwvcQwCIh7wOoBufWtAMo4Acf8c845Tzgqr3EyRdmaZSzUv5pHicgxmMYuuHJ8nthej8inCd4nWj1AaE1rvJGdFB8WadFQasaOYITd37LuVC95a1wrE5WSmBE9nTbHw1diY5MFsNwmPAxzEtWe9g3ftkD8jTiRsD8IBPpI40WKsMDWMZ1aopA37m0bokVVGMHD4Kb5xxYxuJsskIJjBmUtZsZFAn6GGnyRLRle5yxJMRkgD52M1vl0Hu9FRSSRhKxJaEoZylHhR8vnwRmIm6X3ilbECtxZGKTtPU1P2jvHo8kxcsuJkXjcSOnUkIwnN3roV7v9ggeJb9c4rXc4CUWgH4VUTZvlYT3qNsbWbD5hdVCmYRNJpZlOdvH6bcWEDYna6J7p03HULGctCn56bfjMAXF3AjKdRwoS70v9KTlN5DkDjH2KUcIIRR8Ffd7Q50WjyjQ1bgvCLSYYAt8IXB7dvmmsyyRT9ZF7uVihmybplx8ETzhVEzZ9zH4kzf99vC5ZM0959Fje00JxzR4dL9ir46rh6cWZbRhh0ZU7HAMxHsXmC7JeyaMSnxd6um3GC8xN4zQfIpnfZSTcB5azeV0Lji92A5Yugo6Edz240S0lnCzhZbtWqxG1dgnXlKJBADZ9oMDibxBImhrfdw88tNOcQjYtGS4h\r\nX-IOSp7nYMJwhxhyYPunG9RIvBHUoI0A3pC:\r\n\tW8KeIV35tDFbaMAD9rgoUOYDgJGD6cDPg\r\nX-sc1yFBRvIJ0:\r\n\twpYEHFnUDBJaBowmuVMGgqUMWUthgJ7kDpIczNXHzMCktNXn752JnPLJBaLfw6LB5IZ4ehsXUxIAiemUlW9qwWpUrHB4teMF4VFQrXolvwnomr6wAJ8P0s1EcxjUGpfZQEuNhRvBZvWqWRDTud2EUtesPh8ETl0ARRxnoSFiD6A3jZUdBOsmEGRd94BQCOqxYF5VIIhFg1ArzGOlcQ1d0Sd46lDqKpnggcOfi9ljDNSR9iiTyELVDxiTaIpOjMRqXRgxLoCwWEpqP78RnNfj8xD6tZzcSsfXuKNNNTBDMIzK9G0f3rfVNHtcSd9ayPuBtzZS1nwtWbLsmxAJWF9XGWXB33afT9ZoHL753R2oALkjN8ImKZpJ2UE7nQSuOXu0j7weDKgVp6uhShzM0CZqezcpRO78NhW09YeKDfxgNxnAuYUrpabXaJhapvfofIxkReB6d1QUI3kd7rsPNZlQyLuChcapBaITb5jWZYsUk1YeM03q4cyEBFsV6xYI4s6w6egVD51URRLS5j6VtrizhJbXpz7kwhLtIrudhvOeufXrVCakuJB4DRBweihvwK5GFqGpmF8e7IR3WDPmu0eGdWKcHbwTCzHMzTzeebPvX6eTINmmCqzEmF71uyhYscV9sOy0EpRPZkMm7deiTqTfpkpLHFNiuggcMdzKq3Jzx7TWXe80Nyf68QSBPgOJGzvDG2PdVzK6NbaapE7dwc98Pu5bogtxOEZgMsp7q0N0y4yxFXl0ec2VTY5vXtKegVo2eGZF3fvubZhbQQPei7FIQmzncFATX8e0umoiRPKSobz8qmOvR83psDw1ZYsfX9PV8dWYDJmAPspOFR6pDwTSrxxBHIf8OOUSvjsonfBa5Ympf4Lw7jLxvxxyvytdky5Kqa8L5pH90gbH3U\r\nContent-Length:\r\n\t0\r\nTestMe:\r\n\tbob\r\n\r\n"
|
|
||||||
assert_equal(expected, h.to_s, 'junk headers')
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_pipeline
|
|
||||||
req_normalized =
|
|
||||||
"GET / HTTP/1.0\r\n" +
|
|
||||||
"Foo: Bar\r\n" +
|
|
||||||
"Content-Length: 10\r\n" +
|
|
||||||
"\r\n" +
|
|
||||||
"Super body"
|
|
||||||
|
|
||||||
req = req_normalized + req_normalized
|
|
||||||
|
|
||||||
req_base = req.dup
|
|
||||||
req_fold = req.gsub(/:/, ':' + Rex::Text.rand_base(rand(10) + 1,'',"\s","\t") + "\r\n" + Rex::Text.rand_base(rand(10) + 1,'',"\s","\t"))
|
|
||||||
req_nocr = req.gsub(/\r\n/, "\n")
|
|
||||||
req_junk = req + "junk"
|
|
||||||
|
|
||||||
{ 'base' => req_base, 'fold' => req_fold, 'no cr' => req_nocr, 'extra junk' => req_junk }.each_pair { |name, test|
|
|
||||||
h = Klass.new
|
|
||||||
h.auto_cl = false
|
|
||||||
assert_equal(Klass::ParseCode::Completed, h.parse(test), "parse #{name}")
|
|
||||||
assert_equal(req_normalized, h.to_s, "to string #{name}")
|
|
||||||
assert_equal(true, h.completed?, "completed parsing #{name}")
|
|
||||||
assert_equal('Bar', h.headers['Foo'], "first header #{name}")
|
|
||||||
assert_equal('10', h.headers['Content-Length'], "second header #{name}")
|
|
||||||
assert_equal("Super body", h.body, "body #{name}")
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
def test_chunked
|
|
||||||
req_start =
|
|
||||||
"GET / HTTP/1.0\r\n" +
|
|
||||||
"Transfer-Encoding: chunked\r\n" +
|
|
||||||
"Foo: Bar\r\n" +
|
|
||||||
"\r\n"
|
|
||||||
|
|
||||||
req_normalized = req_start + "Super body"
|
|
||||||
|
|
||||||
req = req_start + "1\r\nS\r\n1\r\nu\r\n1\r\np\r\n1\r\ne\r\n1\r\nr\r\n1\r\n \r\n1\r\nb\r\n1\r\no\r\n1\r\nd\r\n1\r\ny\r\n0\r\n\r\n"
|
|
||||||
|
|
||||||
req_base = req.dup
|
|
||||||
req_fold = req.gsub(/:/, ':' + Rex::Text.rand_base(rand(10) + 1,'',"\s","\t") + "\r\n" + Rex::Text.rand_base(rand(10) + 1,'',"\s","\t"))
|
|
||||||
req_nocr = req.gsub(/\r\n/, "\n")
|
|
||||||
req_junk = req + "junk"
|
|
||||||
|
|
||||||
{ 'base' => req_base, 'fold' => req_fold, 'no cr' => req_nocr, 'extra junk' => req_junk }.each_pair { |name, test|
|
|
||||||
h = Klass.new
|
|
||||||
h.auto_cl = false
|
|
||||||
assert_equal(Klass::ParseCode::Completed, h.parse(test), "parse #{name}")
|
|
||||||
assert_equal(req_normalized, h.to_s, "to string #{name}")
|
|
||||||
assert_equal(true, h.completed?, "completed parsing #{name}")
|
|
||||||
assert_equal('Bar', h.headers['Foo'], "first header #{name}")
|
|
||||||
assert_equal('chunked', h.headers['Transfer-Encoding'], "second header #{name}")
|
|
||||||
assert_equal("Super body", h.body, "body #{name}")
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_content_length
|
|
||||||
req =
|
|
||||||
"GET / HTTP/1.0\r\n" +
|
|
||||||
"Foo: Bar\r\n" +
|
|
||||||
"Content-Length: 10\r\n" +
|
|
||||||
"\r\n" +
|
|
||||||
"Super body"
|
|
||||||
|
|
||||||
req_base = req.dup
|
|
||||||
req_fold = req.gsub(/:/, ':' + Rex::Text.rand_base(rand(10) + 1,'',"\s","\t") + "\r\n" + Rex::Text.rand_base(rand(10) + 1,'',"\s","\t"))
|
|
||||||
req_nocr = req.gsub(/\r\n/, "\n")
|
|
||||||
req_junk = req + "junk"
|
|
||||||
|
|
||||||
{ 'base' => req_base, 'fold' => req_fold, 'no cr' => req_nocr, 'extra junk' => req_junk }.each_pair { |name, test|
|
|
||||||
h = Klass.new
|
|
||||||
h.auto_cl = false
|
|
||||||
assert_equal(Klass::ParseCode::Completed, h.parse(test), "parse #{name}")
|
|
||||||
assert_equal(req, h.to_s, "to string #{name}")
|
|
||||||
assert_equal(true, h.completed?, "completed parsing #{name}")
|
|
||||||
assert_equal('Bar', h.headers['Foo'], "first header #{name}")
|
|
||||||
assert_equal('10', h.headers['Content-Length'], "second header #{name}")
|
|
||||||
assert_equal("Super body", h.body, "body #{name}")
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_parse_connection_close
|
|
||||||
req =
|
|
||||||
"GET / HTTP/1.0\r\n" +
|
|
||||||
"Foo: Bar\r\n" +
|
|
||||||
"Connection: close\r\n" +
|
|
||||||
"\r\n" +
|
|
||||||
"Super body"
|
|
||||||
|
|
||||||
req_base = req.dup
|
|
||||||
req_fold = req.gsub(/:/, ':' + Rex::Text.rand_base(rand(10) + 1,'',"\s","\t") + "\r\n" + Rex::Text.rand_base(rand(10) + 1,'',"\s","\t"))
|
|
||||||
req_nocr = req.gsub(/\r\n/, "\n")
|
|
||||||
|
|
||||||
{ 'base' => req_base, 'fold' => req_fold, 'no cr' => req_nocr }.each_pair { |name, test|
|
|
||||||
h = Klass.new
|
|
||||||
h.auto_cl = false
|
|
||||||
assert_equal(Klass::ParseCode::Completed, h.parse(test), "parse #{name}")
|
|
||||||
assert_equal(req, h.to_s, "to string #{name}")
|
|
||||||
assert_equal(true, h.completed?, "completed parsing #{name}")
|
|
||||||
assert_equal('Bar', h.headers['Foo'], "first header #{name}")
|
|
||||||
assert_equal('close', h.headers['Connection'], "second header #{name}")
|
|
||||||
assert_equal("Super body", h.body, "body #{name}")
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_to_s
|
|
||||||
h = Klass.new
|
|
||||||
|
|
||||||
h.headers['Foo'] = 'Fishing'
|
|
||||||
h.headers['Chicken'] = 47
|
|
||||||
|
|
||||||
assert_equal(
|
|
||||||
"Foo: Fishing\r\n" +
|
|
||||||
"Content-Length: 0\r\n" +
|
|
||||||
"Chicken: 47\r\n\r\n", h.to_s)
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_from_s
|
|
||||||
h = Klass.new
|
|
||||||
|
|
||||||
h.from_s(
|
|
||||||
"HTTP/1.0 200 OK\r\n" +
|
|
||||||
"Lucifer: Beast\r\n" +
|
|
||||||
"HoHo: Satan\r\n" +
|
|
||||||
"Eat: Babies\r\n" +
|
|
||||||
"\r\n")
|
|
||||||
|
|
||||||
assert_equal('Babies', h['Eat'])
|
|
||||||
h['Eat'] = "fish"
|
|
||||||
assert_equal('fish', h['Eat'])
|
|
||||||
end
|
|
||||||
|
|
||||||
# XXX
|
|
||||||
def test_no_headers
|
|
||||||
h = Klass.new
|
|
||||||
h.from_s("GET / HTTP/1.0\r\n\r\n")
|
|
||||||
assert_equal("GET / HTTP/1.0\r\n", h.headers.cmd_string, 'cmd string')
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
|
@ -1,215 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'rex/proto/http'
|
|
||||||
|
|
||||||
class Rex::Proto::Http::Request::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
Klass = Rex::Proto::Http::Request
|
|
||||||
|
|
||||||
def test_to_s
|
|
||||||
h = Klass.new
|
|
||||||
|
|
||||||
h.headers['Foo'] = 'Fishing'
|
|
||||||
h.headers['Chicken'] = 47
|
|
||||||
h.auto_cl = true
|
|
||||||
|
|
||||||
assert_equal(
|
|
||||||
"GET / HTTP/1.1\r\n" +
|
|
||||||
"Foo: Fishing\r\n" +
|
|
||||||
"Content-Length: 0\r\n" +
|
|
||||||
"Chicken: 47\r\n\r\n", h.to_s)
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_from_s
|
|
||||||
h = Klass.new
|
|
||||||
|
|
||||||
h.from_s(
|
|
||||||
"POST /foo HTTP/1.0\r\n" +
|
|
||||||
"Lucifer: Beast\r\n" +
|
|
||||||
"HoHo: Satan\r\n" +
|
|
||||||
"Eat: Babies\r\n" +
|
|
||||||
"\r\n")
|
|
||||||
|
|
||||||
assert_equal('POST', h.method, 'method')
|
|
||||||
assert_equal('/foo', h.uri, 'uri')
|
|
||||||
assert_equal('1.0', h.proto, 'proto')
|
|
||||||
assert_equal('Babies', h['Eat'], 'header')
|
|
||||||
|
|
||||||
assert_equal("POST /foo HTTP/1.0\r\n", h.cmd_string, 'cmd_string')
|
|
||||||
|
|
||||||
h.method = 'GET'
|
|
||||||
assert_equal("GET /foo HTTP/1.0\r\n", h.cmd_string, 'set method')
|
|
||||||
|
|
||||||
h.uri = '/bar'
|
|
||||||
assert_equal("GET /bar HTTP/1.0\r\n", h.cmd_string, 'set uri')
|
|
||||||
|
|
||||||
h.proto = '1.2'
|
|
||||||
assert_equal("GET /bar HTTP/1.2\r\n", h.cmd_string, 'set proto')
|
|
||||||
end
|
|
||||||
|
|
||||||
def junk_request
|
|
||||||
h = Klass.new
|
|
||||||
h.from_s("GET /foo/bar.html HTTP/1.0\r\n" + "Foo: Bar\r\n\r\n")
|
|
||||||
return h
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_junk_slashes
|
|
||||||
srand(0)
|
|
||||||
|
|
||||||
h = junk_request
|
|
||||||
assert_equal('GET', h.method, 'method')
|
|
||||||
assert_equal('1.0', h.proto, 'proto')
|
|
||||||
assert_equal('Bar', h['Foo'], 'header')
|
|
||||||
assert_equal('/foo/bar.html', h.uri, 'uri')
|
|
||||||
|
|
||||||
h = junk_request
|
|
||||||
h.junk_directories = 1
|
|
||||||
assert_equal('/D/../DnJT/../kXG/../Y/../BmnXu/../foo/lZ/../J/../zQzFP/../S/../Yxzd/../bar.html', h.uri, 'junk directories')
|
|
||||||
|
|
||||||
h = junk_request
|
|
||||||
h.junk_slashes = 1
|
|
||||||
assert_equal('/foo//bar.html', h.uri, 'junk slashes')
|
|
||||||
|
|
||||||
h = junk_request
|
|
||||||
h.junk_self_referring_directories = 1
|
|
||||||
assert_equal('/././foo/././bar.html', h.uri, 'junk referring directories')
|
|
||||||
|
|
||||||
h = junk_request
|
|
||||||
h.junk_param_start = 1
|
|
||||||
assert_equal('/%3fgf=XjLyc/../foo/bar.html', h.uri, 'junk start of params')
|
|
||||||
|
|
||||||
h = junk_request
|
|
||||||
h.junk_end_of_uri = 1
|
|
||||||
assert_equal('/%20HTTP/1.0%0d%0a/../../foo/bar.html', h.uri, 'junk end of URI')
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_params
|
|
||||||
srand(0)
|
|
||||||
|
|
||||||
h = junk_request
|
|
||||||
assert_equal('/foo/bar.html', h.uri, 'uri')
|
|
||||||
|
|
||||||
h.uri_parts['QueryString']['B'] = 'a'
|
|
||||||
assert_equal('/foo/bar.html?B=a', h.uri, 'uri with param')
|
|
||||||
|
|
||||||
h.uri_parts['QueryString']['B'] = ['a','b']
|
|
||||||
assert_equal('/foo/bar.html?B=a&B=b', h.uri, 'uri with a param with multiple values')
|
|
||||||
|
|
||||||
h.uri_parts['QueryString']['B'] = '='
|
|
||||||
assert_equal('/foo/bar.html?B=%3d', h.uri, 'uri with a param that requires escaping')
|
|
||||||
|
|
||||||
assert_equal(
|
|
||||||
"GET /foo/bar.html?B=%3d HTTP/1.0\r\n" +
|
|
||||||
"Foo: Bar\r\n" +
|
|
||||||
"Content-Length: 0\r\n" +
|
|
||||||
"\r\n", h.to_s, 'GET to_s'
|
|
||||||
)
|
|
||||||
|
|
||||||
h.method = 'POST'
|
|
||||||
assert_equal(
|
|
||||||
"POST /foo/bar.html HTTP/1.0\r\n" +
|
|
||||||
"Foo: Bar\r\n" +
|
|
||||||
"Content-Length: 5\r\n" +
|
|
||||||
"\r\n" +
|
|
||||||
'B=%3d',
|
|
||||||
h.to_s, 'POST to_s'
|
|
||||||
)
|
|
||||||
|
|
||||||
h.body = 'FOO'
|
|
||||||
assert_equal(
|
|
||||||
"POST /foo/bar.html HTTP/1.0\r\n" +
|
|
||||||
"Foo: Bar\r\n" +
|
|
||||||
"Content-Length: 3\r\n" +
|
|
||||||
"\r\n" +
|
|
||||||
'FOO',
|
|
||||||
h.to_s, 'POST to_s, with hardcoded body'
|
|
||||||
)
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_junk_params
|
|
||||||
srand(0)
|
|
||||||
h = junk_request
|
|
||||||
|
|
||||||
h.junk_params = 1
|
|
||||||
h.uri_parts['QueryString']['a'] = 'b'
|
|
||||||
h.uri_parts['QueryString']['c'] = 'd'
|
|
||||||
|
|
||||||
assert_equal("GET /foo/bar.html?eZUhlXbdhzzW=HpxJATk&UwDqBU=EQwvK&oebrfUGJbvjTMSxKih=MkBx&nYkjF=DiohcEa&tzJFh=eIUHDVbs&a=b&UHTfAFbreJT=VlcIruAo&mZKziXgT=z&hsytpEdbRjC=tPkpE&yNetXi=JaaW&PiazmuQvoAKLNHeGt=ePpmrS&c=d&BpCycOlbkfdyudyhMgpQCIzKwabBAFYiP=ulrTYGUG&zGCccmlFtJkNVfRjtzIZVtlWQZulBFGMa=OIHtFvqDKybZDOS&ERFeYDFokx=YhShOxHruwhRdMugizXZuyrpuAMJSEHDwMltwtSzxHaxudDKUqBUQqycaXwC&JCspZkaEpKM=hlnghajZyYSUecISZYnqcYSDsTtAKDGbjGTiyymUrAktp&hMPhXMF=BKGGmmLyVyyzCMdJzIFrBrPMvMVSZNecspVGkwoaeFP HTTP/1.0\r\nFoo: Bar\r\nContent-Length: 0\r\n\r\n", h.to_s, 'junk params (GET)')
|
|
||||||
|
|
||||||
h.method = 'POST'
|
|
||||||
assert_equal("POST /foo/bar.html HTTP/1.0\r\nFoo: Bar\r\nContent-Length: 591\r\n\r\nxfgwQgKMdA=WTFkTkFc&axTMmHQdAXPKDDQwJ=lwRJs&PmOhEQkHXbuHWieQbvv=LXO&eaiRjHtwlENl=rIgR&kBdFQmoWeT=UqKDW&a=b&dpoRzoqedheulYQ=ndBX&AXlvaZZGYPlpR=w&uFTvWtLLhHawHvgk=XVC&KFmmkBkFFmjYx=yJExY&CTDNLNkRaGviVUqRlZV=kEviLihu&c=d&LhZhftGZYtmzQXaDaudCF=HPOjnHzmzdxLDNYEzWdmLOSZsDlHdOLJLQnBScAVYJISLczRPDqYVcVOvBMLZn&atiBQBQhhsmoINqT=gXEfWAlfPTPzMtKpQGVeDQABygrSSWPPcHbYYMNSOOUHsrbsPXLNdfu&EcBxxXQpawCvRUmAGsWPKio=VigqsjpnbwKERDleXdmeLCdHzJXAwRozVeaPwRKRDnJ&DHQiEakGgRlbzOWfIdcfiRcvQIsHMgUrLd=AUtcNlvnyEuMlwEpkQSleujwAxJyhwxMGzkjmkeyTmsjO&zRDdbDhzbkVnqKdxdYyQAkiNBCCTMenVNx=zMxABkKqgcCcBNTvRkHGJPSdqSCdRjT",h.to_s, 'junk params (POST)')
|
|
||||||
|
|
||||||
h.method = 'SEARCH'
|
|
||||||
assert_equal("SEARCH /foo/bar.html HTTP/1.0\r\nFoo: Bar\r\nContent-Length: 522\r\n\r\nMjtCUDRsmqKl=vbEzWljeH&YvPKTNnlnSHYg=ovkqQaoQ&geUXPsTibtiRXbNwXeF=nhxicBEVIy&jwjZFB=HBBH&kNsybgrTitkQwq=rDITuAUgir&a=b&YCHsLzcfBQ=SOV&vFhqCboTPHsdjhwxQYFz=RtgW&mJFMqQ=EZ&tRdGcKFkkUyyWKreOzw=BoHFPpgXO&dzZEAaU=YREgxR&c=d&kfeJswjgOXgcrh=usIlCRPDVwydlWSHxaEtZazvTOSgbkmUsDSNzxfhSMvbniHetQBYQtb&yYwMEwzuoO=KbOmNEWPdOqZLfbWurUCZAfuGSWuZNMlTfcTooZvdcqKURAnmiBwWt&xWncBVCgyGmjkXzSmZuPxbVBJzRLADk=TvFUEpQQFgWDIcpKmcfsLibxH&mFJYMohOtPEW=CHtIFnPPpZWZZTdJLjanSIBjyxuKKYfrbNOFXqnxlmLrYRVeSZdlxoxqf&LOgBBkZMIyMY=DKHcOIujjRXMtHvuneTqtyBr", h.to_s, 'junk params (SEARCH)')
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_junk_pipelining
|
|
||||||
srand(0)
|
|
||||||
|
|
||||||
h = Klass.new
|
|
||||||
h.from_s("GET /foo HTTP/1.0\r\n" + "Foo: Bar\r\n\r\n")
|
|
||||||
h.junk_pipeline = 1
|
|
||||||
assert_equal("GET / HTTP/1.1\r\nConnection: Keep-Alive\r\n\r\nGET /foo HTTP/1.0\r\nFoo: Bar\r\nContent-Length: 0\r\nConnection: Closed\r\n\r\n", h.to_s, 'pipeline')
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_junk_all
|
|
||||||
srand(0)
|
|
||||||
|
|
||||||
h = junk_request
|
|
||||||
h.junk_slashes = 1
|
|
||||||
h.junk_directories = 1
|
|
||||||
h.junk_self_referring_directories = 1
|
|
||||||
h.junk_end_of_uri = 1
|
|
||||||
h.junk_param_start = 1
|
|
||||||
|
|
||||||
seen = {}
|
|
||||||
expect = [
|
|
||||||
{"//"=>145, "/./"=>35, "param"=>1, "http"=>1, "/w/../"=>3},
|
|
||||||
{"//"=>149, "/./"=>35, "param"=>1, "http"=>1, "/w/../"=>3},
|
|
||||||
{"//"=>130, "/./"=>30, "param"=>1, "http"=>1, "/w/../"=>2},
|
|
||||||
{"//"=>165, "/./"=>40, "param"=>1, "http"=>1, "/w/../"=>4},
|
|
||||||
{"//"=>145, "/./"=>35, "param"=>1, "http"=>1, "/w/../"=>3},
|
|
||||||
]
|
|
||||||
i = 0
|
|
||||||
5.times {
|
|
||||||
str = h.uri.dup
|
|
||||||
assert_not_equal('/foo/bar.html', str, 'all the junk')
|
|
||||||
assert_nil(seen[str], 'all the junk, not a dup rand')
|
|
||||||
seen[str] = 1
|
|
||||||
|
|
||||||
seen = { '/./' => 0, '//' => 0, '/w/../' => 0, 'http' => 0, 'param' => 0}
|
|
||||||
matched = 1
|
|
||||||
while matched == 1
|
|
||||||
# p str
|
|
||||||
if str.sub!(/\/%20HTTP\/1.0%0d%0a\/\.\.\/\.\.\//, '/')
|
|
||||||
seen['http'] += 1;
|
|
||||||
elsif str.sub!(/\/%3f\w+=\w+\/\.\.\//i, '/')
|
|
||||||
seen['param'] += 1;
|
|
||||||
elsif str.sub!(/\/\w+\/\.\.\//, '/')
|
|
||||||
seen['/./'] += 1;
|
|
||||||
elsif str.sub!(/\/\//, '/')
|
|
||||||
seen['//'] += 1;
|
|
||||||
elsif str.sub!(/\/.\//, '/')
|
|
||||||
seen['/w/../'] += 1;
|
|
||||||
else
|
|
||||||
matched = 0
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
assert_equal('/foo/bar.html', str, 'normalized')
|
|
||||||
assert_equal(expect[i], seen, 'expected counts')
|
|
||||||
i += 1
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_normalize
|
|
||||||
h = junk_request
|
|
||||||
h.uri = '/foo/..////./././asdf/././//../bar.html'
|
|
||||||
assert_equal('/bar.html', h.uri, 'normalize on set')
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,150 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'rex/proto/http'
|
|
||||||
|
|
||||||
class Rex::Proto::Http::Response::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
Klass = Rex::Proto::Http::Response
|
|
||||||
|
|
||||||
def test_deflate
|
|
||||||
h = Klass.new
|
|
||||||
h.body = 'hi mom'
|
|
||||||
h.compress = 'deflate'
|
|
||||||
assert_equal(
|
|
||||||
"HTTP/1.1 200 OK\r\n" +
|
|
||||||
"Content-Length: 14\r\n" +
|
|
||||||
"Content-Encoding: deflate\r\n\r\n" +
|
|
||||||
"x\234\313\310T\310\315\317\005\000\a\225\002;",
|
|
||||||
h.to_s, 'deflate'
|
|
||||||
)
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_gzip
|
|
||||||
h = Klass.new
|
|
||||||
h.body = 'hi mom'
|
|
||||||
h.compress = 'gzip'
|
|
||||||
srand(0)
|
|
||||||
|
|
||||||
response = h.to_s
|
|
||||||
|
|
||||||
http_header = response.slice!(0,63)
|
|
||||||
|
|
||||||
assert_equal(
|
|
||||||
"HTTP/1.1 200 OK\r\n" +
|
|
||||||
"Content-Length: 26\r\n"+
|
|
||||||
"Content-Encoding: gzip\r\n\r\n",
|
|
||||||
http_header, 'http headers'
|
|
||||||
)
|
|
||||||
|
|
||||||
assert_equal("\x1f\x8b\x08\x00", response.slice!(0,4), 'gzip headers')
|
|
||||||
|
|
||||||
# skip the next 6 bytes as it is host & time specific (zlib's example gun does, so why not us too?)
|
|
||||||
response.slice!(0,6)
|
|
||||||
|
|
||||||
assert_equal("\xcb\xc8\x54\xc8\xcd\xcf\x05\x00\x68\xa4\x1c\xf0\x06\x00\x00\x00", response, 'gzip data')
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
def test_to_s
|
|
||||||
h = Klass.new
|
|
||||||
|
|
||||||
h.headers['Foo'] = 'Fishing'
|
|
||||||
h.headers['Chicken'] = 47
|
|
||||||
|
|
||||||
assert_equal(
|
|
||||||
"HTTP/1.1 200 OK\r\n" +
|
|
||||||
"Content-Length: 0\r\n" +
|
|
||||||
"Foo: Fishing\r\n" +
|
|
||||||
"Chicken: 47\r\n\r\n", h.to_s, 'to_s w/o body')
|
|
||||||
|
|
||||||
h.body = 'hi mom'
|
|
||||||
assert_equal(
|
|
||||||
"HTTP/1.1 200 OK\r\n" +
|
|
||||||
"Content-Length: 6\r\n" +
|
|
||||||
"Foo: Fishing\r\n" +
|
|
||||||
"Chicken: 47\r\n\r\nhi mom", h.to_s, 'to_s w/ body')
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
def test_chunked
|
|
||||||
h = Klass.new
|
|
||||||
|
|
||||||
h.headers['Foo'] = 'Fishing'
|
|
||||||
h.headers['Chicken'] = 47
|
|
||||||
h.auto_cl = false
|
|
||||||
h.transfer_chunked = true
|
|
||||||
|
|
||||||
|
|
||||||
assert_equal(
|
|
||||||
"HTTP/1.1 200 OK\r\n" +
|
|
||||||
"Transfer-Encoding: chunked\r\n" +
|
|
||||||
"Foo: Fishing\r\n" +
|
|
||||||
"Chicken: 47\r\n\r\n0\r\n\r\n", h.to_s, 'chunked w/o body'
|
|
||||||
)
|
|
||||||
|
|
||||||
srand(0)
|
|
||||||
h.body = Rex::Text.rand_text_alphanumeric(100)
|
|
||||||
assert_equal(
|
|
||||||
"HTTP/1.1 200 OK\r\n" +
|
|
||||||
"Transfer-Encoding: chunked\r\n" +
|
|
||||||
"Foo: Fishing\r\n" +
|
|
||||||
"Chicken: 47\r\n\r\n" +
|
|
||||||
"5\r\nsv1AD\r\n7\r\n7DnJTVy\r\n5\r\nkXGYY\r\n5\r\nM6Bmn\r\n4\r\nXuYR\r\n5\r\nlZNIJ\r\n5\r\nUzQzF\r\n9\r\nPvASjYxzd\r\n5\r\nTTOng\r\n4\r\nBJ5g\r\n8\r\nfK0XjLy3\r\n6\r\nciAAk1\r\n6\r\nFmo0RP\r\n1\r\nE\r\n2\r\npq\r\n6\r\n6f4BBn\r\n4\r\np5jm\r\n1\r\n3\r\n6\r\nLuSbAO\r\n1\r\nj\r\n2\r\n1M\r\n3\r\n5qU\r\n0\r\n\r\n",
|
|
||||||
h.to_s, 'random chunk sizes'
|
|
||||||
)
|
|
||||||
|
|
||||||
h.chunk_max_size = 1
|
|
||||||
h.body = 'hi mom'
|
|
||||||
assert_equal(
|
|
||||||
"HTTP/1.1 200 OK\r\n" +
|
|
||||||
"Transfer-Encoding: chunked\r\n" +
|
|
||||||
"Foo: Fishing\r\n" +
|
|
||||||
"Chicken: 47\r\n\r\n" +
|
|
||||||
"1\r\nh\r\n1\r\ni\r\n1\r\n \r\n1\r\nm\r\n1\r\no\r\n1\r\nm\r\n0\r\n\r\n",
|
|
||||||
h.to_s, '1 byte chunks'
|
|
||||||
)
|
|
||||||
|
|
||||||
h.chunk_min_size = 2
|
|
||||||
assert_equal(
|
|
||||||
"HTTP/1.1 200 OK\r\n" +
|
|
||||||
"Transfer-Encoding: chunked\r\n" +
|
|
||||||
"Foo: Fishing\r\n" +
|
|
||||||
"Chicken: 47\r\n\r\n" +
|
|
||||||
"2\r\nhi\r\n2\r\n m\r\n2\r\nom\r\n0\r\n\r\n",
|
|
||||||
h.to_s, '2 byte chunks'
|
|
||||||
)
|
|
||||||
|
|
||||||
h = Klass.new(200, 'OK', '1.0')
|
|
||||||
h.body = 'hi mom'
|
|
||||||
h.auto_cl = false
|
|
||||||
h.transfer_chunked = true
|
|
||||||
assert_raise(Rex::RuntimeError, 'chunked encoding via 1.0') {
|
|
||||||
h.to_s
|
|
||||||
}
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_from_s
|
|
||||||
h = Klass.new
|
|
||||||
|
|
||||||
h.from_s(
|
|
||||||
"HTTP/1.0 404 File not found\r\n" +
|
|
||||||
"Lucifer: Beast\r\n" +
|
|
||||||
"HoHo: Satan\r\n" +
|
|
||||||
"Eat: Babies\r\n" +
|
|
||||||
"\r\n")
|
|
||||||
|
|
||||||
assert_equal(404, h.code)
|
|
||||||
assert_equal('File not found', h.message)
|
|
||||||
assert_equal('1.0', h.proto)
|
|
||||||
assert_equal("HTTP/1.0 404 File not found\r\n", h.cmd_string)
|
|
||||||
h.code = 470
|
|
||||||
assert_equal("HTTP/1.0 470 File not found\r\n", h.cmd_string)
|
|
||||||
assert_equal('Babies', h['Eat'])
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
|
@ -1,80 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'rex/proto/http'
|
|
||||||
|
|
||||||
class Rex::Proto::Http::Server::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
ListenPort = 8090
|
|
||||||
ListenHost = '127.0.0.1'
|
|
||||||
|
|
||||||
SrvKlass = Rex::Proto::Http::Server
|
|
||||||
CliKlass = Rex::Proto::Http::Client
|
|
||||||
|
|
||||||
def test_server
|
|
||||||
begin
|
|
||||||
s = start_srv
|
|
||||||
c = CliKlass.new(ListenHost, ListenPort)
|
|
||||||
|
|
||||||
1.upto(10) {
|
|
||||||
req = c.request_raw('uri' => '/')
|
|
||||||
res = c.send_recv(req)
|
|
||||||
assert_not_nil(res)
|
|
||||||
assert_equal(404, res.code)
|
|
||||||
}
|
|
||||||
ensure
|
|
||||||
stop_srv
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_resource
|
|
||||||
begin
|
|
||||||
s = start_srv
|
|
||||||
c = CliKlass.new(ListenHost, ListenPort)
|
|
||||||
|
|
||||||
s.add_resource('/foo',
|
|
||||||
'Proc' => Proc.new { |cli, req|
|
|
||||||
resp = Rex::Proto::Http::Response::OK.new
|
|
||||||
|
|
||||||
resp.body = "Chickens everywhere"
|
|
||||||
|
|
||||||
cli.send_response(resp)
|
|
||||||
})
|
|
||||||
|
|
||||||
1.upto(10) {
|
|
||||||
req = c.request_raw('uri' => '/foo')
|
|
||||||
res = c.send_recv(req)
|
|
||||||
assert_not_nil(res)
|
|
||||||
assert_equal(200, res.code)
|
|
||||||
assert_equal("Chickens everywhere", res.body)
|
|
||||||
}
|
|
||||||
|
|
||||||
s.remove_resource('/foo')
|
|
||||||
|
|
||||||
req = c.request_raw('uri' => '/foo')
|
|
||||||
res = c.send_recv(req)
|
|
||||||
assert_not_nil(res)
|
|
||||||
assert_equal(404, res.code)
|
|
||||||
ensure
|
|
||||||
stop_srv
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
protected
|
|
||||||
|
|
||||||
def start_srv
|
|
||||||
self.srv = SrvKlass.new(ListenPort, ListenHost)
|
|
||||||
self.srv.start
|
|
||||||
self.srv
|
|
||||||
end
|
|
||||||
|
|
||||||
def stop_srv
|
|
||||||
self.srv.stop if (self.srv)
|
|
||||||
end
|
|
||||||
|
|
||||||
attr_accessor :srv
|
|
||||||
|
|
||||||
end
|
|
|
@ -1,181 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'rex/proto/ntlm'
|
|
||||||
require 'rex/socket'
|
|
||||||
|
|
||||||
class ConnectionTest < Test::Unit::TestCase
|
|
||||||
def setup
|
|
||||||
@user = "admin"
|
|
||||||
@pass = "1234"
|
|
||||||
@domain = ""
|
|
||||||
@host = "192.168.145.161"
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_socket_connectivity
|
|
||||||
assert_nothing_raised do
|
|
||||||
socket = Rex::Socket.create_tcp(
|
|
||||||
'PeerHost' => @host,
|
|
||||||
'PeerPort' => 80
|
|
||||||
)
|
|
||||||
assert_kind_of Socket, socket
|
|
||||||
assert !socket.closed?
|
|
||||||
socket.close
|
|
||||||
assert socket.closed?
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def http_message(msg)
|
|
||||||
get_req = "GET / HTTP/1.1\r\n"
|
|
||||||
get_req += "Host: #{@host}\r\n"
|
|
||||||
get_req += "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\n"
|
|
||||||
get_req += "Authorization: NTLM #{msg.encode64}\r\n"
|
|
||||||
get_req += "Content-type: application/x-www-form-urlencoded\r\n"
|
|
||||||
get_req += "Content-Length: 0\r\n"
|
|
||||||
get_req += "\r\n"
|
|
||||||
end
|
|
||||||
|
|
||||||
def client_auth(pw)
|
|
||||||
msg_1 = Rex::Proto::NTLM::Message::Type1.new
|
|
||||||
get_req = http_message(msg_1)
|
|
||||||
socket = Rex::Socket.create_tcp(
|
|
||||||
'PeerHost' => @host,
|
|
||||||
'PeerPort' => 80
|
|
||||||
)
|
|
||||||
socket.put get_req
|
|
||||||
res = socket.get(3)
|
|
||||||
assert res =~ /WWW-Authenticate: NTLM TlRM/
|
|
||||||
res_ntlm = res.match(/WWW-Authenticate: NTLM ([A-Z0-9\x2b\x2f=]+)/i)[1]
|
|
||||||
assert_operator res_ntlm.size, :>=, 24
|
|
||||||
msg_2 = Rex::Proto::NTLM::Message.decode64(res_ntlm)
|
|
||||||
assert msg_2
|
|
||||||
msg_3 = msg_2.response({:user => @user, :password => pw}, {:ntlmv2 => true})
|
|
||||||
assert msg_3
|
|
||||||
auth_req = http_message(msg_3)
|
|
||||||
socket.put auth_req
|
|
||||||
auth_res = socket.get(3)
|
|
||||||
socket.close
|
|
||||||
return auth_res
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_client_auth_success
|
|
||||||
assert_equal client_auth(@pass)[0,12], "HTTP/1.1 200"
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_client_auth_fail
|
|
||||||
assert_not_equal client_auth("badpass")[0,12], "HTTP/1.1 200"
|
|
||||||
assert_equal client_auth("badpass")[0,12], "HTTP/1.1 401"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# FunctionTest by Minero Aoki
|
|
||||||
|
|
||||||
class FunctionTest < Test::Unit::TestCase #:nodoc:
|
|
||||||
def setup
|
|
||||||
@passwd = "SecREt01"
|
|
||||||
@user = "user"
|
|
||||||
@domain = "domain"
|
|
||||||
@challenge = ["0123456789abcdef"].pack("H*")
|
|
||||||
@client_ch = ["ffffff0011223344"].pack("H*")
|
|
||||||
@timestamp = 1055844000
|
|
||||||
@trgt_info = [
|
|
||||||
"02000c0044004f004d00410049004e00" +
|
|
||||||
"01000c00530045005200560045005200" +
|
|
||||||
"0400140064006f006d00610069006e00" +
|
|
||||||
"2e0063006f006d000300220073006500" +
|
|
||||||
"72007600650072002e0064006f006d00" +
|
|
||||||
"610069006e002e0063006f006d000000" +
|
|
||||||
"0000"
|
|
||||||
].pack("H*")
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_lm_hash
|
|
||||||
ahash = ["ff3750bcc2b22412c2265b23734e0dac"].pack("H*")
|
|
||||||
assert_equal ahash, Rex::Proto::NTLM::Crypt::lm_hash(@passwd)
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_ntlm_hash
|
|
||||||
ahash = ["cd06ca7c7e10c99b1d33b7485a2ed808"].pack("H*")
|
|
||||||
assert_equal ahash, Rex::Proto::NTLM::Crypt::ntlm_hash(@passwd)
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_ntlmv2_hash
|
|
||||||
ahash = ["04b8e0ba74289cc540826bab1dee63ae"].pack("H*")
|
|
||||||
assert_equal ahash, Rex::Proto::NTLM::Crypt::ntlmv2_hash(@user, @passwd, @domain)
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_lm_response
|
|
||||||
ares = ["c337cd5cbd44fc9782a667af6d427c6de67c20c2d3e77c56"].pack("H*")
|
|
||||||
assert_equal ares, Rex::Proto::NTLM::Crypt::lm_response(
|
|
||||||
{
|
|
||||||
:lm_hash => Rex::Proto::NTLM::Crypt::lm_hash(@passwd),
|
|
||||||
:challenge => @challenge
|
|
||||||
}
|
|
||||||
)
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_ntlm_response
|
|
||||||
ares = ["25a98c1c31e81847466b29b2df4680f39958fb8c213a9cc6"].pack("H*")
|
|
||||||
ntlm_hash = Rex::Proto::NTLM::Crypt::ntlm_hash(@passwd)
|
|
||||||
assert_equal ares, Rex::Proto::NTLM::Crypt::ntlm_response(
|
|
||||||
{
|
|
||||||
:ntlm_hash => ntlm_hash,
|
|
||||||
:challenge => @challenge
|
|
||||||
}
|
|
||||||
)
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_lmv2_response
|
|
||||||
ares = ["d6e6152ea25d03b7c6ba6629c2d6aaf0ffffff0011223344"].pack("H*")
|
|
||||||
assert_equal ares, Rex::Proto::NTLM::Crypt::lmv2_response(
|
|
||||||
{
|
|
||||||
:ntlmv2_hash => Rex::Proto::NTLM::Crypt::ntlmv2_hash(@user, @passwd, @domain),
|
|
||||||
:challenge => @challenge
|
|
||||||
},
|
|
||||||
{ :client_challenge => @client_ch }
|
|
||||||
)
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_ntlmv2_response
|
|
||||||
ares = [
|
|
||||||
"cbabbca713eb795d04c97abc01ee4983" +
|
|
||||||
"01010000000000000090d336b734c301" +
|
|
||||||
"ffffff00112233440000000002000c00" +
|
|
||||||
"44004f004d00410049004e0001000c00" +
|
|
||||||
"53004500520056004500520004001400" +
|
|
||||||
"64006f006d00610069006e002e006300" +
|
|
||||||
"6f006d00030022007300650072007600" +
|
|
||||||
"650072002e0064006f006d0061006900" +
|
|
||||||
"6e002e0063006f006d00000000000000" +
|
|
||||||
"0000"
|
|
||||||
].pack("H*")
|
|
||||||
assert_equal ares, Rex::Proto::NTLM::Crypt::ntlmv2_response(
|
|
||||||
{
|
|
||||||
:ntlmv2_hash => Rex::Proto::NTLM::Crypt::ntlmv2_hash(@user, @passwd, @domain),
|
|
||||||
:challenge => @challenge,
|
|
||||||
:target_info => @trgt_info
|
|
||||||
},
|
|
||||||
{
|
|
||||||
:timestamp => @timestamp,
|
|
||||||
:client_challenge => @client_ch
|
|
||||||
}
|
|
||||||
)
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_ntlm2_session
|
|
||||||
acha = ["ffffff001122334400000000000000000000000000000000"].pack("H*")
|
|
||||||
ares = ["10d550832d12b2ccb79d5ad1f4eed3df82aca4c3681dd455"].pack("H*")
|
|
||||||
session = Rex::Proto::NTLM::Crypt::ntlm2_session(
|
|
||||||
{
|
|
||||||
:ntlm_hash => Rex::Proto::NTLM::Crypt::ntlm_hash(@passwd),
|
|
||||||
:challenge => @challenge
|
|
||||||
},
|
|
||||||
{ :client_challenge => @client_ch }
|
|
||||||
)
|
|
||||||
assert_equal acha, session[0]
|
|
||||||
assert_equal ares, session[1]
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,33 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
#
|
|
||||||
# RFB protocol support
|
|
||||||
#
|
|
||||||
# @author Joshua J. Drake <jduck>
|
|
||||||
#
|
|
||||||
# Based on:
|
|
||||||
# vnc_auth_none contributed by Matteo Cantoni <goony[at]nothink.org>
|
|
||||||
# vnc_auth_login contributed by carstein <carstein.sec[at]gmail.com>
|
|
||||||
#
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..'))
|
|
||||||
|
|
||||||
require 'rex/socket'
|
|
||||||
require 'rex/proto/rfb'
|
|
||||||
|
|
||||||
sd = Rex::Socket::Tcp.create('PeerHost' => ENV["VNCHOST"], 'PeerPort' => Rex::Proto::RFB::DefaultPort)
|
|
||||||
|
|
||||||
v = Rex::Proto::RFB::Client.new(sd)
|
|
||||||
if not v.connect('password')
|
|
||||||
$stderr.puts v.error
|
|
||||||
exit(1)
|
|
||||||
end
|
|
||||||
|
|
||||||
loop {
|
|
||||||
sret = select([sd],nil,nil,10)
|
|
||||||
puts sret.inspect
|
|
||||||
if sret and sret[0].include? sd
|
|
||||||
buf = sd.sysread(8192)
|
|
||||||
puts "read #{buf.length} bytes: #{buf.inspect}"
|
|
||||||
end
|
|
||||||
}
|
|
|
@ -1,224 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
|
|
||||||
|
|
||||||
require 'rex/test'
|
|
||||||
require 'rex/proto/smb/constants'
|
|
||||||
require 'rex/proto/smb/exceptions'
|
|
||||||
require 'rex/proto/smb/utils'
|
|
||||||
require 'rex/proto/smb/client'
|
|
||||||
require 'rex/proto/dcerpc'
|
|
||||||
require 'rex/socket'
|
|
||||||
|
|
||||||
class Rex::Proto::SMB::Client::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
Klass = Rex::Proto::SMB::Client
|
|
||||||
|
|
||||||
# Alias over the Rex DCERPC protocol modules
|
|
||||||
DCERPCPacket = Rex::Proto::DCERPC::Packet
|
|
||||||
DCERPCClient = Rex::Proto::DCERPC::Client
|
|
||||||
DCERPCResponse = Rex::Proto::DCERPC::Response
|
|
||||||
DCERPCUUID = Rex::Proto::DCERPC::UUID
|
|
||||||
|
|
||||||
def test_smb_open_share
|
|
||||||
|
|
||||||
share = 'C$'
|
|
||||||
|
|
||||||
write_data = ('A' * 256)
|
|
||||||
filename = 'smb_test.txt'
|
|
||||||
|
|
||||||
begin
|
|
||||||
Timeout.timeout($_REX_TEST_TIMEOUT) {
|
|
||||||
s = Rex::Socket.create_tcp(
|
|
||||||
'PeerHost' => $_REX_TEST_SMB_HOST,
|
|
||||||
'PeerPort' => 139
|
|
||||||
)
|
|
||||||
|
|
||||||
c = Klass.new(s)
|
|
||||||
|
|
||||||
# Request a SMB session over NetBIOS
|
|
||||||
# puts "[*] Requesting a SMB session over NetBIOS..."
|
|
||||||
ok = c.session_request()
|
|
||||||
assert_kind_of(Rex::Struct2::CStruct, ok)
|
|
||||||
|
|
||||||
# Check for a positive session response
|
|
||||||
# A negative response is 0x83
|
|
||||||
assert_equal(ok.v['Type'], 0x82)
|
|
||||||
|
|
||||||
# puts "[*] Negotiating SMB dialects..."
|
|
||||||
ok = c.negotiate()
|
|
||||||
assert_kind_of(Rex::Struct2::CStruct, ok)
|
|
||||||
|
|
||||||
# puts "[*] Authenticating with NTLMv2..."
|
|
||||||
ok = c.session_setup_with_ntlmssp($_REX_TEXT_SMB_USER, $_REX_TEXT_SMB_PASS)
|
|
||||||
assert_kind_of(Rex::Struct2::CStruct, ok)
|
|
||||||
assert_not_equal(c.auth_user_id, 0)
|
|
||||||
|
|
||||||
# puts "[*] Connecting to the share..."
|
|
||||||
ok = c.tree_connect(share)
|
|
||||||
assert_kind_of(Rex::Struct2::CStruct, ok)
|
|
||||||
assert_not_equal(c.last_tree_id, 0)
|
|
||||||
|
|
||||||
# puts "[*] Opening a file for write..."
|
|
||||||
ok = c.open(filename)
|
|
||||||
assert_kind_of(Rex::Struct2::CStruct, ok)
|
|
||||||
assert_not_equal(c.last_file_id, 0)
|
|
||||||
|
|
||||||
# puts "[*] Writing data to the test file..."
|
|
||||||
ok = c.write(c.last_file_id, 0, write_data)
|
|
||||||
assert_kind_of(Rex::Struct2::CStruct, ok)
|
|
||||||
assert_equal(ok['Payload'].v['CountLow'], write_data.length)
|
|
||||||
|
|
||||||
# puts "[*] Closing the test file..."
|
|
||||||
ok = c.close(c.last_file_id)
|
|
||||||
assert_kind_of(Rex::Struct2::CStruct, ok)
|
|
||||||
|
|
||||||
# puts "[*] Opening a file for read..."
|
|
||||||
ok = c.open(filename, 1)
|
|
||||||
assert_kind_of(Rex::Struct2::CStruct, ok)
|
|
||||||
assert_not_equal(c.last_file_id, 0)
|
|
||||||
|
|
||||||
# puts "[*] Reading data from the test file..."
|
|
||||||
ok = c.read(c.last_file_id, 0, write_data.length)
|
|
||||||
assert_kind_of(Rex::Struct2::CStruct, ok)
|
|
||||||
assert_equal(ok['Payload'].v['DataLenLow'], write_data.length)
|
|
||||||
|
|
||||||
read_data = ok.to_s.slice(
|
|
||||||
ok['Payload'].v['DataOffset'] + 4,
|
|
||||||
ok['Payload'].v['DataLenLow']
|
|
||||||
)
|
|
||||||
assert_equal(read_data, write_data)
|
|
||||||
|
|
||||||
# puts "[*] Closing the test file..."
|
|
||||||
ok = c.close(c.last_file_id)
|
|
||||||
assert_kind_of(Rex::Struct2::CStruct, ok)
|
|
||||||
|
|
||||||
# puts "[*] Disconnecting from the tree..."
|
|
||||||
ok = c.tree_disconnect
|
|
||||||
assert_kind_of(Rex::Struct2::CStruct, ok)
|
|
||||||
|
|
||||||
s.close
|
|
||||||
|
|
||||||
|
|
||||||
# Reconnect and delete the file
|
|
||||||
s = Rex::Socket.create_tcp(
|
|
||||||
'PeerHost' => $_REX_TEST_SMB_HOST,
|
|
||||||
'PeerPort' => 139
|
|
||||||
)
|
|
||||||
|
|
||||||
c = Klass.new(s)
|
|
||||||
|
|
||||||
# Request a SMB session over NetBIOS
|
|
||||||
# puts "[*] Requesting a SMB session over NetBIOS..."
|
|
||||||
ok = c.session_request()
|
|
||||||
assert_kind_of(Rex::Struct2::CStruct, ok)
|
|
||||||
|
|
||||||
# Check for a positive session response
|
|
||||||
# A negative response is 0x83
|
|
||||||
assert_equal(ok.v['Type'], 0x82)
|
|
||||||
|
|
||||||
# puts "[*] Negotiating SMB dialects..."
|
|
||||||
ok = c.negotiate()
|
|
||||||
assert_kind_of(Rex::Struct2::CStruct, ok)
|
|
||||||
|
|
||||||
# puts "[*] Authenticating with NTLMv2..."
|
|
||||||
ok = c.session_setup_with_ntlmssp($_REX_TEXT_SMB_USER, $_REX_TEXT_SMB_PASS)
|
|
||||||
assert_kind_of(Rex::Struct2::CStruct, ok)
|
|
||||||
assert_not_equal(c.auth_user_id, 0)
|
|
||||||
|
|
||||||
# puts "[*] Connecting to the share..."
|
|
||||||
ok = c.tree_connect(share)
|
|
||||||
assert_kind_of(Rex::Struct2::CStruct, ok)
|
|
||||||
assert_not_equal(c.last_tree_id, 0)
|
|
||||||
|
|
||||||
# puts "[*] Deleting the test file..."
|
|
||||||
ok = c.delete(filename)
|
|
||||||
assert_kind_of(Rex::Struct2::CStruct, ok)
|
|
||||||
|
|
||||||
# puts "[*] Diconnecting from the tree..."
|
|
||||||
ok = c.tree_disconnect
|
|
||||||
assert_kind_of(Rex::Struct2::CStruct, ok)
|
|
||||||
|
|
||||||
s.close
|
|
||||||
}
|
|
||||||
rescue Timeout::Error
|
|
||||||
flunk('timeout')
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_smb_session_request
|
|
||||||
begin
|
|
||||||
Timeout.timeout($_REX_TEST_TIMEOUT) {
|
|
||||||
s = Rex::Socket.create_tcp(
|
|
||||||
'PeerHost' => $_REX_TEST_SMB_HOST,
|
|
||||||
'PeerPort' => 139
|
|
||||||
)
|
|
||||||
|
|
||||||
c = Klass.new(s)
|
|
||||||
|
|
||||||
# Request a SMB session over NetBIOS
|
|
||||||
# puts "[*] Requesting a SMB session over NetBIOS..."
|
|
||||||
ok = c.session_request()
|
|
||||||
assert_kind_of(Rex::Struct2::CStruct, ok)
|
|
||||||
|
|
||||||
# Check for a positive session response
|
|
||||||
# A negative response is 0x83
|
|
||||||
assert_equal(ok.v['Type'], 0x82)
|
|
||||||
|
|
||||||
# puts "[*] Negotiating SMB dialects..."
|
|
||||||
ok = c.negotiate()
|
|
||||||
assert_kind_of(Rex::Struct2::CStruct, ok)
|
|
||||||
|
|
||||||
# puts "[*] Authenticating with NTLMv2..."
|
|
||||||
ok = c.session_setup_with_ntlmssp
|
|
||||||
assert_kind_of(Rex::Struct2::CStruct, ok)
|
|
||||||
|
|
||||||
# puts "[*] Authenticating with NTLMv1..."
|
|
||||||
ok = c.session_setup_no_ntlmssp
|
|
||||||
assert_kind_of(Rex::Struct2::CStruct, ok)
|
|
||||||
|
|
||||||
# puts "[*] Authenticating with clear text passwords..."
|
|
||||||
begin
|
|
||||||
ok = c.session_setup_clear
|
|
||||||
assert_kind_of(Rex::Struct2::CStruct, ok)
|
|
||||||
rescue Rex::Proto::SMB::Exceptions::ErrorCode
|
|
||||||
if ($!.error_code != 0x00010002)
|
|
||||||
raise $!
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# puts "[*] Connecting to IPC$..."
|
|
||||||
ok = c.tree_connect
|
|
||||||
assert_kind_of(Rex::Struct2::CStruct, ok)
|
|
||||||
|
|
||||||
# puts "[*] Opening the \BROWSER pipe..."
|
|
||||||
ok = c.create_pipe('\BROWSER')
|
|
||||||
assert_kind_of(Rex::Struct2::CStruct, ok)
|
|
||||||
|
|
||||||
vers = DCERPCUUID.vers_by_name('SRVSVC')
|
|
||||||
uuid = DCERPCUUID.uuid_by_name('SRVSVC')
|
|
||||||
bind, ctx = DCERPCPacket.make_bind_fake_multi(uuid, vers)
|
|
||||||
|
|
||||||
# puts "[*] Binding to the Server Service..."
|
|
||||||
ok = c.trans_named_pipe(c.last_file_id, bind)
|
|
||||||
assert_kind_of(Rex::Struct2::CStruct, ok)
|
|
||||||
|
|
||||||
data = ok.to_s.slice(
|
|
||||||
ok['Payload'].v['DataOffset'] + 4,
|
|
||||||
ok['Payload'].v['DataCount']
|
|
||||||
)
|
|
||||||
assert_not_equal(data, nil)
|
|
||||||
|
|
||||||
resp = DCERPCResponse.new(data)
|
|
||||||
assert_equal(resp.type, 12)
|
|
||||||
}
|
|
||||||
rescue Timeout::Error
|
|
||||||
flunk('timeout')
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
|
@ -1,19 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
|
|
||||||
|
|
||||||
require 'rex/test'
|
|
||||||
require 'rex/proto/smb/constants'
|
|
||||||
|
|
||||||
class Rex::Proto::SMB::Constants::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
Klass = Rex::Proto::SMB::Constants
|
|
||||||
|
|
||||||
def test_defines
|
|
||||||
assert_equal(Klass::SMB_COM_CREATE_DIRECTORY, 0x00 )
|
|
||||||
assert_equal(Klass::SMB_COM_NT_CREATE_ANDX, 0xa2 )
|
|
||||||
assert_equal(Klass::NT_TRANSACT_QUERY_SECURITY_DESC, 0x06)
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
|
@ -1,129 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
|
|
||||||
|
|
||||||
require 'rex/test'
|
|
||||||
require 'rex/proto/smb'
|
|
||||||
require 'rex/proto/dcerpc'
|
|
||||||
require 'rex/socket'
|
|
||||||
|
|
||||||
class Rex::Proto::SMB::SimpleClient::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
Klass = Rex::Proto::SMB::SimpleClient
|
|
||||||
|
|
||||||
# Alias over the Rex DCERPC protocol modules
|
|
||||||
DCERPCPacket = Rex::Proto::DCERPC::Packet
|
|
||||||
DCERPCClient = Rex::Proto::DCERPC::Client
|
|
||||||
DCERPCResponse = Rex::Proto::DCERPC::Response
|
|
||||||
DCERPCUUID = Rex::Proto::DCERPC::UUID
|
|
||||||
XCEPT = Rex::Proto::SMB::Exceptions
|
|
||||||
|
|
||||||
FILE_CREATE = 0x10
|
|
||||||
FILE_TRUNC = 0x02
|
|
||||||
FILE_OPEN = 0x01
|
|
||||||
|
|
||||||
|
|
||||||
def test_smb_open_share
|
|
||||||
user = 'SMBTest'
|
|
||||||
pass = 'SMBTest'
|
|
||||||
share = 'C$'
|
|
||||||
|
|
||||||
write_data = ('A' * (1024 * 8))
|
|
||||||
filename = 'smb_tester.txt'
|
|
||||||
begin
|
|
||||||
Timeout.timeout($_REX_TEST_TIMEOUT) {
|
|
||||||
s = Rex::Socket.create_tcp(
|
|
||||||
'PeerHost' => $_REX_TEST_SMB_HOST,
|
|
||||||
'PeerPort' => 445
|
|
||||||
)
|
|
||||||
|
|
||||||
c = Klass.new(s, true)
|
|
||||||
|
|
||||||
begin
|
|
||||||
c.login('*SMBSERVER', user, pass)
|
|
||||||
rescue XCEPT::LoginError
|
|
||||||
flunk('login failure')
|
|
||||||
end
|
|
||||||
|
|
||||||
c.connect(share)
|
|
||||||
|
|
||||||
f = c.open(filename, 'rwct')
|
|
||||||
f << write_data
|
|
||||||
f.close
|
|
||||||
|
|
||||||
f = c.open(filename, 'ro')
|
|
||||||
d = f.read()
|
|
||||||
f.close
|
|
||||||
|
|
||||||
c.delete(filename)
|
|
||||||
c.disconnect(share)
|
|
||||||
|
|
||||||
s.close
|
|
||||||
}
|
|
||||||
rescue Timeout::Error
|
|
||||||
flunk('timeout')
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_smb_dcerpc
|
|
||||||
begin
|
|
||||||
Timeout.timeout($_REX_TEST_TIMEOUT) {
|
|
||||||
s = Rex::Socket.create_tcp(
|
|
||||||
'PeerHost' => $_REX_TEST_SMB_HOST,
|
|
||||||
'PeerPort' => 445
|
|
||||||
)
|
|
||||||
|
|
||||||
c = Klass.new(s, true)
|
|
||||||
|
|
||||||
user = ''
|
|
||||||
pass = ''
|
|
||||||
|
|
||||||
begin
|
|
||||||
c.login('*SMBSERVER', user, pass)
|
|
||||||
rescue XCEPT::LoginError
|
|
||||||
flunk('login failure')
|
|
||||||
end
|
|
||||||
|
|
||||||
c.connect('IPC$')
|
|
||||||
f = c.create_pipe('\BROWSER')
|
|
||||||
|
|
||||||
bind, ctx = DCERPCPacket.make_bind_fake_multi(
|
|
||||||
'4b324fc8-1670-01d3-1278-5a47bf6ee188', '3.0',
|
|
||||||
10,
|
|
||||||
4
|
|
||||||
)
|
|
||||||
|
|
||||||
# Evasion techniques:
|
|
||||||
# 1) Write the bind out a few bytes at a time with a random offset
|
|
||||||
# 2) Read the response back a few bytes at a time with a random offset
|
|
||||||
|
|
||||||
# Write the bind request out in random chunk sizes
|
|
||||||
while (bind.length > 0)
|
|
||||||
f.write( bind.slice!(0, (rand(20)+5)), rand(1024)+1 )
|
|
||||||
end
|
|
||||||
|
|
||||||
d = ''
|
|
||||||
# Read the response back a few bytes a time
|
|
||||||
begin
|
|
||||||
while(true)
|
|
||||||
t = (f.read((rand(20)+5), rand(1024)+1))
|
|
||||||
last if ! t.length
|
|
||||||
d << t
|
|
||||||
end
|
|
||||||
rescue XCEPT::NoReply
|
|
||||||
end
|
|
||||||
|
|
||||||
r = DCERPCResponse.new(d)
|
|
||||||
assert_equal(r.type, 12)
|
|
||||||
assert_equal(r.ack_result[ctx-0], 0)
|
|
||||||
assert_equal(r.ack_result[ctx-1], 2)
|
|
||||||
|
|
||||||
s.close
|
|
||||||
}
|
|
||||||
rescue Timeout::Error
|
|
||||||
flunk('timeout')
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
|
@ -1,21 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
|
|
||||||
|
|
||||||
require 'rex/test'
|
|
||||||
require 'rex/proto/smb/utils'
|
|
||||||
|
|
||||||
class Rex::Proto::SMB::Utils::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
Klass = Rex::Proto::SMB::Utils
|
|
||||||
|
|
||||||
def test_nbname
|
|
||||||
|
|
||||||
nbdecoded = 'METASPLOITROCKS!'
|
|
||||||
nbencoded = 'ENEFFEEBFDFAEMEPEJFEFCEPEDELFDCB'
|
|
||||||
|
|
||||||
assert_equal(Klass.nbname_encode(nbdecoded), nbencoded )
|
|
||||||
assert_equal(Klass.nbname_decode(nbencoded), nbdecoded )
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,24 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
require 'rex/compat'
|
|
||||||
require 'rex/proto/tftp'
|
|
||||||
|
|
||||||
content = nil
|
|
||||||
|
|
||||||
fn = ARGV.shift
|
|
||||||
if (fn and fn.length > 0)
|
|
||||||
File.open(fn, "rb") do |fd|
|
|
||||||
content = fd.read(fd.stat.size)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
content ||= "A" * (1024*1024)
|
|
||||||
|
|
||||||
|
|
||||||
tftp = Rex::Proto::TFTP::Server.new
|
|
||||||
tftp.register_file("poo", content)
|
|
||||||
tftp.start
|
|
||||||
|
|
||||||
#loop { break if not tftp.thread.alive? }
|
|
||||||
tftp.thread.join
|
|
|
@ -1,33 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'rex/service_manager'
|
|
||||||
|
|
||||||
class Rex::ServiceManager::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
Klass = Rex::ServiceManager
|
|
||||||
|
|
||||||
def test_svcm
|
|
||||||
begin
|
|
||||||
c = Klass
|
|
||||||
s = c.start(Rex::Proto::Http::Server, 8090)
|
|
||||||
assert_not_nil(s)
|
|
||||||
t = c.start(Rex::Proto::Http::Server, 8090)
|
|
||||||
assert_not_nil(t)
|
|
||||||
assert_equal(s, t)
|
|
||||||
z = c.start(Rex::Proto::Http::Server, 8091)
|
|
||||||
assert_not_equal(t, z)
|
|
||||||
assert_equal("HTTP Server", s.alias)
|
|
||||||
assert_equal("HTTP Server 1", z.alias)
|
|
||||||
ensure
|
|
||||||
c.stop_by_alias(s.alias) if (s)
|
|
||||||
c.stop_by_alias(z.alias) if (z)
|
|
||||||
c.stop_by_alias(t.alias) if (t)
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
|
@ -1,108 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'rex/socket'
|
|
||||||
require 'rex/socket/tcp'
|
|
||||||
|
|
||||||
class Rex::Socket::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
def test_ip
|
|
||||||
assert_equal(true,Rex::Socket.dotted_ip?('0.0.0.0'), 'valid IP min')
|
|
||||||
assert_equal(true,Rex::Socket.dotted_ip?('255.255.255.255'), 'valid IP max')
|
|
||||||
assert_equal(false,Rex::Socket.dotted_ip?('0.0.0.0.0'), 'too many sections')
|
|
||||||
assert_equal(false,Rex::Socket.dotted_ip?('0..0.0.0'), 'too many dots')
|
|
||||||
assert_equal(false,Rex::Socket.dotted_ip?('00.0.0'), 'not enough dots')
|
|
||||||
assert_equal(false,Rex::Socket.dotted_ip?('256.256.256.256'), 'numbers too big')
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_create
|
|
||||||
port = 64442
|
|
||||||
serv = TCPServer.new('127.0.0.1', port)
|
|
||||||
|
|
||||||
sock = nil
|
|
||||||
assert_nothing_raised {
|
|
||||||
sock = Rex::Socket.create(
|
|
||||||
'PeerHost' => '127.0.0.1',
|
|
||||||
'PeerPort' => port,
|
|
||||||
'Proto' => 'tcp')
|
|
||||||
}
|
|
||||||
assert_kind_of(Rex::Socket::Tcp, sock, "socket factory creation")
|
|
||||||
|
|
||||||
sock = nil
|
|
||||||
assert_nothing_raised {
|
|
||||||
sock = Rex::Socket.create_tcp(
|
|
||||||
'PeerHost' => '127.0.0.1',
|
|
||||||
'PeerPort' => port)
|
|
||||||
}
|
|
||||||
assert_kind_of(Rex::Socket::Tcp, sock, "tcp socket factory creation")
|
|
||||||
|
|
||||||
serv.close
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_to_sockaddr
|
|
||||||
assert_equal(([2] + [0]*14).pack("sC*"), Rex::Socket.to_sockaddr(0, 0), "null sockaddr")
|
|
||||||
=begin
|
|
||||||
# This is platform dependent, pain to test
|
|
||||||
if (Rex::Socket.support_ipv6?)
|
|
||||||
# Use the constant for AF_INET6 since it is different per platform
|
|
||||||
# (10 on linux and 28 on BSD)
|
|
||||||
inaddr_any_sockaddr = ([::Socket::AF_INET6, 22] + [0]*24).pack('sSC*')
|
|
||||||
else
|
|
||||||
inaddr_any_sockaddr = ([2, 22] + [0]*12).pack('snC*')
|
|
||||||
end
|
|
||||||
=end
|
|
||||||
assert_equal(([2, 0x16, 1, 2, 3, 4] + [0]*8).pack('snC*'), Rex::Socket.to_sockaddr("1.2.3.4", 22), "1.2.3.4 addr, port 22 sockaddr")
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_from_sockaddr
|
|
||||||
# 1.9.1 raises ArgumentError if we don't have an af == AF_INET or AF_INET6
|
|
||||||
af, host, port = Rex::Socket.from_sockaddr(([2, 0] + [0]*12).pack('snC*'))
|
|
||||||
assert_equal(2, af, "af = 2")
|
|
||||||
assert_equal('0.0.0.0', host, "zero host")
|
|
||||||
assert_equal(0, port, "zero port")
|
|
||||||
|
|
||||||
af, host, port = Rex::Socket.from_sockaddr(([2, 22]+[0]*12).pack('snC*'))
|
|
||||||
assert_equal(2, af, "af = 2")
|
|
||||||
assert_equal(22, port, "port = 22")
|
|
||||||
assert_equal('0.0.0.0', host, "zero host")
|
|
||||||
|
|
||||||
af, host, port = Rex::Socket.from_sockaddr(([2, 22, 1, 2, 3, 4] + [0]*8).pack('snC*') )
|
|
||||||
assert_equal(2, af, "af = 2")
|
|
||||||
assert_equal('1.2.3.4', host, "host = '1.2.3.4'")
|
|
||||||
assert_equal(22, port, "port = 22")
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_resolv_nbo
|
|
||||||
assert_equal("\x04\x03\x02\x01", Rex::Socket.resolv_nbo("4.3.2.1"))
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_net2bitmask
|
|
||||||
assert_equal(32, Rex::Socket.net2bitmask('255.255.255.255'))
|
|
||||||
assert_equal(28, Rex::Socket.net2bitmask('255.255.255.240'))
|
|
||||||
assert_equal(24, Rex::Socket.net2bitmask('255.255.255.0'))
|
|
||||||
assert_equal(16, Rex::Socket.net2bitmask('255.255.0.0'))
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_bit2netmask
|
|
||||||
assert_equal("255.255.255.255", Rex::Socket.bit2netmask(32))
|
|
||||||
assert_equal("255.255.255.254", Rex::Socket.bit2netmask(31))
|
|
||||||
assert_equal("255.255.255.240", Rex::Socket.bit2netmask(28))
|
|
||||||
assert_equal("255.255.255.0", Rex::Socket.bit2netmask(24))
|
|
||||||
assert_equal("255.255.0.0", Rex::Socket.bit2netmask(16))
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_is_internal
|
|
||||||
assert( ! Rex::Socket.is_internal?("1.2.3.4"))
|
|
||||||
assert( ! Rex::Socket.is_internal?("172.15.3.4"))
|
|
||||||
assert( ! Rex::Socket.is_internal?("172.32.3.4"))
|
|
||||||
assert(Rex::Socket.is_internal?("10.2.3.4"))
|
|
||||||
assert(Rex::Socket.is_internal?("192.168.3.4"))
|
|
||||||
16.upto(31) do |octet|
|
|
||||||
assert(Rex::Socket.is_internal?("172.#{octet}.3.4"))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
|
@ -1,76 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'rex/exceptions'
|
|
||||||
require 'rex/socket/parameters'
|
|
||||||
require 'rex/socket/comm/local'
|
|
||||||
|
|
||||||
class Rex::Socket::Comm::Local::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
def test_create_tcp
|
|
||||||
test_port = 64432
|
|
||||||
test_server = TCPServer.new('127.0.0.1', test_port)
|
|
||||||
|
|
||||||
# Create a stream connection to the stub listener
|
|
||||||
stream = nil
|
|
||||||
|
|
||||||
assert_nothing_raised {
|
|
||||||
stream = Rex::Socket::Comm::Local.create(
|
|
||||||
Rex::Socket::Parameters.from_hash(
|
|
||||||
'PeerHost' => '127.0.0.1',
|
|
||||||
'PeerPort' => test_port,
|
|
||||||
'Proto' => 'tcp'))
|
|
||||||
}
|
|
||||||
|
|
||||||
assert_kind_of(Rex::IO::Stream, stream, "valid Stream instance")
|
|
||||||
assert_kind_of(Rex::Socket::Tcp, stream, "valid Tcp instance")
|
|
||||||
stream.close
|
|
||||||
|
|
||||||
# Now create a bare connection to the listener
|
|
||||||
stream = nil
|
|
||||||
|
|
||||||
assert_nothing_raised {
|
|
||||||
stream = Rex::Socket::Comm::Local.create(
|
|
||||||
Rex::Socket::Parameters.from_hash(
|
|
||||||
'PeerHost' => '127.0.0.1',
|
|
||||||
'PeerPort' => test_port,
|
|
||||||
'Proto' => 'tcp',
|
|
||||||
'Bare' => true))
|
|
||||||
}
|
|
||||||
|
|
||||||
assert_kind_of(Socket, stream, "valid Socket instance")
|
|
||||||
|
|
||||||
assert_raise(Rex::ConnectionRefused, "connection refused failed") {
|
|
||||||
Rex::Socket::Comm::Local.create(
|
|
||||||
Rex::Socket::Parameters.from_hash(
|
|
||||||
'PeerHost' => '127.0.0.1',
|
|
||||||
'PeerPort' => 1,
|
|
||||||
'Proto' => 'tcp',
|
|
||||||
'Bare' => true))
|
|
||||||
}
|
|
||||||
|
|
||||||
stream.close
|
|
||||||
|
|
||||||
test_server.close
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_create_tcp_server
|
|
||||||
# TODO
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_create_udp
|
|
||||||
# TODO
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_create_invalid
|
|
||||||
assert_raise(Rex::UnsupportedProtocol, "invalid protocol check failed") {
|
|
||||||
Rex::Socket::Comm::Local.create(
|
|
||||||
Rex::Socket::Parameters.from_hash(
|
|
||||||
'Proto' => 'invalid'))
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
|
@ -1,52 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'rex/socket/parameters'
|
|
||||||
|
|
||||||
class Rex::Socket::Parameters::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
def test_parameters
|
|
||||||
h = {
|
|
||||||
'PeerHost' => 'phost',
|
|
||||||
'PeerPort' => 12,
|
|
||||||
'LocalHost' => 'lhost',
|
|
||||||
'LocalPort' => 47,
|
|
||||||
'Bare' => true,
|
|
||||||
'Server' => true,
|
|
||||||
'Comm' => 'nothing',
|
|
||||||
'Proto' => 'tcp',
|
|
||||||
'SSL' => true
|
|
||||||
}
|
|
||||||
|
|
||||||
p = Rex::Socket::Parameters.from_hash(h)
|
|
||||||
|
|
||||||
assert_equal('phost', p.peerhost, "peerhost")
|
|
||||||
assert_equal('phost', p.peeraddr, "peeraddr")
|
|
||||||
assert_equal(12, p.peerport, "peerport")
|
|
||||||
assert_equal('lhost', p.localhost, "localhost")
|
|
||||||
assert_equal('lhost', p.localaddr, "localaddr")
|
|
||||||
assert_equal(47, p.localport, "localport")
|
|
||||||
assert_equal(true, p.bare?, "bare")
|
|
||||||
assert_equal(true, p.server?, "server")
|
|
||||||
assert_equal(false, p.client?, "client")
|
|
||||||
assert_equal('nothing', p.comm, "comm")
|
|
||||||
assert_equal(true, p.tcp?, "proto tcp")
|
|
||||||
assert_equal(false, p.udp?, "proto udp")
|
|
||||||
assert_equal(true, p.ssl, "ssl")
|
|
||||||
|
|
||||||
p = Rex::Socket::Parameters.from_hash({})
|
|
||||||
|
|
||||||
assert_equal(nil, p.peerhost, "null peerhost")
|
|
||||||
assert_equal('0.0.0.0', p.localhost, "default localhost")
|
|
||||||
assert_equal(0, p.peerport, "0 peerport")
|
|
||||||
assert_equal(0, p.localport, "0 localport")
|
|
||||||
assert_equal(false, p.bare, "default false bare")
|
|
||||||
assert_equal('tcp', p.proto, "default tcp proto")
|
|
||||||
assert_equal(false, p.server, "default false server")
|
|
||||||
assert_equal(false, p.ssl, "default false ssl")
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
|
@ -1,56 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'rex/socket/range_walker'
|
|
||||||
|
|
||||||
class Rex::Socket::RangeWalker::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
Klass = Rex::Socket::RangeWalker
|
|
||||||
|
|
||||||
def test_walker
|
|
||||||
|
|
||||||
#
|
|
||||||
# Single argument
|
|
||||||
#
|
|
||||||
s = Klass.new('10.0.0.0-10.0.0.255')
|
|
||||||
|
|
||||||
0.upto(255) { |x|
|
|
||||||
assert_equal('10.0.0.' + x.to_s, s.next_ip)
|
|
||||||
}
|
|
||||||
assert_nil(s.next_ip)
|
|
||||||
|
|
||||||
s.reset
|
|
||||||
|
|
||||||
0.upto(255) { |x|
|
|
||||||
assert_equal('10.0.0.' + x.to_s, s.next_ip)
|
|
||||||
}
|
|
||||||
assert_nil(s.next_ip)
|
|
||||||
|
|
||||||
#
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# Backwards
|
|
||||||
#
|
|
||||||
s = Klass.new('10.0.0.255-10.0.0.0')
|
|
||||||
|
|
||||||
0.upto(255) { |x|
|
|
||||||
assert_equal('10.0.0.' + x.to_s, s.next_ip)
|
|
||||||
}
|
|
||||||
assert_nil(s.next_ip)
|
|
||||||
|
|
||||||
#
|
|
||||||
# Same address
|
|
||||||
#
|
|
||||||
s = Klass.new('10.0.0.255-10.0.0.255')
|
|
||||||
assert_equal('10.0.0.255', s.next_ip)
|
|
||||||
assert_nil(s.next_ip)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
|
@ -1,40 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'rex/socket/ssl_tcp'
|
|
||||||
|
|
||||||
class Rex::Socket::SslTcp::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
def test_ssltcp
|
|
||||||
|
|
||||||
# Create an SslTcp instance
|
|
||||||
t = nil
|
|
||||||
assert_nothing_raised {
|
|
||||||
t = Rex::Socket::SslTcp.create(
|
|
||||||
'PeerHost' => 'www.google.com',
|
|
||||||
'PeerPort' => 443)
|
|
||||||
}
|
|
||||||
assert_kind_of(Rex::Socket::SslTcp, t, "valid ssl tcp")
|
|
||||||
|
|
||||||
# Send a HEAD request and make sure we get some kind of response
|
|
||||||
head_request = "HEAD / HTTP/1.0\r\n\r\n"
|
|
||||||
|
|
||||||
assert_equal(19, t.put(head_request), "sending head request")
|
|
||||||
|
|
||||||
head_response = ""
|
|
||||||
|
|
||||||
assert_nothing_raised {
|
|
||||||
head_response = t.get(nil) || ""
|
|
||||||
}
|
|
||||||
|
|
||||||
assert_match(/^HTTP\/1./, head_response, "valid head response")
|
|
||||||
|
|
||||||
assert_nothing_raised {
|
|
||||||
t.close
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
|
@ -1,62 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'rex/socket/ssl_tcp_server'
|
|
||||||
require 'rex/socket/ssl_tcp'
|
|
||||||
require 'rex/text'
|
|
||||||
|
|
||||||
class Rex::Socket::SslTcpServer::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
# XXX. The client data is sent & decrypted just fine. The server data is not. the client thread just spins. BAH.
|
|
||||||
#
|
|
||||||
# As of 2011-03-04, works fine on 1.8.6-p399, 1.8.7-p330, 1.9.1-p378
|
|
||||||
#
|
|
||||||
def test_tcp_server
|
|
||||||
#return;
|
|
||||||
|
|
||||||
serv_port = 65433
|
|
||||||
c = nil
|
|
||||||
|
|
||||||
threads = []
|
|
||||||
|
|
||||||
# Server thread
|
|
||||||
threads << Thread.new() {
|
|
||||||
serv = Rex::Socket.create_tcp_server('LocalPort' => serv_port, 'SSL' => true)
|
|
||||||
assert_kind_of(Rex::Socket::SslTcpServer, serv, "type => ssl")
|
|
||||||
assert_kind_of(Rex::Socket::TcpServer, serv, "type => tcp")
|
|
||||||
assert_kind_of(Rex::IO::StreamServer, serv, "type => stream")
|
|
||||||
s = serv.accept
|
|
||||||
assert_equal("client_data\n", s.get_once(), "s: get_once")
|
|
||||||
assert_equal(3, s.write("Yo\n"), "s: put Yo")
|
|
||||||
# Make sure methods are Strings for 1.9 compat (which returns
|
|
||||||
# symbols)
|
|
||||||
meths = s.methods.map {|m| m.to_s}
|
|
||||||
assert(meths.include?("<<"), "Has <<")
|
|
||||||
assert(meths.include?(">>"), "Has >>")
|
|
||||||
assert(meths.include?("has_read_data?"), "Has has_read_data?")
|
|
||||||
serv.close
|
|
||||||
}
|
|
||||||
|
|
||||||
# Client thread
|
|
||||||
threads << Thread.new() {
|
|
||||||
sleep(2)
|
|
||||||
assert_nothing_raised {
|
|
||||||
c = Rex::Socket::SslTcp.create(
|
|
||||||
'PeerHost' => '127.0.0.1',
|
|
||||||
'PeerPort' => serv_port
|
|
||||||
)
|
|
||||||
}
|
|
||||||
assert_kind_of(Rex::Socket::Tcp, c, "TCP")
|
|
||||||
assert_kind_of(Rex::Socket::SslTcp, c, "SSL")
|
|
||||||
assert_equal(12, c.write("client_data\n"), "c: write")
|
|
||||||
assert_equal("Yo\n", c.get_once(), "c: get_once")
|
|
||||||
c.close if (c)
|
|
||||||
}
|
|
||||||
|
|
||||||
threads.each { |aThread| aThread.join }
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
|
@ -1,29 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'rex/socket/subnet_walker'
|
|
||||||
|
|
||||||
class Rex::Socket::SubnetWalker::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
Klass = Rex::Socket::SubnetWalker
|
|
||||||
|
|
||||||
def test_walker
|
|
||||||
s = Klass.new('10.0.0.0', '255.255.255.0')
|
|
||||||
|
|
||||||
0.upto(255) { |x|
|
|
||||||
assert_equal('10.0.0.' + x.to_s, s.next_ip)
|
|
||||||
}
|
|
||||||
assert_nil(s.next_ip)
|
|
||||||
|
|
||||||
s.reset
|
|
||||||
|
|
||||||
0.upto(255) { |x|
|
|
||||||
assert_equal('10.0.0.' + x.to_s, s.next_ip)
|
|
||||||
}
|
|
||||||
assert_nil(s.next_ip)
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
|
@ -1,53 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'rex/socket/switch_board'
|
|
||||||
|
|
||||||
class Rex::Socket::SwitchBoard::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
Klass = Rex::Socket::SwitchBoard
|
|
||||||
|
|
||||||
def test_add
|
|
||||||
Klass.flush_routes
|
|
||||||
assert_equal(true, Klass.add_route('0.0.0.0', 0, 'foo'))
|
|
||||||
assert_equal(false, Klass.add_route('0.0.0.0', 0, 'foo'))
|
|
||||||
assert_equal(1, Klass.routes.length)
|
|
||||||
|
|
||||||
assert_equal('0.0.0.0', Klass.routes[0].subnet)
|
|
||||||
assert_equal('0.0.0.0', Klass.routes[0].netmask)
|
|
||||||
assert_equal(0, Klass.routes[0].bitmask)
|
|
||||||
assert_equal('foo', Klass.routes[0].comm)
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_remove
|
|
||||||
Klass.flush_routes
|
|
||||||
assert_equal(true, Klass.add_route('0.0.0.0', 0, 'foo'))
|
|
||||||
assert_equal(true, Klass.remove_route('0.0.0.0', 0, 'foo'))
|
|
||||||
assert_equal(false, Klass.remove_route('0.0.0.0', 0, 'foo'))
|
|
||||||
assert_equal(0, Klass.routes.length)
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_best_comm
|
|
||||||
Klass.flush_routes
|
|
||||||
Klass.add_route('0.0.0.0', 0, 'default')
|
|
||||||
Klass.add_route('1.2.3.0', 24, 'spec')
|
|
||||||
|
|
||||||
assert_equal('default', Klass.best_comm('4.5.6.7'))
|
|
||||||
assert_equal('spec', Klass.best_comm('1.2.3.7'))
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_remove_by_comm
|
|
||||||
Klass.flush_routes
|
|
||||||
Klass.add_route('1.2.3.0', 24, 'foo')
|
|
||||||
Klass.add_route('1.2.4.0', 24, 'dog')
|
|
||||||
|
|
||||||
Klass.remove_by_comm('foo')
|
|
||||||
|
|
||||||
assert_equal('dog', Klass.best_comm('1.2.4.7'))
|
|
||||||
assert_nil(Klass.best_comm('1.2.3.7'))
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
|
@ -1,65 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'rex'
|
|
||||||
|
|
||||||
class Rex::Socket::Tcp::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
def test_tcp
|
|
||||||
port = 65434
|
|
||||||
listener = Rex::Socket.create_tcp_server( 'LocalPort' => port )
|
|
||||||
client = nil
|
|
||||||
|
|
||||||
begin
|
|
||||||
# Connect to the temp server
|
|
||||||
assert_nothing_raised {
|
|
||||||
client = Rex::Socket.create_tcp(
|
|
||||||
'PeerHost' => '127.0.0.1',
|
|
||||||
'PeerPort' => port)
|
|
||||||
}
|
|
||||||
|
|
||||||
assert_kind_of(Rex::Socket::Tcp, client, 'kindof?')
|
|
||||||
assert_equal('127.0.0.1', client.peerhost, 'peerhost')
|
|
||||||
assert_equal(port, client.peerport, 'peerport')
|
|
||||||
|
|
||||||
# Accept the client connection
|
|
||||||
server = listener.accept
|
|
||||||
assert_kind_of(Socket, server, "valid server socket connection")
|
|
||||||
|
|
||||||
# do all of the tests, once for each side
|
|
||||||
{ 'c/s' => [client, server], 's/c' => [server, client] }.each_pair { |mode, sockets|
|
|
||||||
a = sockets[0]
|
|
||||||
b = sockets[1]
|
|
||||||
|
|
||||||
string = "test\n"
|
|
||||||
assert_equal(false, a.has_read_data?(1), "#{mode} : has_read_data?, no data")
|
|
||||||
assert_equal(string.length, b.write(string), "#{mode} : write")
|
|
||||||
assert_equal(true, a.has_read_data?(1), "#{mode} : has_read_data?, with data")
|
|
||||||
assert_equal(string, a.recv(string.length), "#{mode} : recv")
|
|
||||||
|
|
||||||
string = "string\rtest\nwith\x00null"
|
|
||||||
assert_equal(string.length, a << string, "#{mode} : append")
|
|
||||||
tmp = ''; tmp = b.>>
|
|
||||||
assert_equal(string, tmp, "#{mode} : append (reverse)")
|
|
||||||
|
|
||||||
string = "\x00foobar\x00"
|
|
||||||
assert_equal(string.length, a.send(string, 0), "#{mode} : send")
|
|
||||||
assert_equal(string, b.get(), "#{mode} : get")
|
|
||||||
}
|
|
||||||
|
|
||||||
assert_equal(true, client.shutdown(::Socket::SHUT_RD), 'client: shutdown read handle')
|
|
||||||
assert_equal(true, client.shutdown(::Socket::SHUT_WR), 'client: shutdown write handle')
|
|
||||||
assert_nothing_raised {
|
|
||||||
client.close
|
|
||||||
client = nil
|
|
||||||
}
|
|
||||||
ensure
|
|
||||||
client.close if (client)
|
|
||||||
listener.close
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
|
@ -1,45 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'rex/socket/tcp_server'
|
|
||||||
|
|
||||||
class Rex::Socket::TcpServer::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
def test_tcp_server
|
|
||||||
serv_port = 65433
|
|
||||||
serv = Rex::Socket.create_tcp_server(
|
|
||||||
'LocalPort' => serv_port)
|
|
||||||
ccli = nil
|
|
||||||
|
|
||||||
begin
|
|
||||||
assert_kind_of(Rex::Socket::TcpServer, serv, "valid TcpServer")
|
|
||||||
assert_kind_of(Rex::IO::StreamServer, serv, "valid StreamServer")
|
|
||||||
|
|
||||||
# Connect to the server
|
|
||||||
assert_nothing_raised {
|
|
||||||
ccli = Rex::Socket.create_tcp(
|
|
||||||
'PeerHost' => '127.0.0.1',
|
|
||||||
'PeerPort' => serv_port)
|
|
||||||
}
|
|
||||||
assert_kind_of(Rex::Socket::Tcp, ccli, "valid client client Tcp")
|
|
||||||
|
|
||||||
# Accept the client connection
|
|
||||||
scli = serv.accept
|
|
||||||
assert_kind_of(Rex::Socket::Tcp, scli, "valid server client Tcp")
|
|
||||||
|
|
||||||
assert_equal(2, scli.put("Yo"), "scli: put Yo")
|
|
||||||
assert_equal("Yo", ccli.get(), "ccli: get Yo")
|
|
||||||
assert(scli.methods.include?('<<'), "no << operator")
|
|
||||||
assert(scli.methods.include?('>>'), "no >> operator")
|
|
||||||
assert(scli.methods.include?('has_read_data?'), "no has_read_data?")
|
|
||||||
|
|
||||||
ensure
|
|
||||||
ccli.close if (ccli)
|
|
||||||
serv.close
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
|
@ -1,45 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'rex/socket/udp'
|
|
||||||
|
|
||||||
class Rex::Socket::Udp::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
def test_udp
|
|
||||||
serv_port = 55432
|
|
||||||
serv = Rex::Socket::Udp.create(
|
|
||||||
'LocalHost' => '127.0.0.1',
|
|
||||||
'LocalPort' => serv_port)
|
|
||||||
|
|
||||||
begin
|
|
||||||
assert_kind_of(Rex::Socket::Udp, serv, "valid Udp server instance")
|
|
||||||
|
|
||||||
# Test connected socket
|
|
||||||
concli = Rex::Socket::Udp.create(
|
|
||||||
'PeerHost' => '127.0.0.1',
|
|
||||||
'PeerPort' => serv_port)
|
|
||||||
|
|
||||||
assert_equal('127.0.0.1', concli.peerhost, "matching peerhost")
|
|
||||||
assert_equal(serv_port, concli.peerport, "matching peerport")
|
|
||||||
assert_equal(2, concli.write('yo'), "write succeeded")
|
|
||||||
|
|
||||||
data, host, port = serv.recvfrom
|
|
||||||
|
|
||||||
assert_equal('yo', data, "read data match")
|
|
||||||
assert_equal('127.0.0.1', host, "matching client host")
|
|
||||||
|
|
||||||
# Test non-connected socket
|
|
||||||
concli = Rex::Socket::Udp.create
|
|
||||||
|
|
||||||
assert_equal(3, concli.sendto('bob', '127.0.0.1', serv_port), "sendto")
|
|
||||||
data, host, port = serv.recvfrom
|
|
||||||
assert_equal('bob', data, "read data match")
|
|
||||||
ensure
|
|
||||||
serv.close
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
|
@ -1,193 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'rex/text'
|
|
||||||
require 'rex/exceptions'
|
|
||||||
class Rex::Text::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
def test_pattern_create
|
|
||||||
set1 = %w{AB ab 12}
|
|
||||||
assert_equal 'Aa1Aa2', Rex::Text.pattern_create(6,set1)
|
|
||||||
set2 = %w{ABC abc 123}
|
|
||||||
assert_equal 'Aa1Aa2Aa3Ab1Ab2Ab3', Rex::Text.pattern_create(18,set2)
|
|
||||||
assert_equal 'Zz8Zz9', Rex::Text.pattern_create(20280)[-6,6] # Bug #2952
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_pattern_create_silly
|
|
||||||
assert_equal "", Rex::Text.pattern_create(nil)
|
|
||||||
assert_equal "", Rex::Text.pattern_create(0)
|
|
||||||
assert_equal 'AAAAAAAAA', Rex::Text.pattern_create(9,['A'])
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_uri_encode
|
|
||||||
srand(0)
|
|
||||||
assert_equal('A1%21', Rex::Text.uri_encode('A1!'), 'uri encode')
|
|
||||||
assert_equal('A1!', Rex::Text.uri_encode('A1!', 'none'), 'uri encode: none')
|
|
||||||
assert_equal('A1%21', Rex::Text.uri_encode('A1!', 'hex-normal'), 'uri encode: hex-normal')
|
|
||||||
assert_equal('%41%31%21', Rex::Text.uri_encode('A1!', 'hex-all'), 'uri encode: hex-all')
|
|
||||||
assert_equal('A1%u01c3', Rex::Text.uri_encode('A1!', 'u-normal'), 'uri encode: u-normal')
|
|
||||||
assert_equal('%uff21%u2081%uff01', Rex::Text.uri_encode('A1!', 'u-all'), 'uri encode: u-all')
|
|
||||||
srand(0)
|
|
||||||
assert_equal("%uff2d%uff49%uff43%uff52%uff4f%uff53%uff4f%uff46%uff54%u2004%uff45%uff4e%uff43%uff4f%uff44%uff49%uff4e%uff47%u3000%uff44%uff52%uff49%uff56%uff45%uff53%u2005%uff4d%uff45%u2000%uff43%uff52%uff41%uff5a%uff59%uff01", Rex::Text.uri_encode('Microsoft encoding drives me crazy!', 'u-half'))
|
|
||||||
|
|
||||||
assert_raises(TypeError) {
|
|
||||||
Rex::Text.uri_encode('a', 'umpa lumpa')
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_html_encode
|
|
||||||
assert_equal('A', Rex::Text.html_encode('A'), 'html_encode default')
|
|
||||||
assert_equal('A', Rex::Text.html_encode('A','hex'), 'html_encode hex')
|
|
||||||
assert_equal('A', Rex::Text.html_encode('A','int'), 'html_encode int')
|
|
||||||
assert_equal('A', Rex::Text.html_encode('A','int-wide'), 'html_encode int-wide')
|
|
||||||
|
|
||||||
assert_raises(TypeError) {
|
|
||||||
Rex::Text.html_encode('a', 'umpa lumpa')
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_rand_text
|
|
||||||
srand(0)
|
|
||||||
assert_equal("\254/u\300C\373\303g\t\323", Rex::Text.rand_text(10), 'rand text 1')
|
|
||||||
assert_equal("\025\362$WF\330X\214:\301", Rex::Text.rand_text(10), 'rand text 2')
|
|
||||||
assert_equal("\346'W\256XQ\245\031MH", Rex::Text.rand_text(10), 'rand text 3')
|
|
||||||
assert_equal('bababbabba', Rex::Text.rand_text(10, nil, 'ab'), 'rand text with specified "good"')
|
|
||||||
assert_equal('MA', Rex::Text.rand_state(), 'rand state')
|
|
||||||
assert_equal('xzdttongb.5gfk0xjly3.aak.fmo0rp.com', Rex::Text.rand_hostname(), 'rand hostname')
|
|
||||||
assert_equal('9aaf811799', Rex::Text.rand_text_hex(10), 'rand hex')
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
def test_unicode
|
|
||||||
assert_equal("a\x00b\x00c\x00", Rex::Text.to_unicode('abc'), 'unicode, default = little endian')
|
|
||||||
assert_equal("a\x00b\x00c\x00", Rex::Text.to_unicode('abc', 'utf-16le'), 'utf-16le')
|
|
||||||
assert_equal("\x00a\x00b\x00c", Rex::Text.to_unicode('abc', 'utf-16be'), 'utf-16be')
|
|
||||||
assert_equal("a\x00\x00\x00b\x00\x00\x00c\x00\x00\x00", Rex::Text.to_unicode('abc', 'utf-32le'), 'utf-32le')
|
|
||||||
assert_equal("\x00\x00\x00a\x00\x00\x00b\x00\x00\x00c", Rex::Text.to_unicode('abc', 'utf-32be'), 'utf-32be')
|
|
||||||
assert_equal("abc+-abc-+AAA-", Rex::Text.to_unicode("abc+abc-\x00", 'utf-7'), 'utf-7')
|
|
||||||
assert_equal("+AGE-+AGI-+AGM-+ACs-+AGE-+AGI-+AGM-+AC0-+AAA-", Rex::Text.to_unicode("abc+abc-\x00", 'utf-7', 'all'), 'utf-7-all')
|
|
||||||
|
|
||||||
assert_equal("a\303\272", Rex::Text.to_unicode("a\xFA", 'utf-8'))
|
|
||||||
assert_equal("\xC1\xA1", Rex::Text.to_unicode('a', 'utf-8', 'overlong', 2), 'utf-8 overlong')
|
|
||||||
assert_equal("\xE0\x81\xA1", Rex::Text.to_unicode('a', 'utf-8', 'overlong', 3), 'utf-8 overlong')
|
|
||||||
assert_equal("\xF0\x80\x81\xA1", Rex::Text.to_unicode('a', 'utf-8', 'overlong', 4), 'utf-8 overlong')
|
|
||||||
assert_equal("\xF8\x80\x80\x81\xA1", Rex::Text.to_unicode('a', 'utf-8', 'overlong', 5), 'utf-8 overlong')
|
|
||||||
assert_equal("\xFC\x80\x80\x80\x81\xA1", Rex::Text.to_unicode('a', 'utf-8', 'overlong', 6), 'utf-8 overlong')
|
|
||||||
assert_equal("\xFE\x80\x80\x80\x80\x81\xA1", Rex::Text.to_unicode('a', 'utf-8', 'overlong', 7), 'utf-8 overlong')
|
|
||||||
100.times {
|
|
||||||
assert(["\xC1\x21","\xC1\x61","\xC1\xE1"].include?(Rex::Text.to_unicode('a', 'utf-8', 'invalid')), 'utf-8 invalid')
|
|
||||||
assert(["\xE0\x01\x21","\xE0\x01\x61","\xE0\x01\xA1","\xE0\x01\xE1","\xE0\x41\x21","\xE0\x41\x61","\xE0\x41\xA1","\xE0\x41\xE1","\xE0\x81\x21","\xE0\x81\x61","\xE0\x81\xA1","\xE0\x81\xE1","\xE0\xC1\x21","\xE0\xC1\x61","\xE0\xC1\xA1","\xE0\xC1\xE1"].include?(Rex::Text.to_unicode('a', 'utf-8', 'invalid', 3)), 'utf-8 invalid 3 byte')
|
|
||||||
}
|
|
||||||
|
|
||||||
a = ["\xC1\x21","\xC1\x61","\xC1\xE1"]
|
|
||||||
10.times {
|
|
||||||
encoded = Rex::Text.to_unicode('a', 'utf-8', 'invalid')
|
|
||||||
if a.include?(encoded)
|
|
||||||
a.delete(encoded)
|
|
||||||
end
|
|
||||||
}
|
|
||||||
assert_equal([], a, 'all possible values')
|
|
||||||
|
|
||||||
assert_raises(TypeError) {
|
|
||||||
Rex::Text.to_unicode('a', 'utf-8', '', 8)
|
|
||||||
}
|
|
||||||
assert_raises(TypeError) {
|
|
||||||
Rex::Text.to_unicode('a', 'utf-8', 'foo', 6)
|
|
||||||
}
|
|
||||||
|
|
||||||
assert_raises(TypeError) {
|
|
||||||
Rex::Text.to_unicode('a', 'uhwtfms', -1)
|
|
||||||
}
|
|
||||||
|
|
||||||
100.times {
|
|
||||||
assert(["\x01\x00","\x01\x02","\x01\x04","\x01\xcd","\x01\xde","\xff\x21"].include?(Rex::Text.to_unicode('A', 'uhwtfms')), 'uhwtfms')
|
|
||||||
assert(["\x00\xc0","\x00\xc1","\x00\xc2","\x00\xc3","\x00\xc4","\x00\xc5"].include?(Rex::Text.to_unicode('A', 'uhwtfms', 949)), 'uhwtfms codepage 949')
|
|
||||||
}
|
|
||||||
|
|
||||||
a = ["\x01\x00","\x01\x02","\x01\x04","\x01\xcd","\x01\xde","\xff\x21"]
|
|
||||||
20.times {
|
|
||||||
encoded = Rex::Text.to_unicode('A', 'uhwtfms')
|
|
||||||
if a.include?(encoded)
|
|
||||||
a.delete(encoded)
|
|
||||||
end
|
|
||||||
}
|
|
||||||
assert_equal([], a, 'all possible values uhwtfms')
|
|
||||||
|
|
||||||
assert_raises(TypeError) {
|
|
||||||
Rex::Text.to_unicode('a', 'uhwtfms-half', 1)
|
|
||||||
}
|
|
||||||
|
|
||||||
assert_equal("\xFF\x01", Rex::Text.to_unicode('!', 'uhwtfms-half'))
|
|
||||||
srand(0)
|
|
||||||
assert_equal("\xff\x2d\xff\x49\xff\x43\xff\x52\xff\x4f\xff\x53\xff\x4f\xff\x46\xff\x54\x20\x04\xff\x45\xff\x4e\xff\x43\xff\x4f\xff\x44\xff\x49\xff\x4e\xff\x47\x30\x00\xff\x44\xff\x52\xff\x49\xff\x56\xff\x45\xff\x53\x20\x05\xff\x4d\xff\x45\x20\x00\xff\x43\xff\x52\xff\x41\xff\x5a\xff\x59\xff\x01", Rex::Text.to_unicode('Microsoft encoding drives me crazy!', 'uhwtfms-half'))
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_zlib
|
|
||||||
assert_equal("x\332\313\310T\310\315\317\005\000\a\225\002;", Rex::Text.zlib_deflate('hi mom'), 'compress')
|
|
||||||
assert_equal('hi mom', Rex::Text.zlib_inflate("x\234\313\310T\310\315\317\005\000\a\225\002;"), 'decompress')
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_gzip
|
|
||||||
string = Rex::Text.gzip('hi mom')
|
|
||||||
assert_equal("\x1f\x8b\x08\x00", string.slice!(0,4), 'gzip headers')
|
|
||||||
|
|
||||||
# skip the next 6 bytes as it is host & time specific (zlib's example gun does, so why not us too?)
|
|
||||||
string.slice!(0,6)
|
|
||||||
|
|
||||||
assert_equal("\xcb\xc8\x54\xc8\xcd\xcf\x05\x00\x68\xa4\x1c\xf0\x06\x00\x00\x00", string, 'gzip data')
|
|
||||||
|
|
||||||
assert_equal('hi mom', Rex::Text.ungzip("\037\213\010\000|\261\275C\002\003\313\310T\310\315\317\005\000h\244\034\360\006\000\000\000"), 'ungzip')
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_badchar_index
|
|
||||||
assert_equal(nil, Rex::Text.badchar_index('abcdef', 'gzk'))
|
|
||||||
assert_equal(2, Rex::Text.badchar_index('123avd', 'ly3'))
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_hexify
|
|
||||||
str = "\x01\x02\xff\x00"
|
|
||||||
|
|
||||||
assert_equal("\\x01\\x02\\xff\\x00", Rex::Text.to_hex(str), 'to_hex')
|
|
||||||
assert_equal("ABC01ABC02ABCffABC00", Rex::Text.to_hex(str, 'ABC'), 'to_hex with prefix')
|
|
||||||
assert_equal('%u0102%uff00', Rex::Text.to_hex(str, '%u', 2), 'to_hex with chunk size of 2')
|
|
||||||
|
|
||||||
# to_hex, without providing enouigh data to chunk on a given size
|
|
||||||
assert_raises(RuntimeError){ Rex::Text.to_hex('a', '', 2) }
|
|
||||||
|
|
||||||
assert_equal("buf = \n\"\\x01\\x02\\xff\\x00\"\n", Rex::Text.to_ruby(str), 'to_ruby')
|
|
||||||
assert_equal("my $buf = \n\"\\x01\\x02\\xff\\x00\";\n", Rex::Text.to_perl(str), 'to_perl')
|
|
||||||
assert_equal("export buf=\\\n$'\\x01\\x02\\xff\\x00\'\n", Rex::Text.to_bash(str), 'to_bash')
|
|
||||||
assert_equal("unsigned char buf[] = \n\"\\x01\\x02\\xff\\x00\";\n", Rex::Text.to_c(str), 'to_c')
|
|
||||||
|
|
||||||
# 0 -> 20
|
|
||||||
str = "\000\001\002\003\004\005\006\a\010\t\n\v\f\r\016\017\020\021\022\023"
|
|
||||||
|
|
||||||
assert_equal("buf = \n\"\\x00\\x01\\x02\\x03\" +\n\"\\x04\\x05\\x06\\x07\" +\n\"\\x08\\x09\\x0a\\x0b\" +\n\"\\x0c\\x0d\\x0e\\x0f\" +\n\"\\x10\\x11\\x12\\x13\"\n", Rex::Text.to_ruby(str, 20), 'to_ruby with wrap')
|
|
||||||
assert_equal("my $buf = \n\"\\x00\\x01\\x02\\x03\" .\n\"\\x04\\x05\\x06\\x07\" .\n\"\\x08\\x09\\x0a\\x0b\" .\n\"\\x0c\\x0d\\x0e\\x0f\" .\n\"\\x10\\x11\\x12\\x13\";\n", Rex::Text.to_perl(str, 20), 'to_perl with wrap')
|
|
||||||
assert_equal("export buf=\\\n$'\\x00\\x01\\x02\\x03\'\\\n$'\\x04\\x05\\x06\\x07\'\\\n$'\\x08\\x09\\x0a\\x0b'\\\n$'\\x0c\\x0d\\x0e\\x0f'\\\n$'\\x10\\x11\\x12\\x13\'\n", Rex::Text.to_bash(str, 20), 'to_bash with wrap')
|
|
||||||
assert_equal("unsigned char buf[] = \n\"\\x00\\x01\\x02\\x03\\x04\"\n\"\\x05\\x06\\x07\\x08\\x09\"\n\"\\x0a\\x0b\\x0c\\x0d\\x0e\"\n\"\\x0f\\x10\\x11\\x12\\x13\";\n", Rex::Text.to_c(str, 20, "buf"), 'to_c with wrap')
|
|
||||||
assert_equal("\\x0a", Rex::Text.to_hex("\n"), 'to_hex newline')
|
|
||||||
|
|
||||||
str = "\x05Hello\x06World!\x03\x41\x42\x43"
|
|
||||||
assert_equal("\\x05Hello\\x06World!\\x03ABC", Rex::Text.to_hex_ascii(str))
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_xml_char_encode
|
|
||||||
str = "\x05hello\x06world"
|
|
||||||
assert_equal("helloworld", Rex::Text.xml_char_encode(str))
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_wordwrap
|
|
||||||
txt = "this is a test of the word wrap features"
|
|
||||||
|
|
||||||
assert_equal("this is a \ntest of \nthe word \nwrap \nfeatures\n", Rex::Text.wordwrap(txt, 0, 10))
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_transforms
|
|
||||||
assert_equal("acbd18db4cc2f85cedef654fccc4a4d8", Rex::Text.md5('foo'))
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
|
@ -1,39 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'rex/exceptions'
|
|
||||||
require 'rex/transformer'
|
|
||||||
|
|
||||||
class Rex::Transformer::UnitTest < Test::Unit::TestCase
|
|
||||||
class Pizza
|
|
||||||
def Pizza.from_s(str)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
class ArrayTester
|
|
||||||
def self.from_a(a)
|
|
||||||
a[0] + a[1]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_transformer
|
|
||||||
a = Rex::Transformer.transform([ 'yo', 'ho' ], Array, [ String ], 'Jones')
|
|
||||||
|
|
||||||
assert_equal(2, a.length, "invalid array length")
|
|
||||||
assert_equal('yo', a[0], "invalid first element")
|
|
||||||
assert_equal('ho', a[1], "invalid second element")
|
|
||||||
|
|
||||||
assert_raise(Rex::ArgumentError, "invalid transform") {
|
|
||||||
Rex::Transformer.transform('dog', Array, [ Pizza ], 'bob')
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_from_a
|
|
||||||
a = Rex::Transformer.transform([ [ 'one', 'two' ] ], Array, [ ArrayTester ], 'Jimmy')
|
|
||||||
|
|
||||||
assert_equal('onetwo', a[0], "invalid from_a conversion")
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -1,19 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'rex/ui/text/color'
|
|
||||||
|
|
||||||
class Rex::Ui::Text::Color::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
def test_color
|
|
||||||
color = Rex::Ui::Text::Color.new.ansi('bold', 'red')
|
|
||||||
color += 'hey sup'
|
|
||||||
color += Rex::Ui::Text::Color.new.ansi('clear')
|
|
||||||
|
|
||||||
assert_equal("\e[1;31mhey sup\e[0m", color)
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
|
@ -1,35 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'rex/ui'
|
|
||||||
|
|
||||||
class Rex::Ui::Text::ProgressTracker::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
def test_stuff
|
|
||||||
output = Rex::Ui::Text::Output::Buffer.new
|
|
||||||
pt = Rex::Ui::Text::ProgressTracker.new(output)
|
|
||||||
|
|
||||||
pt.range = 1..10
|
|
||||||
|
|
||||||
assert_equal(1, pt.start)
|
|
||||||
assert_equal(10, pt.stop)
|
|
||||||
|
|
||||||
pt.start = 2
|
|
||||||
assert_equal(2, pt.start)
|
|
||||||
pt.stop = 9
|
|
||||||
assert_equal(9, pt.stop)
|
|
||||||
assert_equal(2, pt.pos)
|
|
||||||
assert_equal('', output.buf)
|
|
||||||
assert_equal(3, pt.step)
|
|
||||||
assert_equal(4, pt.step("test"))
|
|
||||||
assert_equal("[*] 4: test\n", output.buf)
|
|
||||||
output.reset
|
|
||||||
assert_equal("[-] bad\n", pt.error("bad"))
|
|
||||||
output.reset
|
|
||||||
assert_equal("[-] fatal: bad\n", pt.abort("bad"))
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
|
@ -1,56 +0,0 @@
|
||||||
#!/usr/bin/env ruby
|
|
||||||
# -*- coding: binary -*-
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..'))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'rex/ui/text/table'
|
|
||||||
|
|
||||||
class Rex::Ui::Text::Table::UnitTest < Test::Unit::TestCase
|
|
||||||
|
|
||||||
def new_table(opts = {})
|
|
||||||
if (opts['Columns'] == nil)
|
|
||||||
opts['Columns'] =
|
|
||||||
[
|
|
||||||
'col1',
|
|
||||||
'col2',
|
|
||||||
'col3'
|
|
||||||
]
|
|
||||||
end
|
|
||||||
|
|
||||||
tbl = Rex::Ui::Text::Table.new(opts)
|
|
||||||
|
|
||||||
tbl << [ "r1cell1", "r1cell2", "r1cell3" ]
|
|
||||||
tbl << [ "r2cell1", "r2cell2", "r2cell3" ]
|
|
||||||
|
|
||||||
return tbl
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_basic
|
|
||||||
tbl = new_table
|
|
||||||
|
|
||||||
dstr = <<End
|
|
||||||
col1 col2 col3
|
|
||||||
---- ---- ----
|
|
||||||
r1cell1 r1cell2 r1cell3
|
|
||||||
r2cell1 r2cell2 r2cell3
|
|
||||||
End
|
|
||||||
|
|
||||||
assert_equal(tbl.to_s, dstr)
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_indent
|
|
||||||
tbl = new_table(
|
|
||||||
'Indent' => 4)
|
|
||||||
|
|
||||||
dstr = <<End
|
|
||||||
col1 col2 col3
|
|
||||||
---- ---- ----
|
|
||||||
r1cell1 r1cell2 r1cell3
|
|
||||||
r2cell1 r2cell2 r2cell3
|
|
||||||
End
|
|
||||||
|
|
||||||
assert_equal(tbl.to_s, dstr)
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
|
@ -35,18 +35,22 @@ class Metasploit3 < Msf::Auxiliary
|
||||||
'method' => 'GET',
|
'method' => 'GET',
|
||||||
}, 25)
|
}, 25)
|
||||||
|
|
||||||
hsts = res.headers['Strict-Transport-Security']
|
if res
|
||||||
|
hsts = res.headers['Strict-Transport-Security']
|
||||||
|
|
||||||
if res and hsts
|
if hsts
|
||||||
print_good("#{ip}:#{rport} - Strict-Transport-Security:#{hsts}")
|
print_good("#{ip}:#{rport} - Strict-Transport-Security:#{hsts}")
|
||||||
report_note({
|
report_note({
|
||||||
:data => hsts,
|
:data => hsts,
|
||||||
:type => "hsts.data",
|
:type => "hsts.data",
|
||||||
:host => ip,
|
:host => ip,
|
||||||
:port => rport
|
:port => rport
|
||||||
})
|
})
|
||||||
|
else
|
||||||
|
print_error("#{ip}:#{rport} No HSTS found.")
|
||||||
|
end
|
||||||
else
|
else
|
||||||
print_error("#{ip}:#{rport} No HSTS found.")
|
print_error("#{ip}:#{rport} No headers were returned.")
|
||||||
end
|
end
|
||||||
|
|
||||||
rescue ::Timeout::Error, ::Errno::EPIPE
|
rescue ::Timeout::Error, ::Errno::EPIPE
|
||||||
|
|
|
@ -1,47 +0,0 @@
|
||||||
##
|
|
||||||
# This file is part of the Metasploit Framework and may be subject to
|
|
||||||
# redistribution and commercial restrictions. Please see the Metasploit
|
|
||||||
# web site for more information on licensing and terms of use.
|
|
||||||
# http://metasploit.com/
|
|
||||||
##
|
|
||||||
|
|
||||||
|
|
||||||
#!/usr/bin/env ruby
|
|
||||||
#
|
|
||||||
# This file tests all x86 encoders to ensure that they execute correctly.
|
|
||||||
#
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', 'lib'))
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', 'dev', 'machinetest'))
|
|
||||||
|
|
||||||
require 'rex'
|
|
||||||
require 'msf/core'
|
|
||||||
require 'msf/base'
|
|
||||||
require 'machinetest'
|
|
||||||
|
|
||||||
$framework = Msf::Simple::Framework.create
|
|
||||||
|
|
||||||
$framework.encoders.each_module { |name, mod|
|
|
||||||
e = mod.new
|
|
||||||
h = {}
|
|
||||||
failed = 0
|
|
||||||
passed = 0
|
|
||||||
|
|
||||||
next if (e.arch?(ARCH_X86) == false)
|
|
||||||
|
|
||||||
1000.times {
|
|
||||||
|
|
||||||
if (rv = MachineTest.testraw(buf = e.to_native(e.encode("\xcc"))))
|
|
||||||
failed += 1
|
|
||||||
$stderr.puts("#{name.ljust(25)}[off=#{rv}]: failure: #{Rex::Text.to_hex(buf)}")
|
|
||||||
else
|
|
||||||
passed += 1
|
|
||||||
end
|
|
||||||
|
|
||||||
h[buf] = true
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
$stderr.puts("#{name.ljust(25)}: Passed: #{passed}, Failed: #{failed}, Unique: #{h.keys.length}")
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,38 +0,0 @@
|
||||||
##
|
|
||||||
# This file is part of the Metasploit Framework and may be subject to
|
|
||||||
# redistribution and commercial restrictions. Please see the Metasploit
|
|
||||||
# web site for more information on licensing and terms of use.
|
|
||||||
# http://metasploit.com/
|
|
||||||
##
|
|
||||||
|
|
||||||
|
|
||||||
#!/usr/bin/env ruby
|
|
||||||
|
|
||||||
$:.unshift(File.join(File.dirname(__FILE__), '..', '..', '..', 'lib'))
|
|
||||||
$:.unshift(File.dirname(__FILE__))
|
|
||||||
|
|
||||||
require 'test/unit'
|
|
||||||
require 'rex/ui'
|
|
||||||
require 'msf/core'
|
|
||||||
require 'none'
|
|
||||||
|
|
||||||
class Metasploit3 < Msf::Test::Unit::TestCase
|
|
||||||
|
|
||||||
Klass = Msf::Encoders::Generic::None
|
|
||||||
|
|
||||||
def test_encoder
|
|
||||||
|
|
||||||
k = Klass.new
|
|
||||||
|
|
||||||
[
|
|
||||||
"\x41\x42\x43\x44",
|
|
||||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
|
||||||
].each { |raw|
|
|
||||||
assert_equal(
|
|
||||||
raw, k.encode(raw, '')
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue