Metasploit mailing list archives

Updated Microsoft DNS modules


From: asotirov at determina.com (Alexander Sotirov)
Date: Tue, 22 May 2007 00:34:59 -0700

H D Moore wrote:
Honestly I didn't udnerstand the patch. In the module 'target' should be 
set to targets[datastore['TARGET']] by default. Setting this manually 
means something else broke. Fabrice, can you share a little more about 
this?

I think this is the same issue I ran into last week with another module. It took
me a while to debug it, but I finally figured out that it's a bug in Ruby (or
maybe a just a really weird feature). Look at this code:

class Foo
  attr_accessor :bar

  def foo
    self.bar = 1
    p self.bar       # prints 1
    p bar            # prints 1
  end
end

The assignment self.bar is a method call to the setter method bar=(). The two
print statements call the bar() getter method.

class Foo
  attr_accessor :bar

  def foo
    self.bar = 1
    bar = 2
    p self.bar       # prints 1
    p bar            # prints 2
  end
end

The assignment bar = 2 creates a new local variable. The second print statement
prints the value of the local variable instead of calling the bar() getter method.

Here comes the weird part:

class Foo
  attr_accessor :bar

  def foo
    self.bar = 1

    if false
      bar = 2        # never executed
    end

    p self.bar       # prints 1
    p bar            # prints nil
  end
end

Even though the bar = 2 assignment is never executed, the Ruby interpreter still
creates a local variable called bar. The second print statement prints the value
of the local variable (which is nil because it has not been initialized).

I think that that you're seeing the exact same issue in the DNS module. Here's
the code:

if (target.name =~ /Automatic/)
  if (not schedport)
    target = gettarget('2003SP12')
  else
    if (not schedport)
      target = gettarget('2000')
    else
      target = gettarget('2003SP0')
    end
  end
end

The assignments to target inside the if statement will create a new local
variable called target. If you're using a non-automatic target, the assignments
will not happen and the local target variable will be nil.

Alex



Current thread: