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
| Auswirkung | Details |
|---|---|
| Vertraulichkeit | Bereich: Vertraulichkeit Unbefugten Code ausführen - Angreifer können beliebige Befehle ausführen, sensible Dateien lesen, auf Datenbanken zugreifen und vertrauliche Daten exfiltrieren. |
| Integrität | Bereich: Integrität Unbefugten Code ausführen - Angreifer können Systemdateien ändern, Hintertüren installieren, Websites verunstalten und Anwendungsverhalten ändern. |
| Verfügbarkeit | Bereich: 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
- MITRE Corporation. "CWE-553: Command Shell in Externally Accessible Directory." https://cwe.mitre.org/data/definitions/553.html
- OWASP. "Testing for Command Injection."
- MITRE ATT&CK. "T1505.003 - Server Software Component: Web Shell."