Protection contre l’envoi d’email via un scripte PHP piraté

Bonjour,
Comment faire pour se protéger contre les envois d’email indésirable via un scripte PHP piraté ?
Ces derniers jours, malgré un certain nombre de protections, un de nos serveur a eu un WP piraté et il a envoyé du spam.
L’envoi se fessait via une communication directe avec le serveur SMTP en face sans utiliser la fonction mail() de PHP et donc sans aucun log dans mon postfix.
j’ai découvert ces communications avec la commande

Les protections déjà en place, qui se son révélé insuffisante sont : Fail2ban, mod_evasive, modsecurity (avec règles payantes), interception de tout email envoyé avec fonction mail() de PHP.

[quote=“Bobak”]Bonjour,
Comment faire pour se protéger contre les envois d’email indésirable via un scripte PHP piraté ?
Ces derniers jours, malgré un certain nombre de protections, un de nos serveur a eu un WP piraté et il a envoyé du spam.
L’envoi se fessait via une communication directe avec le serveur SMTP en face sans utiliser la fonction mail() de PHP et donc sans aucun log dans mon postfix.
j’ai découvert ces communications avec la commande

Les protections déjà en place, qui se son révélé insuffisante sont : Fail2ban, mod_evasive, modsecurity (avec règles payantes), interception de tout email envoyé avec fonction mail() de PHP.[/quote]

Peut-être refusé aussi l’envoi de mail si il n’y a pas eu d’authentification, et une protection accrue des comptes dédié à la gestion de l’envoi de mail via les formulaire.

Une idée vite fait :

[code] Nos serveurs demandent une authentification smtp depuis un script PHP .

Voici un exemple de code utilisant PHPmailer que vous devrez télécharger pour utiliser ce script, les parties en vert sont à adapter :

// exemple serveur windows ikoula

<?php include("class.phpmailer.php"); include("class.smtp.php"); date_default_timezone_set("Europe/Paris"); $mail = new PHPMailer(); $body = " Test de PHPMailer. "; $mail->IsSMTP(); $mail->SMTPAuth = true; $mail->Host = "mail.votredomaine.tld"; $mail->Port = 25; $mail->Username = "votre email"; $mail->Password = "mot de passe"; $mail->From = "votre email"; //adresse d’envoi correspondant au login entrée précédemment $mail->FromName = "votre nom"; // nom qui sera affiché $mail->Subject = "This is the subject"; // sujet $mail->AltBody = "corps du message au format texte"; //Body au format texte $mail->WordWrap = 50; // nombre de caractère pour le retour a la ligne automatique $mail->MsgHTML($body); $mail->AddReplyTo("votre mail","votre nom"); $mail->AddAttachment("./exemples/images/phpmailer.gif"); // pièce jointe si besoin $mail->AddAddress("adresse destinataire 1","adresse destinataire 2"); $mail->IsHTML(true); // envoyer au format html, passer a false si en mode texte if(!$mail->Send()) { echo "Mailer Error: " . $mail->ErrorInfo; } else { echo "Le message à bien été envoyé"; } ?>[/code]

Maintenant si les Wordpress/Joomla sont autant visé c’est qu’il ne sont pas toujours audité et sécurisé/mis à jour qu’il ne le devrais.
Il faut redoubler d’attention lorsque des thèmes et des plugins sont installés sur ce genres de CMS une grande partie sont moisies et responsables directement des compromissions.

Si tu cherche surtout à te laisser une marge avant une mise ne RBL, tu peux aussi mettre en place un nombre maximum de mail envoyer par heure ce qui impactera les campagnes de newsletter sur le serveur mais limitera grandement aussi l’envoi de spam.
Ce type de configuration couplé à un monitoring précis du /var/mail/log qui grossit anormalement devrais pouvoir te permettre de réagir efficacement.

[quote=“Bobak”]
L’envoi se fessait via une communication directe avec le serveur SMTP en face[/quote]
=> en face, c’est-à-dire ?

