Table des matières

Le proxy

Installation de Clamav

Clamav est un antivirus sous licence GPL, qui fonctionne sur le principe d'une base de données de signatures, comme la plupart des antivirus commerciaux. Son installation ne pose aucun problème particulier sur une Debian Sarge. Les scripts d'installation vous aideront à configurer correctement cet antivirus, en choisissant  :

Pensez à installer tous les outils de décompression nécessaires au bon fonctionnement de l'antivirus sur les pièces jointes compressées. Apt vous indiquera la liste des paquetages supplémentaires suggérés et recommandés, s'ils ne sont déjà présents.

Clamav semble être un bon antivirus, dont le principal avantage est d'être sous licence GPL et le principal inconvénient, celui de consommer énormément de ressources CPU. Il ne sait pas éradiquer un virus dans un document (ici, un e-mail). Tout ce qu'il sait faire, c'est identifier un virus connu. Vous pourrez alors choisir de mettre le message en quarantaine ou de le détruire, mais c'est P3Scan qui se chargera de ça.

Clamav tourne par défaut sous le nom d'un utilisateur fictif : clamav, créé lors de l'installation du paquetage.

Installation de P3Scan

P3Scan est le logiciel proxy. Il permet non seulement d'y greffer Clamav, ou d'autres antivirus non libres, mais encore spamassassin, si vous souhaitez en profiter pour filtrer les spams.

Il s'installe aussi simplement que clamav avec les apt, mais il faudra ici revenir un petit peu sur son fichier de configuration.

Pour que P3Scan fonctionne, il faut le configurer pour qu'il utilise au moins les services d'un antivirus.

Voici l'allure du fichier de configuration :

mercure:~# cat /etc/p3scan/p3scan.conf | grep ^[^#]
pidfile = /var/run/p3scan/p3scan.pid
maxchilds = 10
ip = 0.0.0.0
port = 8110
user = p3scan
notifydir = /var/spool/p3scan/notify
virusdir = /var/spool/p3scan
justdelete
scannertype = basic
scanner = /usr/bin/clamscan --no-summary -i
virusregexp = .*: (.*) FOUND
template = /etc/p3scan/p3scan-fr.mail
subject = [virus] dans un message pour vous:
notify = Pour information, le message a été détruit.

