Détecteur de vulnerability scanner

Soyez le premier à donner votre avis sur cette source.

Snippet vu 6 550 fois - Téléchargée 17 fois

Contenu du snippet

Bonjour,

Ceux qui me connaissent savent qu'il y a une chose (parmi tant d'autres) que je ne supporte pas : les vulnerability scanner. Petit rappel sur ce qu'est un "vulnerability scanner", il s'agit d'un petit robot (bot) dont le but est de passer de serveur en serveur afin de vérifier l'existence d'un logiciel qu'il sait contenir une faille en vue de l'exploiter. Bien souvent ces vagabonds du web passent en revue de grandes plages d'adresses IP afin de trouver des victimes potentielles. Ici je vous propose une class qui, pour un serveur web, aide à détecter ces bots et à écrire un fichier de log en vue d'analyse.

Le principe est très simple, le contenu de l'URL et de l'user-agent sont analysées afin de définir si oui ou non c'est un vulnerability scanner qui a fait la requête. Une fois détecté une entrée contenant toutes les informations utiles est écrite dans un fichier de log afin de l'administrateur puisse l'utiliser afin de luter contre ces menaces.

A principe simple, utilisation simple. Un simple appel à la méthode start_analyze() est suffisant. Il faut cependant faire remarquer deux choses importantes :
1/ Il est nécessaire de faire un fichier bot_alerts.log afin que le script puisse y écrire. Ce fichier doit avoir 0622 comme droits. Une commande pour le créer est donc `touch bot_alerts.log && chmod 0622 bot_alerts.log`. On prendra soin de faire en sorte que le propriétaire du fichier ne soit pas le même utilisateur que celui utilisé par le serveur web afin d'éviter que le fichier ne soit visible depuis l'extérieur.
2/ Afin de connaître l'url demandée on utilise $_SERVER['REDIRECT_URL'] et non $_SERVER['QUERY_STRING']. La raison est simple : l'appel à cette classe se fera dans la page affichée lors d'une erreur 404. Ceci pour trois raisons évidentes :
- De tels bots ciblent des logiciels grand public tels que PHPMyAdmin, pas vos pages perso.
- Vu la quantité de tests fait ils déclenchent presque obligatoirement une erreur 404.
- Si vous avez bien fait votre travail il ne doit y avoir presque que les bots qui déclenchent des 404 (avec exception sur les demandes de favicon, apple-touch-icon.png etc).

Fonctionnalités :
- Permet d'obtenir un log précis sur les activités repérées comme étant des vulnerability scanner.
- Le fichier de log est épuré de tout caractère non affichable (meilleur lisibilité et prévention des risques d'attaques par utilisation de séquences d'échappement propres au terminal).
- En cas de détection d'un bot, termine prématurément le script.
- Redirige les bots vers un nom de domaine non valide (juste pour embêter ceux qui les suivent).

Pour ceux qui veulent modifier certaines parties, au lieux de modifier directement la classe il est recommandé d'en créer une nouvelle qui hérite de celle-là afin de surcharger les membres et méthodes désirés. Le code est suffisamment découpé pour permettre une bonne utilisation de la surcharge.

Nota :
La présence de "Windows 98" dans les recherches sur le useragent est du à un bot que je rencontre régulièrement et qui se fait passer pour un IE6 sur Windows 98. Le nombre de clients réels restant sous windows 98 et générant des 404 est tellement insignifiant que je me suis permis de l'ajouter comme tel.

Edit :
Désolé pour l'indentation un peu foireuse par endroits, les tabulations ne sont pas gérées ici de la même manière que sur emacs. Si j'ai le temps je rectifierai ce point.

Source / Exemple :


<?php
// BotDetector.php for BotAnalyzer in /home/tycho/sources/php/class
// 
// Made by Rodolphe Breard
// Mail    <rodolphe.breard@laposte.net>
// 
// Started on  Sat Nov 14 11:13:32 2009 Rodolphe Breard
// Last update Thu Nov 19 15:54:30 2009 Rodolphe Breard
// 
// Copyright (C) 2009 Rodolphe Breard
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// 
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
// 
// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.
//

define('BOTDETECTOR_LOGFILE', './bot_alerts.log');

class		BotDetector
{
  protected	$log_msg = null;
  protected	$url_patterns = array('config', 'admin', 'adm', 'sql', 'shop',
				      'store', 'cart', 'include', 'pma');
  protected	$user_agent_patterns = array('Windows 98', 'Python', 'libwww',
					     'urllib', 'lwp',
					     'Morpheus', 'Fucking', 'Scanner',
					     'Toata', 'dragostea', 'pentru',
					     'diavola');

  public function	start_analyze()
  {
    $this->check_patterns($_SERVER['REDIRECT_URL'], $this->url_patterns);
    if (!empty($_SERVER['HTTP_USER_AGENT']))
      $this->check_patterns($_SERVER['HTTP_USER_AGENT'],
			    $this->user_agent_patterns);
  }

  protected function	bot_handler()
  {
    $this->write_log();
    header('Location: http://no_bots.invalid/');
    die();
  }