[quote=“Clochette”][quote=“Bobak”]Bonjour,
Comment faire pour se protéger contre les envois d’email indésirable via un scripte PHP piraté ?
Ces derniers jours, malgré un certain nombre de protections, un de nos serveur a eu un WP piraté et il a envoyé du spam.
L’envoi se fessait via une communication directe avec le serveur SMTP en face sans utiliser la fonction mail() de PHP et donc sans aucun log dans mon postfix.
j’ai découvert ces communications avec la commande

Les protections déjà en place, qui se son révélé insuffisante sont : Fail2ban, mod_evasive, modsecurity (avec règles payantes), interception de tout email envoyé avec fonction mail() de PHP.[/quote]

Peut-être refusé aussi l’envoi de mail si il n’y a pas eu d’authentification, et une protection accrue des comptes dédié à la gestion de l’envoi de mail via les formulaire.

Une idée vite fait :

[code] Nos serveurs demandent une authentification smtp depuis un script PHP .

Voici un exemple de code utilisant PHPmailer que vous devrez télécharger pour utiliser ce script, les parties en vert sont à adapter :

// exemple serveur windows ikoula

<?php include("class.phpmailer.php"); include("class.smtp.php"); date_default_timezone_set("Europe/Paris"); $mail = new PHPMailer(); $body = " Test de PHPMailer. "; $mail->IsSMTP(); $mail->SMTPAuth = true; $mail->Host = "mail.votredomaine.tld"; $mail->Port = 25; $mail->Username = "votre email"; $mail->Password = "mot de passe"; $mail->From = "votre email"; //adresse d’envoi correspondant au login entrée précédemment $mail->FromName = "votre nom"; // nom qui sera affiché $mail->Subject = "This is the subject"; // sujet $mail->AltBody = "corps du message au format texte"; //Body au format texte $mail->WordWrap = 50; // nombre de caractère pour le retour a la ligne automatique $mail->MsgHTML($body); $mail->AddReplyTo("votre mail","votre nom"); $mail->AddAttachment("./exemples/images/phpmailer.gif"); // pièce jointe si besoin $mail->AddAddress("adresse destinataire 1","adresse destinataire 2"); $mail->IsHTML(true); // envoyer au format html, passer a false si en mode texte if(!$mail->Send()) { echo "Mailer Error: " . $mail->ErrorInfo; } else { echo "Le message à bien été envoyé"; } ?>[/code]

Maintenant si les Wordpress/Joomla sont autant visé c’est qu’il ne sont pas toujours audité et sécurisé/mis à jour qu’il ne le devrais.
Il faut redoubler d’attention lorsque des thèmes et des plugins sont installés sur ce genres de CMS une grande partie sont moisies et responsables directement des compromissions.

Si tu cherche surtout à te laisser une marge avant une mise ne RBL, tu peux aussi mettre en place un nombre maximum de mail envoyer par heure ce qui impactera les campagnes de newsletter sur le serveur mais limitera grandement aussi l’envoi de spam.
Ce type de configuration couplé à un monitoring précis du /var/mail/log qui grossit anormalement devrais pouvoir te permettre de réagir efficacement.[/quote]

Les limitations sont déjà en place via l’interception de la fonction mail() ce qui me permet justement de limiter l’envoi par client.
Mais là il s’agit de se protéger d’un scripte qui ne passe pas par la chaine du SMTP local (fonction mail() du PHP).
Les connexions se font directement avec le serveur SMTP yahoo, free etc …
Et c’est là que je n’ai aucune protection actuellement en place.

[quote=“fluo”][quote=“Bobak”]
L’envoi se fessait via une communication directe avec le serveur SMTP en face[/quote]
=> en face, c’est-à-dire ?[/quote]

Le pirate est passé par un scripte PHP qui ne passe pas par la chaine du SMTP local (mon postfix).
Les connexions se font directement avec le serveur SMTP yahoo, free etc …

Je ne sais pas s’il est possible de limiter l’utilisation d’un port par un programme particulier.
En tout cas je verrais dans les option de ton pare-feu ce qu’il en est.

Sinon faire un script qui tourne en continue et qui dégage + mail les process qui utilise le port 25 hors liste blanche.

[quote=“Mimoza”]Je ne sais pas s’il est possible de limiter l’utilisation d’un port par un programme particulier.
En tout cas je verrais dans les option de ton pare-feu ce qu’il en est.

