Trouvez le script php qui envoie des mails

9

Existe-t-il un moyen pour moi de trouver le script php qui envoie des e-mails.

J'ai apache + php (pas de mod_suphp ni de suexec) dans une installation "standard", et je veux découvrir que le script php des sorcières envoie des e-mails, quand je vérifie les journaux, je vois juste l'uid de l'utilisateur qui envoie les e-mails (dans mon cas apache) mais je veux découvrir le script à l'origine de l'e-mail.

Est-il possible ou dois-je installer suexec ou mod_suphp pour en garder la trace?

Merci pour l'aide.

Adam
la source

Réponses:

9

php 5.3 a été conçu pour un meilleur suivi du courrier, mais je ne sais pas si cela s'est produit. (edit: oui php 5.3 a intégré la journalisation maintenant - php.ini a la variable config mail.log qui enregistrera l'utilisation du courrier du code php.)

Nous avons résolu le problème en faisant de sendmail un script shell wrapper.

Dans php.ini, définissez un nouveau mailer. Par exemple:

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

Le script sendmail-php utilise simplement l'enregistreur pour obtenir des informations, puis appelle le sendmail du système:

#!/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 $*

Cela se connectera à tout ce que votre mail.info est défini dans le fichier syslog.conf.

Une autre suggestion est d'installer l'extension suhosin php pour resserrer les failles en PHP, sauf si vous utilisez Debian ou Ubuntu où c'est déjà la valeur par défaut.

labradort
la source
php 4.x ici (a obtenu quelques vieilles applications qui ne sont pas viables sur php 5.x)
adam
Pas de problème, ce wrapper fera l'affaire. Il est externe à php. J'ai mentionné php 5.3 simplement car ce manque de fonctionnalité de journalisation devait être corrigé d'ici là. L'encapsuleur fonctionne très bien et nous avons pu identifier un script défectueux par un utilisateur qui permettait le spam.
labradort
merci, je suppose que je vais prendre votre approche. merci
adam
1
Salut, ne sais pas pourquoi mais le "script = $ {SCRIPT_NAME}, filename = $ {SCRIPT_FILENAME}" ne renvoie rien voir: 7 20:24:08 enregistreur de passerelle: sendmail-php: client =, filename =, pwd = / var / www / html / mail, uid = 48, user = apache
adam
Êtes-vous sûr qu'il a été correctement configuré? Si elle était inconnue en tant que variable prédéfinie dans votre environnement PHP, vous devriez également voir: "script =," dans la sortie enregistrée. Vérifiez très soigneusement ce que vous avez configuré à nouveau. Vous pouvez essayer: $ _SERVER ['SCRIPT_FILENAME'] Vous pourriez être en mesure de rechercher plus de variables pour la journalisation à partir de la documentation PHP sur les variables prédéfinies: php.net/manual/en/reserved.variables.server.php
labradort
4

La solution à cela nécessite en fait quelques étapes. La solution de labradort ci-dessus ne fonctionne pas vraiment car le script de journalisation est un script bash, pas php, et le script bash n'a pas accès aux variables de php, donc les journaux sont vides. Fondamentalement, tout ce que vous souhaitez enregistrer doit être enregistré dans des variables d'environnement en php avant d'envoyer l'e-mail afin que l'enregistreur ait accès aux données. Puisque vous essayez de détecter les scripts d'autres utilisateurs, pas nécessairement les vôtres, vous n'avez aucun contrôle sur le code php, vous devez donc utiliser la fonction auto_prepend_file de PHP pour vous assurer que tout php exécuté exécute votre code d'initialisation avant tout le reste. J'ai ajouté le code suivant via php.ini pour m'assurer d'avoir les données dont j'ai besoin dans l'enregistreur:

<?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");
?>

J'ai mis en place un tutoriel complet sur la façon de faire fonctionner cela ici: http://mcquarrie.com.au/wordpress/2012/10/tracking-down-malicious-php-spam-scripts/

Tom McQuarrie
la source
Le script wrapper a bien fonctionné sur l'implémentation de Redhat et Debian Linux des valeurs par défaut de php quand il s'agissait de php 5.2 et versions antérieures. J'utilise simplement mail.log = /var/log/apache-mail.log ces jours-ci et il fait ce dont j'ai besoin.
labradort
1
C'est précisément ainsi que le bug shellshock est exploité. Je ne recommande vraiment pas de faire les choses de cette façon.
Ben Hitchcock
Vous avez raison. Vous pouvez certainement exécuter les variables via une fonction de nettoyage pour éliminer tout élément nuisible, comme "() {:;};". En fait, c'est probablement une bonne idée de préfixer également les noms de variables, avec quelque chose comme "PHP_", juste au cas où il y aurait un conflit de noms de variables d'environnement.
Tom McQuarrie
2

Il existe un correctif pour PHP qui montrera quel script génère les e-mails en ajoutant un en-tête à l'e-mail envoyé. Je ne l'ai pas testé car je n'ai pas envie de patcher le noyau PHP, mais j'ai entendu de bonnes choses.

WheresAlice
la source
1
Cela semble être une excellente façon de procéder. +1. Cependant, si vous gérez un hôte partagé avec plusieurs clients, vous souhaiterez peut-être informer ces clients de l'en-tête ou rediriger la sortie dans un fichier journal à la place.
Pekka
Oui, c'est peut-être la voie à suivre, mais à un certain moment, cela peut être un problème de sécurité, tout le monde va maintenant savoir quel script envoie des e-mails, des scripts mal conçus invitent simplement à être piratés. Rediriger vers un journal, c'est peut-être mieux
Adam
Les scripts mal faits ne devraient pas être sur le serveur en premier lieu, les gens les trouveront s'ils sont là (en particulier s'ils font partie d'un système cms populaire). Mais je comprends votre point de vue contre cette solution.
WheresAlice
0

Vous allez devoir récupérer les journaux d'accès pour quelque chose qui correspond à la période de temps où les messages ont été ajoutés au spool.

Richard Salts
la source
Merci pour la relecture, le problème est qu'il s'agit d'un hébergement partagé et pour chaque domaine, il s'agit d'un journal d'accès dédié.
Adam
Oui, malheureusement, vous allez devoir les parcourir tous.
Richard Salts
0

Peut être simplement rechercher dans les fichiers source la sous-chaîne "mail ("?

Dmitry Trukhanov
la source
Cela vaut parfois la peine d'être examiné, et en particulier de regarder le code source qui l'entoure pour toute vulnérabilité que les spammeurs pourraient utiliser. Mais avec de nombreux scripts PHP compliqués appartenant à de nombreuses personnes sur un hôte partagé, ce n'est pas la solution à ce problème.
WheresAlice
Dans un environnement d'hébergement partagé, cela pourrait ne pas déterminer le script exact ou entraîner plusieurs faux positifs
Eric Kigathi
0

Activez-les simplement sur votre php.ini

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

puis créez ce fichier et accordez l'autorisation d'écriture. Jetez un œil dessus après cela.

Kevin Nguyen
la source