  protected function	write_log()
  {
    $LogFile = new SplFileInfo(BOTDETECTOR_LOGFILE);
    if (!$LogFile->isFile())
      throw new Exception('BotAnalyzer: write_log: invalid log file.');
    if ($LogFile->getPerms() & 0777 != 0622)
      if (!chmod(BOTDETECTOR_LOGFILE, 0622))
	throw new Exception('BotAnalyzer: write_log: bad log file mode.');
    if (!$LogFile->isWritable())
      throw new Exception('BotAnalyzer: write_log: unwritable log file.');
    $LogFile = $LogFile->openFile('a');
    $this->init_log_msg();
    $LogFile->fwrite($this->log_msg);
  }

  protected function	init_log_msg()
  {
    $datas = array(date('r'),
		   $_SERVER['REMOTE_ADDR'],
		   $_SERVER['REQUEST_METHOD'],
		   $_SERVER['SERVER_PROTOCOL'],
		   $_SERVER['HTTP_HOST'],
		   $_SERVER['REDIRECT_URL'],
		   (isset($_SERVER['HTTP_USER_AGENT']) ?
		    $_SERVER['HTTP_USER_AGENT'] : ''));
    foreach ($datas as $key => $val)
      $this->log_msg .= ($key != 0 ? ' - ' : '') . $this->protect_data($val);
    $this->log_msg .= "\n";
  }

  protected function	protect_data($str)
  {
    if (empty($str))
      return 'unknown';
    $rep = str_split(' !"#$%&\'()*+,-./:;<=>?@[\]^_`{|}~');
    $replace = null;
    foreach ($rep as $val)
      $replace[urlencode($val)] = $val;
    return strtr(urlencode($str), $replace);
  }

  protected function	check_patterns($var, array $patterns)
  {
    foreach ($patterns as $pat)
      {
	if (stripos($var, $pat) !== false)
	  $this->bot_handler();
      }
  }
}

?>

Conclusion :


Ne vous attendez pas à ce que ça fasse le café, j'ai fait ça juste sur un coup de colère contre le présences quotidienne de ces saletés de bots dans un serveur dont j'ai la charge. Je doute que grand monde ne soit intéressé mais dans le doute je partage, et puis si certains ne connaissaient pas l'existence de ces vagabonds c'est une bonne occasion pour apprendre :)

Bonne chasse aux bots et tout mon amour aux filles du diable (les initiés comprendront).

A voir également

Ajouter un commentaire

Commentaires

TychoBrahe
Messages postés
1310
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
11 -
Bonjour,

Vu que la question de la protection (et non de la détection) revient régulièrement dans les commentaires, je me permet de laisser quelques liens vers des articles traitant du sujet :
(en) http://johannburkard.de/blog/www/spam/introduction-to-blocking-spambots-and-bad-bots.html
(en) http://johannburkard.de/blog/www/spam/updated-spam-bot-and-bad-bot-list.html
(en) http://johannburkard.de/blog/www/spam/effective-spam-bot-blocking.html
(fr) http://tycho.dyn-o-saur.com/index.php?post/2009/10/18/%C3%89viter-les-vulnerability-scanners-sur-un-serveur-web

Bien entendu, utiliser cette source permet d'aider à évaluer les meilleurs moyens à mettre en place mais égalent à vérifier leur efficacité.
LeFauve42
Messages postés
239
Date d'inscription
vendredi 20 octobre 2006
Statut
Membre
Dernière intervention
20 avril 2009
-
Salut,

Se proteger de ce genre de desagrements est toujours galere, et il est dur d'avoir une solution 100% efficace, mais dans tous les cas il est toujours instructif de jeter un oeil a ce genre de source.

Donc, merci de partager ton experience avec nous !

Sinon, j'ai decouvert ce matin une solution qui a l'air assez complete, bien que recente : CrawlProtect (http://www.crawlprotect.com/fr/)

C'est principalement base sur du .htaccess (et je ne suis donc pas sur que ca filtre les tentatives d'injection par methode POST).

J'aime aussi moyen le fait de ne pas pouvoir changer le path d'installation (encore qu'on peut certainement, en editant les .htaccess, mais je n'ai pas eu le temps de regarder en details) mais je serais curieux de savoir ce que vous pensez de cette approche.

Eric
35201
Messages postés
1
Date d'inscription
samedi 2 décembre 2000
Statut
Membre
Dernière intervention
23 novembre 2009
-
Bien utile dans certains cas. Merci
TychoBrahe
Messages postés
1310
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
11 -
"Je met sur un forum très visité un image dans ma signature qui a pour lien http://tonsite.com/pathbanni/include/admin.php et en quelques jours tes logs font se faire spammer de IP qui ne sont pas des bots."
Il en est de même pour le access_log et le error_log, tu devrais aller donner des cours à des gros noobs de la fondation Apache qui visiblement n'ont pas eu vent de ta trouvaille révolutionnaire. D'accord je n'ai pas mis de gzipage automatique du fichier de log mais quand même.