Sinon faire un script qui tourne en continue et qui dégage + mail les process qui utilise le port 25 hors liste blanche.[/quote]
Faire un scripte qui vérifiiez tous les x minutes les connections ouvertes vers le port 25, certes c’est envisageable, mais pour un évènement aussi rare (c’est la 1re fois depuis des années qu’on a ce problème).
Je recherche plus une d’autre méthode qui consomme moins de CPU pour rien ?

[quote=“Clochette”]
Maintenant si les Wordpress/Joomla sont autant visé c’est qu’il ne sont pas toujours audité et sécurisé/mis à jour qu’il ne le devrais.
Il faut redoubler d’attention lorsque des thèmes et des plugins sont installés sur ce genres de CMS une grande partie sont moisies et responsables directement des compromissions.[/quote]

C’est donc de ce point là qu’il est réellement question.

Si je comprends bien le problème tu as été confronté à un script PHP injecter via une méthode X pour interroger et utiliser des smtp hors de ton serveur pour envoyer de la mer…

On n’en reviens donc à mon conseils de soit développer les thèmes plugins soit même soit les audité sérieusement.

Un CMS compromis ce n’est pas anodin non plus, tu parle de Wordpress j’espère qu’il n’y est pas de dossier en 777, que les mots de passe sont bétons, que les CMS soient mis à jour régulièrement, et qu’un Rkhunter ou autre soit mis en place via un cron.

Si les Wordpress n’ont pas vocation à être modifié tous les deux heures il est encore envisageable de vérifier leur intégrité et tous changement suspicieux pourrait alors être relevé.

Pour le restant une bonne bôite à outils : MX TOOL BOX

[quote=“Bobak”]

Le pirate est passé par un scripte PHP qui ne passe pas par la chaine du SMTP local (mon postfix).
Les connexions se font directement avec le serveur SMTP yahoo, free etc …[/quote]

Donc si j’ai bien compris, le pirate utilise un script php depuis son site wordpress pour envoyer du spam.
Et toi, tu ne veux pas que ce pirate utilise ce script.
Et le site wordpress est hébergé dans la machine qui contient le serveur mail postfix.
=> C’est ça ?

J’ai trouvé la solution avec iptables :

Pour avoir des traces, j’ai mis ça en plus :

iptables -N LOGGING iptables -A OUTPUT -p tcp --dport 25 -m owner --gid-owner users -j LOGGING iptables -A OUTPUT -p tcp --dport 465 -m owner --gid-owner users -j LOGGING iptables -A OUTPUT -p tcp --dport 587 -m owner --gid-owner users -j LOGGING iptables -A LOGGING -j LOG --log-prefix "IPTables-REJECT:" --log-uid --log-level 4

Pour whitelister les user du groupe users, j’ai fait ça :

iptables -A OUTPUT -p tcp --dport 25 -m owner --uid-owner xxx -j ACCEPT iptables -A OUTPUT -p tcp --dport 465 -m owner --uid-owner xxx -j ACCEPT iptables -A OUTPUT -p tcp --dport 587 -m owner --uid-owner xxx -j ACCEPT

Et pour bloquer tous les autres user du groupe users , j’ai mis ça

iptables -D OUTPUT -p tcp --dport 25 -m owner --gid-owner users -j REJECT iptables -D OUTPUT -p tcp --dport 465 -m owner --gid-owner users -j REJECT iptables -D OUTPUT -p tcp --dport 587 -m owner --gid-owner users -j REJECT

Pour trouver les fichier php “pirate” dans le repertoire racine de ton serveur web tente :

Le code pirate est souvent encodé en base64 pour ne pas être “detecté facilement”. Ce n’est pas obligatoire, mais ça m’a aidé pour trouver des fichiers uploadé …

[quote=“tof”]Pour trouver les fichier php “pirate” dans le repertoire racine de ton serveur web tente :

Le code pirate est souvent encodé en base64 pour ne pas être “detecté facilement”. Ce n’est pas obligatoire, mais ça m’a aidé pour trouver des fichiers uploadé …[/quote]
Merci,
Une fois le piratage constaté et l’hébergement concerné bloqué le temps de la réparation, c’est ce que j’ai fait pour m’assurer que d’autre ne le sont pas aussi.