C'est l'histoire d'un spam Partie 1: petit cours d'anatomie
Par Mathieu le lundi 2 mai 2016, 15:48 - Informatique - Lien permanent
Le SPAM par mail, c'est pénible. C'est du travail à temps plein si on veut s'en débarrasser en gênant le moins les utilisateurs. De la stricte application des RFC aux paramètres secrets de spamassassin, je vais essayer dans cette nouvelle série d'articles essayer de vous en faire mieux comprendre les techniques, et proposer à mon échelle les quelques solutions "qui marchent", du moins pour moi.
Voici donc pour cette première partie un cours d'autopsie. Le SPAM que nous décortiquer aujourd'hui est un mail est est resté coincé en queue sur le serveur mail. Bien que tous les mails en queue ne soient pas du SPAM, il est important de surveiller la taille de cette liste de mails "en transit" ; un grand nombre de mails dans cette liste indiquant souvent un problème d'envoi ou de réception.
Affichons donc la queue :
# mailq 1430281C33 8589 Thu Apr 28 14:51:58 MAILER-DAEMON (connect to serveurspamserveur.net.ae[86.96.xxx.xxx]:25: Connection refused) spammeur@serveurspamserveur.net.ae
Première constatation : l'adresse source ne correspond pas à une adresse gérée par le serveur, ce n'est donc pas un mail envoyé par un des utilisateurs du serveur. Mais alors comment ça se fait que je route des mails qui ne viennent pas de chez moi, et qui ne vont pas chez moi ? Mon serveur serait configuré en OpenRelay (ça serait inquiétant) ?
Examinons le contenu brut du mail à partir de son ID. La commande postcat permet de le faire pour Postfix, à adapter selon votre MTA.
# postcat -q 1430281C33
Ci-dessous la sortie de la commande postcat que j'ai colorisée :
*** ENVELOPE RECORDS deferred/1/1430281C33 *** message_size: 8589 234 1 0 8589 message_arrival_time: Thu Apr 28 14:51:58 2016 create_time: Thu Apr 28 14:51:58 2016 named_attribute: log_message_origin=local named_attribute: trace_flags=0 sender: original_recipient: spammeur@spamserveur.net.ae recipient: spammeur@spamserveur.net.ae *** MESSAGE CONTENTS deferred/1/1430281C33 *** Received: by monserveur.com (Postfix) id 1430281C33; Thu, 28 Apr 2016 14:51:58 +0200 (CEST) Date: Thu, 28 Apr 2016 14:51:58 +0200 (CEST) From: MAILER-DAEMON@monserveur.com (Mail Delivery System) Subject: Undelivered Mail Returned to Sender To: spammeur@spamserveur.net.ae Auto-Submitted: auto-replied MIME-Version: 1.0 Content-Type: multipart/report; report-type=delivery-status; boundary="B25FA81C32.1461847918/monserveur.com" Content-Transfer-Encoding: 8bit Message-Id: <20160428125158.1430281C33@monserveur.com> This is a MIME-encapsulated message. --B25FA81C32.1461847918/monserveur.com Content-Description: Notification Content-Type: text/plain; charset=us-ascii This is the mail system at host monserveur.com. I'm sorry to have to inform you that your message could not be delivered to one or more recipients. It's attached below. For further assistance, please send mail to postmaster. If you do so, please include this problem report. You can delete your own text from the attached returned message. The mail system <monclient@gmail.com>: host gmail-smtp-in.l.google.com[2a00:1450:400c:xxxx::xxxx] said: 552-5.7.0 This message was blocked because its content presents a potential 552-5.7.0 security issue. Please visit 552-5.7.0 https://support.google.com/mail/answer/6590 to review our message 552 5.7.0 content and attachment content guidelines. cw9si10769736wjb.20 - gsmtp (in reply to end of DATA command) --B25FA81C32.1461847918/monserveur.com Content-Description: Delivery report Content-Type: message/delivery-status Reporting-MTA: dns; monserveur.com X-Postfix-Queue-ID: B25FA81C32 X-Postfix-Sender: rfc822; spammeur@spamserveur.net.ae Arrival-Date: Thu, 28 Apr 2016 14:51:57 +0200 (CEST) Final-Recipient: rfc822; monclient@gmail.com Original-Recipient: rfc822;monclient@gmail.com Action: failed Status: 5.7.0 Remote-MTA: dns; gmail-smtp-in.l.google.com Diagnostic-Code: smtp; 552-5.7.0 This message was blocked because its content presents a potential 552-5.7.0 security issue. Please visit 552-5.7.0 https://support.google.com/mail/answer/6590 to review our message 552 5.7.0 content and attachment content guidelines. cw9si10769736wjb.20 - gsmtp --B25FA81C32.1461847918/monserveur.com Content-Description: Undelivered Message Content-Type: message/rfc822 Content-Transfer-Encoding: 8bit Return-Path: <spammeur@spamserveur.net.ae> Received: from localhost (localhost [127.0.0.1]) by monserveur.com (Postfix) with ESMTP id B25FA81C32 for <monclient@gmail.com>; Thu, 28 Apr 2016 14:51:57 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at monserveur.com Received: from monserveur.com ([127.0.0.1]) by localhost (monserveur.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id vn_xZRLJ3EKq for <monclient@gmail.com>; Thu, 28 Apr 2016 14:51:51 +0200 (CEST) Received: by monserveur.com (Postfix, from userid 5000) id BE51181C31; Thu, 28 Apr 2016 14:51:51 +0200 (CEST) X-Sieve: Pigeonhole Sieve 0.4.2 X-Sieve-Redirected-From: contact@monclient.com Delivered-To: contact@monclient.com Received: from localhost (localhost [127.0.0.1]) by monserveur.com (Postfix) with ESMTP id 95E2581C33 for <contact@monclient.com>; Thu, 28 Apr 2016 14:51:51 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at monserveur.com Received: from monserveur.com ([127.0.0.1]) by localhost (monserveur.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 8agkFLPzF_vy for <contact@monclient.com>; Thu, 28 Apr 2016 14:51:44 +0200 (CEST) Received: from bba148580.serveurspam.net.ae (bba148580.serveurspam.net.ae [217.165.xxx.xxx]) by monserveur.com (Postfix) with ESMTP id 774C481C27 for <contact@monclient.com>; Thu, 28 Apr 2016 14:51:44 +0200 (CEST) Received: from www.serveurspam.net.ae ([127.0.0.1]) by AMAZONA-F00CA66 with Microsoft SMTPSVC(7.5.7601.17514); Thu, 28 Apr 2016 16:51:42 +0400 Date: Thu, 28 Apr 2016 16:51:42 +0400 To: "contact@monclient.com" <contact@monclient.com> From: xxxx xxxx <spammeur@spamserveur.net.ae> Subject: [SPAM] FW: Invoice Message-ID: <be0fa65c2e77bf81d3fd1b0216e8e742@www.serveurspam.net.ae> X-Priority: 3 X-Mailer: PHPMailer [version 1.73] MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="b1_be0fa65c2e77bf81d3fd1b0216e8e742" X-OriginalArrivalTime: 28 Apr 2016 16:51:42.0538 (UTC) FILETIME=[40C0DFC0:01D1A068] --b1_be0fa65c2e77bf81d3fd1b0216e8e742 Content-Type: multipart/alternative; boundary="b2_be0fa65c2e77bf81d3fd1b0216e8e742" --b2_be0fa65c2e77bf81d3fd1b0216e8e742 Content-Type: text/plain; charset = "iso-8859-1" Content-Transfer-Encoding: 8bit Please find attached invoice #726990 Have a nice day Rowena Pittman Executive Director Sales Account Management Training Performance Support --b2_be0fa65c2e77bf81d3fd1b0216e8e742 Content-Type: text/html; charset = "iso-8859-1" Content-Transfer-Encoding: 8bit <html> <body> <p>Please find attached invoice #726990<br><br><br>Have a nice day<br><br><br>Rowena Pittman<br> Executive Director Sales Account Management Training Performance Support</p> </body></html> --b2_be0fa65c2e77bf81d3fd1b0216e8e742-- --b1_be0fa65c2e77bf81d3fd1b0216e8e742 Content-Type: application/zip; name="B1095_scan-invoice_0B0C3F.zip" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="B1095_scan-invoice_0B0C3F.zip" UEsDBBQAAAAIAIRenEiR5N/wYgcAAHQTAAAKAAAAMTk0MGMwOS5qc9VYaW/TMBj+DBL/IUQC ElYGLacoCNJr7Wh6LKVrixBKHCdxDid17oz9d+ys45IzBN+YtmWLX7/v4+c93Uwnwgha4xSe ... --b1_be0fa65c2e77bf81d3fd1b0216e8e742-- --B25FA81C32.1461847918/monserveur.com-- *** HEADER EXTRACTED deferred/1/1430281C33 *** named_attribute: encoding=8bit *** MESSAGE FILE END deferred/1/1430281C33 ***
Les lignes que j'ai mises en gris ne sont pas très intéressantes : il s'agit de l'enveloppe et des informations fournies par le système qui gère la queue, intéressons-nous plutôt au reste.
Les lignes en bleu sont les en-têtes, ce sont elles qui retracent à la fois le format du message, mais aussi leur trajet à travers les différents serveurs mails qui l'ont manipulé. Comme une liste de tampons sur un passeport. Ce sont en particulier les lignes commençant par Received, qui tracent le trajet des mails à travers les échanges entre les serveurs. La première ligne Received correspondant au dernier échange réalisé, et la dernière ligne Received au premier échange réalisé.
Dans l'en-tête on retrouve aussi l'ID du message, 1430281C33, et son parcours entre les seveurs mail. Chaque serveur par lequel le mail passe va rajouter une ligne, la première ligne correspondant au dernier serveur ayant reçu le message.
Les lignes en rouge sont ce que l'on appelle les boundaries (et leurs déclarations). Ce sont des lignes de séparation permettant de dissocier les pièces jointes du reste du message. Ici on en a plusieurs, parce qu'en fait à chaque échange, le mail s'est fait attacher à un autre mail. Ce n'est pas courant, à moins que le mail n'ai été enrichi d'informations supplémentaire après un "rejet" du serveur de destination. Ici, il s'est donc probablement fait "jeter" plusieurs fois !
Commençons notre analyse par la fin du message. Le mail original contenait visiblement lui aussi une pièce jointe, et à en juger par le texte invitant à ouvrir la pièce jointe, il est fort possible que ça soit un SCAM. Un message vous invitant à ouvrir un faux fichier PDF qui va infecter l'ordinateur. Heureusement donc que ce mail n'est pas arrivé jusqu'à sa destination.
Remontons un peu, on constate que le mail a été envoyé avec PHPMailer, et qu'il a été marqué en [SPAM] dans le sujet par mon filtre antispam. La première trace de l'arrivée du mail est la suivante :
Received: from bba148580.serveurspam.net.ae (bba148580.serveurspam.net.ae [217.165.xxx.xxx]) by monserveur.com (Postfix) with ESMTP id 774C481C27 for <contact@monclient.com>; Thu, 28 Apr 2016 14:51:44 +0200 (CEST)
Received: from www.serveurspam.net.ae ([127.0.0.1]) by AMAZONA-F00CA66 with Microsoft SMTPSVC(7.5.7601.17514); Thu, 28 Apr 2016 16:51:42 +0400
La ligne au-dessus, c'est la trace du passage à l'antispam et à l'antivirus :
Received: from localhost (localhost [127.0.0.1]) by monserveur.com (Postfix) with ESMTP id 95E2581C33 for <contact@monclient.com>; Thu, 28 Apr 2016 14:51:51 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at monserveur.com
Received: from monserveur.com ([127.0.0.1]) by localhost (monserveur.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 8agkFLPzF_vy for <contact@monclient.com>; Thu, 28 Apr 2016 14:51:44 +0200 (CEST)
Rien de spécial, l'antivirus et l'antispam sont installés en local et ont fait leur job dès que le message a été reçu. Continuons.
X-Sieve: Pigeonhole Sieve 0.4.2
X-Sieve-Redirected-From: contact@monclient.com
Ça c'est le mécanisme qui gère les alias de mon serveur. Sieve va rediriger l'adresse contact@monclient.com vers la bonne adresse de destination, l'adresse contact@monclient.com étant un alias.
Received: from monserveur.com ([127.0.0.1]) by localhost (monserveur.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id vn_xZRLJ3EKq for <monclient@gmail.com>; Thu, 28 Apr 2016 14:51:51 +0200 (CEST)
Received: by monserveur.com (Postfix, from userid 5000) id BE51181C31; Thu, 28 Apr 2016 14:51:51 +0200 (CEST)
On transfère tout ça au MTA local pour envoi à la destination finale :
Received: from localhost (localhost [127.0.0.1]) by monserveur.com (Postfix) with ESMTP id B25FA81C32 for <monclient@gmail.com>; Thu, 28 Apr 2016 14:51:57 +0200 (CEST)
Fin du premier message, on traverse la boundary pour voir ce qu'il s'est passé ensuite :
<monclient@gmail.com>: host gmail-smtp-in.l.google.com[2a00:1450:400c:xxxx::xxxx] said: 552-5.7.0 This message was blocked because its content presents a potential 552-5.7.0 security issue.
Ça c'est moins cool. En gros, gmail a jeté le message, parce que la pièce jointe était sans doute contaminée. Mon antivirus n'a rien vu, il va falloir chercher pourquoi (plus tard).
On continue de remonter, et au-dessus de la dernière boundary, on a :
Received: by monserveur.com (Postfix) id 1430281C33; Thu, 28 Apr 2016 14:51:58 +0200 (CEST)
Ok, gmail m'a renvoyé le message plus ou moins gentiement en m'expliquant qu'il n'en voulait pas, et mon serveur essaie de le transférer au spammeur original qui nous a fermé sa porte. Le mail reste donc en queue jusqu'à son expiration... Voilà pourquoi il traîne dans la queue des mails et qu'il n'a été envoyé ni par moi ni pour moi...
Conclusion
J'espère que cette courte plongée dans les en-têtes d'un mail vous a permis de vous familiariser avec le "vrai" contenu d'un mail.
Ici je ne peux plus faire grand chose avec ce mail à part le supprimer de la queue mail, le spammeur ayant certainement déjà été bloqué par son hébergeur ou changé d'adresse IP pour continuer à envoyer sans se faire prendre par les blacklists.
À bientôt pour un nouvel article. :)