Le «pare-feu» applicatif Introduction Pré-requis - configuration Pré-requis - installation ADF, Montpellier septembre 2008
Attaques : ««visant des applications web et en particulier PHP fondées sur possibilité de faire exécuter des commandes via telle faille mod_security : Définir des règles -filtrant la plupart des requêtes
mod_security ATTAQUES Attaques fondées sur possibilité de faire executer des commandes : Des applications WEB ( PHP en particulier) avec des règles filtrant la plupart des requêtes Faille(s) Wget / uname /rm /mv /pwd /chmod /lynx /perl /chr /curl /fetch /cd /cmd/
Module de Apache 2 Moteur de détection et de prévention d intrusion OpenSource pour les applications Web On parle de : «pare-feu applicatif» Travaille au niveau de la couche application : http Fonctionne sur un mode de règles / filtres Cette version 2.x apporte : «Un support XML ( permet un firewall XML) «Granularité fine dans les règles apportant grandes précisions «5 phases d intervention possibles
Filtrages de requêtes, de patterns,.. Filtrages HTTPS, données compressées Stoppe des requêtes suspectes avant qu'elles n'atteignent une application PHP Journalisation des requêtes, analyse des logs Analyse de contenu (lors de l utilisation de la méthode POST) des fonctions de prévention d attaques
LUA : langage de programmation Libxml2 : librairie xml PCRE : Perl compatible regular expression NB : privilégier les packages des distributions
Pré-requis : Apache 2 et libxml2 Cas 1 : installation rapide : celle de votre distribution Cas 2 : nous compilons le module télécharger le module 2.5.4 du site web, décompresser Compilation : => mod_security2.so
5 phases - des Règles, Actions, Filtres ADF, Montpellier septembre 2008
document
Possibilité de définir à quelle phase intervenir : différents niveaux «Globalement : SecDefaultAction «log,pass,phase:2» Ou SecRule HTTP_HOST «!^$» «deny,phase:1» «Dans la règle SecRule REMOTE_PORT «@gt 1024»»deny,phase:2»
ARGS traite l'ensemble des arguments, ou accéde à un argument en particulier, ou à tous les arguments sauf un,... AUTH_TYPE pour accéder au type d'authentification ENV HTTP_REFERER pour l'accès au Referer REMOTE_ADDR et REMOTE_HOST pour connaître l'adresse IP ou le reverse DNS du client REQUEST_BODY : corps d'une requête REQUEST_HEADERS : en-tête d'une requête REQUEST_METHOD : la méthode HTTP utilisée RESPONSE_BODY et RESPONSE_HEADERS : l'ensemble de la réponse
Coder / Décoder en base64 Décoder un url Enlever des espaces Calculer des empreintes md5 ou sha1.
Allow auditlog : journaliser l'action dans le fichier d'audit capture: sauvegarder la transaction, 10 captures sont possibles chain: permet d enchaîner plusieurs règles ctl : mettre à jour les règles de filtrage deny : bloque la requête et l'interprétation des autres règles. drop : coupe la connexion au niveau TCP exec : lance un script externe (pour bloquer une adresse par exemple) log : journalise la transaction
phase : précise la phase durant laquelle la règle sera mise en place proxy : relaye la requête vers un autre serveur (si mod_proxy est installé) redirect : redirige le client vers une url donnée sanitisearg, sanitisematched, sanitiserequestheader. actions de nettoyage severity : spécifie le niveau d'une alerte status : spécifie la réponse HTTP : 403, 404,...
SecRule est la principale directive : SecRule VARIABLES OPERATEUR [ACTION] Variables : spécifie la variable que l on veut tester Exemple :le client possède t il l adresse 192.168.1.1? SecRule REMOTE_ADDR «^192\.168\.1.1 Opérateur : est précédé par @ : lt, gt, ; la négation est représentée par! SecRule REMOTE_PORT «@lt 1024» Action : précise ce que l on veut faire SecDefaultAction «log,pass,phase:2» OU «deny,log,status:400,phase:2»
LoadFile /usr/lib/libxml2.so.2 modsecurity.conf LoadModule security2_module LoadModule unique_id_module modules/mod_unique_id.so SecRuleEngine On SecRequestBodyAccess On (activation inspection du champs des requêtes) SecResponseBodyAccess On (activation inspection des trames réponses) # changer la bannière du serveur SecServerSignature " MON_SERVEUR" SecDebugLog modsec2_debug.log SecDebugLogLevel 3 (notices)(0=nolog 1=err only 2=warning 4=détails 5=détails handled 9=tout est journalisé et détaillé) # bloquer l accès au fichier testhsc avec un message SecRule REQUEST_FILENAME "testhsc" log,deny,status:403,msg: non permis-testhsc
5- Scan / filtres SecFilterScanPost On Off (scanne les variables POST) SecFilterDefaultAction + Action à prendre par defaut SecFilterDefaultAction «deny,log, status:400» => interdit requêtes invalides
: des options utiles : v2.x Création de filtres : SecFilter SecFilter /bin/ls (interdit commande ls, exec, ) Des filtres plus précis SecFilterSelective THE_REQUEST «wget» SecFilterSelective ARG_PHPSESSION «!^[0-9a-z]*$» SecFilterSelective COOCKIE_PHPSESSIONID «!^[0-9az]*$» SecFilterSelective REQUEST_METHOD TRACE
#bloquer tout ce qui contient mot viagra ou mortgage ou herbal SecFilter «viagra mortgage herbal» SecFilter scanne toute la requete #Scanne variable(s) post uniquement ou autres champs SecFilterSelective «POST_PAYLOAD» «viagra» SecFilterSelective «HTTP_REFER» «(viagra toto mortgage)» #rediriger agent google SecFilterSelectve «HTTP_USER_AGENT» «Google» nolog, redirect:http://www.google.com
#Applications Web # Vérifier la valeur numérique d une variable SecRule ARGS:maVar "!(^[0-9]*$)" log,deny,status:403 # test une valeur d une liste blanche avec home et liens SecRule ARGS:file "!(^(home liens)\.php$)" log,deny,status:403 # Détection attaque type Injection SQL (modification d une variable utilisée dans la requête SQL) SecFilter «or.+1[[:space]]*=[[:space]]
# attaque sur BD SecFilter «exec.+xp_» ( souvent attaques par xp_cmdshel) SecFilter «@ @ [[ alnum : ]]+» (tout attaché) SecFilter «exec.+sp_» SecFilter «load [[:space]]+data» SecFilter «delete [[:space]]+from» SecFilter «create [[:space]]+table» SecFilter «update.+set.+=» SecFilterSelective ARGS «drop [[:space]]+database» SecFilterSelective ARGS «drop [[:space]]+table»
modsecurity_crs_10_config.conf modsecurity_crs_20_protocol_violations.conf modsecurity_crs_21_protocol_anomalies.conf modsecurity_crs_30_http_policy.conf modsecurity_crs_35_bad_robots.conf modsecurity_crs_40_generic_attacks.conf modsecurity_crs_45_trojans.conf modsecurity_crs_50_outbound.conf modsecurity_crs_55_marketing.conf modsecurity_localrules.conf
LoadFile /usr/lib/libxml2.so.2 LoadModule security2_module modules/mod_security2.so LoadModule unique_id_module modules/mod_unique_id.so <IfModule mod_security2.c> # This is the ModSecurity Core Rules Set. # Basic configuration goes in here Include modsecurity.d/modsecurity_crs_10_config.conf # Protocol violation and anomalies. Include modsecurity.d/modsecurity_crs_20_protocol_violations.conf Include modsecurity.d/modsecurity_crs_21_protocol_anomalies.conf # HTTP policy rules Include modsecurity.d/modsecurity_crs_30_http_policy.conf
# Here comes the Bad Stuff... Include modsecurity.d/modsecurity_crs_35_bad_robots.conf Include modsecurity.d/modsecurity_crs_40_generic_attacks.conf Include modsecurity.d/modsecurity_crs_45_trojans.conf Include modsecurity.d/modsecurity_crs_50_outbound.conf # Search engines and other crawlers. Only useful if you want to track # Include modsecurity.d/modsecurity_crs_55_marketing.conf # Put your local rules in here. Include modsecurity.d/modsecurity_localrules.conf </IfModule>
modsecurity_crs_10_config.conf. # bloquer le bot DTS agent SecFilterSelective HTTP_USER_AGENT "DTS Agent" # Empecher l'acces fichier /etc SecFilterSelective THE_REQUEST "/etc" # Empecher une attaque transversale de répertoire SecFilter "\.\./" # Empêcher téléchargement de fichiers ou certaines commandes SecFilterSelective THE_REQUEST "echo " SecFilterSelective THE_REQUEST "uname " SecFilterSelective THE_REQUEST "mkdir " SecFilterSelective THE_REQUEST "cmd " SecFilterSelective THE_REQUEST "mv " SecFilterSelective THE_REQUEST "links -dump " SecFilterSelective THE_REQUEST "links -dump-width " SecFilterSelective THE_REQUEST "links -dump-charset " SecFilterSelective THE_REQUEST "links http:// " SecFilterSelective THE_REQUEST "links ftp:// "
Vérifie que les requêtes sont conformes aux règles de construction du protocole HTTP Teste : -présence de NULL -- méthodes HEAD et GET -- taille des trames -- contenu entête HTTP -- construction de la request line
Complète le précédent : JOURNALISE signale dans les LOGS des ANOMALIES Alerte : -Utilisation adresse locale -- requête HTTP0.9 -- rejet de la requête initiale
restreint/autorise Blocage de méthodes telles CONNECT, TRACE, DEBUG extension de fichiers,.ini, fichiers de bases de données Limitation de tailles upload
Permet d inscrire des robots qui n en seraient pas Intervient en phase 2
Met en place des règles contre des attaques génériques XSS, injection SQL,.. -Fixe les sessions --injections sql aveugles -- attaques XSS -- attaques ouvertures de fenetres de commandes shell --injections diverses ( ldap, ssi, coldfusion )
Détecte et interdit les accès aux chevaux de troie connus Ce fichier devra être tenu à jour régulièrement en téléchargeant les règles ou bien en les insérant manuellement dans le fichier
Détecte et interdit les trames contenant des informations susceptibles dêtre utilisées pour des actions malveillantes
INFORMATION : Principalement journalisation et log de transactions en provenance de -Google --Yahoo -- MSN
1- partie requête et réponse des applications peuvent s arrêter ou bloquer 2- consommation mémoire le «body» est parfois conservé en mémoire gérer les tailles de réponses ( c est possible avec la v 2.x) pas de probleme avec un reverse-proxy peut surcharger le serveur 3- consommation CPU - vérifier le CPU-Bound Pas de problème dans un contexte de reverse proxy 4- nécessite une personnalisation des règles 5- n est pas un outil infaillible
. -Cf Doc. Modsecurity en pdf -Cf liste des codes erreurs modsecurity -Cf liste des codes erreurs http ADF, Montpellier septembre 2008
ordre dans le fichier nom fichier code message 3 crs_55 910006 robot google 2 crs_55 910007 robot yahoo 1 crs_55 910008 robot msn 5 crs_40 950001 sql injection attack 11 crs_40 950002 system command access 9 crs_40 950004 xss: attack cross script 10 crs_40 950005 file injection 12 crs_40 950006 system command access 2 crs_40 950007 sql injection attack 14 crs_40 950008 cold fusion injection de doc 1 crs_40 950009 request header session fixation 15 crs_40 950010 ldap injection 16 crs_40 950011 ssi injection 17 crs_40 950013 php injection 19 crs_40 950018 persistant universal pdf attack 20 crs_40 950019 email injection 1 crs_45 950110 trojan : backdoor access 404 3 crs_40 950903 request header referer 4 crs_40 950904 sql injection attack 6 crs_40 950905 sql injection attack 7 crs_40 950906 sql injection attack 13 crs_40 950907 system command access / user agent 501 8 crs_40 950908 sql injection attack 18 crs_40 950911 http splitting attack 2 crs_45 950921 trojan : backdoor access 3 crs_45 950922 trojan : backdoor access 6 crs_30 960010 request content not allowed by policy 5 crs_30 960032 method not allowed by policy 7 crs_30 960034 http protocol version not allowed 8 crs_30 960035 url file extension restricted 9 crs_30 960038 http header restricted 10 crs_30 960902 modsecurity doesnt support encoding 11 crs_30 960903 modsecurity doesnt support encoding 1 crs_50 970002 2 crs_50 970003 sql 3 crs_50 970004 IIS 5 crs_50 970007 zope 6 crs_50 970008 cold fusion 7 crs_50 970009 php info 8 crs_50 970010 isa server 9 crs_50 970012 word 10 crs_50 970013 directory - authorisé 11 crs_50 970014 jsp - asp 13 crs_50 970015 php 15 crs_50 970016 cold fusion 16 crs_50 970018 IIS 19 crs_50 970021 weblogic 18 crs_50 970118 appli non disponible 17 crs_50 970901 appli non disponible 14 crs_50 970902 php source code 12 crs_50 970903 jsp - asp 4 crs_50 970904 IIS 1 crs_35 990002 bad robots : scanner web site 4 crs_35 990011 automatic program explore web site 3 crs_35 990012 rogue web site crawler 2 crs_35 990901 bad robots : scanner web site