Trova lo script php che sta inviando mail


9

C'è un modo per me di trovare lo script php che sta inviando e-mail.

Ho apache + php (no mod_suphp né suexec) in un'installazione "standard", e voglio scoprire che lo script di php di streghe sta inviando e-mail, quando controllo i log vedo solo l'uid dell'utente che sta inviando le e-mail (in il mio caso apache) ma voglio scoprire lo script che ha originato l'e-mail.

È possibile o devo installare suexec o mod_suphp per tenerne traccia?

Grazie per l'aiuto.

Risposte:


9

php 5.3 è stato inserito per ottenere una migliore traccia della posta, ma non sono sicuro che sia successo. (modifica: sì php 5.3 ha il logging incorporato ora - php.ini ha la variabile di configurazione mail.log che registrerà l'uso della posta dal codice php.)

Abbiamo risolto il problema rendendo sendmail uno script shell wrapper.

In php.ini imposta un nuovo mailer. Per esempio:

sendmail_path = /usr/local/bin/sendmail-php -t -i

Lo script sendmail-php utilizza semplicemente il logger per ottenere informazioni, quindi chiama sendmail del sistema:

#!/bin/bash

logger -p mail.info -t sendmail-php "site=${HTTP_HOST}, client=${REMOTE_ADDR}, script=${SCRIPT_NAME}, filename=${SCRIPT_FILENAME}, docroot=${DOCUMENT_ROOT}, pwd=${PWD}, uid=${UID}, user=$(whoami)"

/usr/sbin/sendmail -t -i $*

Questo accederà a qualunque cosa sia impostata su mail.info nel file syslog.conf.

Un altro suggerimento è installare l'estensione php suhosin per colmare le lacune in PHP, a meno che non si stia eseguendo Debian o Ubuntu dove questo è già predefinito.


php 4.x qui (ho avuto alcune vecchie app che non potevano essere portate su php 5.x)
adam

Nessun problema, questo wrapper farà il trucco. È esterno a php. Ho citato php 5.3 semplicemente perché questa mancanza di una funzione di registrazione doveva essere risolta da allora. Il wrapper funziona molto bene e siamo stati in grado di individuare uno script difettoso da parte di un utente che consentiva lo spam.
labradort,

grazie, credo che avrò il tuo approccio. grazie
adam

1
Ciao, non ora perché, ma lo "script = $ {SCRIPT_NAME}, nome file = $ {SCRIPT_FILENAME}" non sta restituendo nulla, vedi: 7 20:24:08 logger gateway: sendmail-php: client =, nomefile =, pwd = / var / www / html / mail, uid = 48, user = apache
adam

Sei sicuro che sia stato impostato correttamente? Se era sconosciuto come variabile predefinita nel tuo ambiente PHP, dovresti vedere anche: "script =" nell'output registrato. Controlla cosa hai impostato di nuovo con molta attenzione. Potresti provare: $ _SERVER ['SCRIPT_FILENAME'] Potresti essere in grado di cercare più variabili per la registrazione dalla documentazione PHP su variabili predefinite: php.net/manual/en/reserved.variables.server.php
labradort

4

La soluzione a questo richiede in realtà alcuni passaggi. La soluzione di labradort sopra non funziona in realtà poiché lo script logger è uno script bash, non php, e lo script bash non ha accesso alle variabili di php, quindi i log risultano vuoti. Fondamentalmente tutto ciò che si desidera registrare deve essere salvato nelle variabili di ambiente in php prima di inviare l'e-mail in modo che il logger abbia accesso ai dati. Dal momento che stai cercando di rilevare script di altri utenti, non necessariamente tuoi, non hai alcun controllo sul codice php, quindi devi usare la funzione auto_prepend_file di PHP per assicurarti che tutto il php eseguito esegua il tuo codice di inizializzazione prima di ogni altra cosa. Ho anteposto il seguente codice tramite php.ini per assicurarmi di avere i dati di cui ho bisogno nel logger:

<?php
/**
 * This passes all SERVER variables to environment variables, 
 * so they can be used by called bash scripts later
 */
foreach ( $_SERVER as $k=>$v ) putenv("$k=$v");
?>

Ho messo insieme un tutorial completo su come farlo funzionare qui: http://mcquarrie.com.au/wordpress/2012/10/tracking-down-malicious-php-spam-scripts/


Lo script wrapper ha funzionato sull'implementazione di default di Redhat e Debian Linux quando era php 5.2 e precedenti. Sto semplicemente usando mail.log = /var/log/apache-mail.log in questi giorni e fa quello che mi serve.
labradort,

1
Questo è esattamente il modo in cui viene sfruttato il bug shellshock. Non raccomando seriamente di fare le cose in questo modo.
Ben Hitchcock,

Tu hai un punto. Potresti certamente eseguire le variabili attraverso una funzione sanitize per eliminare qualsiasi cosa dannosa, come "() {:;};". In realtà probabilmente è una buona idea aggiungere il prefisso anche ai nomi delle variabili, con qualcosa come "PHP_", nel caso in cui ci sia uno scontro tra nomi di variabili d'ambiente.
Tom McQuarrie,

2

Esiste una patch per PHP che mostrerà quale script sta generando le e-mail aggiungendo un'intestazione all'e-mail inviata. Non l'ho testato dal momento che non sono appassionato di patching core PHP, ma ho sentito cose positive.


1
Sembra un ottimo modo di procedere. +1. Tuttavia, se si gestisce un host condiviso con più client, è possibile che si desideri informare tali client sull'intestazione o reindirizzare l'output in un file di registro.
Pekka,

Sì, forse è la strada da percorrere, ma a un certo punto è un mio problema di sicurezza, tutte le persone stanno andando ora a quale script sta inviando e-mail, script mal fatti invitano solo a essere hackerati. Il reindirizzamento a un log forse è meglio
adam

Gli script realizzati male non dovrebbero essere sul server in primo luogo, le persone li troveranno se sono lì (in particolare se fanno parte di un popolare sistema cms). Ma capisco che c'è forse un caso contro questa soluzione.
Dov'è Alice

0

Dovrai greppare i log di accesso per qualcosa che si adatti al periodo di tempo in cui i messaggi sono stati aggiunti allo spool.


Grazie per la riproduzione, il problema è che si tratta di un hosting condiviso e per ogni dominio è un registro di accesso dedicato.
Adamo,

Sì, sfortunatamente dovrai affrontarli tutti.
Richard Salts,

0

Può essere solo cercare nei file di origine "sottostringa" (sottostringa?


A volte vale la pena esaminarlo, e in particolare il codice sorgente che lo circonda per eventuali vulnerabilità che gli spammer possono utilizzare. Ma con molti script php complicati di proprietà di molte persone su un host condiviso, non è la soluzione a questo problema.
Dov'è Alice

In un ambiente di hosting condiviso questo potrebbe non indicare con
precisione

0

Abilitali semplicemente sul tuo php.ini

mail.add_x_header = On
mail.log = /var/log/phpmail.log

quindi crea quel file e dai il permesso di scrittura. Dagli un'occhiata dopo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.