Another Home Page Blog - Sécuritéhttps://blog.anotherhomepage.org/2018-04-16T09:30:00+02:00VPN : test de Shellfire2018-04-16T09:30:00+02:002018-04-16T09:30:00+02:00Nils Ratuszniktag:blog.anotherhomepage.org,2018-04-16:/post/2018/04/16/VPN-test-Shellfire/<p><img alt="""" src="https://blog.anotherhomepage.org/public/2018/purple_rain_mini.jpg"><em>Avertissement : ce billet est l'objet d'un partenariat avec Shellfire, j'ai accepté de rédiger ce test en échange de 6 mois de service au niveau PremiumPlus (et d'un lien vers leur service).</em></p>
<p><a href="https://www.shellfire.fr/" title=""Shellfire">Shellfire</a> est une société qui propose un service de VPN. L'idée derrière ce genre de service est de pouvoir …</p><p><img alt="""" src="https://blog.anotherhomepage.org/public/2018/purple_rain_mini.jpg"><em>Avertissement : ce billet est l'objet d'un partenariat avec Shellfire, j'ai accepté de rédiger ce test en échange de 6 mois de service au niveau PremiumPlus (et d'un lien vers leur service).</em></p>
<p><a href="https://www.shellfire.fr/" title=""Shellfire">Shellfire</a> est une société qui propose un service de VPN. L'idée derrière ce genre de service est de pouvoir "débloquer" sa connexion Internet, c'est-à-dire de pouvoir contourner certaines limitations, comme :</p>
<ul>
<li>accéder à des sites web ou des services autrement indisponibles à cause d'une limitation gouvernementale ou commerciale de son accès Internet ;</li>
<li>accéder à des sites web ou des services autrement indisponibles à cause d'une limitation de leur fait (exemple : service accessible uniquement dans certains pays) ;</li>
<li>augmenter le niveau d'anonymat de son accès Internet, en ne divulguant pas la véritable adresse IP de sa connexion Internet ;</li>
<li>augmenter son niveau de sécurité lorsqu'on se connecte à un réseau Wi-Fi public (gare, café, espace de coworking, ...), en particulier s'il s'agit d'un réseau ouvert (oui, un portail captif compte comme réseau ouvert).</li>
</ul>
<p>L'offre de service VPN Shellfire se décompose en trois gammes de prix :</p>
<ul>
<li>l'offre gratuite, qui annonce 2 pays de sortie (Allemage et USA), et limite le débit à 1 Mbit/sec ;</li>
<li>l'offre Premium, qui annonce 20 pays de sortie, et limite le débit à 12 Mbit/sec ;</li>
<li>l'offre PremiumPlus, qui annonce 34 pays de sortie, et ne limite pas le débit.</li>
</ul>
<p>Je n'utilise que très peu ce genre de service : mon utilisation habituelle d'un VPN consiste surtout à accéder à mon LAN depuis l'extérieur, voire aussi pour me connecter depuis un lieu public. J'ai la chance d'avoir le choix en matière de FAI, et lorsqu'un fournisseur s'est avéré insuffisant sur un point, j'ai pu aller chez un autre.</p>
<h3>Le site web</h3>
<p>Commençons par le site web de Shellfire, puisque pas mal de manipulations se passent via celui-ci. Je n'ai pas pu tester l'inscription, ni le paiement, puisque tout ceci a été réalisé pour moi dans le cadre du partenariat. J'ai par contre testé la réinitialisation du mot de passe, et cela m'a fait plaisir de ne pas voir celui-ci apparaître en clair dans un mail ! J'ai aussi pu apprécier que le site soit traduit en français (en plus de l'anglais et de l'allemand), et que de la documentation soit accessible au format PDF selon différents OS et différentes technologies de VPN. D'ailleurs l'assistance se trouve très simplement, un lien est disponible en haut des pages du site. Ce lien renvoie vers une foire au questions, contenant entres autres les documents PDF, mais aussi des informations sur la rétention des données, mais aussi sur comment résilier, ce qui semble se faire assez simplement (on se doute que je n'ai pas encore testé). Dernier point rassurant, tout le site est en HTTPS, et obtient une note de A+ au <a href="https://www.ssllabs.com/ssltest/analyze.html?d=www.shellfire.fr&hideResults=on" title=""test">test SSL Labs</a>.</p>
<p>J'ai cependant noté quelques points d'améliorations, à commencer comme le paragraphe précédent par la traduction. Bien que celle-ci soit globalement compréhensible, il y a parfois des formulations qui me semblent être des traductions littérales de l'anglais. Il y a même quelques passages non traduits, comme un titre dans l'un des PDF de documentation, resté en allemand, les impressions d'écrans de ces documentations ou l'icône de téléchargement du client Shellfire VPN, aussi en allemand. Un peu plus gênant je trouve, j'ai voulu au début utiliser le site sans Javascript, et cela a tourné court : le menu permettant d'accéder aux paramètres VPN n'est accessible que via Javascript. J'ai aussi remarqué qu'un mot de passe est affiché en clair dans l'interface web : comme il ne correspond pas au mot de passe de mon compte et qu'aucun mot de passe n'est requis pour OpenVPN, je suppose qu'il s'agit du mot de passe pour PPTP. Toujours dans les points gênants, j'ai eu la mauvaise surprise de voir des widgets Facebook, Twitter et Google Analytics. Si ceux-ci sont clairement annoncés dans la <a href="https://www.shellfire.fr/declaration-de-protection-de-donnees/déclaration" title="Shellfire - Déclaration de confidentialité">déclaration de confidentialité</a>, je trouve cela assez dommage pour une entreprise qui se vante de vouloir <a href="https://www.shellfire.fr/vision/" title="Shellfire - Vision">protéger mes données privées</a> de faire savoir à Facebook, Google et Twitter que je visite un site de VPN, sa fréquence et potentiellement plein d'informations.</p>
<h3>Le réseau VPN</h3>
<p>Passons maintenant au cœur de notre sujet, le VPN en lui-même.</p>
<h4>Protocoles et configurations réseau</h4>
<p>Il est possible de se connecter au VPN via trois protocoles principaux : PPTP, IPSec et OpenVPN. Je n'ai pas essayé les deux premiers, et me suis concentré sur le troisième. La première chose que j'ai remarquée est le nombre de points de sorties possibles (nommés serveurs sur le site de Shellfire) : 50 au moment où j'écris ces lignes. J'ai aussi remarqué la variété des pays de sortie, couvrant non seulement l'Amérique du nord et l'Europe (incluant l'Europe de l'est), mais aussi l'Asie, l'Amérique du sud et l'Afrique avec un serveur à Johannesburg ! Il est aussi possible de choisir entre TCP et UDP, ce qui selon les cas peut s'avérer utile.</p>
<p>J'ai, là aussi noté quelques points d'amélioration. Tout d'abord, le changement des points de sortie est assez contraignant : il faut se connecter sur le site, puis télécharger la configuration concernant le serveur qui nous intéresse. Cela rend une configuration précédente inopérante, et si comme moi avez plusieurs machines ou appareils, il faut alors déployer cette nouvelle configuration sur ceux-ci. De la même manière, le choix entre TCP et UDP se fait dans l'interface web, et il faut de nouveau télécharger la configuration pour l'appliquer. J'ai aussi remarqué que les serveurs ne sont accessibles que via un seul port. J'aurais trouvé beaucoup plus pratique que plusieurs ports soient disponibles, car cela veut dire que si un serveur VPN n'est pas accessible pour cause de réseau trop restrictif, je devrai choisir un serveur situé dans un autre pays.</p>
<p>Un autre point qui a retenu mon attention est le paramétrage DNS : en effet, OpenVPN applique (ou tente d'appliquer, on en reparlera plus tard) une configuration DNS pour que les requêtes DNS passent dans le VPN. Chez Shellfire, il a été décidé d'utiliser <a href="https://developers.google.com/speed/public-dns/" title="">les DNS publics de Google</a>. Je trouve dommage de s'en remettre aux GAFAM pour de nombreuses choses comme le DNS, mais je suis aussi conscient qu'il n'est pas forcément évident de maintenir une infrastructure de résolution DNS en plus du VPN (et des autres services de Shellfire).</p>
<p>Enfin, je n'ai pas vraiment testé un éventuel filtrage de port, mais je n'ai pas eu de soucis en PremiumPlus pour le web, le SSH, ainsi qu'un peu de mail.</p>
<h4>Débits</h4>
<p>On l'a vu plus tôt, l'offre tarifaire est entre autres segmentée sur les débits. Mais qu'en est-il réellement ? J'ai fait des tests de débit en utilisant plusieurs sites sites spécialisés :</p>
<ul>
<li>speedtest.net ;</li>
<li>fast.com ;</li>
<li>speedof.me ;</li>
<li>megapath.com ;</li>
<li>bandwidthplace.com .</li>
</ul>
<p>Je me suis basé sur 5 niveaux de connexion : un serveur gratuit (USA/Chicago), un Premium (France/Roubaix), deux PremiumPlus (Singapour et Suisse/Zurich), et bien entendu sans VPN. Sans surprise, sans tunnel VPN, j'ai le meilleur débit : j'ai la chance d'être en fibre optique.</p>
<p>Globalement, sur le serveur gratuit, le bridage est présent et je me retrouve bien avec un débit descendant aux alentours d'1 Mbit/s. Là où c'est amusant, c'est que le débit montant (non spécifié par Shellfire) ne semblait pas bridé, selon les tests j'ai eu entre 4 et 13 Mbit/s.</p>
<p>Le bridage est aussi bien présent sur le serveur Premium, avec selon les tests un débit descendant situé entre 11 et 13 Mbit/s. Comme pour le serveur de l'offre gratuite, le débit montant est bien plus important, entre 19 et 25 Mbit/s.</p>
<p>Alors, comment se comportent les serveurs PremiumPlus, soit disant "sans limite de débit" ? Et bien cela dépend des cas, c'est pour cela que j'en ai testé deux. Le serveur suisse, situé à Zurich, m'a fourni un débit descendant entre 18 et 26 Mbit/s selon les tests, mais j'ai eu entre 15 et 22 Mbit/s sur le débit montant. Je me serais attendu à plus au vu des serveurs moins chers. L'autre cas est un serveur situé à Singapour, qui m'a offert une toute autre expérience : entre 1,6 et 5,25 Mbit/s de débit descendant et entre 3 et 7 Mbit/s pour le débit montant, ce qui le situerait entre un serveur gratuit et un serveur Premium.</p>
<p>Côté latence, les pings ne sont pas corrélés avec l'offre tarifaire, mais plutôt avec ma distance du serveur. Ainsi je ne perds que peu de latence en restant en France (quelques millisecondes), mais je suis monté à plus de 250 ms en utilisant le serveur situé à Singapour, ce qui est somme toute assez logique.</p>
<p>Que conclure de tout cela ? D'abord, qu'il est tout simplement impensable de vouloir jouer au travers d'un VPN, mais je suppose qu'on ne m'a pas attendu pour ce constat. Ensuite, que globalement sur les offres gratuites et Premium, les débits descendant sont respectés, et bonne surprise, que les débits montant sont assez confortables pour envoyer des fichiers un peu volumineux. Pour l'offre PremiumPlus, l'absence de limite contractuelle laisserait à penser que de gigantesques tuyaux sont à disposition, mais en fait le débit dépend plutôt de ce qui est disponible sur place : un VPS ou un serveur dédié pour monter un VPN coûte peu cher en Europe, particulièrement en France et en Allemagne par exemple, mais peut coûter bien plus cher ailleurs.</p>
<h4>Chiffrement</h4>
<p>Selon les serveurs, le chiffrement n'est pas le même, il y a trois possibilités :</p>
<ul>
<li>AES-128-CBC pour les serveurs de l'offre gratuite ;</li>
<li>AES-192-CBC pour les serveurs de l'offre Premium ;</li>
<li>et enfin AES-256 pour les serveurs de l'offre PremiumPlus.</li>
</ul>
<p>D'un côté, je comprends tout à fait cette différence sur les gammes de prix, d'autant que d'après <a href="https://fr.wikipedia.org/wiki/Advanced_Encryption_Standard#Attaques" title=""Wikipédia">Wikipédia</a> (et <a href="https://en.wikipedia.org/wiki/Advanced_Encryption_Standard#Security" title=""Wikipedia">ici</a> en anglais), même AES-128 est sûr. Toutefois, les attaques sur celui-ci deviennent de plus en plus nombreuses, même si elles sont de type "canal auxiliaire", c'est-à-dire qu'elles exploitent surtout des implémentations que l'algorithme en lui-même. Il est donc important de rester informé sur le sujet, en particulier si on se limite aux serveurs gratuits.</p>
<h4>Géolocalisation</h4>
<p>Je n'ai pas fait beaucoup de tests à ce niveau, si ce n'est m'assurer à l'aide d'un service <em>whois</em> que l'adresse IP de sortie (qui est celle du serveur) est bien géolocalisée dans le pays indiqué. Je me suis d'ailleurs fait une petite frayeur, puisque sur une base whois ancienne, l'IP de sortie de Singapour était géolocalisée en Nouvelle-Zélande !</p>
<p>Pour ce qui est des blocages géographiques par contre, mon test s'est limité à Netflix France, malheureusement bloqué sur l'IP de sortie française.</p>
<h3>L'assistance</h3>
<p>Durant mon test du VPN Shellfire, j'ai eu un problème, ce qui fut l'occasion parfaite pour tester le support technique. Celui-ci n'est disponible que par mail, mais répond dans un français excellent, et m'a toujours répondu en moins de 24h. Quand à l'utilité des réponses du support, si celles-ci n'étaient pas parfaites, elles m'ont mises sur la voie pour comprendre ce qui n'allait pas.</p>
<h3>En conclusion</h3>
<p>Le service qu'offre Shellfire dispose d'une base solide, avec une connexion réseau de qualité. Mais cela ne fait pas tout, et je trouve dommage que cette société succombe aux sirènes de la facilité en utilisant sans chercher plus loin des serveurs DNS, widgets de réseaux sociaux et outils de statistiques qui vont à l'encontre de son objectif d'anonymat. Je crois aussi que le service gagnerait à être plus pratique (changement de serveur, protocole et port).</p>
<p>Je ne déconseille donc pas Shellfire, mais ne le recommande que sous les conditions suivantes :</p>
<ul>
<li>penser à bloquer les connexions vers les réseaux sociaux et Google dans le navigateur ;</li>
<li>modifier les serveurs DNS paramétrés par le VPN, en les remplaçant par <a href="https://www.fdn.fr/actions/dns/" title=""FDN">les DNS publics FDN</a> par exemple.</li>
</ul>
<p>Si jamais vous avez apprécié ce test et que vous souhaitez essayer leur service (et pourquoi pas comparer les impressions), des liens de parrainage/affiliation existent, voici le mien : <a href="https://www.shellfire.fr/vpn/?ref=USKSrkcmE6" title=""Lien">ici</a>.</p>
<p><em>Vous avez aimé cet article ? Alors partagez-le sur les réseaux sociaux !</em></p>
<p><em>Crédit photo : <a href="https://unsplash.com/photos/7vmA7Fx1Nyo" title=""Purple">Tom Roberts - Purple Rain</a>.</em></p>Wordpress : étude d'un site web victime de piratage2017-05-31T09:30:00+02:002017-05-31T09:30:00+02:00Nils Ratuszniktag:blog.anotherhomepage.org,2017-05-31:/post/2017/05/31/wordpress-etude-site-web-piratage/<p><img alt=""A" src="https://blog.anotherhomepage.org/public/needlehaystack.jpg" title=""A">Durant le mois de février 2017, j'ai été sollicité pour analyser et "nettoyer" un site web piraté. Le site web en question fonctionnait sous Wordpress. Je partage mon expérience ici, en espérant que cela aide certaines personnes plus tard. J'ai choisi de ne pas mentionner le nom du site ou …</p><p><img alt=""A" src="https://blog.anotherhomepage.org/public/needlehaystack.jpg" title=""A">Durant le mois de février 2017, j'ai été sollicité pour analyser et "nettoyer" un site web piraté. Le site web en question fonctionnait sous Wordpress. Je partage mon expérience ici, en espérant que cela aide certaines personnes plus tard. J'ai choisi de ne pas mentionner le nom du site ou de son webmestre, si des commentaires venaient à divulguer ces informations, je me permettrai de les éditer ou de les refuser.</p>
<p>Mais avant de continuer, une mise en garde : en cas de piratage avéré de votre site, <strong>l'option la plus sûre reste de tout effacer, de restaurer des sauvegardes et de mettre à jour votre CMS ainsi que ses plugins</strong> ! Malheureusement, tout le monde ne fait pas de sauvegarde, et se retrouve parfois, selon l'hébergeur, avec un site web hors ligne le temps que le "nettoyage" soit fait.</p>
<p>Ah, et au passage : les adresses IP et noms de domaines ont été anonymisés. Si jamais il y a un oubli, faites-le moi savoir, et je corrigerai au plus vite !</p>
<h3>Première étape : l'inventaire</h3>
<p>J'ai commencé par faire un rapide inventaire de ce que je pouvais récupérer : le webmestre du site m'a aimablement fourni les accès à son hébergement et à son site, de sorte que je puisse effectuer sans difficulté toutes les actions dont j'aurais besoin. Je récupère donc les éléments suivants :</p>
<ul>
<li>logs d'accès sur environ 16 jours ;</li>
<li>copie complète des fichiers sur l'hébergement ;</li>
<li>export de la base de données.</li>
</ul>
<h3>Première recherche dans les logs</h3>
<p>Etudions donc ces logs, et voyons ce qui peut en ressortir. Je regarde d'abord le nombre de lignes de chaque fichier (la rotation semble se faire de manière quotidienne) :</p>
<div class="highlight"><pre><span></span><code><span class="m">13</span>:19 nils@shell2:~/tmp/exemple/access_logs$ wc -l *.log
<span class="m">29771</span> exemple.fr-03-02-2017.log
<span class="m">11377</span> exemple.fr-04-02-2017.log
<span class="m">12504</span> exemple.fr-05-02-2017.log
<span class="m">12279</span> exemple.fr-06-02-2017.log
<span class="m">9700</span> exemple.fr-07-02-2017.log
<span class="m">6182</span> exemple.fr-08-02-2017.log
<span class="m">11819</span> exemple.fr-09-02-2017.log
<span class="m">11918</span> exemple.fr-10-02-2017.log
<span class="m">19616</span> exemple.fr-11-02-2017.log
<span class="m">15377</span> exemple.fr-12-02-2017.log
<span class="m">11232</span> exemple.fr-13-02-2017.log
<span class="m">8253</span> exemple.fr-14-02-2017.log
<span class="m">6791</span> exemple.fr-15-02-2017.log
<span class="m">13711</span> exemple.fr-16-02-2017.log
<span class="m">23480</span> exemple.fr-17-02-2017.log
<span class="m">16602</span> exemple.fr-18-02-2017.log
<span class="m">220612</span> total
</code></pre></div>
<p>Trois jours deviennent intéressant, le premier avec 29771 requêtes, un autre 19616, et enfin un dernier à 23480. Je vais donc rechercher dans ces logs, des requêtes étranges, en particulier beaucoup de requêtes POST vers une ou plusieurs pages précises, qui ne semblent pas faire partie du site. Je suis content d'avoir retenu quelque chose de <a href="/post/2014/11/11/Relai-de-spam%2C-cela-n-arrive-qu-aux-autres">mon expérience précédente</a>.</p>
<p>Pour aller voir si quelque chose ressort des requêtes POST, je réutilise les one-liners awk dont j'avais parlé <a href="/post/2010/03/01/Nombre-d-occurences-d-un-champ-dans-un-fichier">ici</a> et <a href="/post/2012/10/01/Nombre-d-occurrences-dans-un-fichier-remix">là</a>. Voyons donc ce qui effectue le plus de requêtes POST dans le premier log :</p>
<div class="highlight"><pre><span></span><code>nils@shell2:~/tmp/exemple/access_logs$ grep POST exemple.fr-03-02-2017.log <span class="p">|</span> grep -v <span class="s2">"POST /wp-cron.php"</span> <span class="p">|</span> awk <span class="s1">'{frequencies[$1]++;} END {for (ip in frequencies) printf "%d\\t%s" , frequencies[ip] , ip;}'</span> <span class="p">|</span> sort -rn <span class="p">|</span> head -5
<span class="m">98</span> <span class="m">10</span>.105.31.167
<span class="m">46</span> <span class="m">10</span>.169.249.134
<span class="m">13</span> <span class="m">10</span>.0.164.52
<span class="m">11</span> <span class="m">10</span>.186.33.40
<span class="m">7</span> <span class="m">10</span>.43.0.21
</code></pre></div>
<p>En effectuant des résolutions DNS inverses et des whois des adresses IP, je retrouve entre autres le FAI du webmestre, ainsi que le cluster de l'hébergeur. Mais je trouve aussi une adresse IP allemande, une autre tchétchène, et une russe. Surprenant pour un blog francophone, n'est-ce pas ? Bon, avant d'être accusé de racisme, allons voir ce que ces adresses IP ont fait comme requêtes. Extrait :</p>
<div class="highlight"><pre><span></span><code><span class="m">10</span>.0.164.52 www.exemple.fr - <span class="o">[</span><span class="m">03</span>/Feb/2017:14:56:17 +0100<span class="o">]</span> <span class="s2">"POST /wp-content/mybkl.php HTTP/1.1"</span> <span class="m">200</span> <span class="m">11</span> <span class="s2">"-"</span> <span class="s2">"Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; MAARJS; rv:11.0) like Gecko"</span>
<span class="m">10</span>.0.164.52 www.exemple.fr - <span class="o">[</span><span class="m">03</span>/Feb/2017:16:25:19 +0100<span class="o">]</span> <span class="s2">"POST /wp-content/mbsrd.php HTTP/1.1"</span> <span class="m">200</span> <span class="m">11</span> <span class="s2">"-"</span> <span class="s2">"Mozilla/5.0 (iPhone; CPU iPhone OS 9_3_2 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Mobile/13F69"</span>
<span class="m">10</span>.0.164.52 www.exemple.fr - <span class="o">[</span><span class="m">03</span>/Feb/2017:17:41:16 +0100<span class="o">]</span> <span class="s2">"POST /wp-content/vipmpnjen.php HTTP/1.1"</span> <span class="m">200</span> <span class="m">11</span> <span class="s2">"-"</span> <span class="s2">"Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36"</span>
<span class="m">10</span>.0.164.52 www.exemple.fr - <span class="o">[</span><span class="m">03</span>/Feb/2017:18:06:57 +0100<span class="o">]</span> <span class="s2">"POST /wp-content/bvcomjjaf.php HTTP/1.1"</span> <span class="m">200</span> <span class="m">11</span> <span class="s2">"-"</span> <span class="s2">"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; Tablet PC 2.0)"</span>
<span class="m">10</span>.0.164.52 www.exemple.fr - <span class="o">[</span><span class="m">03</span>/Feb/2017:18:10:18 +0100<span class="o">]</span> <span class="s2">"POST /wp-content/mmgi.php HTTP/1.1"</span> <span class="m">200</span> <span class="m">11</span> <span class="s2">"-"</span> <span class="s2">"Mozilla/5.0 (Windows NT 5.1; rv:50.0) Gecko/20100101 Firefox/50.0"</span>
<span class="m">10</span>.0.164.52 www.exemple.fr - <span class="o">[</span><span class="m">03</span>/Feb/2017:18:24:07 +0100<span class="o">]</span> <span class="s2">"POST /wp-content/gruk.php HTTP/1.1"</span> <span class="m">404</span> <span class="m">56215</span> <span class="s2">"-"</span> <span class="s2">"Mozilla/5.0 (iPad; CPU OS 9_2_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13D15 Safari/601.1"</span>
<span class="m">10</span>.0.164.52 www.exemple.fr - <span class="o">[</span><span class="m">03</span>/Feb/2017:18:24:11 +0100<span class="o">]</span> <span class="s2">"POST /wp-content/fkjzhl.php HTTP/1.1"</span> <span class="m">200</span> <span class="m">11</span> <span class="s2">"-"</span> <span class="s2">"Mozilla/5.0 (Linux; Android 6.0.1; SM-N920V Build/MMB29K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.124 Mobile Safari/537.36"</span>
<span class="m">10</span>.0.164.52 www.exemple.fr - <span class="o">[</span><span class="m">03</span>/Feb/2017:18:32:00 +0100<span class="o">]</span> <span class="s2">"POST /wp-content/ssauz.php HTTP/1.1"</span> <span class="m">200</span> <span class="m">11</span> <span class="s2">"-"</span> <span class="s2">"Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"</span>
<span class="m">10</span>.0.164.52 www.exemple.fr - <span class="o">[</span><span class="m">03</span>/Feb/2017:20:19:02 +0100<span class="o">]</span> <span class="s2">"POST /wp-content/zpamh.php HTTP/1.1"</span> <span class="m">200</span> <span class="m">11</span> <span class="s2">"-"</span> <span class="s2">"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36"</span>
<span class="m">10</span>.0.164.52 www.exemple.fr - <span class="o">[</span><span class="m">03</span>/Feb/2017:20:47:29 +0100<span class="o">]</span> <span class="s2">"POST /wp-content/bvcomjjaf.php HTTP/1.1"</span> <span class="m">200</span> <span class="m">11</span> <span class="s2">"-"</span> <span class="s2">"Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"</span>
<span class="m">10</span>.0.164.52 www.exemple.fr - <span class="o">[</span><span class="m">03</span>/Feb/2017:20:48:09 +0100<span class="o">]</span> <span class="s2">"POST /wp-content/ssauz.php HTTP/1.1"</span> <span class="m">200</span> <span class="m">11</span> <span class="s2">"-"</span> <span class="s2">"Mozilla/5.0 (iPad; CPU OS 10_0_1 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) Version/10.0 Mobile/14A403 Safari/602.1"</span>
<span class="m">10</span>.0.164.52 www.exemple.fr - <span class="o">[</span><span class="m">03</span>/Feb/2017:20:50:33 +0100<span class="o">]</span> <span class="s2">"POST /wp-content/vgmq.php HTTP/1.1"</span> <span class="m">200</span> <span class="m">11</span> <span class="s2">"-"</span> <span class="s2">"Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"</span>
<span class="m">10</span>.0.164.52 www.exemple.fr - <span class="o">[</span><span class="m">03</span>/Feb/2017:21:09:03 +0100<span class="o">]</span> <span class="s2">"POST /wp-content/pwemtiqeb.php HTTP/1.1"</span> <span class="m">200</span> <span class="m">11</span> <span class="s2">"-"</span> <span class="s2">"Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; Touch; ASU2JS; rv:11.0) like Gecko"</span>
</code></pre></div>
<p>Je récupère alors une archive propre de Wordpress depuis le site officiel, par acquis de conscience, mais personnellement, <em>fkjzhl.php</em> ou <em>pwemtiqeb.php</em> ça me semble louche comme nom de fichier. Comme prévu, ces fichiers n'ont absolument rien d'officiel, et les plugins Wordpress ne s'installent pas dans <em>/wp-content/</em>.</p>
<p>A ce moment-là, ma conclusion est la suivante : l'intrus (en supposant qu'il soit seul) a déposé une multitude de fichiers un peu partout dans l'arborescence afin de rendre plus difficile un éventuel nettoyage. De plus, en accédant à plusieurs fichiers, depuis plusieurs adresses IP différentes, cela noie les requêtes dans la masse et rend là aussi, la détection plus difficile.</p>
<h3>Même joueur joue encore</h3>
<p>Passons au deuxième fichier, en utilisant la même méthode :</p>
<div class="highlight"><pre><span></span><code>nils@shell2:~/tmp/exemple/access_logs$ grep POST exemple.fr-17-02-2017.log <span class="p">|</span> grep -v <span class="s2">"POST /wp-cron.php"</span> <span class="p">|</span> awk <span class="s1">'{frequencies[$1]++;} END {for (ip in frequencies) printf "%d\\t%s" , frequencies[ip] , ip;}'</span> <span class="p">|</span> sort -rn <span class="p">|</span> head -5
<span class="m">10143</span> <span class="m">10</span>.9.129.250
<span class="m">240</span> <span class="m">10</span>.28.47.221
<span class="m">234</span> <span class="m">10</span>.135.219.59
<span class="m">229</span> <span class="m">10</span>.213.224.115
<span class="m">199</span> <span class="m">10</span>.123.209.172
</code></pre></div>
<p>Là aussi, la géolocalisation est assez variée : Allemagne, Hong-Kong, Pologne, Russie, Lituanie.Jetons alors un œil aux requêtes POST les plus visitées :</p>
<div class="highlight"><pre><span></span><code>grep POST exemple.fr-17-02-2017.log <span class="p">|</span> awk <span class="s1">'{frequencies[$7]++;} END {for (field in frequencies) printf "%s\\t%d" , field , frequencies[field];}'</span> <span class="p">|</span> sort -nr -k <span class="m">2</span>,2 <span class="p">|</span> grep -v <span class="s2">"/wp-cron.php"</span>
/hostdata4.php <span class="m">11299</span>
/wp-includes/js/tinymce/dir.php <span class="m">1211</span>
/xmlrpc.php <span class="m">240</span>
/wp-content/from.php <span class="m">75</span>
/wp-content/common.php <span class="m">39</span>
/wp-login.php <span class="m">8</span>
/wp-content/db_model.php <span class="m">7</span>
/wp-content/rss_feeder.class.php <span class="m">4</span>
/wp-includes/customize/db2.php <span class="m">3</span>
/wp-admin/network/plugin-editor.php <span class="m">3</span>
/wp-includes/js/tinymce/f53585.php <span class="m">3</span>
/wp-includes/Requests/Exception/HTTP/431.php <span class="m">3</span>
/wp-content/tongue_lib.php <span class="m">2</span>
/palaute.php <span class="m">2</span>
/addfavorites.php <span class="m">2</span>
/wp-content/uploads/2015/07/lib.php <span class="m">2</span>
/ranking.php <span class="m">2</span>
/confirmorder.php <span class="m">2</span>
/wp-content/press_lib.php <span class="m">2</span>
/wp-json/wp/v2/posts/5529 <span class="m">1</span>
/wp-content/adodb.class.php?test_url<span class="o">=</span><span class="nb">true</span> <span class="m">1</span>
/e28441e709.php?test_url<span class="o">=</span><span class="nb">true</span> <span class="m">1</span>
/index.php/wp-json/wp/v2/posts/5529 <span class="m">1</span>
/wp-content/index.php <span class="m">1</span>
/wp-content/powerful.inc.php <span class="m">1</span>
/wp-content/991e700dbd.html <span class="m">1</span>
/ <span class="m">1</span>
/xmlrpc.php?for<span class="o">=</span>jetpack<span class="p">&</span><span class="nv">token</span><span class="o">=</span>anonymized <span class="m">1</span>
</code></pre></div>
<p>Pas mal de fichiers me semblent bizarres, et on peut s'amuser à aller les recherche dans l'archive "saine" de Wordpress. Spoiler Alert : il n'y sont pas.</p>
<h3>Prenons un peu de hauteur</h3>
<p>Avant de passer à autre chose, j'ai décidé de regarder les requêtes POST les plus visitées sur la totalité des fichiers (en retirant un peu plus de requêtes "classiques") :</p>
<div class="highlight"><pre><span></span><code>nils@shell2:~/tmp/exemple/access_logs$ <span class="k">for</span> i <span class="k">in</span> <span class="k">$(</span>find . -type f -print <span class="p">|</span> sort<span class="k">)</span><span class="p">;</span> <span class="k">do</span> cat <span class="nv">$i</span> >> ../exemple.fr-global.log<span class="p">;</span> <span class="k">done</span>
nils@shell2:~/tmp/exemple/access_logs$ grep POST ../exemple.fr-global.log <span class="p">|</span> grep -v <span class="s2">"/wp-cron.php\\|/wp-login.php\\|/xmlrpc.php"</span> <span class="p">|</span> awk <span class="s1">'{frequencies[$7]++;} END {for (field in frequencies) printf "%s\\t%d" , field , frequencies[field];}'</span> <span class="p">|</span> sort -nr -k <span class="m">2</span>,2 <span class="p">|</span> head -50
/hostdata4.php <span class="m">24322</span>
/wp-includes/js/tinymce/dir.php <span class="m">10057</span>
/_index.php <span class="m">1373</span>
/wp-admin/admin-ajax.php <span class="m">762</span>
/wp-content/izodltnu.php <span class="m">753</span>
/wp-content/vgmq.php <span class="m">705</span>
/wp-content/zpamh.php <span class="m">699</span>
/wp-content/fkjzhl.php <span class="m">654</span>
/wp-content/ulimzaggf.php <span class="m">645</span>
/wp-content/jbrv.php <span class="m">642</span>
/wp-content/omfxde.php <span class="m">629</span>
/wp-content/ohvvdgk.php <span class="m">625</span>
/wp-content/pwemtiqeb.php <span class="m">614</span>
/wp-content/mmgi.php <span class="m">613</span>
/wp-content/nrzekbal.php <span class="m">609</span>
/wp-content/bvcomjjaf.php <span class="m">605</span>
/wp-content/yuflla.php <span class="m">601</span>
/wp-content/mybkl.php <span class="m">598</span>
/wp-content/mbsrd.php <span class="m">594</span>
/wp-content/vipmpnjen.php <span class="m">578</span>
/wp-content/ssauz.php <span class="m">542</span>
/wp-content/common.php <span class="m">378</span>
/wp-content/gruk.php <span class="m">313</span>
/wp-content/db_model.php <span class="m">133</span>
/wp-content/nwjtirmy.php <span class="m">96</span>
/wp-content/nrkg/wzvzrtnqh.php <span class="m">95</span>
/wp-content/iari.php <span class="m">89</span>
/wp-content/from.php <span class="m">77</span>
/wp-admin/admin.php?page<span class="o">=</span>stats<span class="p">&</span>noheader<span class="p">&</span><span class="nv">chart</span><span class="o">=</span>flot-stats-data <span class="m">72</span>
/wp-admin/admin-ajax.php?action<span class="o">=</span>wp_ewwwio_async_optimize_media<span class="p">&</span><span class="nv">nonce</span><span class="o">=</span>c8aa5f3464 <span class="m">24</span>
/wp-content/plugins/thank-me-later/lib/start37.php <span class="m">23</span>
/wp-admin/admin-ajax.php?action<span class="o">=</span>wordfence_testAjax <span class="m">23</span>
/wp-content/uploads/2015/07/lib.php <span class="m">19</span>
/wp-includes/Requests/Exception/HTTP/431.php <span class="m">19</span>
/wp-includes/customize/db2.php <span class="m">17</span>
/wp-includes/js/tinymce/f53585.php <span class="m">13</span>
/wp-admin/meta/output.php <span class="m">12</span>
/post.php <span class="m">11</span>
/wp-admin/post.php <span class="m">9</span>
/wp-admin/network/plugin-editor.php <span class="m">9</span>
/wp-admin/admin-ajax.php?action<span class="o">=</span>wp_ewwwio_async_optimize_media<span class="p">&</span><span class="nv">nonce</span><span class="o">=</span>50967874b9 <span class="m">8</span>
/ <span class="m">7</span>
/wp-comments-post.php?for<span class="o">=</span>jetpack <span class="m">6</span>
/wp-content/egatl/wnxavysc.php <span class="m">5</span>
/3cdb6f452a.php?test_url<span class="o">=</span><span class="nb">true</span> <span class="m">5</span>
/wp-content/sad.func.php <span class="m">4</span>
/addfavorites.php <span class="m">4</span>
/palaute.php <span class="m">4</span>
/wp-content/rss_feeder.class.php <span class="m">4</span>
/wp-content/hook-filters.php <span class="m">4</span>
</code></pre></div>
<p>Afin d'éviter que ce blog tire en longueur juste pour des lignes de requête POST, je me suis limité au 50 premières lignes. Rien de plus que dans les autres recherche, on note comme avant que l'intrus a pris ses aises dans les répertoires <em>/wp-content/</em> et <em>/wp-includes/</em>. L'intérêt de faire cette recherche est de faire remonter certaines requêtes qui seraient passées sous les radars si j'avais continué fichier par fichier.</p>
<h3>Résultat des courses</h3>
<p>J'ai donc repéré comme ça un certain nombre de fichiers qui n'ont rien à voir avec le contenu réel du blog, et que je vais pouvoir supprimer sans regret. Cela n'est hélas pas suffisant, car rien n'empêche un intrus d'insérer des fichiers qui ne sont presque pas accédés. Dans un prochain billet, j'espère donc comparer au niveau fichier l'export de ce blog avec une archive saine.</p>
<p>Vous avez aimé cet article ? Alors partagez-le sur les réseaux sociaux ! Si en plus vous avez des remarques, ou des propositions d'améliorations, n'hésitez pas : les commentaires sont là pour ça !</p>
<p>Crédit photo : <a href="https://www.flickr.com/photos/msvg/5143096005/" title=""A">Michael Gil - A Needle in a Hay Stack</a>.</p>PHP Malware Finder : gestion des listes blanches2017-04-18T12:00:00+02:002017-04-18T12:00:00+02:00Nils Ratuszniktag:blog.anotherhomepage.org,2017-04-18:/post/2017/04/18/php-malware-finder-gestion-des-listes-blanches/<p><img alt=""Lime" src="https://blog.anotherhomepage.org/public/lime_and_list.jpg" title=""Lime"></p>
<p>Rappelez-vous : dans <a href="/post/php-malware-finder-detecteur-dintrusion-php">le billet précédent</a>, nous avons découvert PHP Malware Finder. Aujourd'hui, allons plus loin et passons à la gestion des listes blanches ! Pour cela, prenons l'exemple d'un blog fonctionnant sous Wordpress. Cette gestion des listes blanches se fera en trois étapes :</p>
<ul>
<li>tout d'abord, il s'agit de faire un état …</li></ul><p><img alt=""Lime" src="https://blog.anotherhomepage.org/public/lime_and_list.jpg" title=""Lime"></p>
<p>Rappelez-vous : dans <a href="/post/php-malware-finder-detecteur-dintrusion-php">le billet précédent</a>, nous avons découvert PHP Malware Finder. Aujourd'hui, allons plus loin et passons à la gestion des listes blanches ! Pour cela, prenons l'exemple d'un blog fonctionnant sous Wordpress. Cette gestion des listes blanches se fera en trois étapes :</p>
<ul>
<li>tout d'abord, il s'agit de faire un état de l'existant, en exécutant PHP Malware Finder et en observant des faux-positifs ;</li>
<li>ensuite, la deuxième étape sera de comprendre le fonctionnement des règles et des listes blanches ;</li>
<li>enfin, la troisième étape consistera à générer la liste blanche et à l'intégrer dans les règles existantes.</li>
</ul>
<p>Et pour finir, en bonus, un script de génération de liste blanche sera abordé. Au moment de l'écriture de cet article, la dernière version de Wordpress est la 4.7.3. La dernière version de PHP Malware Finder est la 0.3.4.</p>
<h3>Exécution de PHP Malware Finder sur un site de test</h3>
<p>Nous allons donc commencer par récupérer une archive de Wordpress directement sur le site officiel, afin de s'assurer qu'elle est saine :</p>
<div class="highlight"><pre><span></span><code>nils@Dalaran:~/tmp$ wget https://wordpress.org/wordpress-4.7.3.tar.gz
--2017-04-11 <span class="m">21</span>:54:31-- https://wordpress.org/wordpress-4.7.3.tar.gz
Résolution de wordpress.org… <span class="m">66</span>.155.40.250, <span class="m">66</span>.155.40.249
Connexion à wordpress.org<span class="p">|</span><span class="m">66</span>.155.40.250<span class="p">|</span>:443… connecté.
requête HTTP transmise, en attente de la réponse… <span class="m">200</span> OK
Taille : <span class="m">8008833</span> <span class="o">(</span><span class="m">7</span>,6M<span class="o">)</span> <span class="o">[</span>application/octet-stream<span class="o">]</span>
Sauvegarde en : « wordpress-4.7.3.tar.gz »
wordpress-4.7.3.tar.gz <span class="m">100</span>%<span class="o">[=========================================================================================================================================</span>><span class="o">]</span> <span class="m">7</span>,64M <span class="m">3</span>,27MB/s ds <span class="m">2</span>,3s
<span class="m">2017</span>-04-11 <span class="m">21</span>:54:34 <span class="o">(</span><span class="m">3</span>,27 MB/s<span class="o">)</span> — « wordpress-4.7.3.tar.gz » sauvegardé <span class="o">[</span><span class="m">8008833</span>/8008833<span class="o">]</span>
nils@Dalaran:~/tmp$ tar -xzf wordpress-4.7.3.tar.gz
</code></pre></div>
<p>Puis, décompressons-la et scannons son contenu :</p>
<div class="highlight"><pre><span></span><code>nils@Dalaran:~/tmp$ <span class="nb">cd</span> wordpress
nils@Dalaran:~/tmp/wordpress$ phpmalwarefinder .
ObfuscatedPhp ./wp-admin/includes/class-ftp.php
DodgyStrings ./wp-admin/includes/ajax-actions.php
ObfuscatedPhp ./wp-admin/includes/class-wp-plugins-list-table.php
DodgyPhp ./wp-admin/includes/schema.php
ObfuscatedPhp ./wp-admin/includes/media.php
DodgyStrings ./wp-admin/includes/template.php
ObfuscatedPhp ./wp-admin/includes/template.php
DodgyStrings ./wp-admin/includes/upgrade.php
ObfuscatedPhp ./wp-includes/bookmark-template.php
DodgyPhp ./wp-includes/class-pop3.php
DodgyStrings ./wp-includes/class-phpmailer.php
DodgyPhp ./wp-includes/class-phpmailer.php
ObfuscatedPhp ./wp-includes/class-wp-meta-query.php
ObfuscatedPhp ./wp-includes/class-wp-tax-query.php
DodgyStrings ./wp-includes/class-wp-query.php
DodgyStrings ./wp-includes/comment.php
ObfuscatedPhp ./wp-includes/date.php
DodgyStrings ./wp-includes/deprecated.php
ObfuscatedPhp ./wp-includes/deprecated.php
DodgyStrings ./wp-includes/functions.php
DodgyPhp ./wp-includes/functions.php
DangerousPhp ./wp-includes/functions.php
DodgyStrings ./wp-includes/formatting.php
ObfuscatedPhp ./wp-includes/IXR/class-IXR-date.php
DodgyPhp ./wp-includes/load.php
DodgyStrings ./wp-includes/media.php
ObfuscatedPhp ./wp-includes/post-template.php
ObfuscatedPhp ./wp-includes/js/tinymce/tinymce.min.js
DodgyStrings ./wp-includes/post.php
ObfuscatedPhp ./wp-includes/SimplePie/Parse/Date.php
</code></pre></div>
<p>Certains fichiers sont présentés comme malveillants, mais il n'en est rien : ce sont donc des faux-positifs. Il faut donc les mettre en liste blanche, mais avant, il convient de comprendre où sont les signatures et cette liste blanche.</p>
<h3>Signatures et listes blanches</h3>
<p>PHP Malware Finder est basé sur YARA, un outil qui recherche des fichiers selon certains critères, comme la présence d'une chaîne de caractères, ou une expression rationnelle. Les signatures sont définies dans les fichiers <em>asp.yar</em>, <em>common.yar</em> et <em>php.yar</em>. On comprend alors qu'un fichier est dédié aux fichiers ASP, un autre aux fichiers PHP, et le troisième regroupe des signatures communes aux deux langages.</p>
<p>Passons ensuite à la lecture des fichiers <em>asp.yar</em> et <em>php.yar</em> : on voit assez vite que pour qu'un fichier soit reconnu comme malveillant, il doit non seulement remplir certaines conditions (les règles définies), mais il doit aussi ne pas remplir les conditions des fichiers de liste blanche.</p>
<p>En fait, les fichiers de liste blanche sontdes sommes de contrôle SHA1 de la taille des fichiers considérés comme faux-positifs. Allons maintenant à la création du fichier contenant ces informations !</p>
<h3>Création du fichier de liste blanche</h3>
<p>Pour ajouter nos faux-positifs en liste blanche, nous allons avoir besoin de deux choses :</p>
<ul>
<li>d'abord, python-yara, une bibliothèque qui permet d'accéder à yara depuis Python ;</li>
<li>ensuite un script, generate_whitelist.py, qui se trouve être écrit... en Python.</li>
</ul>
<p>Ce script est disponible dans le répertoire utils de PHP Malware Finder, ou bien dans <em>\${PREFIX}/share/php-malware-finder/utils/</em> s'il est installé depuis pkgsrc (<em>\${PREFIX}</em> dépendant de l'installation de pkgsrc).</p>
<p>Testons donc ce script sur notre répertoire wordpress :</p>
<div class="highlight"><pre><span></span><code>nils@Dalaran:~/tmp/php-malware-finder/php-malware-finder/utils$ /opt/pkg/bin/python2.7 ./generate_whitelist.py ma_liste_blanche ~/tmp/wordpress
</code></pre></div>
<p>Le résultat est alors ressemblant à celui-ci :</p>
<div class="highlight"><pre><span></span><code>import <span class="s2">"hash"</span>
private rule maListeblanche
<span class="o">{</span>
condition:
/* maListeblanche */
hash.sha1<span class="o">(</span><span class="m">0</span>, filesize<span class="o">)</span> <span class="o">==</span> <span class="s2">"12a18329072bed94b6f9c4d9f16d7a079ca64655"</span> or // /Users/nils/tmp/wordpress/wp-admin/includes/ajax-actions.php
hash.sha1<span class="o">(</span><span class="m">0</span>, filesize<span class="o">)</span> <span class="o">==</span> <span class="s2">"6bccf04c8b46c8d6cdf79db8b509f4b76689f3bf"</span> or // /Users/nils/tmp/wordpress/wp-admin/includes/class-ftp.php
hash.sha1<span class="o">(</span><span class="m">0</span>, filesize<span class="o">)</span> <span class="o">==</span> <span class="s2">"aa6a12a0325056b9649f58f8072fa02a1e264551"</span> or // /Users/nils/tmp/wordpress/wp-admin/includes/class-wp-plugins-list-table.php
hash.sha1<span class="o">(</span><span class="m">0</span>, filesize<span class="o">)</span> <span class="o">==</span> <span class="s2">"3e73204644f0ce7b0971aad885fdcbcabba629fc"</span> or // /Users/nils/tmp/wordpress/wp-admin/includes/media.php
hash.sha1<span class="o">(</span><span class="m">0</span>, filesize<span class="o">)</span> <span class="o">==</span> <span class="s2">"81b1ae432ba765a43c6d81fb6d6c35ce72efd0e8"</span> or // /Users/nils/tmp/wordpress/wp-admin/includes/schema.php
hash.sha1<span class="o">(</span><span class="m">0</span>, filesize<span class="o">)</span> <span class="o">==</span> <span class="s2">"2ef50e790fdd42daa8ccd64d4c7c4be75d21742d"</span> or // /Users/nils/tmp/wordpress/wp-admin/includes/template.php
hash.sha1<span class="o">(</span><span class="m">0</span>, filesize<span class="o">)</span> <span class="o">==</span> <span class="s2">"9835d10a7561deeef1f8381da065b4b45d7f2662"</span> or // /Users/nils/tmp/wordpress/wp-admin/includes/upgrade.php
hash.sha1<span class="o">(</span><span class="m">0</span>, filesize<span class="o">)</span> <span class="o">==</span> <span class="s2">"b92aefa2917fc319ca7ceab092e183cafc651a6d"</span> or // /Users/nils/tmp/wordpress/wp-includes/bookmark-template.php
hash.sha1<span class="o">(</span><span class="m">0</span>, filesize<span class="o">)</span> <span class="o">==</span> <span class="s2">"cb0c5a355409d807202bbf52749a3e74a9967a6a"</span> or // /Users/nils/tmp/wordpress/wp-includes/class-phpmailer.php
hash.sha1<span class="o">(</span><span class="m">0</span>, filesize<span class="o">)</span> <span class="o">==</span> <span class="s2">"e4f0694bc96f99d5e30201171a3e7fc86e9e5ae4"</span> or // /Users/nils/tmp/wordpress/wp-includes/class-pop3.php
hash.sha1<span class="o">(</span><span class="m">0</span>, filesize<span class="o">)</span> <span class="o">==</span> <span class="s2">"c06a15f4869c5459a782b714572eacea5c82d570"</span> or // /Users/nils/tmp/wordpress/wp-includes/class-wp-meta-query.php
hash.sha1<span class="o">(</span><span class="m">0</span>, filesize<span class="o">)</span> <span class="o">==</span> <span class="s2">"72dbc1d4f2bbc8efdcdd834ecaf3771cbf17f64e"</span> or // /Users/nils/tmp/wordpress/wp-includes/class-wp-query.php
hash.sha1<span class="o">(</span><span class="m">0</span>, filesize<span class="o">)</span> <span class="o">==</span> <span class="s2">"348c3a60d99768041be690b65b008628f53badb7"</span> or // /Users/nils/tmp/wordpress/wp-includes/class-wp-tax-query.php
hash.sha1<span class="o">(</span><span class="m">0</span>, filesize<span class="o">)</span> <span class="o">==</span> <span class="s2">"0aab95245b9668f954151f4312b678fb0ee798cf"</span> or // /Users/nils/tmp/wordpress/wp-includes/comment.php
hash.sha1<span class="o">(</span><span class="m">0</span>, filesize<span class="o">)</span> <span class="o">==</span> <span class="s2">"c8c9182aa25fb92ca91fcc96c3419847acdcf6e0"</span> or // /Users/nils/tmp/wordpress/wp-includes/date.php
hash.sha1<span class="o">(</span><span class="m">0</span>, filesize<span class="o">)</span> <span class="o">==</span> <span class="s2">"5877695771fbe7a5667f4a06f4d897a37ef3fceb"</span> or // /Users/nils/tmp/wordpress/wp-includes/deprecated.php
hash.sha1<span class="o">(</span><span class="m">0</span>, filesize<span class="o">)</span> <span class="o">==</span> <span class="s2">"806d2872676ea22e0a6fa6b32fbd4652298023ee"</span> or // /Users/nils/tmp/wordpress/wp-includes/formatting.php
hash.sha1<span class="o">(</span><span class="m">0</span>, filesize<span class="o">)</span> <span class="o">==</span> <span class="s2">"3083b9a58e76d42455935811a457f29f57620145"</span> or // /Users/nils/tmp/wordpress/wp-includes/functions.php
hash.sha1<span class="o">(</span><span class="m">0</span>, filesize<span class="o">)</span> <span class="o">==</span> <span class="s2">"f53f80c4ee7446f0b605443b6d2f05acd8064d13"</span> or // /Users/nils/tmp/wordpress/wp-includes/load.php
hash.sha1<span class="o">(</span><span class="m">0</span>, filesize<span class="o">)</span> <span class="o">==</span> <span class="s2">"bea5ea598f537e7acb20b77a1421f819c0a9ec75"</span> or // /Users/nils/tmp/wordpress/wp-includes/media.php
hash.sha1<span class="o">(</span><span class="m">0</span>, filesize<span class="o">)</span> <span class="o">==</span> <span class="s2">"abcf1a0801694db4774cd2abb29b5392e10dd632"</span> or // /Users/nils/tmp/wordpress/wp-includes/post-template.php
hash.sha1<span class="o">(</span><span class="m">0</span>, filesize<span class="o">)</span> <span class="o">==</span> <span class="s2">"5ddc1e5c5c6302211b1aecbf930f76417b65d678"</span> or // /Users/nils/tmp/wordpress/wp-includes/post.php
hash.sha1<span class="o">(</span><span class="m">0</span>, filesize<span class="o">)</span> <span class="o">==</span> <span class="s2">"040ef40d245242723de200e494a27545ea0b121b"</span> or // /Users/nils/tmp/wordpress/wp-includes/IXR/class-IXR-date.php
hash.sha1<span class="o">(</span><span class="m">0</span>, filesize<span class="o">)</span> <span class="o">==</span> <span class="s2">"086986cdf03ede58494034661d38c4842af38fe3"</span> // /Users/nils/tmp/wordpress/wp-includes/SimplePie/Parse/Date.php
<span class="o">}</span>
</code></pre></div>
<p>Il faut ensuite ajouter la règle générée à l'instant aux listes blanches déjà présentes. Pour aller vite, on peut directement éditer le fichier <em>whitelist.yar</em> et ajouter notre règle juste avant la dernière (IsWhitelisted). Il ne faut donc pas oublier d'ajouter dans cette dernière règle celle qu'on vient de créer. Dans mon cas, la dernière règle ressemble à cela :</p>
<div class="highlight"><pre><span></span><code>private rule IsWhitelisted
<span class="o">{</span>
condition:
Symfony or
Wordpress or
Prestashop or
Magento or
Magento2 or
Drupal or
Roundcube or
Concrete5 or
Dotclear or
Owncloud or
Phpmyadmin or
Misc or
maListeblanche
<span class="o">}</span>
</code></pre></div>
<p>Vérifions maintenant que la liste blanche est bien à jour et assurons-nous qu'il n'y a plus de faux-positif dans notre répertoire :</p>
<div class="highlight"><pre><span></span><code>nils@Dalaran:~/tmp/wordpress$ phpmalwarefinder ./
ObfuscatedPhp .//wp-includes/js/tinymce/tinymce.min.js
</code></pre></div>
<p>Et là, c'est le drame. Mais pourquoi ? En fait, c'est parce que le script utilisé à l'instant ne prend en compte que les fichiers PHP. Cela peut être une idée d'amélioration pour une version future.</p>
<h3>Création facile de liste blanche pour divers logiciels PHP</h3>
<p>Il existe un autre script fort utile : mass_whitelist.py. Son but est de faciliter la création de liste blanche pour des applications PHP connues, cela va de Wordpress à Drupal en passant par PHPMyAdmin. Il suffit de lui donner en argument le nom de l'application, l'URL de téléchargement (en remplaçant le numéro de version avec <strong><em>version</em></strong>), ainsi que les numéros de version mineurs et majeurs à rechercher.</p>
<p>Ce script va alors rechercher toutes les versions de l'application, les télécharger, et afficher une liste blanche les prenant toutes en compte. Par exemple, pour Wordpress :</p>
<div class="highlight"><pre><span></span><code>nils@Dalaran:~/tmp/php-malware-finder/php-malware-finder/utils$ /opt/pkg/bin/python2.7 mass_whitelist.py wordpress https://wordpress.org/wordpress-__version__.tar.gz <span class="m">4</span> <span class="m">7</span> <span class="m">3</span> <span class="p">|</span> tee -a wordpress.yar
</code></pre></div>
<p>Le fichier de résultat se nomme donc <em>wordpress.yar</em>. Il suffira alors de le copier dans le répertoire de règles (et écraser le précédent) afin de le prendre en compte. Attention, car ce script est long, très long !</p>
<p>Vous avez aimé cet article ? Alors partagez-le sur les réseaux sociaux ! Si en plus vous avez des remarques, ou des propositions d'améliorations, n'hésitez pas : les commentaires sont là pour ça !</p>
<p><em>Crédit Photo : List_84 - <a href="https://www.flickr.com/photos/liste1/5008852993/in/album-72157625921973253/" title=""Lime">Lime & List</a></em></p>PHP Malware Finder : détecteur d'intrusion sur site PHP2017-04-11T09:30:00+02:002017-04-11T09:30:00+02:00Nils Ratuszniktag:blog.anotherhomepage.org,2017-04-11:/post/2017/04/11/php-malware-finder-detecteur-dintrusion-php/<p><img alt=""Dans" src="https://blog.anotherhomepage.org/public/dansmaloupe2.jpg">Lors des RMLL de Beauvais en 2015, j'ai eu l'occasion de voir une <a href="https://2015.rmll.info/analyse-forensic-d-un-serveur-web-linux" title=""Analyse">conférence</a> présentant au passage un outil fort sympathique nommé PHP Malware Finder (<a href="https://github.com/nbs-system/php-malware-finder" title=""PHP">site web</a>). Le but de ce script est de détecter du code PHP qui semble obfusqué ou malveillant, voire même des fonctions trouvées généralement dans …</p><p><img alt=""Dans" src="https://blog.anotherhomepage.org/public/dansmaloupe2.jpg">Lors des RMLL de Beauvais en 2015, j'ai eu l'occasion de voir une <a href="https://2015.rmll.info/analyse-forensic-d-un-serveur-web-linux" title=""Analyse">conférence</a> présentant au passage un outil fort sympathique nommé PHP Malware Finder (<a href="https://github.com/nbs-system/php-malware-finder" title=""PHP">site web</a>). Le but de ce script est de détecter du code PHP qui semble obfusqué ou malveillant, voire même des fonctions trouvées généralement dans des malwares ou des webshells. On trouve, sur la page du projet, une liste (non exhaustive) des malwares qu'il est capable de trouver.</p>
<p>PHP Malware Finder scanne un répertoire pour trouver les malwares, on peut donc choisir de l'utiliser directement sur son serveur, soit depuis son ordinateur en ayant au préalable copié les fichiers de son site. La première option nécessitera les droits administrateurs pour les dépendances, il vaut mieux donc choisir la deuxième option pour la découverte de cet outil, et aussi parce qu'il est assez gourmand en accès disque.</p>
<h3>Installer PHP Malware Finder</h3>
<p>Son installation et utilisation sont simples, pourvu que <a href="https://virustotal.github.io/yara/" title=""The">YARA</a> soit installé. Sur une distrbution Linux classique, une fois YARA installé, il suffit d'installer PHP Malware Finder en clonant le dépôt Github :</p>
<div class="highlight"><pre><span></span><code>git clone https://github.com/nbs-system/php-malware-finder.git
</code></pre></div>
<p>Le script <em>phpmalwarefinder</em> se trouve dans le répertoire <em>php-malware-finder/php-malware-finder/</em>.</p>
<p>Il est par contre possible, sur un système NetBSD ou macOS, de l'installer facilement via pkgsrc-wip :</p>
<div class="highlight"><pre><span></span><code>cd /usr/pkgsrc/wip/
make package-install
</code></pre></div>
<p>Avec cette manière, PHP Malware Finder est disponible directement dans \$PATH :)</p>
<h3>Utilisation</h3>
<p>Il suffit maintenant de le lancer en spécifiant un endroit où il y a des pages PHP :</p>
<div class="highlight"><pre><span></span><code>$ phpmalwarefinder /chemin/vers/ses/pages/
</code></pre></div>
<p>Si certains fichiers semblent réagir aux signatures, alors le script affichera le type de problème ainsi que le chemin du fichier. Sinon, il n'affiche rien. Bien sûr, d'autres options sont disponibles, et un résumé de celles-ci est disponible via l'option -h :</p>
<div class="highlight"><pre><span></span><code>$ phpmalwarefinder -h
Usage phpmalwarefinder <span class="o">[</span>-cfhtvl<span class="o">]</span> <file<span class="p">|</span>folder> ...
-c Optional path to a configuration file
-f Fast mode
-h Show this <span class="nb">help</span> message
-t Specify the number of threads to use <span class="o">(</span><span class="m">8</span> by default<span class="o">)</span>
-v Verbose mode
-l Set language <span class="o">(</span><span class="s1">'asp'</span>, <span class="s1">'php'</span><span class="o">)</span>
-L Check long lines
-u update rules
</code></pre></div>
<p>Par défaut, PHP Malware Finder va chercher ses signatures dans son répertoire (si utilisé depuis un clone du dépôt git), mais le paquet pkgsrc va les chercher dans <em>/usr/pkg/etc/phpmalwarefinder/</em> (ou <em>/opt/pkg/</em> pour macOS). Il est possible de préciser ses propres signatures via l'option -c.</p>
<p>D'autres options sont aussi très intéressantes, comme -f (pour accélérer le scan), ou -t qui permet de limiter le nombre de threads à utiliser en parallèle. Cela peut s'avérer très pratique dans le cas où le scan prend du temps et on veut continuer à utiliser sa machine pendant ce temps. Au passage, une recommandation : il vaut mieux éviter de lancer PHP Malware Finder directement sur son serveur, il a tendance à être assez gourmand en ressources !</p>
<p>Si vous aimez cet article, partagez-le sur les réseaux sociaux. Si vous avez des remarques, ou des propositions d'améliorations, n'hésitez pas : les commentaires sont là pour ça !</p>
<p><em>Crédit photo : Olivier Penet - <a href="https://www.flickr.com/photos/115750956@N06/14884520728/" title=""Dans">Dans ma loupe-2</a></em></p>Nmap : détection et récupération d'information sur Wordpress2017-03-20T10:00:00+01:002017-03-20T10:00:00+01:00Nils Ratuszniktag:blog.anotherhomepage.org,2017-03-20:/post/2017/03/20/nmap-detection-et-recuperation-d-information-sur-wordpress/<p>Début mars 2017, le moteur de blog Wordpress a fait l'objet d'une nouvelle mise à jour, <a href="https://wordpress.org/news/2017/03/wordpress-4-7-3-security-and-maintenance-release/" title=""WordPress">la version 4.7.3</a>. Cette mise à jour revêt une certaine importance, puisqu'elle corrige 5 vulnérabilités !</p>
<p>Vérifier sur une installation de Wordpress que la dernière version est installée est assez simple à partir …</p><p>Début mars 2017, le moteur de blog Wordpress a fait l'objet d'une nouvelle mise à jour, <a href="https://wordpress.org/news/2017/03/wordpress-4-7-3-security-and-maintenance-release/" title=""WordPress">la version 4.7.3</a>. Cette mise à jour revêt une certaine importance, puisqu'elle corrige 5 vulnérabilités !</p>
<p>Vérifier sur une installation de Wordpress que la dernière version est installée est assez simple à partir du moment où on peut se connecter à l'interface d'administration. Il se peut toutefois que cela ne soit pas envisageable : nombre d'installations, disponibilité des identifiants de connexion (pour des raisons d'organisation). Du fait de la verbosité par défaut de Wordpress, il est possible d'obtenir des informations sans posséder d'identifiants de connexion.</p>
<p>Pour réaliser cette vérification, faisons de nouveau appel à <a href="https://nmap.org/" title=""Nmap:">Nmap</a> ! En effet, grâce à la disponibilité du langage de script NSE, il est possible de chercher plusieurs informations, comme la version. De manière générale, on peut voir la liste des scripts officiellement disponibles <a href="https://nmap.org/nsedoc/index.html" title=""NSEDoc">sur une page dédiée</a>. Dans le cas qui nous intéresse, on notera la présence d'un dépôt contenant <a href="https://github.com/peter-hackertarget/nmap-nse-scripts" title="nmap-nse-scripts">des scripts NSE personnalisés concernant Wordpress</a>.</p>
<p>L'installation de scripts NSE dans Nmap est assez facile, il suffit de localiser les scripts existant et de copier les siens au même endroit. Par exemple, sur une Fedora 25 :</p>
<div class="highlight"><pre><span></span><code><span class="o">[</span><span class="n">nils@fedora-workstation ~</span><span class="o">]</span><span class="err">$</span><span class="w"> </span><span class="n">git</span><span class="w"> </span><span class="n">clone</span><span class="w"> </span><span class="nl">https</span><span class="p">:</span><span class="o">//</span><span class="n">github</span><span class="p">.</span><span class="n">com</span><span class="o">/</span><span class="n">peter</span><span class="o">-</span><span class="n">hackertarget</span><span class="o">/</span><span class="n">nmap</span><span class="o">-</span><span class="n">nse</span><span class="o">-</span><span class="n">scripts</span><span class="p">.</span><span class="n">git</span><span class="w"></span>
<span class="n">Clonage</span><span class="w"> </span><span class="n">dans</span><span class="w"> </span><span class="s1">'nmap-nse-scripts'</span><span class="p">...</span><span class="w"></span>
<span class="nl">remote</span><span class="p">:</span><span class="w"> </span><span class="n">Counting</span><span class="w"> </span><span class="nl">objects</span><span class="p">:</span><span class="w"> </span><span class="mi">12</span><span class="p">,</span><span class="w"> </span><span class="n">done</span><span class="p">.</span><span class="w"></span>
<span class="nl">remote</span><span class="p">:</span><span class="w"> </span><span class="n">Total</span><span class="w"> </span><span class="mi">12</span><span class="w"> </span><span class="p">(</span><span class="n">delta</span><span class="w"> </span><span class="mi">0</span><span class="p">),</span><span class="w"> </span><span class="n">reused</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">(</span><span class="n">delta</span><span class="w"> </span><span class="mi">0</span><span class="p">),</span><span class="w"> </span><span class="n">pack</span><span class="o">-</span><span class="n">reused</span><span class="w"> </span><span class="mi">12</span><span class="w"></span>
<span class="n">Dépaquetage</span><span class="w"> </span><span class="n">des</span><span class="w"> </span><span class="nl">objets</span><span class="p">:</span><span class="w"> </span><span class="mi">100</span><span class="o">%</span><span class="w"> </span><span class="p">(</span><span class="mi">12</span><span class="o">/</span><span class="mi">12</span><span class="p">),</span><span class="w"> </span><span class="n">fait</span><span class="p">.</span><span class="w"></span>
<span class="n">Vérification</span><span class="w"> </span><span class="n">de</span><span class="w"> </span><span class="n">la</span><span class="w"> </span><span class="n">connectivité</span><span class="p">...</span><span class="w"> </span><span class="n">fait</span><span class="p">.</span><span class="w"></span>
<span class="o">[</span><span class="n">nils@fedora-workstation ~</span><span class="o">]</span><span class="err">$</span><span class="w"> </span><span class="n">cd</span><span class="w"> </span><span class="n">nmap</span><span class="o">-</span><span class="n">nse</span><span class="o">-</span><span class="n">scripts</span><span class="o">/</span><span class="w"></span>
<span class="o">[</span><span class="n">nils@fedora-workstation nmap-nse-scripts</span><span class="o">]</span><span class="err">$</span><span class="w"> </span><span class="n">sudo</span><span class="w"> </span><span class="n">cp</span><span class="w"> </span><span class="o">-</span><span class="n">v</span><span class="w"> </span><span class="n">wp</span><span class="o">-</span><span class="n">themes</span><span class="p">.</span><span class="n">lst</span><span class="w"> </span><span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">share</span><span class="o">/</span><span class="n">nmap</span><span class="o">/</span><span class="n">nselib</span><span class="o">/</span><span class="w"></span>
<span class="s1">'wp-themes.lst'</span><span class="w"> </span><span class="o">-></span><span class="w"> </span><span class="s1">'/usr/share/nmap/nselib/wp-themes.lst'</span><span class="w"></span>
<span class="o">[</span><span class="n">nils@fedora-workstation nmap-nse-scripts</span><span class="o">]</span><span class="err">$</span><span class="w"> </span><span class="n">sudo</span><span class="w"> </span><span class="n">cp</span><span class="w"> </span><span class="o">-</span><span class="n">v</span><span class="w"> </span><span class="o">*</span><span class="p">.</span><span class="n">nse</span><span class="w"> </span><span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">share</span><span class="o">/</span><span class="n">nmap</span><span class="o">/</span><span class="n">scripts</span><span class="o">/</span><span class="w"></span>
<span class="s1">'hostmap-hackertarget.nse'</span><span class="w"> </span><span class="o">-></span><span class="w"> </span><span class="s1">'/usr/share/nmap/scripts/hostmap-hackertarget.nse'</span><span class="w"></span>
<span class="s1">'http-wordpress-info.nse'</span><span class="w"> </span><span class="o">-></span><span class="w"> </span><span class="s1">'/usr/share/nmap/scripts/http-wordpress-info.nse'</span><span class="w"></span>
<span class="s1">'http-wordpress-plugins.nse'</span><span class="w"> </span><span class="o">-></span><span class="w"> </span><span class="s1">'/usr/share/nmap/scripts/http-wordpress-plugins.nse'</span><span class="w"></span>
<span class="s1">'http-wordpress-themes.nse'</span><span class="w"> </span><span class="o">-></span><span class="w"> </span><span class="s1">'/usr/share/nmap/scripts/http-wordpress-themes.nse'</span><span class="w"></span>
</code></pre></div>
<p>Lançons alors un premier scan :</p>
<div class="highlight"><pre><span></span><code><span class="o">[</span><span class="n">nils@fedora-workstation ~</span><span class="o">]</span><span class="err">$</span><span class="w"> </span><span class="n">sudo</span><span class="w"> </span><span class="n">nmap</span><span class="w"> </span><span class="o">-</span><span class="n">sV</span><span class="w"> </span><span class="o">-</span><span class="n">p80</span><span class="p">,</span><span class="mi">443</span><span class="w"> </span><span class="o">--</span><span class="n">script</span><span class="w"> </span><span class="n">http</span><span class="o">-</span><span class="n">wordpress</span><span class="o">-</span><span class="n">info</span><span class="w"> </span><span class="n">exemple</span><span class="p">.</span><span class="n">fr</span><span class="w"></span>
<span class="n">Starting</span><span class="w"> </span><span class="n">Nmap</span><span class="w"> </span><span class="mf">7.40</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="nl">https</span><span class="p">:</span><span class="o">//</span><span class="n">nmap</span><span class="p">.</span><span class="n">org</span><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="k">at</span><span class="w"> </span><span class="mi">2017</span><span class="o">-</span><span class="mi">03</span><span class="o">-</span><span class="mi">20</span><span class="w"> </span><span class="mi">09</span><span class="err">:</span><span class="mi">46</span><span class="w"> </span><span class="n">CET</span><span class="w"></span>
<span class="n">Nmap</span><span class="w"> </span><span class="n">scan</span><span class="w"> </span><span class="n">report</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">exemple</span><span class="p">.</span><span class="n">fr</span><span class="w"> </span><span class="p">(</span><span class="mf">10.172.46.128</span><span class="p">)</span><span class="w"></span>
<span class="k">Host</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="n">up</span><span class="w"> </span><span class="p">(</span><span class="mf">0.0056</span><span class="n">s</span><span class="w"> </span><span class="n">latency</span><span class="p">).</span><span class="w"></span>
<span class="n">rDNS</span><span class="w"> </span><span class="n">record</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="mf">10.172.46.128</span><span class="err">:</span><span class="w"> </span><span class="n">www</span><span class="p">.</span><span class="n">exemple</span><span class="p">.</span><span class="n">fr</span><span class="w"></span>
<span class="n">PORT</span><span class="w"> </span><span class="k">STATE</span><span class="w"> </span><span class="n">SERVICE</span><span class="w"> </span><span class="n">VERSION</span><span class="w"></span>
<span class="mi">80</span><span class="o">/</span><span class="n">tcp</span><span class="w"> </span><span class="k">open</span><span class="w"> </span><span class="n">http</span><span class="w"> </span><span class="n">Apache</span><span class="w"> </span><span class="n">httpd</span><span class="w"></span>
<span class="o">|</span><span class="n">_http</span><span class="o">-</span><span class="n">server</span><span class="o">-</span><span class="nl">header</span><span class="p">:</span><span class="w"> </span><span class="n">Apache</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">http</span><span class="o">-</span><span class="n">wordpress</span><span class="o">-</span><span class="nl">info</span><span class="p">:</span><span class="w"> </span>
<span class="o">|</span><span class="w"> </span><span class="nl">version</span><span class="p">:</span><span class="w"> </span><span class="n">WordPress</span><span class="w"> </span><span class="mf">4.7.3</span><span class="w"></span>
<span class="o">|</span><span class="n">_</span><span class="w"> </span><span class="nl">theme</span><span class="p">:</span><span class="w"> </span><span class="n">twentyseventeen</span><span class="w"></span>
<span class="mi">443</span><span class="o">/</span><span class="n">tcp</span><span class="w"> </span><span class="k">open</span><span class="w"> </span><span class="n">ssl</span><span class="o">/</span><span class="n">ssl</span><span class="w"> </span><span class="n">Apache</span><span class="w"> </span><span class="n">httpd</span><span class="w"> </span><span class="p">(</span><span class="n">SSL</span><span class="o">-</span><span class="k">only</span><span class="w"> </span><span class="n">mode</span><span class="p">)</span><span class="w"></span>
<span class="o">|</span><span class="n">_http</span><span class="o">-</span><span class="n">server</span><span class="o">-</span><span class="nl">header</span><span class="p">:</span><span class="w"> </span><span class="n">Apache</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">http</span><span class="o">-</span><span class="n">wordpress</span><span class="o">-</span><span class="nl">info</span><span class="p">:</span><span class="w"> </span>
<span class="o">|</span><span class="w"> </span><span class="nl">version</span><span class="p">:</span><span class="w"> </span><span class="n">WordPress</span><span class="w"> </span><span class="mf">4.7.3</span><span class="w"></span>
<span class="o">|</span><span class="n">_</span><span class="w"> </span><span class="nl">theme</span><span class="p">:</span><span class="w"> </span><span class="n">twentyseventeen</span><span class="w"></span>
</code></pre></div>
<p>On dispose donc de la version de Wordpress, et du thème utilisé. Il est possible, grâce au script “http-wordpress-themes”, de chercher plus en profondeurs d'éventuels thèmes supplémentaires installés. Quant à “http-wordpress-plugins”, il permet de rechercher des plugins. Le script d'information est néanmoins assez verbeux. Voici son résultat après l'installation de quelques plugins et thèmes autres :</p>
<div class="highlight"><pre><span></span><code><span class="o">[</span><span class="n">nils@fedora-workstation ~</span><span class="o">]</span><span class="err">$</span><span class="w"> </span><span class="n">sudo</span><span class="w"> </span><span class="n">nmap</span><span class="w"> </span><span class="o">-</span><span class="n">sV</span><span class="w"> </span><span class="o">-</span><span class="n">p80</span><span class="p">,</span><span class="mi">443</span><span class="w"> </span><span class="o">--</span><span class="n">script</span><span class="w"> </span><span class="n">http</span><span class="o">-</span><span class="n">wordpress</span><span class="o">-</span><span class="n">info</span><span class="w"> </span><span class="n">exemple</span><span class="p">.</span><span class="n">fr</span><span class="w"></span>
<span class="n">Starting</span><span class="w"> </span><span class="n">Nmap</span><span class="w"> </span><span class="mf">7.40</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="nl">https</span><span class="p">:</span><span class="o">//</span><span class="n">nmap</span><span class="p">.</span><span class="n">org</span><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="k">at</span><span class="w"> </span><span class="mi">2017</span><span class="o">-</span><span class="mi">03</span><span class="o">-</span><span class="mi">20</span><span class="w"> </span><span class="mi">09</span><span class="err">:</span><span class="mi">53</span><span class="w"> </span><span class="n">CET</span><span class="w"></span>
<span class="n">Nmap</span><span class="w"> </span><span class="n">scan</span><span class="w"> </span><span class="n">report</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">exemple</span><span class="p">.</span><span class="n">fr</span><span class="w"> </span><span class="p">(</span><span class="mf">10.172.46.128</span><span class="p">)</span><span class="w"></span>
<span class="k">Host</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="n">up</span><span class="w"> </span><span class="p">(</span><span class="mf">0.0058</span><span class="n">s</span><span class="w"> </span><span class="n">latency</span><span class="p">).</span><span class="w"></span>
<span class="n">rDNS</span><span class="w"> </span><span class="n">record</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="mf">10.172.46.128</span><span class="err">:</span><span class="w"> </span><span class="n">www</span><span class="p">.</span><span class="n">exemple</span><span class="p">.</span><span class="n">fr</span><span class="w"></span>
<span class="n">PORT</span><span class="w"> </span><span class="k">STATE</span><span class="w"> </span><span class="n">SERVICE</span><span class="w"> </span><span class="n">VERSION</span><span class="w"></span>
<span class="mi">80</span><span class="o">/</span><span class="n">tcp</span><span class="w"> </span><span class="k">open</span><span class="w"> </span><span class="n">http</span><span class="w"> </span><span class="n">Apache</span><span class="w"> </span><span class="n">httpd</span><span class="w"></span>
<span class="o">|</span><span class="n">_http</span><span class="o">-</span><span class="n">server</span><span class="o">-</span><span class="nl">header</span><span class="p">:</span><span class="w"> </span><span class="n">Apache</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">http</span><span class="o">-</span><span class="n">wordpress</span><span class="o">-</span><span class="nl">info</span><span class="p">:</span><span class="w"> </span>
<span class="o">|</span><span class="w"> </span><span class="nl">version</span><span class="p">:</span><span class="w"> </span><span class="n">WordPress</span><span class="w"> </span><span class="mf">4.7.3</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="nl">theme</span><span class="p">:</span><span class="w"> </span><span class="n">fooding</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="nl">plugins</span><span class="p">:</span><span class="w"> </span>
<span class="o">|</span><span class="n">_</span><span class="w"> </span><span class="n">jetpack</span><span class="w"></span>
<span class="mi">443</span><span class="o">/</span><span class="n">tcp</span><span class="w"> </span><span class="k">open</span><span class="w"> </span><span class="n">ssl</span><span class="o">/</span><span class="n">ssl</span><span class="w"> </span><span class="n">Apache</span><span class="w"> </span><span class="n">httpd</span><span class="w"> </span><span class="p">(</span><span class="n">SSL</span><span class="o">-</span><span class="k">only</span><span class="w"> </span><span class="n">mode</span><span class="p">)</span><span class="w"></span>
<span class="o">|</span><span class="n">_http</span><span class="o">-</span><span class="n">server</span><span class="o">-</span><span class="nl">header</span><span class="p">:</span><span class="w"> </span><span class="n">Apache</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">http</span><span class="o">-</span><span class="n">wordpress</span><span class="o">-</span><span class="nl">info</span><span class="p">:</span><span class="w"> </span>
<span class="o">|</span><span class="w"> </span><span class="nl">version</span><span class="p">:</span><span class="w"> </span><span class="n">WordPress</span><span class="w"> </span><span class="mf">4.7.3</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="nl">theme</span><span class="p">:</span><span class="w"> </span><span class="n">fooding</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="nl">plugins</span><span class="p">:</span><span class="w"> </span>
<span class="o">|</span><span class="n">_</span><span class="w"> </span><span class="n">jetpack</span><span class="w"></span>
</code></pre></div>
<p>On remarquera ici la présence du plugin bien connu Jetpack, ainsi que du thème fooding.</p>
<p>Jusqu'à maintenant, on a testé un script est assez gentil, mais d'autres sont plus brutaux, comme “http-wordpress-brute” qui cherche à obtenir un accès via bruteforce de l'interface d'administration. Il convient donc de faire très attention lors de l'utilisation de ces outils.</p>
<p>Des remarques, des propositions d'améliorations ? Où même des exemples intéressants sur certaines configurations de Wordpress ? Les commentaires sont là pour ça !</p>
<h2>Commentaires</h2>
<h3>Le 18/04/2017 15:43 par <a href="http://www.f4b1.com/">f4b1</a></h3>
<p>Pas mal cet outil, je ne connaissais pas mais c'est devenu très vite indispensable pour moi, merci pour la trouvaille !</p>Vérifier les chiffrements disponibles sur un serveur HTTPS avec Nmap2017-02-20T09:30:00+01:002017-02-20T09:30:00+01:00Nils Ratuszniktag:blog.anotherhomepage.org,2017-02-20:/post/2017/02/20/verifier-les-chiffrements-disponible-sur-un-serveur-https-avec-nmap/<p>Je me suis retrouvé l'autre jour avec une alerte de sonde de détection d'intrusion, laquelle me signalait qu'une potentielle exploitation de la faille Heartbleed avait eu lieu sur un serveur web. L'autre détail que j'avais au niveau de l'alerte : le protocole utilisé pour cette exploitation était SSL v3.</p>
<p>N'ayant pas …</p><p>Je me suis retrouvé l'autre jour avec une alerte de sonde de détection d'intrusion, laquelle me signalait qu'une potentielle exploitation de la faille Heartbleed avait eu lieu sur un serveur web. L'autre détail que j'avais au niveau de l'alerte : le protocole utilisé pour cette exploitation était SSL v3.</p>
<p>N'ayant pas la main sur la machine, je n'avais pour seule option que de vérifier côté client si le serveur utilise ce protocole. Sur l'instant, j'ai pensé à utiliser OpenSSL, qui dispose d'options pour se connecter à un serveur en utilisant certains protocoles. Cela donne pour mon cas, l'exemple et le résultat suivant :</p>
<div class="highlight"><pre><span></span><code>$ openssl s_client -connect blog.anotherhomepage.org:443 -ssl3
CONNECTED<span class="o">(</span><span class="m">00000006</span><span class="o">)</span>
<span class="m">140187574654788</span>:error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure:/usr/src/crypto/external/bsd/openssl/dist/ssl/s3_pkt.c:1304:SSL alert number <span class="m">40</span>
<span class="m">140187574654788</span>:error:1409E0E5:SSL routines:SSL3_WRITE_BYTES:ssl handshake failure:/usr/src/crypto/external/bsd/openssl/dist/ssl/s3_pkt.c:637:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has <span class="nb">read</span> <span class="m">7</span> bytes and written <span class="m">0</span> bytes
---
New, <span class="o">(</span>NONE<span class="o">)</span>, Cipher is <span class="o">(</span>NONE<span class="o">)</span>
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol : SSLv3
Cipher : <span class="m">0000</span>
Session-ID:
Session-ID-ctx:
Master-Key:
Key-Arg : None
PSK identity: None
PSK identity hint: None
SRP username: None
Start Time: <span class="m">1485895043</span>
Timeout : <span class="m">7200</span> <span class="o">(</span>sec<span class="o">)</span>
Verify <span class="k">return</span> code: <span class="m">0</span> <span class="o">(</span>ok<span class="o">)</span>
---
</code></pre></div>
<p>Alors bon, je sais pas trop vous, mais pour moi, ce n'est pas très évident que le serveur ne prend pas en charge SSL v3. Il y a quand même écrit "CONNECTED" au début, avant de me sortir "handshake failure". Néanmoins, la mission est remplie, et on peut vérifier plusieurs protocoles via les options suivantes d'OpenSSL :</p>
<p><code>* -ssl2 ;* -ssl3 ;* -tls1_2 ;* -tls1_1 ;* -tls1 ;* -dtls1.</code></p>
<p>Peu satisfait de la solution, j'ai continué mon voyage dans les moteurs de recherche, avant de tomber sur <a href="https://security.stackexchange.com/questions/70733/how-do-i-use-openssl-s-client-to-test-for-absence-of-sslv3-support" title=""Stack">une question similaire</a>, disposant de la première solution, mais d'une autre visiblement plus lisible, utilisant le célèbre <a href="https://nmap.org/" title=""Nmap:">Nmap</a>. Elle consiste à tirer parti d'une fonctionnalité assez intéressante du célèbre scanneur de ports, à savoir la disponibilité d'un langage de script permettant d'obtenir des détails supplémentaires lors d'un scan de port. Parmi les scripts disponibles, certains ont même pour but de mener des attaques par <a href="https://svn.nmap.org/nmap/scripts/telnet-brute.nse" title="telnet-brute.nse">bruteforce</a>. Là, il n'est pas question d'attaque, mais simplement d'énumération des ciphers disponibles. Comme plus haut, voici un exemple accompagné d'un résultat :</p>
<div class="highlight"><pre><span></span><code><span class="n">Starting</span><span class="w"> </span><span class="n">Nmap</span><span class="w"> </span><span class="mf">7.40</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">nmap</span><span class="o">.</span><span class="n">org</span><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="n">at</span><span class="w"> </span><span class="mi">2017</span><span class="o">-</span><span class="mi">02</span><span class="o">-</span><span class="mi">19</span><span class="w"> </span><span class="mi">09</span><span class="p">:</span><span class="mi">30</span><span class="w"> </span><span class="n">CET</span><span class="w"></span>
<span class="n">Nmap</span><span class="w"> </span><span class="n">scan</span><span class="w"> </span><span class="n">report</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">blog</span><span class="o">.</span><span class="n">anotherhomepage</span><span class="o">.</span><span class="n">org</span><span class="w"> </span><span class="p">(</span><span class="mf">163.172</span><span class="o">.</span><span class="mf">46.128</span><span class="p">)</span><span class="w"></span>
<span class="n">Host</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="n">up</span><span class="w"> </span><span class="p">(</span><span class="mf">0.0012</span><span class="n">s</span><span class="w"> </span><span class="n">latency</span><span class="p">)</span><span class="o">.</span><span class="w"></span>
<span class="n">rDNS</span><span class="w"> </span><span class="n">record</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="mf">163.172</span><span class="o">.</span><span class="mf">46.128</span><span class="p">:</span><span class="w"> </span><span class="n">vhost2</span><span class="o">.</span><span class="n">anotherhomepage</span><span class="o">.</span><span class="n">org</span><span class="w"></span>
<span class="n">PORT</span><span class="w"> </span><span class="n">STATE</span><span class="w"> </span><span class="n">SERVICE</span><span class="w"></span>
<span class="mi">443</span><span class="o">/</span><span class="n">tcp</span><span class="w"> </span><span class="n">open</span><span class="w"> </span><span class="n">https</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">ssl</span><span class="o">-</span><span class="k">enum</span><span class="o">-</span><span class="n">ciphers</span><span class="p">:</span><span class="w"> </span>
<span class="o">|</span><span class="w"> </span><span class="n">TLSv1</span><span class="o">.</span><span class="mi">0</span><span class="p">:</span><span class="w"> </span>
<span class="o">|</span><span class="w"> </span><span class="n">ciphers</span><span class="p">:</span><span class="w"> </span>
<span class="o">|</span><span class="w"> </span><span class="n">TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA</span><span class="w"> </span><span class="p">(</span><span class="n">secp256r1</span><span class="p">)</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">A</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA</span><span class="w"> </span><span class="p">(</span><span class="n">secp256r1</span><span class="p">)</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">A</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">TLS_DHE_RSA_WITH_AES_128_CBC_SHA</span><span class="w"> </span><span class="p">(</span><span class="n">dh</span><span class="w"> </span><span class="mi">4096</span><span class="p">)</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">A</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">TLS_DHE_RSA_WITH_AES_256_CBC_SHA</span><span class="w"> </span><span class="p">(</span><span class="n">dh</span><span class="w"> </span><span class="mi">4096</span><span class="p">)</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">A</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">compressors</span><span class="p">:</span><span class="w"> </span>
<span class="o">|</span><span class="w"> </span><span class="n">NULL</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">cipher</span><span class="w"> </span><span class="n">preference</span><span class="p">:</span><span class="w"> </span><span class="n">server</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">warnings</span><span class="p">:</span><span class="w"> </span>
<span class="o">|</span><span class="w"> </span><span class="n">Key</span><span class="w"> </span><span class="n">exchange</span><span class="w"> </span><span class="p">(</span><span class="n">secp256r1</span><span class="p">)</span><span class="w"> </span><span class="n">of</span><span class="w"> </span><span class="n">lower</span><span class="w"> </span><span class="n">strength</span><span class="w"> </span><span class="n">than</span><span class="w"> </span><span class="n">certificate</span><span class="w"> </span><span class="n">key</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">TLSv1</span><span class="o">.</span><span class="mi">1</span><span class="p">:</span><span class="w"> </span>
<span class="o">|</span><span class="w"> </span><span class="n">ciphers</span><span class="p">:</span><span class="w"> </span>
<span class="o">|</span><span class="w"> </span><span class="n">TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA</span><span class="w"> </span><span class="p">(</span><span class="n">secp256r1</span><span class="p">)</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">A</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA</span><span class="w"> </span><span class="p">(</span><span class="n">secp256r1</span><span class="p">)</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">A</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">TLS_DHE_RSA_WITH_AES_128_CBC_SHA</span><span class="w"> </span><span class="p">(</span><span class="n">dh</span><span class="w"> </span><span class="mi">4096</span><span class="p">)</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">A</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">TLS_DHE_RSA_WITH_AES_256_CBC_SHA</span><span class="w"> </span><span class="p">(</span><span class="n">dh</span><span class="w"> </span><span class="mi">4096</span><span class="p">)</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">A</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">compressors</span><span class="p">:</span><span class="w"> </span>
<span class="o">|</span><span class="w"> </span><span class="n">NULL</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">cipher</span><span class="w"> </span><span class="n">preference</span><span class="p">:</span><span class="w"> </span><span class="n">server</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">warnings</span><span class="p">:</span><span class="w"> </span>
<span class="o">|</span><span class="w"> </span><span class="n">Key</span><span class="w"> </span><span class="n">exchange</span><span class="w"> </span><span class="p">(</span><span class="n">secp256r1</span><span class="p">)</span><span class="w"> </span><span class="n">of</span><span class="w"> </span><span class="n">lower</span><span class="w"> </span><span class="n">strength</span><span class="w"> </span><span class="n">than</span><span class="w"> </span><span class="n">certificate</span><span class="w"> </span><span class="n">key</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">TLSv1</span><span class="o">.</span><span class="mi">2</span><span class="p">:</span><span class="w"> </span>
<span class="o">|</span><span class="w"> </span><span class="n">ciphers</span><span class="p">:</span><span class="w"> </span>
<span class="o">|</span><span class="w"> </span><span class="n">TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA</span><span class="w"> </span><span class="p">(</span><span class="n">secp256r1</span><span class="p">)</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">A</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA</span><span class="w"> </span><span class="p">(</span><span class="n">secp256r1</span><span class="p">)</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">A</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">TLS_DHE_RSA_WITH_AES_128_CBC_SHA</span><span class="w"> </span><span class="p">(</span><span class="n">dh</span><span class="w"> </span><span class="mi">4096</span><span class="p">)</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">A</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">TLS_DHE_RSA_WITH_AES_256_CBC_SHA</span><span class="w"> </span><span class="p">(</span><span class="n">dh</span><span class="w"> </span><span class="mi">4096</span><span class="p">)</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">A</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">compressors</span><span class="p">:</span><span class="w"> </span>
<span class="o">|</span><span class="w"> </span><span class="n">NULL</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">cipher</span><span class="w"> </span><span class="n">preference</span><span class="p">:</span><span class="w"> </span><span class="n">server</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">warnings</span><span class="p">:</span><span class="w"> </span>
<span class="o">|</span><span class="w"> </span><span class="n">Key</span><span class="w"> </span><span class="n">exchange</span><span class="w"> </span><span class="p">(</span><span class="n">secp256r1</span><span class="p">)</span><span class="w"> </span><span class="n">of</span><span class="w"> </span><span class="n">lower</span><span class="w"> </span><span class="n">strength</span><span class="w"> </span><span class="n">than</span><span class="w"> </span><span class="n">certificate</span><span class="w"> </span><span class="n">key</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">TLSv1</span><span class="o">.</span><span class="mi">2</span><span class="p">:</span><span class="w"> </span>
<span class="o">|</span><span class="w"> </span><span class="n">ciphers</span><span class="p">:</span><span class="w"> </span>
<span class="o">|</span><span class="w"> </span><span class="n">TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256</span><span class="w"> </span><span class="p">(</span><span class="n">secp256r1</span><span class="p">)</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">A</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384</span><span class="w"> </span><span class="p">(</span><span class="n">secp256r1</span><span class="p">)</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">A</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">TLS_DHE_RSA_WITH_AES_128_GCM_SHA256</span><span class="w"> </span><span class="p">(</span><span class="n">dh</span><span class="w"> </span><span class="mi">4096</span><span class="p">)</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">A</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">TLS_DHE_RSA_WITH_AES_256_GCM_SHA384</span><span class="w"> </span><span class="p">(</span><span class="n">dh</span><span class="w"> </span><span class="mi">4096</span><span class="p">)</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">A</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256</span><span class="w"> </span><span class="p">(</span><span class="n">secp256r1</span><span class="p">)</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">A</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384</span><span class="w"> </span><span class="p">(</span><span class="n">secp256r1</span><span class="p">)</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">A</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA</span><span class="w"> </span><span class="p">(</span><span class="n">secp256r1</span><span class="p">)</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">A</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA</span><span class="w"> </span><span class="p">(</span><span class="n">secp256r1</span><span class="p">)</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">A</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">TLS_DHE_RSA_WITH_AES_128_CBC_SHA256</span><span class="w"> </span><span class="p">(</span><span class="n">dh</span><span class="w"> </span><span class="mi">4096</span><span class="p">)</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">A</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">TLS_DHE_RSA_WITH_AES_128_CBC_SHA</span><span class="w"> </span><span class="p">(</span><span class="n">dh</span><span class="w"> </span><span class="mi">4096</span><span class="p">)</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">A</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">TLS_DHE_RSA_WITH_AES_256_CBC_SHA256</span><span class="w"> </span><span class="p">(</span><span class="n">dh</span><span class="w"> </span><span class="mi">4096</span><span class="p">)</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">A</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">TLS_DHE_RSA_WITH_AES_256_CBC_SHA</span><span class="w"> </span><span class="p">(</span><span class="n">dh</span><span class="w"> </span><span class="mi">4096</span><span class="p">)</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">A</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">compressors</span><span class="p">:</span><span class="w"> </span>
<span class="o">|</span><span class="w"> </span><span class="n">NULL</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">cipher</span><span class="w"> </span><span class="n">preference</span><span class="p">:</span><span class="w"> </span><span class="n">server</span><span class="w"></span>
<span class="o">|</span><span class="w"> </span><span class="n">warnings</span><span class="p">:</span><span class="w"> </span>
<span class="o">|</span><span class="w"> </span><span class="n">Key</span><span class="w"> </span><span class="n">exchange</span><span class="w"> </span><span class="p">(</span><span class="n">secp256r1</span><span class="p">)</span><span class="w"> </span><span class="n">of</span><span class="w"> </span><span class="n">lower</span><span class="w"> </span><span class="n">strength</span><span class="w"> </span><span class="n">than</span><span class="w"> </span><span class="n">certificate</span><span class="w"> </span><span class="n">key</span><span class="w"></span>
<span class="o">|</span><span class="n">_</span><span class="w"> </span><span class="n">least</span><span class="w"> </span><span class="n">strength</span><span class="p">:</span><span class="w"> </span><span class="n">A</span><span class="w"></span>
<span class="n">Nmap</span><span class="w"> </span><span class="n">done</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="n">IP</span><span class="w"> </span><span class="n">address</span><span class="w"> </span><span class="p">(</span><span class="mi">1</span><span class="w"> </span><span class="n">host</span><span class="w"> </span><span class="n">up</span><span class="p">)</span><span class="w"> </span><span class="n">scanned</span><span class="w"> </span><span class="ow">in</span><span class="w"> </span><span class="mf">10.06</span><span class="w"> </span><span class="n">seconds</span><span class="w"></span>
</code></pre></div>
<p>On remarquera, dans mon exemple, l'absence de SSLv3.</p>
<p>Et pour l'alerte de mon IDS ? Et bien comme dans mon exemple, SSLv3 n'est pas apparu dans mes résultats, ce qui m'a permis de conclure au faux-positif.</p>
<p>Un dernier détail : au moment de l'écriture de ce billet, <a href="https://nmap.org/book/nse.html" title=""Chapter">NSE</a> n'est pas activé par défaut dans pkgsrc, et pour NetBSD, son activation <a href="https://gnats.netbsd.org/cgi-bin/query-pr-single.pl?number=51715" title=""Gnats">empêche de compiler Nmap</a>.</p>
<p>Des remarques, des propositions d'améliorations ? Les commentaires sont là pour ça !</p>Kodi : récupérer certaines informations sur des addons2017-01-04T09:30:00+01:002017-01-04T09:30:00+01:00Nils Ratuszniktag:blog.anotherhomepage.org,2017-01-04:/post/2017/01/04/Kodi-recuperer-certaines-informations-sur-des-addons/<p>J'ai récemment perdu le mot de passe d'un service web que j'utilise par le biais d'un addon de Kodi. Je sais, c'est pas très malin, j'ai malencontreusement écrasé ma base de mots de passe au mauvais moment. Shit happens, comme ils disent dans la langue de Shakespeare.</p>
<p>Comme c'est casse-pied …</p><p>J'ai récemment perdu le mot de passe d'un service web que j'utilise par le biais d'un addon de Kodi. Je sais, c'est pas très malin, j'ai malencontreusement écrasé ma base de mots de passe au mauvais moment. Shit happens, comme ils disent dans la langue de Shakespeare.</p>
<p>Comme c'est casse-pied de retaper un nouveau mot de passe via un clavier virtuel et une télécommande, je me suis demandé si le mot de passe était stocké en clair dans la configuration de l'addon. On sait jamais, sur un malentendu, ça pourrait marcher. J'ai donc commencé à fouiller dans l'arborescence de Kodi, et j'ai pu voir que celui-ci stocke ses informations dans <em>\~/.kodi</em>. On y trouve alors un répertoire <em>addons</em>, qui contient un répertoire par addon, ainsi qu'un répertoire <em>packages</em>, qui contient des archives des addons téléchargés. Il est intéressant de regarder le code source des addons, car c'est dans celui-ci que j'ai compris qu'il stockait bien le nom d'utilisateur et le mot de passe.</p>
<p>Au même niveau que le répertoire addons, se trouve un répertoire nommé <em>userdata</em>. Celui-ci contient un répertoire <em>addon_data</em>, dans lequel il y a un répertoire par addon. L'addon dont je souhaitais voir la configuration y a laissé un répertoire à son nom, contenant un fichier de paramètres ainsi qu'un répertoire temporaire. Un petit "cat" sur le fichier de paramètres dévoile donc le Graal :</p>
<div class="highlight"><pre><span></span><code><span class="nt"><settings></span>
<span class="nt"><setting</span> <span class="na">id=</span><span class="s">"OSpass"</span> <span class="na">value=</span><span class="s">"motdepasseenclair"</span> <span class="nt">/></span>
<span class="nt"><setting</span> <span class="na">id=</span><span class="s">"OSuser"</span> <span class="na">value=</span><span class="s">"utilisateur"</span> <span class="nt">/></span>
<span class="nt"></settings></span>
</code></pre></div>
<p>En résumé, les paramètres d'un addon Kodi se trouvent dans <em>\~/.kodi/userdata/addon_data/nomdeladdon/</em>, dans un fichier nommé <em>settings.xml</em>. Le code source se trouve quant à lui dans <em>\~/.kodi/addons/nomdeladdon/</em>.</p>
<p>Comme quoi, j'ai vraiment raison de ne vouloir utiliser qu'un unique trio e-mail/utilisateur/mot de passe sur certains sites ou certaines applications.</p>Relai de spam, cela n'arrive qu'aux autres ?2014-11-11T09:30:00+01:002014-11-11T09:30:00+01:00Nils Ratuszniktag:blog.anotherhomepage.org,2014-11-11:/post/2014/11/11/Relai-de-spam,-cela-n-arrive-qu-aux-autres/<p>Ça y est. Le jour que je redoutais est arrivé : après plus de 7 années sans problème majeur, Another Home Page a été victime de l'exploitation d'une faille de sécurité. Ou, en tous cas, c'est la première dont je me rend compte ce qui n'est guère rassurant. Est-ce parce que …</p><p>Ça y est. Le jour que je redoutais est arrivé : après plus de 7 années sans problème majeur, Another Home Page a été victime de l'exploitation d'une faille de sécurité. Ou, en tous cas, c'est la première dont je me rend compte ce qui n'est guère rassurant. Est-ce parce que j'ai tardé à appliquer des mises à jour sur mon serveur ? Non, il s'agit en réalité d'une faille applicative présente sur l'un des sites que j'héberge. Pour être exact, il s'agit de l'exploitation <a href="https://www.drupal.org/PSA-2014-003" title=""Drupal">d'une faille de Drupal</a>. Le site n'a pas été mis à jour assez tôt, et mon infra s'est retrouvée relai de spam, bien malgré moi !</p>
<p>Comment m'en suis-je rendu compte ? Deux éléments m'y ont aidé : d'une part la réception d'un mail de la part d'une organisation anti-spam, <a href="http://www.junkemailfilter.com" title=""Junk">Junk Email Filter</a>. D'autre part, certaines adresses mail de destination étant invalides, j'ai reçu des réponses de type "mailer-daemon" incluant le contenu du mail en pièce jointe. D'autres éléments auraient mérité plus d'attention de ma part, comme par exemple le nombre de requêtes sur une page donnée, le nombre de mails envoyés par mon serveur de mail et surtout le nombre de mails bloqués pour cause de spam.</p>
<p>Par la suite, j'ai averti la personne responsable du site victime, qui s'est empressée de mettre à jour son site. Hélas, comme le mentionne <a href="http://www.nextinpact.com/news/90751-drupal-alerte-sur-faille-sql-comblee-mais-pas-pour-tout-monde.htm" title=""Drupal">Next INpact</a>, cela ne suffit pas. Sans rentrer dans le détail, décision a été prise d'effacer tous les sites web tournant sous Drupal. Et maintenant, je n'ai plus qu'à me refaire une réputation auprès des services de filtrage anti-spam...</p>
<p>Je n'ai d'ailleurs pris conscience que tard de la quantité impressionnante de mails que le spammeur a envoyé via mon infrastructure. Au moment de l'écriture de ce billet, je termine tout juste de purger la file d'attente de mon serveur de mails...</p>
<p>Que retenir de cet évènement ?</p>
<p>- Plus que jamais, les mises à jour de sécurité au niveau OS ne sont pas suffisantes. Il est crucial de mettre aussi à jour les applications web ;</p>
<p>- il est important de surveiller correctement ses services, en effet, le volume de mails dans la file d'attente aurait dû me mettre la puce à l'oreille ;</p>
<p>- Enfin, ma gestion des sauvegardes mériterait quelques améliorations...</p>Configuration d'OpenSSH2011-03-14T09:30:00+01:002011-03-14T09:30:00+01:00Nils Ratuszniktag:blog.anotherhomepage.org,2011-03-14:/post/2011/03/14/configuration-openssh/<p><a href="http://www.openssh.org/fr/index.html">OpenSSH</a> est un logiciel formidable, tout le monde le sait. Quelque chose que j'aime beaucoup avec ce logiciel, c'est la manière dont son fichier de configuration permet de simplifier certaines opérations. Je vous propose de voir ou de revoir certaines options qu'on peut ajouter à la suite d'un bloc de …</p><p><a href="http://www.openssh.org/fr/index.html">OpenSSH</a> est un logiciel formidable, tout le monde le sait. Quelque chose que j'aime beaucoup avec ce logiciel, c'est la manière dont son fichier de configuration permet de simplifier certaines opérations. Je vous propose de voir ou de revoir certaines options qu'on peut ajouter à la suite d'un bloc de configuration qu'on stocke généralement dans \~/.ssh/config .</p>
<h3>La base</h3>
<p>On va configurer l'accès à la machine "testdrive" dont l'adresse IP est 192.168.13.37. Commençons avec les informations de base :</p>
<div class="highlight"><pre><span></span><code>Host testdrive
HostName 192.168.13.37
User nils
Protocol 2
Port 22
ServerAliveInterval 5
</code></pre></div>
<p>Lorsque que je taperai la commande "ssh testdrive", OpenSSH me connectera à la machine 192.168.13.37 en tant qu'utilisateur nils, en utilisant la version 2 du protocole SSH, sur le port 22 et vérifiera toutes les 5 secondes si la machine en question est toujours joignable, ce qui peut s'avérer pratique dans certains cas où on peut être déconnecté du réseau pour cause d'inactivité (réseau de téléphonie mobile, proxy...)</p>
<h3>Connexion au travers d'un proxy HTTP</h3>
<div class="highlight"><pre><span></span><code>ProxyCommand /usr/bin/corkscrew monproxy.lan 3128 %h %p ~/.ssh/proxy_auth
</code></pre></div>
<p>Ici, j'utilise un utilitaire nommé <a href="http://www.agroman.net/corkscrew/">Corkscrew</a> qui me permet de me connecter via un proxy HTTP à mon serveur. Dans mon exemple, le proxy écooute sur le port 3128 et nécessite une authentification, j'ai donc ajouté un fichier proxy_auth contenant les identifiants. Les variables %h et %p désignent l'hôte vers qui se connecter et son port. A noter que la plupart des serveurs proxy qu'on peut trouver sont configurés pour ne pas autoriser les ports autres que les ports HTTP, HTTPS, et éventuellement FTP. Il faudra donc peut-être changer le port d'écoute de notre testdrive, et mettre notre serveur SSH sur le port 80 ou 443. A noter que selon l'organisation qui administre le proxy, cette manière de faire peut être vue comme une violation de la charte informatique du réseau, ou de tout autre règlement intérieur. Ne l'utilisez donc que si vous y êtes autorisés !</p>
<h3>Créer un tunnel SOCKS</h3>
<div class="highlight"><pre><span></span><code>DynamicForward 1080
</code></pre></div>
<p>Cette option est très pratique si vous ne voulez pas vous casser la tête à créer un tunnel VPN. Une fois cette option ajoutée à la configuration de votre hôte, et la connexion à celui-ci effective, un tunnel SOCKS écoute sur la boucle locale de votre machine, sur le port 1080. Un cas concret d'utilisation est la connexion à vos sites préférés depuis un point d'accès sans fil public, comme une gare : une fois connecté au réseau, on se connecte en SSH à son serveur, puis on modifie les paramètres de proxy de notre navigateur web pour utiliser un proxy SOCKS dont l'adresse est 127.0.0.1 et le port est 1080. Tout le trafic web du navigateur passe ainsi dans la connexion SSH. Si vous faites souvent le va-et-viens dans votre configuration de proxy, Firefox possède une extension nommée FoxyProxy qui vous facilitera l'existence !</p>
<h3>Créer un tunnel pour rediriger du trafic</h3>
<div class="highlight"><pre><span></span><code>LocalForward 5901 192.168.13.38:5900
</code></pre></div>
<p>Encapsuler un trafic réseau dans SSH est quelque chose de connu, et l'exemple ci-dessus est lui aussi archi-connu : le protocole <a href="https://secure.wikimedia.org/wikipedia/fr/wiki/Virtual_Network_Computing">VNC</a> transite en clair sur le réseau, l'utilisation de SSH permet de chiffrer la transmission entre notre client et notre serveur. On transfère donc le port 5900 de la machine 192.168.13.38 (qui doit être joignable depuis notre machine testdrive) vers le port 5901 local. On lance ensuite notre client VNC en direction la machine localhost sur le port 5901.</p>
<h3>Spécifier l'algorithme de chiffrement</h3>
<div class="highlight"><pre><span></span><code>Ciphers aes128-cbc
</code></pre></div>
<p>De nombreux algorithmes de chiffrement sont disponibles avec OpenSSH, vous pourrez trouver la liste dans les pages de manuel. Certains processeurs (tels que l'<a href="https://secure.wikimedia.org/wikipedia/en/wiki/Geode_%28processor%29#Geode_LX">AMD Geode LX</a> ou le <a href="https://secure.wikimedia.org/wikipedia/en/wiki/VIA_C7">VIA C7</a>) savent déchiffrer certains algorithmes, ce qui les rend plus rapide pour ces types d'opérations. Forcer le chiffrement en <a href="https://secure.wikimedia.org/wikipedia/fr/wiki/Standard_de_chiffrement_avanc%C3%A9">AES 128</a> si vous vous connectez à une machine ayant un CPU AMD Geode peut ainsi s'avérer très efficace pour limiter l'utilisation du CPU et alléger la charge.</p>Vérifications de permissions - suite2011-01-17T10:41:00+01:002011-01-17T10:41:00+01:00Nils Ratuszniktag:blog.anotherhomepage.org,2011-01-17:/post/2011/01/17/verifications-de-permissions-suite/<p><em>Introduction</em> : les astuces de ce billet sont extraites du document “Guide to the Secure Configuration of Red Hat Enterprise Linux 5” édité par la <a href="https://secure.wikimedia.org/wikipedia/fr/wiki/NSA">NSA</a>. Vous pouvez télécharger le document au format PDF dans son intégralité <a href="http://www.nsa.gov/ia/guidance/security_configuration_guides/operating_systems.shtml#linux2">sur leur site</a>. Cette introduction me permet d'être en conformité avec leur <a href="http://www.nsa.gov/terms_of_use.shtml#copyright">notice de …</a></p><p><em>Introduction</em> : les astuces de ce billet sont extraites du document “Guide to the Secure Configuration of Red Hat Enterprise Linux 5” édité par la <a href="https://secure.wikimedia.org/wikipedia/fr/wiki/NSA">NSA</a>. Vous pouvez télécharger le document au format PDF dans son intégralité <a href="http://www.nsa.gov/ia/guidance/security_configuration_guides/operating_systems.shtml#linux2">sur leur site</a>. Cette introduction me permet d'être en conformité avec leur <a href="http://www.nsa.gov/terms_of_use.shtml#copyright">notice de Copyright</a>.</p>
<p>Après les droits des répertoires et le sticky bit, amusons-nous un peu avec <a href="https://secure.wikimedia.org/wikipedia/fr/wiki/Setuid">SUID</a> et SGID : un fichier possédant l'attribut SUID ou SGID permet d'être lancé avec les droits de l'utilisateur ou du groupe qui a été placé, généralement root. Ainsi, le programme <em>at</em>, permettant de lancer une tâche à un moment donné, est accessible aux utilisateurs classiques alors que son fonctionnement nécessite des droits plus élevés. Ceci peut s'avérer risqué car si un programme SUID root possède une faille, celle-ci peut être exploitée avec les droits de root, même si l'attaquant n'a pas les droits.</p>
<p>Comme pour le sticky bit, commençons par vérifier notre environnement :</p>
<div class="highlight"><pre><span></span><code>root@orgrimmar:~# whoami
root
root@orgrimmar:~# cat /etc/redhat-release
CentOS release <span class="m">5</span>.5 <span class="o">(</span>Final<span class="o">)</span>
</code></pre></div>
<p>Recherchons maintenant tous les fichiers possédant un SUID ou un SGID :</p>
<div class="highlight"><pre><span></span><code>root@orgrimmar:~# find / <span class="se">\\</span><span class="o">(</span> -perm -4000 -o -perm -2000 <span class="se">\\</span><span class="o">)</span> -type f -print
/bin/ping6
/bin/umount
/bin/ping
/bin/mount
/bin/su
/lib64/dbus-1/dbus-daemon-launch-helper
/usr/bin/wall
/usr/bin/chfn
/usr/bin/newgrp
/usr/bin/sudoedit
/usr/bin/chsh
/usr/bin/write
/usr/bin/at
/usr/bin/chage
/usr/bin/crontab
/usr/bin/ssh-agent
/usr/bin/passwd
/usr/bin/sudo
/usr/bin/gpasswd
/usr/bin/locate
/usr/bin/screen
/usr/libexec/openssh/ssh-keysign
/usr/libexec/libvirt_proxy
/usr/libexec/utempter/utempter
/usr/kerberos/bin/ksu
/usr/sbin/userhelper
/usr/sbin/postqueue
/usr/sbin/postdrop
/usr/sbin/usernetctl
/usr/sbin/ccreds_validate
/sbin/netreport
/sbin/mount.nfs4
/sbin/umount.nfs4
/sbin/umount.nfs
/sbin/mount.nfs
/sbin/unix_chkpwd
/sbin/pam_timestamp_check
find: /proc/9859/task/9859/fd/4: Aucun fichier ou répertoire de ce <span class="nb">type</span>
find: /proc/9859/task/9859/fd/4: Aucun fichier ou répertoire de ce <span class="nb">type</span>
find: /proc/9859/fd/4: Aucun fichier ou répertoire de ce <span class="nb">type</span>
find: /proc/9859/fd/4: Aucun fichier ou répertoire de ce <span class="nb">type</span>
root@orgrimmar:~#
</code></pre></div>
<p>Sur le coup, voir autant de lignes peut paraître effrayant, mais si on y regarde de plus près, on peut comprendre que 99% des fichiers indiqués aient besoin du SUID. Le seul qui m'inquiète, c'est screen. Je vais donc regarder sur une autre machine, bien différente cette fois-ci :</p>
<div class="highlight"><pre><span></span><code>nils@tomb:~$ uname -sr
NetBSD <span class="m">5</span>.0.2
nils@tomb:~$ ls -hl /usr/pkg/bin/scree*
lrwxr-xr-x <span class="m">1</span> root wheel 12B Jul <span class="m">11</span> <span class="m">11</span>:23 /usr/pkg/bin/screen@ -> screen-4.0.3
-r-s--x--x <span class="m">1</span> root wheel 279K Jul <span class="m">11</span> <span class="m">11</span>:23 /usr/pkg/bin/screen-4.0.3*
</code></pre></div>
<p>On voit que screen sur ma machine NetBSD a aussi un bit SUID. C'est bon, je peux aller me coucher l'esprit tranquille :) Mais avant, revenons à notre serveur CentOS, et comme pour l'affaire du sticky bit, simulons un programme dont le SUID a été ajouté inutilement :</p>
<div class="highlight"><pre><span></span><code>root@orgrimmar:~# cat > testbin
<span class="c1">#!/bin/bash</span>
<span class="nb">echo</span> -n <span class="s2">"Je suis un programme SUID de test"</span>
<span class="nb">exit</span> <span class="m">0</span>
root@orgrimmar:~# chmod -v +x testbin
Le mode d<span class="s1">'accès de `testbin'</span> a été modifié à <span class="m">0755</span> <span class="o">(</span>rwxr-xr-x<span class="o">)</span>.
root@orgrimmar:~# ls -hl testbin
-rwxr-xr-x <span class="m">1</span> root root <span class="m">63</span> déc <span class="m">31</span> <span class="m">00</span>:44 testbin*
root@orgrimmar:~# chmod -v +s testbin
Le mode d<span class="s1">'accès de `testbin'</span> a été modifié à <span class="m">6755</span> <span class="o">(</span>rwsr-sr-x<span class="o">)</span>.
root@orgrimmar:~# ls -hl testbin
-rwsr-sr-x <span class="m">1</span> root root <span class="m">63</span> déc <span class="m">31</span> <span class="m">00</span>:44 testbin*
</code></pre></div>
<p>Relançons notre recherche :</p>
<div class="highlight"><pre><span></span><code>root@orgrimmar:~# find /root <span class="se">\\</span><span class="o">(</span> -perm -4000 -o -perm -2000 <span class="se">\\</span><span class="o">)</span> -type f -print
/root/testbin
</code></pre></div>
<p>Supprimons maintenant le SUID et relançons la recherche :</p>
<div class="highlight"><pre><span></span><code>root@orgrimmar:~# chmod -v -s testbin
Le mode d<span class="s1">'accès de `testbin'</span> a été modifié à <span class="m">0755</span> <span class="o">(</span>rwxr-xr-x<span class="o">)</span>.
root@orgrimmar:~# find /root <span class="se">\\</span><span class="o">(</span> -perm -4000 -o -perm -2000 <span class="se">\\</span><span class="o">)</span> -type f -print
root@orgrimmar:~#
</code></pre></div>
<p>Et voilà, nous sommes tranquilles :)</p>
<p><strong>Que faire si j'ai un doute sur un programme ?</strong> Plusieurs possibilités : s'il s'agit d'un programme qui est fourni par les paquets de votre distribution, on peut toujours aller vérifier sur d'autres machines, dont l'OS ou la distribution peut différer (comme je l'ai fait avec screen); un même programme nécessitant le SUID sur 2 OS différents peut légèrement rassurer. Si le logiciel est libre (exemple : GNU screen :D), on peut aussi aller chercher dans les fichiers de création du paquet binaire, pour les RPM il suffit de chercher le SRPM du logiciel et de l'installer sur une machine de test. Ensuite, on regarde le contenu du fichier .spec qui sert à la création de ce paquet : en effet, ces fichiers contiennent la liste et les droits des fichiers et répertoires du paquet que l'on veut compiler :) Si un .spec n'indique pas que le programme est SUID, alors il est temps de s'inquiéter !</p>Vérifications de permissions2010-12-30T11:11:00+01:002010-12-30T11:11:00+01:00Nils Ratuszniktag:blog.anotherhomepage.org,2010-12-30:/post/2010/12/30/Vérifications-de-permissions/<p><em>Introduction</em> : les astuces de ce billet sont extraites du document “Guide to the Secure Configuration of Red Hat Enterprise Linux 5” édité par la <a href="https://secure.wikimedia.org/wikipedia/fr/wiki/NSA">NSA</a>. Vous pouvez télécharger le document au format PDF dans son intégralité <a href="http://www.nsa.gov/ia/guidance/security_configuration_guides/operating_systems.shtml#linux2">sur leur site</a>. Cette introduction me permet d'être en conformité avec leur <a href="http://www.nsa.gov/terms_of_use.shtml#copyright">notice de …</a></p><p><em>Introduction</em> : les astuces de ce billet sont extraites du document “Guide to the Secure Configuration of Red Hat Enterprise Linux 5” édité par la <a href="https://secure.wikimedia.org/wikipedia/fr/wiki/NSA">NSA</a>. Vous pouvez télécharger le document au format PDF dans son intégralité <a href="http://www.nsa.gov/ia/guidance/security_configuration_guides/operating_systems.shtml#linux2">sur leur site</a>. Cette introduction me permet d'être en conformité avec leur <a href="http://www.nsa.gov/terms_of_use.shtml#copyright">notice de Copyright</a>.</p>
<p>Je vous propose de vérifier les permissions de certains de vos fichiers sur votre serveur ou poste fonctionnant sur un système Linux. Le but est de limiter les possibilités de tentatives d'intrusion en recherchant les moyens d'entrée possibles. Commençons par vérifier notre environnement :</p>
<div class="highlight"><pre><span></span><code>root@orgrimmar:~# whoami
root
root@orgrimmar:~# cat /etc/redhat-release
CentOS release <span class="m">5</span>.5 <span class="o">(</span>Final<span class="o">)</span>
</code></pre></div>
<p>Recherchons maintenant tous les répertoires dont les droits permettent à n'importe quel utilisateur d'écrire dedans, et dont le <em>sticky bit</em> n'est pas positionné :</p>
<div class="highlight"><pre><span></span><code>root@orgrimmar:~# find / -type d <span class="se">\\</span><span class="o">(</span> -perm -0002 -a ! -perm -1000 <span class="se">\\</span><span class="o">)</span> -print
</code></pre></div>
<p>Si jamais votre machine possède de nombreuses partitions, et qu'elles sont du genre bien remplies, il est possible de limiter la recherche de <em>find</em> à une partition à la fois :</p>
<div class="highlight"><pre><span></span><code>root@orgrimmar:~# find / -xdev -type d <span class="se">\\</span><span class="o">(</span> -perm -0002 -a ! -perm -1000 <span class="se">\\</span><span class="o">)</span> -print
root@orgrimmar:~# find /home -xdev -type d <span class="se">\\</span><span class="o">(</span> -perm -0002 -a ! -perm -1000 <span class="se">\\</span><span class="o">)</span> -print
root@orgrimmar:~# find /var -xdev -type d <span class="se">\\</span><span class="o">(</span> -perm -0002 -a ! -perm -1000 <span class="se">\\</span><span class="o">)</span> -print
</code></pre></div>
<p>Idéalement (et c'est le cas sur ma machine, ouf !), cette commande ne devrait occasionner aucun affichage. Maintenant, amusons-nous un peu :</p>
<div class="highlight"><pre><span></span><code>root@orgrimmar:/tmp# mkdir insecure
root@orgrimmar:/tmp# chmod -v <span class="m">777</span> insecure
Le mode d<span class="s1">'accès de `insecure'</span> a été modifié à <span class="m">0777</span> <span class="o">(</span>rwxrwxrwx<span class="o">)</span>.
root@orgrimmar:/tmp# find /tmp/ -type d <span class="se">\\</span><span class="o">(</span> -perm -0002 -a ! -perm -1000 <span class="se">\\</span><span class="o">)</span> -print
/tmp/insecure
</code></pre></div>
<p>Positionnons maintenant le sticky bit :</p>
<div class="highlight"><pre><span></span><code>root@orgrimmar:/tmp# ls -hl /tmp/ <span class="p">|</span> grep insecure
drwxrwxrwx <span class="m">2</span> root root <span class="m">4</span>,0K déc <span class="m">30</span> <span class="m">23</span>:54 insecure/
root@orgrimmar:/tmp# chmod -v +t /tmp/insecure/
Le mode d<span class="s1">'accès de `/tmp/insecure/'</span> a été modifié à <span class="m">1777</span> <span class="o">(</span>rwxrwxrwt<span class="o">)</span>.
root@orgrimmar:/tmp# ls -hl /tmp/ <span class="p">|</span> grep insecure
drwxrwxrwt <span class="m">2</span> root root <span class="m">4</span>,0K déc <span class="m">30</span> <span class="m">23</span>:54 insecure/
root@orgrimmar:/tmp# find /tmp/ -type d <span class="se">\\</span><span class="o">(</span> -perm -0002 -a ! -perm -1000 <span class="se">\\</span><span class="o">)</span> -print
root@orgrimmar:/tmp#
</code></pre></div>
<p>Qu'est-ce que le <em>sticky bit</em> ? Extrait de la page de manuel de <em>chmod</em> (man chmod) :</p>
<blockquote>
<p>t (sticky-bit) conserver le code du programme sur le périphérique de swap après exécution. Il s’agit du comportement original, mais de nos jours il sert uniquement pour les répertoires. Il indique que seuls le propriétaire du répertoire, et le propriétaire d’un fichier qui s’y trouve ont le droit de supprimer ce fichier. C’est typiquement utilisé pour les répertoires comme /tmp ayant une autorisation d’écriture générale.</p>
</blockquote>
<p>Vérifions cela :</p>
<div class="highlight"><pre><span></span><code>root@orgrimmar:/tmp# <span class="nb">cd</span> /
root@orgrimmar:/# ls -hl <span class="p">|</span> grep tmp
drwxrwxrwt <span class="m">5</span> root root <span class="m">4</span>,0K déc <span class="m">30</span> <span class="m">23</span>:59 tmp/
</code></pre></div>
<p>Le sticky bit est positionné. Je suis rassuré. Néanmoins, il ne fait pas tout. Regardons donc quels répertoires sont accessibles à tous les utilisateurs, sans chercher à savoir si le sticky bit est positionné :</p>
<div class="highlight"><pre><span></span><code>root@orgrimmar:/# find / -type d <span class="se">\\</span><span class="o">(</span> -perm -0002 <span class="se">\\</span><span class="o">)</span> -print
/var/tmp
/var/lib/xenstored
/dev/shm
/tmp
/tmp/insecure
/tmp/.ICE-unix
</code></pre></div>
<p>Cela fait déjà un peu plus de monde... pas très rassurant mais à part notre répertoire <em>insecure</em>, pas de quoi s'affoler : <em>/var/tmp</em> et <em>/tmp</em> sont des répertoires destinés aux fichiers temporaires des programmes en fonctionnement, <em>/var/shm</em> désigne <a href="https://secure.wikimedia.org/wikipedia/fr/wiki/M%C3%A9moire_partag%C3%A9e">la mémoire partagée</a> et le xenstored sert <a href="http://books.google.com/books?id=XS-Jj7s2nhYC&pg=PA68&lpg=PA68&dq=/var/lib/xenstored&source=bl&ots=UUPHrW9az-&sig=NvdqPm8-x3cC6UOPlGEpRGOXKQY&hl=fr&ei=sw4dTcycMouo8QPnsrm9BQ&sa=X&oi=book_result&ct=result&resnum=4&ved=0CC8Q6AEwAw#v=onepage&q=%2Fvar%2Flib%2Fxenstored&f=false">au bon fonctionnement de l'hyperviseur Xen</a>.</p>
<p>Pour finir, nous pouvons nettoyer notre petite expérience :</p>
<div class="highlight"><pre><span></span><code>root@orgrimmar:/# rmdir -v /tmp/insecure/
rmdir: destruction du répertoire /tmp/insecure/
root@orgrimmar:/# ls -hal /tmp/ <span class="p">|</span> grep secu
</code></pre></div>
<h2>Commentaires</h2>
<h3>Le 06/01/2011 19:09 par <a href="http://www.sakana.fr/blog/">stephane</a></h3>
<p>Hello,</p>
<p>Juste un petit commentaire en passant, vu que ça fait longtemps :-)</p>
<p>Un flag de ls a connaître : -d, pour éviter le ls .... | grep .... , tu peux faire un ls -ld /tmp par exemple. Ça te sort le ls du répertoire et non de son contenu.</p>
<p>A+</p>
<p>Stéphane</p>On n'est jamais mieux servi que par soi-même2006-08-22T18:20:00+02:002006-08-22T18:20:00+02:00Nils Ratuszniktag:blog.anotherhomepage.org,2006-08-22:/post/2006/08/22/53-on-n-est-jamais-mieux-servi-que-par-soi-meme/<p>Ou quand un expert en sécurité informatique voit son site internet défacé...</p>
<p><a href="http://www.clubic.com/actualite-37692-insolite-site-kevin-mitnick-hacke.html">Clubic</a> a publié un article sur le défaçage du site Internet de <a href="http://fr.wikipedia.org/wiki/Mitnick">Kevin Mitnick</a>. En lisant l'article, on apprend qu'en fait Kevin a fait appel à un prestataire pour son site, qui, après visite, n'est tout simplement qu'une …</p><p>Ou quand un expert en sécurité informatique voit son site internet défacé...</p>
<p><a href="http://www.clubic.com/actualite-37692-insolite-site-kevin-mitnick-hacke.html">Clubic</a> a publié un article sur le défaçage du site Internet de <a href="http://fr.wikipedia.org/wiki/Mitnick">Kevin Mitnick</a>. En lisant l'article, on apprend qu'en fait Kevin a fait appel à un prestataire pour son site, qui, après visite, n'est tout simplement qu'une vitrine. </p>
<p>Cela diminue la portée de l'exploit, car on peut supposer que Mitnick n'est qu'un client parmi d'autres pour le prestataire, et que ce dernier possède des infrastructures de taille assez conséquente pour ne pas placer la sécurité de ses systèmes en priorité numéro un. On se permettra quand même une petite morale pour monsieur Mitnick : "on n'est jamais mieux servi que par soi-même".</p>Mandriva Security Update2006-01-14T11:44:00+01:002006-01-14T11:44:00+01:00Nils Ratuszniktag:blog.anotherhomepage.org,2006-01-14:/post/2006/01/14/16-mandriva-security-update/<p><img alt="Logo de la distribution Mandriva" src="https://web.archive.org/web/20051015204543/http://upload.wikimedia.org/wikipedia/en/9/95/Mandriva_logo.png">Mettez à jour votre distribution !Mandriva a publié de nouvelles mises à jour, 2 sont importantes, mais à des titres différents :</p>
<ul>
<li>La première est une mise à jour de sécurité, il s'agit d'une faille concernant kdegraphics, quelques applications l'utilisant sont aussi corrigées;</li>
<li>La deuxième est sans doute une mise à …</li></ul><p><img alt="Logo de la distribution Mandriva" src="https://web.archive.org/web/20051015204543/http://upload.wikimedia.org/wikipedia/en/9/95/Mandriva_logo.png">Mettez à jour votre distribution !Mandriva a publié de nouvelles mises à jour, 2 sont importantes, mais à des titres différents :</p>
<ul>
<li>La première est une mise à jour de sécurité, il s'agit d'une faille concernant kdegraphics, quelques applications l'utilisant sont aussi corrigées;</li>
<li>La deuxième est sans doute une mise à jour de bug ou un cadeau de la part de Mandriva : Xorg 6.9 Final ! On a enfin une version de Xorg stable dans Mandriva 2006 !</li>
</ul>
<p>Pour installer ces mises à jour, la bonne vieille méthode en mode texte marche toujours :</p>
<div class="highlight"><pre><span></span><code>urpmi.update -a
</code></pre></div>
<p>en ayant pris soin d'avoir le media "updates", sinon ajoutez-le à l'aide de <a href="http://easyurpmi.zarb.org">Easy Urpmi</a>;</p>
<div class="highlight"><pre><span></span><code>urpmi --auto-select
</code></pre></div>
<p>installera tous les paquets plus récents que ceux installés. Si vous voulez automatiser complètement la tâche, l'option --force permet d'éviter la demande de confirmation d'urpmi; bien entendu, ces deux commandes sont à taper en tant que root. </p>
<p>Pour les allergiques à la ligne de commande, je rappelle que vous pouvez faire ces mises à jour depuis le centre de contrôle Mandriva, cherchez "Configurer votre ordinateur" dans le menu de KDE ou Gnome, ou tapez Alt+F2 puis entrez "mcc" dans la boite de dialogue. Le mot de passe root sera ensuite demandé. </p>
<p>Source pour la correction de kdegraphics : <a href="http://www.frsirt.com/bulletins/3535">FrSirt</a> </p>
<p>Source pour Xorg : moi en faisant la mise à jour :p</p>Faille WMF, Microsoft se fait attendre2006-01-06T12:26:00+01:002006-01-06T12:26:00+01:00Nils Ratuszniktag:blog.anotherhomepage.org,2006-01-06:/post/2006/01/06/11-faille-wmf-microsoft-se-fait-attendre/<p>Et en plus le patch ne vient même pas de chez eux !On aura tout vu ! Microsoft ne se presse pas pour publier les rustines pour ses systèmes d'exploitation, du coup il est recommandé d'utiliser un patch qui ne vient pas de chez eux ! </p>
<p>L'article est <a href="http://www2.canoe.com/techno/nouvelles/archives/2006/01/20060103-231205.html">ici</a>, vous pouvez télécharger …</p><p>Et en plus le patch ne vient même pas de chez eux !On aura tout vu ! Microsoft ne se presse pas pour publier les rustines pour ses systèmes d'exploitation, du coup il est recommandé d'utiliser un patch qui ne vient pas de chez eux ! </p>
<p>L'article est <a href="http://www2.canoe.com/techno/nouvelles/archives/2006/01/20060103-231205.html">ici</a>, vous pouvez télécharger le patch sur <a href="http://isc.sans.org/diary.php?storyid=1010">cette page</a>. </p>
<p>Sans vouloir troller, j'ai trouvé une parade infaillible : ne pas utiliser de logiciels Microsoft. Bon, j'avoue, elle est un peu facile celle-là, j'essaierai de trouver mieux la prochaine fois.</p>Mandriva Security Update2005-12-24T13:26:00+01:002005-12-24T13:26:00+01:00Nils Ratuszniktag:blog.anotherhomepage.org,2005-12-24:/post/2005/12/24/9-mandriva-security-update/<p><img alt="Logo de la distribution Mandriva" src="https://web.archive.org/web/20051015204543/http://upload.wikimedia.org/wikipedia/en/9/95/Mandriva_logo.png">Mettez à jour votre distribution !</p>
<p>Mandriva vient de sortir quelques mises à jour de sécurité pour le noyau. Il est bien entendu plus que recommandé d'installer ces mises à jour. Vous pouvez trouver plus de renseignements sur la page dédiée à cette mise à jour sur <a href="http://www.frsirt.com/bulletins/3327">FrSirt</a>.</p>
<p>Un noyau ne …</p><p><img alt="Logo de la distribution Mandriva" src="https://web.archive.org/web/20051015204543/http://upload.wikimedia.org/wikipedia/en/9/95/Mandriva_logo.png">Mettez à jour votre distribution !</p>
<p>Mandriva vient de sortir quelques mises à jour de sécurité pour le noyau. Il est bien entendu plus que recommandé d'installer ces mises à jour. Vous pouvez trouver plus de renseignements sur la page dédiée à cette mise à jour sur <a href="http://www.frsirt.com/bulletins/3327">FrSirt</a>.</p>
<p>Un noyau ne se met pas à jour comme ça. Vous devez installer le noyau en parallèle de l'ancien et redémarrer. N'oubliez pas de modifier la configuration de votre chargeur de démarrage (Lilo ou Grub, modification possible depuis le centre de contrôle). Comme ce genre de mise à jour est impossible à automatiser, le paquet du noyau n'est pas affiché dans la rubrique de mises à jour de paquets Mandriva dans le centre de contrôle. Il vous faudra installer volontairement ce paquet en allant dans la rubrique adéquate. Le nouveau paquet de noyau a pour numéro de version 2.6.12.14mdk-1-1mdk. Bien entendu, si vous utilisez un kernel "spécial" de Mandriva, comme le kernel "entreprise", ou ceux gérant jusqu'à 1 ou 4Go de mémoire vive (ce qui est mon cas), une mise à jour est disponible.</p>
<p>Une fois la machine redémarrée, vérifiez bien que vous êtes sur le nouveau
noyau via la commande "uname -a". Dans mon cas :</p>
<div class="highlight"><pre><span></span><code><span class="o">[</span>thenastyboy@nastymachine ~<span class="o">]</span>$ uname -a
Linux nastymachine <span class="m">2</span>.6.12-14mdk-i586-up-1GB <span class="c1">#1 Tue Dec 20 14:17:34 MST 2005 i686 AMD Athlon(tm) XP2600+ unknown GNU/Linux</span>
</code></pre></div>L'indiscrétion est à la mode...2005-11-20T22:28:00+01:002005-11-20T22:28:00+01:00Nils Ratuszniktag:blog.anotherhomepage.org,2005-11-20:/post/2005/11/20/4-l-indiscretion-est-a-la-mode/<p>Et la vie privée c'est pour la collection automne-hiver 2040?Vous avez pu le suivre sur tous les bons sites internet d'information liée à l'informatique, les déboires de Sony et de son dernier système de protection contre la copie. Sachez que Sony n'est pas le seul à faire des bêtises …</p><p>Et la vie privée c'est pour la collection automne-hiver 2040?Vous avez pu le suivre sur tous les bons sites internet d'information liée à l'informatique, les déboires de Sony et de son dernier système de protection contre la copie. Sachez que Sony n'est pas le seul à faire des bêtises, vous pourrez trouvez quelques exemples supplémentaires sur le blog <a href="http://formats-ouverts.org/blog/2005/11/15/615-ces-operations-sur-votre-ordinateur-qui-voudraient-rester-plutot-discretes">Pour les formats ouverts</a>. </p>
<p>Je crois que j'ai vraiment bien fait de ne pas me mettre à World Of Warcraft... c'est dommage, c'est pourtant un jeu qui me semble agréable au vu du test que j'en ai effectué. La sécurité est donc un combat de tous les instants, et au vu des dernières décisions ministérielles, le manque d'ouverture de certains logiciels semblent être néfastes pour la sécurité des utilisateurs. Je me demande bien ce que fait Windows sur tant de machines dans les écoles françaises :))</p>