Ciao Ragazzi,
oggi ho deciso di affrontare un argomento interessante.
La maggior parte dei siti web php based oggi utilizza un CMS (Content Management System) come Joomla, WordPress, phpBB, siti di ecommerce etc.
Questi hanno semplificato di molto la vita degli utenti ma hanno anche aperto le porte ad attacchi di cracker sempre più frequenti.
Molto spesso il nostro sito è sotto attacco e noi non ce ne accorgiamo nemmeno!
Vediamo un po’ come accorgersi se un sito web è stato attaccato e quindi compromesso!
ATTENZIONE: questa guida presuppone che voi possiate accedere ai log del vostro server web e soprattutto al terminale.
Possiamo cominciare.
Per prima cosa si cercano i file .php che sono stati modificati negli ultimi giorni:
find . -type f -name '*.php' | xargs grep -l "eval *(" --color
find . -type f -name '*.php' | xargs grep -l "base64_decode *(" --color
find . -type f -name '*.php' | xargs grep -l "gzinflate *(" --color
In genere gli autori degli script utilizzati per attaccare i siti li mascherano per evitare eventuali antivirus o software capaci di identificare codice maligno.
In questo modo i file che verranno restituiti saranno al 90% sicuramente compromessi (a meno che non abbiate acquisto un qualche script php che non viene fornito con codice sorgente ma viene mascherato!)
Vediamo un esempio pratico che cerca nella cartella wp-content di WordPress:
find wp-content -type f -name '*.php' | xargs grep -l "gzinflate *(" --color
In alcuni casi, dove gli script sono in chiaro alcune delle opzioni che usano sono quelle di aprire dei socket oppure lanciare comandi per eseguire operazioni sul server: Ecco come cercare questo tipo di files:
find . -type f -name '*.php' | xargs egrep -i "(mail|fsockopen|pfsockopen|stream_socket_client|exec|system|passthru|eval|base64_decode) *\("
Ma chi attacca i siti queste cose le sa bene, per cui spesso maschera questo tipo di operazioni utilizzando direttamente la codifica Esadecimale (HEX)
In questo modo noi non troveremmo niente eppure il sito rimane compromesso…
Ecco come fare:
find . -type f -name '*.php' | xargs egrep -i "preg_replace *\((['|\"])(.).*\2[a-z]*e[^\1]*\1 *," --color
Con il codice che ho scritto sopra si vanno a cercare tutti i preg_replace dove si cerca di inserire del codice esadecimale!
Continuiamo con l’esempio di WordPress.
Mettiamo il caso di avere il sospetto o la certezza che il sito sia stato compromesso.
Possiamo effettuare un upload sul server di una versione “pulita” di wordpress( o un altro cms) in un’altra cartella ed effettuare un diff per notare eventuali differenze (Attenzione perchè in questo caso le versioni del CMS devono essere uguali!)
diff -r wordpress-ok/ wordpress-hack/ -x wp-content
Inoltre la maggior parte degli attacchi prolificano su server dove vengono concessi (volontariamente o meno) i permessi di scrittura sulle cartelle.
Di seguito un breve script per aiutare a capire i file .php presenti nelle cartelle con permessi 777:
#!/bin/bash
search_dir=$(pwd)
writable_dirs=$(find $search_dir -type d -perm 0777)
for dir in $writable_dirs
do
#echo $dir
find $dir -type f -name '*.php'
done
Reso eseguibile lo script è possibile verificare i file in questo modo:
./search_php777 > results.txt
Questo script può essere variato nel seguente modo (in base a quanto abbiamo detto prima):
#!/bin/bash
IFS=$'\n'
while read php_file
do
egrep -i "(mail|eval|base64_decode|str_rot13|chmod|fwrite|exec|passthru|shell_exec|system|proc_open|popen|curl_exec|curl_multi_exec|show_source|fsockopen|pfsockopen|stream_socket_client) *\(" "$php_file"
done < php_in_writable.txt
Da eseguire in questo modo:
./find_malicious