Befehlsshell in extern zugänglichem Verzeichnis

Beschreibung

Befehlsshell in extern zugänglichem Verzeichnis ist eine Schwachstelle, bei der eine Befehlsshell oder ein Skript-Interpreter an einem webzugänglichen Ort wie dem CGI-bin-Verzeichnis oder Document-Root platziert wird. Dies ermöglicht Angreifern, beliebige Befehle auf dem Webserver auszuführen, indem sie direkt über HTTP-Anfragen auf die Shell zugreifen. Die Schwachstelle stellt ein extremes Sicherheitsrisiko dar, da sie jedem, der den Webserver erreichen kann, direkte Befehlsausführungsfähigkeit bietet und potenziell zu einer vollständigen Systemkompromittierung führt.

Risiko

Eine Befehlsshell in einem zugänglichen Verzeichnis ist eine der kritischsten möglichen Schwachstellen. Angreifer erlangen die Fähigkeit, beliebige Betriebssystembefehle mit den Berechtigungen des Webserver-Prozesses auszuführen. Dies ermöglicht vollständige Serverübernahme einschließlich Lesen und Ändern aller zugänglichen Dateien, Installieren von Hintertüren, Pivotieren zu internen Netzwerken, Exfiltrieren sensibler Daten, Kryptomining, Starten von Angriffen gegen andere Systeme und Löschen oder Erpressen von Daten. Selbst kurze Exposition kann zu persistenter Kompromittierung führen, da Angreifer schnell Hintertüren und Rootkits installieren.

Lösung

Entfernen Sie alle Shells, Interpreter oder Skriptausführungsfähigkeiten aus webzugänglichen Verzeichnissen während der Installation und Systemhärtung. Deployen Sie niemals Befehlsshells (bash, sh, cmd.exe, PowerShell) in CGI-bin- oder Document-Root-Verzeichnissen. Konfigurieren Sie Webserver, um die Ausführung von Shell-Skripten in öffentlichen Verzeichnissen zu verweigern. Implementieren Sie Dateiintegritätsüberwachung, um unbefugte Shell-Uploads zu erkennen. Verwenden Sie Application Firewalls, um Web-Shell-Muster zu blockieren. Scannen Sie Webverzeichnisse regelmäßig auf unbefugte Skripte.

Häufige Auswirkungen

AuswirkungDetails
VertraulichkeitBereich: Vertraulichkeit

Unbefugten Code ausführen - Angreifer können beliebige Befehle ausführen, sensible Dateien lesen, auf Datenbanken zugreifen und vertrauliche Daten exfiltrieren.
IntegritätBereich: Integrität

Unbefugten Code ausführen - Angreifer können Systemdateien ändern, Hintertüren installieren, Websites verunstalten und Anwendungsverhalten ändern.
VerfügbarkeitBereich: Verfügbarkeit

Unbefugten Code ausführen - Angreifer können Dateien löschen, Dienste abstürzen lassen, Ressourcen verbrauchen oder das System vollständig lahmlegen.

Beispielcode

Verwundbarer Code

#!/bin/bash
# Verwundbar: Shell-Skript über Web zugänglich
# Datei: /var/www/html/cgi-bin/shell.sh

echo "Content-type: text/plain"
echo ""

# Verwundbar: Direkte Befehlsausführung aus Benutzereingabe
cmd=$QUERY_STRING
eval "$cmd"

# Angreifer kann ausführen: /cgi-bin/shell.sh?ls+-la
# Oder schlimmer: /cgi-bin/shell.sh?cat+/etc/passwd
<?php
// Verwundbar: PHP-Web-Shell im Document-Root
// Datei: /var/www/html/shell.php

// Verwundbar: Direkte Befehlsausführung
if (isset($_GET['cmd'])) {
    $output = shell_exec($_GET['cmd']);
    echo "<pre>$output</pre>";
}

// Verwundbar: System-Befehlsausführung
if (isset($_POST['command'])) {
    system($_POST['command']);
}

// Verwundbar: Passthru gibt Ausgabe direkt aus
if (isset($_REQUEST['c'])) {
    passthru($_REQUEST['c']);
}

// Angreiferzugriff: /shell.php?cmd=whoami
// Oder: /shell.php?cmd=cat%20/etc/passwd
?>
#!/usr/bin/env python3
# Verwundbar: Python CGI Web-Shell
# Datei: /var/www/html/cgi-bin/exec.py

import cgi
import subprocess

print("Content-Type: text/plain\n")

form = cgi.FieldStorage()
cmd = form.getvalue('cmd')

if cmd:
    # Verwundbar: Direkte Befehlsausführung
    result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
    print(result.stdout)
    print(result.stderr)

Lösungscode

