Individuare gli script PHP che inviano SPAM: differenze tra le versioni

Da Guide@Debianizzati.Org.
Vai alla navigazione Vai alla ricerca
Riga 52: Riga 52:
return shell_exec($command);
return shell_exec($command);
?>
?>
</pre>
Rendiamo eseguibile lo script appena creato:
<pre>
# chmod +x /usr/local/bin/sendmail-php
</pre>
Creiamo il file di log e rendiamolo scrivibile:
<pre>
# touch /var/log/mail_php.log
# chmod 770 /var/log/mail_php.log
</pre>
</pre>

Versione delle 08:01, 12 mar 2014

Introduzione

Quando un sito in PHP viene viene utilizzato per inviare tonnellate di email di SPAM tramite una qualche vulnerabilità nel codice, la prima cosa che si deve affrontare, oltre alla pulizia della coda di postfix, è l’individuazione dello script PHP responsabile.
Le cose si fanno più difficili quando sul nostro server sono presenti decine di Virtual Host, poichè il file colpevole dell’invio di spam diventa difficilmente identificabile.
Possiamo però modificare il comportamento di default di PHP per l'invio di email, istruendolo a tenere traccia di tutti gli invii effettuati in un file di log, che potremo poi consultare alla ricerca dello script colpevole.

Configurazione di PHP

Creiamo un nuovo file contenente le istruzioni personalizzate:

# nano /usr/local/bin/sendmail-php

con contenuto:

#!/usr/bin/php
<?php

/**
  Script per tracciare in un log tutti gli script che fanno uso
  della funzione PHP mail().
  Author: Till Brehm, www.ispconfig.org
  (Hopefully) secured by David Goodwin <david @ _palepurple_.co.uk>
  Test e implementazione: Ferdinando Bassi per Debianizzati.org
*/

$sendmail_bin = '/usr/sbin/sendmail';
$logfile = '/var/log/mail_php.log';

//* Get the email content
$logline = '';
$pointer = fopen('php://stdin', 'r');

while ($line = fgets($pointer)) {
        if(preg_match('/^to:/i', $line) || preg_match('/^from:/i', $line)) {
                $logline .= trim($line).' ';
        }
        $mail .= $line;
}

//* compose the sendmail command
$command = 'echo ' . escapeshellarg($mail) . ' | '.$sendmail_bin.' -t -i';
for ($i = 1; $i < $_SERVER['argc']; $i++) {
        $command .= escapeshellarg($_SERVER['argv'][$i]).' ';
}


//* Write the log
file_put_contents($logfile, date('Y-m-d H:i:s') . ' ' . $_ENV['PWD'] . ' ' . $logline, FILE_APPEND);
//* Execute the command
return shell_exec($command);
?>

Rendiamo eseguibile lo script appena creato:

# chmod +x /usr/local/bin/sendmail-php

Creiamo il file di log e rendiamolo scrivibile:

# touch /var/log/mail_php.log
# chmod 770 /var/log/mail_php.log