diff --git a/lib/msf/core/option_container.rb b/lib/msf/core/option_container.rb index 77a2bf0fd7..dd77375757 100644 --- a/lib/msf/core/option_container.rb +++ b/lib/msf/core/option_container.rb @@ -330,10 +330,17 @@ class OptAddress < OptBase def valid?(value) return false if empty_required_value?(value) + return false unless value.kind_of?(String) if (value != nil and value.empty? == false) begin - ::Rex::Socket.getaddress(value, true) + getaddr_result = ::Rex::Socket.getaddress(value, true) + # Covers a wierdcase where an incomplete ipv4 address will have it's + # missing octets filled in with 0's. (e.g 192.168 become 192.0.0.168) + # which does not feel like a legit behaviour + if value =~ /^(\d{1,3}\.*){1,3}$/ and getaddr_result.gsub('.0','') == value + return false + end rescue return false end diff --git a/spec/lib/msf/core/option_container/optaddress_spec.rb b/spec/lib/msf/core/option_container/optaddress_spec.rb new file mode 100644 index 0000000000..3df26d4261 --- /dev/null +++ b/spec/lib/msf/core/option_container/optaddress_spec.rb @@ -0,0 +1,50 @@ +# -*- coding:binary -*- + +require 'spec_helper' +require 'msf/core/option_container' + + +describe Msf::OptAddress do + subject{ Msf::OptAddress.new('RHOST', [true, 'The target address', '']) } + + it 'should return a type of address' do + subject.type.should == 'address' + end + + context 'the validator' do + it 'should return true for a valid ipv4 address' do + subject.valid?('192.168.1.1').should == true + end + + it 'should return true for a valid ipv6 address' do + subject.valid?('2607:f0d0:1002:0051:0000:0000:0000:0004').should == true + end + + it 'should return true for a valid compressed ipv6 address' do + subject.valid?('2607:f0d0:1002:51::4').should == true + end + + it 'should return false for nil' do + subject.valid?(nil).should == false + end + + it 'should return false for an empty string' do + subject.valid?('').should == false + end + + it 'should return false for an incomplete ip4 address' do + subject.valid?('192.168.1').should == false + end + + it 'should return false for a non-string value' do + subject.valid?(true).should == false + subject.valid?(50).should == false + subject.valid?([]).should == false + subject.valid?([1,2]).should == false + subject.valid?({}).should == false + subject.valid?({:foo => 'bar'}) == false + end + + + end +end \ No newline at end of file diff --git a/spec/lib/msf/core/option_container_spec.rb b/spec/lib/msf/core/option_container/option_container_spec.rb similarity index 100% rename from spec/lib/msf/core/option_container_spec.rb rename to spec/lib/msf/core/option_container/option_container_spec.rb