# Behoben: Apache-Konfiguration blockiert Shell-Zugriff
<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/html

    # Behoben: CGI-Ausführung vollständig deaktivieren wenn nicht benötigt
    <Directory /var/www/html>
        Options -ExecCGI -Indexes
        AllowOverride None
        Require all granted
    </Directory>

    # Behoben: Shell-bezogene Dateien blockieren
    <FilesMatch "\.(sh|bash|exe|bat|cmd|ps1|py|pl|rb)$">
        Require all denied
    </FilesMatch>

    # Behoben: Bekannte Web-Shell-Muster blockieren
    <LocationMatch "(shell|cmd|exec|system|passthru|eval)">
        Require all denied
    </LocationMatch>
</VirtualHost>
# Behoben: Nginx-Konfiguration verhindert Shell-Ausführung
server {
    listen 80;
    server_name example.com;
    root /var/www/html;

    # Behoben: Skriptausführung in sensiblen Verzeichnissen deaktivieren
    location ~* ^/(uploads|files|media|images)/ {
        location ~* \.(php|pl|py|sh|cgi|exe|asp|aspx|jsp)$ {
            deny all;
            return 404;
        }
    }

    # Behoben: Bekannte Web-Shell-Muster in Anfragen blockieren
    location ~* (shell|cmd|exec|system|passthru|eval|phpinfo) {
        deny all;
        return 404;
    }

    # Behoben: Zugriff auf Shell-Skripte vollständig verweigern
    location ~* \.(sh|bash|pl|py|cgi)$ {
        deny all;
        return 404;
    }
}
<?php
// Behoben: Wenn Befehlsausführung legitimerweise benötigt wird,
// strenge Kontrollen implementieren (KEINE Web-Shell)

class SichererBefehlsRunner {
    // Behoben: Whitelist erlaubter Befehle
    private const ALLOWED_COMMANDS = [
        'disk_usage' => 'df -h',
        'process_list' => 'ps aux',
        'uptime' => 'uptime'
    ];

    public function __construct() {
        // Behoben: Authentifizierung erfordern
        if (!$this->isAuthenticated()) {
            http_response_code(401);
            die('Nicht autorisiert');
        }

        // Behoben: Admin-Rolle erfordern
        if (!$this->isAdmin()) {
            http_response_code(403);
            die('Verboten');
        }

        // Behoben: Alle Befehlsausführungsversuche protokollieren
        $this->logAccess();
    }

    public function execute(string $commandName): ?string {
        // Behoben: Nur Whitelist-Befehle ausführen
        if (!isset(self::ALLOWED_COMMANDS[$commandName])) {
            $this->logSuspiciousActivity("Ungültiger Befehl: $commandName");
            return null;
        }

        // Behoben: Vordefinierten Befehl ausführen, nicht Benutzereingabe
        $command = self::ALLOWED_COMMANDS[$commandName];
        $output = [];
        exec($command . ' 2>&1', $output, $returnCode);

        $this->logCommandExecution($commandName, $returnCode);
        return implode("\n", $output);
    }
}
?>
#!/bin/bash
# Behoben: Server-Härtungsskript zum Entfernen von Web-Shells

# Shell-Interpreter aus Webverzeichnissen entfernen
find /var/www -type f \( -name "*.sh" -o -name "*.bash" -o -name "*.pl" \
    -o -name "*.py" -o -name "*.rb" -o -name "*.cgi" \) -delete

# Bekannte Web-Shell-Dateien entfernen
find /var/www -type f \( -name "c99.php" -o -name "r57.php" \
    -o -name "shell.php" -o -name "cmd.php" -o -name "webshell*" \
    -o -name "backdoor*" \) -delete

# Restriktive Berechtigungen setzen
chmod -R 644 /var/www/html/*
find /var/www/html -type d -exec chmod 755 {} \;

# Ausführungsberechtigung von allen Dateien im Web-Root entfernen
find /var/www/html -type f -exec chmod -x {} \;

# Dateiintegritäts-Baseline erstellen
find /var/www -type f -exec md5sum {} \; > /var/log/www_baseline.md5

CVE-Beispiele

  • CVE-2021-44228: Log4Shell-Schwachstelle wurde ausgenutzt, um Web-Shells für persistenten Zugriff hochzuladen.
  • CVE-2021-26855: Microsoft Exchange ProxyLogon wurde zum Deployen von Web-Shells verwendet.
  • CVE-2019-0604: SharePoint-Schwachstelle wurde zum Hochladen von Web-Shells ausgenutzt.

Referenzen

  1. MITRE Corporation. "CWE-553: Command Shell in Externally Accessible Directory." https://cwe.mitre.org/data/definitions/553.html
  2. OWASP. "Testing for Command Injection."
  3. MITRE ATT&CK. "T1505.003 - Server Software Component: Web Shell."