par , 05/04/2020 à 18h32 (650 Affichages)
dans ce post, nous avions besoin d’analyser le contenu d’un fichier de configuration qui est écrit en XML, mais qui contient également des classiques pairs de clé/valeur. Et comme notre analyse pourrait être menée sur une ferme de serveurs (par exemple dans le cadre d’un audit de sécurité) il n’est pas question de le faire à la main. ce Billet va donc montrer comment faire ce job automatiquement en Java.
Pour illustrer mon propos je vais faire la démonstration sur un fichier de configuration Apache (le fameux httpd.conf). Voici à quoi il ressemble :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220
|
###*********************************************************
###* Secured configuration *
###* Apache configuration file *
###* No need 4 hardening *
###* v1.95-httpd22-ssl *
###*********************************************************
ThreadsPerChild 250
MaxRequestsPerChild 0
Listen 80
ServerRoot "/www/Apache22"
DocumentRoot "/THDL/thdl-site"
## was /www/webroot
ServerName localhost:80
ServerAdmin admin@localhost
ErrorLog logs/error.log
LogLevel error
###
# Note that the following LoadModule lines only represent the minimum 'Web-Developer' Suite configuration.
#
# Also note that some of the following LoadModule lines, which are commented out, are still loaded under…
# confSuite-extra*.conf
# confextra*.conf
# …configuration files -- for modular reasons.
#
# For example:
# mod_deflate is loaded under confSuite-extramod_deflate_logio.conf and NOT under httpd.conf
# status_module is loaded under confextrahttpd-info.conf and NOT under httpd.conf
#
# Check last part of httpd.conf for the Apache base and 'Web-Developer' *.conf files that are included.
###
#LoadModule actions_module modules/mod_actions.so
LoadModule alias_module modules/mod_alias.so
#LoadModule asis_module modules/mod_asis.so
#LoadModule auth_basic_module modules/mod_auth_basic.so
#LoadModule auth_digest_module modules/mod_auth_digest.so
#LoadModule authn_anon_module modules/mod_authn_anon.so
#LoadModule authn_dbm_module modules/mod_authn_dbm.so
#LoadModule authn_default_module modules/mod_authn_default.so
#LoadModule authn_file_module modules/mod_authn_file.so
#LoadModule authz_dbm_module modules/mod_authz_dbm.so
#LoadModule authz_default_module modules/mod_authz_default.so
#LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_host_module modules/mod_authz_host.so
#LoadModule authz_user_module modules/mod_authz_user.so
LoadModule autoindex_module modules/mod_autoindex.so
#LoadModule cern_meta_module modules/mod_cern_meta.so
#LoadModule cgi_module modules/mod_cgi.so
#LoadModule dav_module modules/mod_dav.so
#LoadModule dav_fs_module modules/mod_dav_fs.so
#LoadModule deflate_module modules/mod_deflate.so
LoadModule dir_module modules/mod_dir.so
#LoadModule env_module modules/mod_env.so
#LoadModule expires_module modules/mod_expires.so
#LoadModule file_cache_module modules/mod_file_cache.so
#LoadModule headers_module modules/mod_headers.so
#LoadModule imagemap_module modules/mod_imagemap.so
#LoadModule include_module modules/mod_include.so
#LoadModule info_module modules/mod_info.so
#LoadModule isapi_module modules/mod_isapi.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule mime_module modules/mod_mime.so
#LoadModule mime_magic_module modules/mod_mime_magic.so
#LoadModule proxy_module modules/mod_proxy.so
#LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
#LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
#LoadModule proxy_connect_module modules/mod_proxy_connect.so
#LoadModule proxy_http_module modules/mod_proxy_http.so
#LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
#LoadModule negotiation_module modules/mod_negotiation.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule setenvif_module modules/mod_setenvif.so
#LoadModule speling_module modules/mod_speling.so
#LoadModule status_module modules/mod_status.so
#LoadModule unique_id_module modules/mod_unique_id.so
#LoadModule userdir_module modules/mod_userdir.so
#LoadModule usertrack_module modules/mod_usertrack.so
#LoadModule vhost_alias_module modules/mod_vhost_alias.so
<IfDefine SSL>
LoadModule ssl_module modules/mod_ssl.so
</IfDefine>
DefaultType text/plain
<IfModule dir_module>
DirectoryIndex index.html index.php index.aspx
</IfModule>
IndexIgnore .htaccess
<FilesMatch "^.ht">
Order allow,deny
Deny from all
</FilesMatch>
Redirect /thdl http://localhost
<Directory />
Options FollowSymLinks
AllowOverride all
Order deny,allow
Allow from all
Satisfy all
</Directory>
## was /www/webroot
<Directory "/THDL/thdl-site">
Options Indexes FollowSymLinks
AllowOverride all
Order allow,deny
Allow from all
</Directory>
<IfModule mime_module>
TypesConfig conf/mime.types
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
</IfModule>
# Apache base configuration
#
# The configuration files in the conf/extra/ directory can be
# included to add extra features or to modify the default configuration of
# the server.
# Server-pool management (MPM specific)
#Include conf/extra/httpd-mpm.conf
# Multi-language error messages
#Include conf/extra/httpd-multilang-errordoc.conf
# Fancy directory listings
Include conf/extra/httpd-autoindex.conf
# Language settings
Include conf/extra/httpd-languages.conf
# User home directories
#Include conf/extra/httpd-userdir.conf
# Real-time info on requests and configuration
Include conf/extra/httpd-info.conf
# Virtual hosts
#Include conf/extra/httpd-vhosts.conf
# Local access to the Apache HTTP Server Manual
Include conf/extra/httpd-manual.conf
# Distributed authoring and versioning (WebDAV)
#Include conf/extra/httpd-dav.conf
# Various default settings
Include conf/extra/httpd-default.conf
# DeveloperSide.NET Server-Suite Configuration
#
# The configuration files in the conf/Suite-extra/ directory can be
# included to add extra features or to modify the default configuration of
# the server.
#
# The specifics are loaded under components.conf…
Include conf/Suite-extra/components.conf
# Security check -- if no php5 module is loaded, Apache should return 'permissions denied' on php5 all URL requests
<IfModule !php5_module>
<Location />
<FilesMatch ".php5$">
Order allow,deny
Deny from all
</FilesMatch>
</Location>
</IfModule>
#For PHP5
LoadFile "C:/www/php5/php5ts.dll"
LoadModule php5_module "C:/www/php5/php5apache2.dll"
<IfModule php5_module>
#PHPIniDir "C:/Windows"
<Location />
AddType text/html .php .phps
AddHandler application/x-httpd-php .php
AddHandler application/x-httpd-php-source .phps
</Location>
</IfModule>
<IfModule ssl_module>
Include conf/extra/httpd-ssl.conf
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>
## Added for MYsql/PMA based on guide.
<IfModule mod_alias.c>
Alias /phpMyAdmin "C:/www/phpMyAdmin"
</IfModule>
<Directory "C:/www/phpMyAdmin">
Options None
AllowOverride None
order deny,allow
deny from all
allow from 127.0.0.1
</Directory> |
Dans un premier temps je vais le transformer en un fichier XML et un fichier traditionnel du siècle précédent .properties. Je dois donc transformer mon fichier httpd.conf en un fichier httpd.conf.xml et un fichier httpd.conf.properties
J’ai choisi ce fichier qui me semble assez significatif de ce que l’on peut trouver. On y remarque 3 choses :
- Il y a beaucoup de commentaires verbeux autant qu’inutiles et que l’on peut repérer facilement puisqu’il commence par un #
- Les ligne clé/valeur sont sur le modèle clé + un espace + valeur et il commence sans indentation
- Les ligne XML (plutôt bien formées) sont facilement repérables car ils comprennent une balise du style <maBalise> ou commencent par un espace (voire une tabulation)
Je vais donc créer une classe utilitaire (Util) avec 3 méthodes (Static) permettant de générer depuis un nom de fichier passé en paramètre :
- Un fichier sans commentaires
- Un fichier uniquement XML
- Un fichier clé valeur
1/ La méthode de nettoyage des commentaires :
On remarque que l’on peut choisir le caractère de début d’une ligne de commentaires
On profite également de cette opération de nettoyage pour se débarrasser des lignes vides
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
static public boolean removeComments(String fileName, String beginComments) {
File inputFile = new File(fileName);
File clearFile = new File(fileName+".clear");
try {
BufferedReader reader = new BufferedReader(new FileReader(inputFile));
BufferedWriter writer = new BufferedWriter(new FileWriter(clearFile));
String content = "";
while((content = reader.readLine()) != null) {
if (content.length() > 0 && !content.contains(beginComments) && content != "") {
writer.write(content);
writer.write("\n");
}
}
reader.close();
writer.close();
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
} |
2/ La méthode de génération du fichier XML
On prendra comme fichier d’entrée un fichier expurgé des commentaires
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
static public boolean file2Xml(String fileName) {
File inputFile = new File(fileName);
File clearFile = new File(fileName+".xml");
try {
BufferedReader reader = new BufferedReader(new FileReader(inputFile));
BufferedWriter writer = new BufferedWriter(new FileWriter(clearFile));
String content = "";
while((content = reader.readLine()) != null) {
if (content.contains("<") && content.contains(">") || content.charAt(0) == ' ' || content.charAt(0) == '\t') {
writer.write(content);
writer.write("\n");
}
}
reader.close();
writer.close();
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
} |
3/ La méthode de génération du fichier de propriétés
On prendra toujours le même fichier en entrée
Mais on le mettra sous la forme clé : valeur afin qu’il puisse automatiquement être chargé par l’API core de Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
static public boolean file2Prop(String fileName) {
File inputFile = new File(fileName);
File clearFile = new File(fileName+".properties");
try {
BufferedReader reader = new BufferedReader(new FileReader(inputFile));
BufferedWriter writer = new BufferedWriter(new FileWriter(clearFile));
String content = "";
while((content = reader.readLine()) != null) {
if (!content.contains("<") && !content.contains(">") && content.charAt(0) != ' ' && content.charAt(0) != '\t') {
int index = content.indexOf(" ");
String resultString = content.substring(0, index) + ":" + content.substring(index+1);
writer.write(resultString);
writer.write("\n");
}
}
reader.close();
writer.close();
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
} |
Nous verrons dans un prochain billet comment traiter ces 2 fichiers en java pour évaluer la configuration de sécurité de la cible (le serveur)
Mis à jour 06/04/2020 à 19h47 par autran
- Catégories
-
Java