Le grep ^[^#] est une astuce qui permet d'éliminer toutes les lignes de commentaire (qui commencent par un #). Pour comprendre cette incantation, il faut comprendre la syntaxe des expressions régulières, c'est assez spécial…

Vous pourrez, au choix, conserver en quarantaine les messages vérolés (dans /var/spool/p3scan) ou tout simplement les détruire (directive justdelete)

La directive template définit le chemin d'accès au message type qui se substituera au message infecté. P3scan propose dans /etc/p3scan une liste de messages types en différentes langues, que vous pouvez aisément personnaliser.

La ligne subject définit l'objet de ce message, qui sera complété par le nom du virus.

La ligne notify apparaît dans le message si justdelete est actif.

Voici (par anticipation, parce que pour l'instant, ça ne fonctionne pas encore), un exemple de texte source d'un message reçu (ici, avec l'option justdelete inactive) :

From - Sat Feb 05 14:29:34 2005
X-Account-Key: account2
X-UIDL: 1083005466.9058
X-Mozilla-Status: 0001
X-Mozilla-Status2: 00000000
Return-Path: <webmaster@divx-overnet.com>
Received: from mwinf1008.wanadoo.fr (mwinf1008.wanadoo.fr)
	by mwinb0704 (SMTP Server) with LMTP; Sat, 05 Feb 2005 14:30:25 +0100
X-Sieve: Server Sieve 2.2
Received: from me-wanadoo.net (localhost [127.0.0.1])
	by mwinf1008.wanadoo.fr (SMTP Server) with ESMTP id 56A2B6000384
	for <caleca.christian@free.fr>; Sat,  5 Feb 2005 14:30:25 +0100 (CET)
Received: from free.fr (12.254.100-84.rev.gaoland.net [84.100.254.12])
	by mwinf1008.free.fr (SMTP Server) with ESMTP id EC80B600038E
	for <caleca.christian@free.fr>; Sat,  5 Feb 2005 14:30:17 +0100 (CET)
X-ME-UUID: 20050205133018968.EC80B600038E@mwinf1008.free.fr
From: webmaster@divx-overnet.com
To: caleca.christian@free.fr
Date: Sat, 05 Feb 2005 14:30:34 +0100
Subject: [Virus] dans un message pour vous: Worm.SomeFool.AA-2
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit
Content-Type: text/plain;
       charset="iso-8859-1"

Bonjour caleca.christian.
Ce corps de message a été généré automatiquement par P3Scan, qui fonctionne sur
la passerelle mercure pour scanner tous les courriels entrants.

Il remplace le corps du message contenant un VIRUS qui vous était adressé!
Ce message vous est envoyé à la place du courriel infecté, .

==========
Nom du virus:
   Worm.SomeFool.AA-2

Expéditeur du courriel:
   webmaster@divx-overnet.com

Envoyé à:
   caleca.christian@free.fr

Date:
   Sat, 05 Feb 2005 14:30:34 +0100

Object:
   Information

Informations de connexion:
   POP3 from 192.168.0.10:1395 to 193.252.22.90:110

Le fichier original du message est archivé sur le serveur sous le nom de :
   /p3scan.ZzReH5
==============

--
P3Scan 2.1
par Jack S. Lai <laitcg@cox.net>
.

Que manque-t-il pour finir ?

Nous avons :

Mais…

Il faut tout de même rediriger les flux POP3 (port 110) entrants sur mercure vers le port du proxy (8110 dans notre configuration). Il nous faudra donc écrire quelque règle “iptables” bien sentie sur mercure.

Quelque chose du genre :

iptables -t nat -A PREROUTING -i eth0 -d ! 192.168.0.0/24 -p tcp --dport 110 -j REDIRECT --to-ports 8110

Nous sommes en PREROUTING, donc sitôt que le paquet TCP entre par eth0, s'il est à destination du port 110, il est redirigé sur le port 8110, sans changer l'adresse IP du destinataire (ce qui n'aurait pas été le cas avec une règle utilisant le DNAT, condition indispensable pour que P3Scan puisse savoir à quel vrai serveur POP3 il doit s'adresser). Il sera donc intercepté par le proxy, à condition que ce ne soit pas à destination de l'une de nos machines du LAN (c'est une précaution, pas indispensable, du moins pour p3scan).

Le résultat est assez amusant (et même vertigineux) à voir avec un tcptraceroute :

janus:~# tcptraceroute pop.wanadoo.fr 110
Selected device eth0, address 192.168.0.4 for outgoing packets
Tracing the path to pop.wanadoo.fr (193.252.22.68) on TCP port 110, 30 hops max
 1  192.168.0.2 (192.168.0.2)  0.282 ms  0.125 ms  0.118 ms
 2  pop.wanadoo.fr (193.252.22.68) [open]  1.087 ms  0.231 ms  0.209 ms

Quand je vous disais que c'est amusant… Le client, janus, qui fait un traceroute vers pop.wanadoo.fr a l'impression qu'il a atteint sa cible au deuxième « hop », c'est à dire, lorsqu'il atteint le proxy (mercure).

Fonctionnement

Ethereal va encore frapper, pour bien voir ce qu'il se passe au niveau de mercure, le proxy POP3. Juste pour vérifier le fonctionnement du proxy, depuis janus, nous allons ouvrir une session POP3 sur pop.free.fr, avec telnet, ce sera plus folklorique. Pendant ce temps, ethereal récupèrera tout ce qui passe sur l'unique interface eth0 de la machine.

Voici l'intégralité du dialogue dans la console telnet :

janus:~# telnet pop.free.fr 110
Trying 212.27.42.11...
Connected to pop1-q.free.fr.
Escape character is '^]'.
+OK <31488.1107616735@pop1-q.free.fr>
user caleca.christian
+OK
pass haben_non
+OK
stat
+OK 1121 25539581
quit
+OK
Connection closed by foreign host.

Vraiment le strict minimum, juste pour voir comment ça se passe au niveau de mercure.

No.     Source         Destination    Protocol Info
      1 192.168.0.4    212.27.42.12   TCP      33273 > pop3 [SYN] Seq=0 Ack=0
      2 212.27.42.12   192.168.0.4    TCP      pop3 > 33273 [SYN, ACK] Seq=0 Ack=1
      3 192.168.0.4    212.27.42.12   TCP      33273 > pop3 [ACK] Seq=1 Ack=1

# le client janus (192.168.0.4) a ouvert une connexion TCP avec ce qu'il croit être
# le serveur pop.free.fr (212.27.42.12). En réalité, il l'a ouverte avec mercure (192.168.0.3)
# mais ça ne se voit pas. C'est normal, c'est fait pour être "transparent"

      4 192.168.0.3    212.27.42.12   TCP      39232 > pop3 [SYN] Seq=0 Ack=0
      5 212.27.42.12   192.168.0.3    TCP      pop3 > 39232 [SYN, ACK] Seq=0 Ack=1
      6 192.168.0.3    212.27.42.12   TCP      39232 > pop3 [ACK] Seq=1 Ack=1

# A son tour, mercure (192.168.0.3) ouvre une connexion TCP avec le vrai pop.free.fr.
# Cette fois-ci, il n'y a pas de tromperie.

      7 212.27.42.12   192.168.0.3    POP      Response: +OK <14870.1107617952@pop2-q.free.fr>
      8 192.168.0.3    212.27.42.12   TCP      39232 > pop3 [ACK] Seq=1 Ack=40

# Le vrai serveur pop.free.fr, croyant avoir affaire avec un vulgaire client POP3
# envoie à notre proxy la réponse +OK (voir le protocole pop3 pour plus d'informations)

      9 212.27.42.12   192.168.0.4    POP      Response: +OK <14870.1107617952@pop2-q.free.fr>
     10 192.168.0.4    212.27.42.12   TCP      33273 >; pop3 [ACK] Seq=1 Ack=40

# notre proxy, qui se fait toujours passer pour le vrai pop.free.fr, répercute alors cette
# réponse à notre client janus (192.168.0.4) qui continue à croire qu'il discute
# avec le vrai serveur POP3////

     11 192.168.0.4    212.27.42.12   POP      Request: user caleca.christian
     12 212.27.42.12   192.168.0.4    TCP      pop3 > 33273 [ACK] Seq=40 Ack=24

# notre client, toujours berné, envoie alors le nom d'utilisateur, à ce qu'il croit
# toujours être son serveur POP3 (alors qu'il s'agit bien sûr de notre proxy)

     13 192.168.0.3    212.27.42.12   POP      Request: user caleca.christian
     14 212.27.42.12   192.168.0.3    TCP      pop3 > 39232 [ACK] Seq=40 Ack=24

# Et notre proxy (192.168.0.3) de répéter la chose au vrai serveur POP3
# qui continue à croire qu'il discute avec son client.

     15 212.27.42.12   192.168.0.3    POP      Response: +OK
     16 192.168.0.3    212.27.42.12   TCP      39232 > pop3 [ACK] Seq=24 Ack=46

# Il lui répond alors +OK

     17 212.27.42.12   192.168.0.4    POP      Response: +OK
     18 192.168.0.4    212.27.42.12   TCP      33273 > pop3 [ACK] Seq=24 Ack=46

# Bien entendu, notre proxy qui continue à se faire passer pour pop.free.fr
# vis à vis de janus, lui répercute la réponse.

     19 192.168.0.4    212.27.42.12   POP      Request: pass haben_non
     20 212.27.42.12   192.168.0.4    TCP      pop3 > 33273 [ACK] Seq=46 Ack=39

# Enhardi par ce succès, janus envoie alors le mot de passe au supposé pop.free.fr
# (qui n'est autre, vous le devinez, que le proxy mercure)...

     21 192.168.0.3    212.27.42.12   POP      Request: pass haben_non
     22 212.27.42.12   192.168.0.3    TCP      pop3 > 39232 [ACK] Seq=46 Ack=39

# Lequel mercure, qui continue inlassablement à se faire passer pour un client
# POP3 "normal", répète au vrai serveur POP3.

     23 212.27.42.12   192.168.0.3    POP      Response: +OK
     24 192.168.0.3    212.27.42.12   TCP      39232 > pop3 [ACK] Seq=39 Ack=52

# Lequel, ne trouvant rien de spécial à redire, se contente de répondre +OK

     25 212.27.42.12   192.168.0.4    POP      Response: +OK
     26 192.168.0.4    212.27.42.12   TCP      33273 > pop3 [ACK] Seq=39 Ack=52

# et notre proxy de continuer à jouer les péroquets.
# Et ainsi de suite... Je vous laisse finir de commenter ce "listing"

     27 192.168.0.4    212.27.42.12   POP      Request: stat
     28 212.27.42.12   192.168.0.4    TCP      pop3 > 33273 [ACK] Seq=52 Ack=45
     29 192.168.0.3    212.27.42.12   POP      Request: stat
     30 212.27.42.12   192.168.0.3    TCP      pop3 > 39232 [ACK] Seq=52 Ack=45
     31 212.27.42.12   192.168.0.3    POP      Response: +OK 1122 25540691
     32 192.168.0.3    212.27.42.12   TCP      39232 > pop3 [ACK] Seq=45 Ack=71
     33 212.27.42.12   192.168.0.4    POP      Response: +OK 1122 25540691
     34 192.168.0.4    212.27.42.12   TCP      33273 > pop3 [ACK] Seq=45 Ack=71
     35 192.168.0.4    212.27.42.12   POP      Request: quit
     36 212.27.42.12   192.168.0.4    TCP      pop3 > 33273 [ACK] Seq=71 Ack=51
     37 192.168.0.3    212.27.42.12   POP      Request: quit
     38 212.27.42.12   192.168.0.3    POP      Response: +OK
     39 192.168.0.3    212.27.42.12   TCP      39232 > pop3 [ACK] Seq=51 Ack=77
     40 212.27.42.12   192.168.0.4    POP      Response: +OK
     41 192.168.0.4    212.27.42.12   TCP      33273 > pop3 [ACK] Seq=51 Ack=77
     42 212.27.42.12   192.168.0.3    TCP      pop3 > 39232 [FIN, ACK] Seq=77 Ack=51
     43 212.27.42.12   192.168.0.4    TCP      pop3 > 33273 [FIN, ACK] Seq=77 Ack=51
     44 192.168.0.3    212.27.42.12   TCP      39232 > pop3 [FIN, ACK] Seq=51 Ack=78
     45 192.168.0.4    212.27.42.12   TCP      33273 > pop3 [FIN, ACK] Seq=51 Ack=78
     46 212.27.42.12   192.168.0.4    TCP      pop3 > 33273 [ACK] Seq=78 Ack=52
     47 212.27.42.12   192.168.0.3    TCP      pop3 > 39232 [ACK] Seq=78 Ack=52

Donc, pour récapituler :

Le client janus croit tout le temps qu'il dialogue avec pop.free.fr, alors qu'en réalité, il dialogue avec mercure, le proxy transparent. Pour janus, l'adresse IP de son serveur est toujours celle de pop.free.fr.
Le vrai serveur pop.free.fr, tout le temps du dialogue, discute en réalité avec notre proxy, en croyant que c'est un vulgaire client POP3.
le proxy, quant à lui, se contente de répéter d'un bord à l'autre ce qu'il reçoit :
Finalement aucune des deux extrémités ne se rend compte qu'il y a un serveur mandataire entre les deux, et c'est bien le but d'un proxy transparent.