"Encore pire, je roule ton script sur une page qui a comme chemin /shop.php et ton script va faire un die dessus juste parce que le path contient "shop"."
Encore une preuve que tu n'as pas lu et compris ce que j'ai écrit. C'est fait pour être placé sur la page servie en cas d'erreur 404, si la page est atteinte le script ne sera pas appelé.

"tu ne les empêche d'aucune façon à scanner ton site et tout ce que ça fait"
"elle n'empêche en rien l'accès à des applis ayant des failles de sécurité"
Je n'ai jamais eu l'intention de le faire.

"c'est te remplir un log qui te sert à rien. Tu comptes faire quoi avec les logs ?"
Tout le monde n'a pas la même vision des choses, ce n'est pas parce que toi tu ne vois aucune utilité que ça n'en a aucune. Le but ici est de fournir un log qui permette d'évaluer les besoin d'un serveur afin d'essayer de luter contre ces bots qui pourrissent le web afin de mettre en place les solutions adaptée. D'un point de vue personnel je ne souhaite pas prendre des solutions de protection à l'aveuglette et ici j'ai un moyen de simplifier la visualisation des robots afin de ne pas perdre de temps à passer en revue error_log et access_log.

"Si je peux me permettre, sans méchanceté aucune, tu as une certaine tendance à cela toi aussi :)"
J'avoue, mais là sur le coup je n'ai pas apprécié ce que j'ai perçu comme une agression gratuite sans fondement contre moi et me suis un peu emporté.

"elle consomme des ressources pour des logs improbables."
La consommation de ressource de ce script est minime, surtout si l'on utilise un serveur dédié. Comme dit ce script à la base je l'ai fait pour moi afin de répondre à mes besoins, et contrairement à la plupart des personnes je n'utilise aucun hébergement mutualisé ou tout autre chose de ce genre. Pour moi, que ce soit pour l'entreprise dans laquelle je suis actuellement ou pour mon cas personnel, le contrôle total et l'accès physique à la machine sont des éléments très importants.

"Tant qu'à faire je préfère encore utiliser un htaccess basé sur une liste d'adresses IP / domaines reconnus et mis à jour très fréquemment. Au moins on se préserve des risques."
Pour ma part je préfère utiliser les virtualhost pour balancer un RedirectPermanent sur toutes les requêtes n'utilisant pas les noms de domaines que j'ai prévu, et donc les bots qui scannent des plages d'adresses et ne connaissent que l'IP du serveur pour y accéder.

"tu as bien de la chance, car moi j'en rencontre un paquet qui n'ont pas de user-agent."
C'est fort possible, mais peut-être confond-tu avec ce qui semble être un bug d'IE6 ? J'ai constaté que certains IE (qui ne sont pas des bots) font régulièrement des requêtes à l'insue de l'utilisateur sur certains éléments visiblement mis en cache et que, dans le cas d'IE6, lors de ces requêtes aucun user-agent n'est transmis. Ceci dit je ne connais pas ton cas et ça très bien ne pas être ça, je ne fait ici qu'une supposition.

"Pour le code lui même, forcément, je n'ai pas grand chose à dire (mais il y en a quand même quelques unes :o))"
Si tu as des remarques n'hésites pas, il est toujours préférable de montrer les erreurs des autres (les miennes dans le cas présent) afin de faire progresser dans le bon sens.

"Disont que j'ai une tendance (peut-être trop) forte à critiquer les solutions sécurités qui ne fonctionnent pas vraiment. Je m'en excuse."
Je n'ai jamais prétendu avoir fait une solution de sécurisation, c'est une solution permettant l'évaluation des risques.

"J'ai souligné qu'une des principales problématiques des bots et scanners étaient la fréquence souvent élevées des requêtes ce qui bouffent de la bandwidth et du processeur pour les autres connexions et qu'une protection contre ceux-ci devrait avant tout intégrer ce genre de protection."
On est bien d'accord sur les troubles causés par ces bots cependant, pour être d'une efficacité optimale, ta solution doit s'adapter au cas de ton serveur.
Arto_8000
Messages postés
1044
Date d'inscription
lundi 7 mars 2005
Statut
Membre
Dernière intervention
13 juillet 2010
5 -
Disont que j'ai une tendance (peut-être trop) forte à critiquer les solutions sécurités qui ne fonctionnent pas vraiment. Je m'en excuse.

Petite remarque sur la citation de "tu devrais t'attarder surtout sur la fréquence des requêtes". Tu aurais du citer ceci au lieu "tu devrais t'attarder surtout sur la fréquence des requêtes qui sont souvent presque du spam (et c'est surtout ça qui peut être problématique avec les bot et les scanners)." J'ai souligné qu'une des principales problématiques des bots et scanners étaient la fréquence souvent élevées des requêtes ce qui bouffent de la bandwidth et du processeur pour les autres connexions et qu'une protection contre ceux-ci devrait avant tout intégrer ce genre de protection. Ça déroge un peu du but de la source, mais je tenais à mentionner cela.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.