[alertyellow][MEMO] [/alertyellow]
En codant ma nouvelle interface de monitoring de mon UPS (https://nut.ckforum.com) en BASH avec json et récupération des retour de nut en remplacement UI en CGI
j'ai voulu sécuriser et ...
Grace à chatGPT j'ai créer un script en BASH d'audit de site
ce qui m'a permis de nettoyer le site et de m'apercevoir que les hackers
ont modifié pas mal de fichier en ayant la capacité d'écrire sur le site via des techniques permettant, a cause de la mauvaise protection de la root du site entre autre,
de coder et d'injecter des codes puis cachés dans certains fichiers (je pense que c'est peut grace à bot qui injecte différents bout de code pour laisser à quelque uns la chance de fonctionner ! )
Le script ci-dessous est bien pratique mais n'est pas magique il permet de comprendre les commandes qui sont nécessaires et se veut un peu didactique.
[titreyoyo]
Guide d’usage —[/titreyoyo]
[titreyoyo]site_audit_portable.sh[/titreyoyo]
Résumé rapide
est un script portable, read-only qui :
site_audit_portable.sh.zip (Taille : 6.24 Ko / Téléchargements : 1)
Ce script ne fait rien sur les fichiers il donne des conseils et annexes les fichiers qu'il estime suspicieux en éxécutant des paternes type
ce qui permet de voir des script php qui ont pu etre modifier et avec le code injecté en base 64
attention il lit tout ce qu'il imagine a risque mais cela peut représenter des faux positifs !
En codant ma nouvelle interface de monitoring de mon UPS (https://nut.ckforum.com) en BASH avec json et récupération des retour de nut en remplacement UI en CGI
j'ai voulu sécuriser et ...
Grace à chatGPT j'ai créer un script en BASH d'audit de site
ce qui m'a permis de nettoyer le site et de m'apercevoir que les hackers
ont modifié pas mal de fichier en ayant la capacité d'écrire sur le site via des techniques permettant, a cause de la mauvaise protection de la root du site entre autre,
de coder et d'injecter des codes puis cachés dans certains fichiers (je pense que c'est peut grace à bot qui injecte différents bout de code pour laisser à quelque uns la chance de fonctionner ! )
Le script ci-dessous est bien pratique mais n'est pas magique il permet de comprendre les commandes qui sont nécessaires et se veut un peu didactique.
[titreyoyo]
Guide d’usage —[/titreyoyo]
[titreyoyo]site_audit_portable.sh[/titreyoyo]
Résumé rapide
est un script portable, read-only qui :
- scanne un webroot pour des motifs suspects (eval, base64, exec, inclusions distantes, etc.),
- génère un rapport lisible + une annexe contenant les lignes complètes trouvées,
- exporte un CSV et un JSON récapitulatif,
- fournit des commandes prêtes pour mettre en quarantaine, durcir les permissions et bloquer l’exécution PHP dans
.Code :uploads/
Citation :Exécution recommandée : sur la machine backend (où sont stockés les fichiers).
Utilise
(pasCode :bash
[alertblue]1 — Installation (rapide)[/alertblue]Code :zsh
Copier le script sur la machine (par exemple /usr/local/bin ou /root).
# depuis ta machine locale (scp) ou en éditant sur le serveur
Code :sudo tee /usr/local/bin/site_audit_portable.sh > /dev/null <<'EOF'
# (colle le contenu du script ici)
EOF
Code :sudo chmod +x /usr/local/bin/site_audit_portable.sh
Vérifier la syntaxe (optionnel) :
Code :bash -n /usr/local/bin/site_audit_portable.sh
Lancer (voir §2 pour les options).
[titreyoyo]2 — Options & variables d’environnement[/titreyoyo]
Options en ligne de commande
Citation :--report-dir DIR : dossier où seront écrits site_audit_*.txt, *_annex_suspects.txt, *_suspects.csv, *_suspects.json. (défaut : dossier du script)
--patterns-file FILE : fichier avec motifs custom (1 motif par ligne, # pour commentaire).
--preview-length N : longueur des extraits dans le rapport (défaut 200).
--strict : n’utiliser que les motifs très suspects (eval, base64, gzinflate, ...).
-h / --help : aide.
Variable d’environnement
PATTERNS='motif1|motif2|motif3' — si définie, remplace les motifs par défaut et est prioritaire sur --patterns-file.
[titreyoyo]3 — Exemples d’utilisation[/titreyoyo]
Exemple basique (interactif)
sudo /usr/local/bin/site_audit_portable.sh --report-dir /root/audits --preview-length 120
Le script te demandera :
comment le site est accessible (http/https/url/détection),
le webroot (ex: /var/www/monsite),
l’utilisateur web (ex: www-data),
type d’application (nextcloud/mybb/wordpress/autre),
répertoires à garder en écriture (ex: uploads cache).
Mode strict (juste les motifs très suspects)
Code :sudo /usr/local/bin/site_audit_portable.sh --strict --report-dir /root/audits
Avec motifs custom via env
export PATTERNS='eval\(|base64_decode|file_get_contents\(.*http'
Code :sudo /usr/local/bin/site_audit_portable.sh --report-dir /root/audits
Avec motifs depuis un fichier
/root/patterns.txt :
Code :# strict suspects
eval\(
base64_decode
gzinflate
# réseau / inclusion distante
file_get_contents\(.*http
curl_exec
Puis :
Code :sudo /usr/local/bin/site_audit_portable.sh --patterns-file /root/patterns.txt --report-dir /root/audits
[titreyoyo]4 — Lecture des résultats[/titreyoyo]
Le script génère 4 fichiers (par défaut dans --report-dir):
site_audit_YYYYMMDD-HHMMSS.txt — rapport principal (synthèse + commandes recommandées).
Ouvrir :
Code :less /root/audits/site_audit_YYYYMMDD-HHMMSS.txt
site_audit_YYYYMMDD-HHMMSS_annex_suspects.txt — annexe contenant les lignes complètes trouvées (pliées à 120 cols).
Ouvrir :
Code :less /root/audits/site_audit_YYYYMMDD-HHMMSS_annex_suspects.txt
site_audit_YYYYMMDD-HHMMSS_suspects.csv — fichier,nb_occurrences (pratique pour tableur/SIEM).
Ouvrir :
Code :column -t -s, /root/audits/site_audit_*.csv | less -S
site_audit_YYYYMMDD-HHMMSS_suspects.json — JSON (utile pour ingestion SIEM).
Ouvrir :
Code :cat /root/audits/site_audit_*.json | jq .
[titreyoyo]5 — Motifs (patterns) par défaut & stratégie[/titreyoyo]
Le script essaie plusieurs jeux de motifs dans l’ordre (sauf si tu fournis PATTERNS ou --patterns-file) :
STRICT — motifs très suspects : eval(, base64_decode, gzinflate, preg_replace /e, assert(
LOOSE — exécutables/inclusions : system(, exec(, shell_exec(, passthru(, ...
COMMON — inclusions distantes et appels réseau : file_get_contents(...http), curl_exec, ...
HEURISTIC — recherche de lignes très longues (≥ ~300 caractères) → signale des blobs obfusqués
Le script s’arrête pour l’aperçu principal sur le premier set qui renvoie des hits, mais enregistre tout dans l’annexe (tu auras les résultats de chaque set).
[titreyoyo]6 — Exemple concret (WordPress / MyBB / Nextcloud)[/titreyoyo]
[alertred]WordPress (exemples de commandes)[/alertred]
Durcir tout le site (safe default) :
Code :sudo chown -R root:www-data /var/www/wordpress
sudo find /var/www/wordpress -type d -exec chmod 0750 {} \;
sudo find /var/www/wordpress -type f -exec chmod 0644 {} \;
Laisser uploads en écriture :
Code :sudo chown -R www-data:www-data /var/www/wordpress/wp-content/uploads
sudo chmod -R 0770 /var/www/wordpress/wp-content/uploads
wp-config.php figé :
Code :sudo chown root:www-data /var/www/wordpress/wp-config.php
sudo chmod 0640 /var/www/wordpress/wp-config.php
[alertred]MyBB[/alertred]
inc/config.php doit parfois être modifiable pendant install :
Pendant l’install :
Code :sudo chown www-data:www-data /var/www/mybb/inc/config.php
sudo chmod 0660 /var/www/mybb/inc/config.php
Après install :
Code :sudo chown root:www-data /var/www/mybb/inc/config.php
sudo chmod 0640 /var/www/mybb/inc/config.php
[alertred]Nextcloud[/alertred]
config/config.php souvent figé :
Code :sudo chown root:www-data /var/www/nextcloud/config/config.php
sudo chmod 0640 /var/www/nextcloud/config/config.php
# datadir hors webroot (sensé être accessible en lecture/écriture pour www-data)
sudo chown -R www-data:www-data /var/www/nextcloud/data
sudo chmod -R 0750 /var/www/nextcloud/data
[titreyoyo]7 — Automatisation (cron / systemd)[/titreyoyo]
Cron (exécution quotidienne)
Éditer root crontab (sudo crontab -e) et ajouter :
Code :0 3 * * * /usr/local/bin/site_audit_portable.sh --report-dir /root/daily_audits --preview-length 120 >> /var/log/site_audit.log 2>&1
Systemd service + timer (si tu préfères systemd)
Citation :/etc/systemd/system/site-audit.service
Code :[Unit]
Description=Site Audit Portable - run once
[Service]
Type=oneshot
ExecStart=/usr/local/bin/site_audit_portable.sh --report-dir /root/daily_audits --preview-length 120
User=root
/etc/systemd/system/site-audit.timer
[Unit]
Description=Run site audit daily
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
Puis :
Code :sudo systemctl daemon-reload
sudo systemctl enable --now site-audit.timer
[titreyoyo]8 — Quarantaine et investigation rapide[/titreyoyo]
Créer dossier quarantainne :
Code :sudo mkdir -p /root/quarantine_site && sudo chmod 700 /root/quarantine_site
Copier fichiers suspects (depuis l’annexe CSV ou grep) :
Code :sudo cp -a /var/www/site/path/suspect.php /root/quarantine_site/
sudo sha256sum /root/quarantine_site/suspect.php | tee /root/quarantine_site/suspect.php.sha256
Analyser la ligne dans l’annexe :
Code :less /root/audits/site_audit_YYYYMMDD-HHMMSS_annex_suspects.txt
[titreyoyo]9 — Dépannage & notes courantes[/titreyoyo]
Erreur zsh: no matches found: --include=*.php → utiliser des guillemets autour des --include : --include="*.php" ou lancer sous bash.
set -u erreurs / variable non définie : lancer le script avec bash (le script gère set -euo pipefail).
Si vous ne voyez rien :
Vérifie que tu as les droits de lecture (sudo) sur le webroot.
Vérifie si les motifs par défaut sont actifs (--strict ou PATTERNS).
Vérifie les extensions incluses (*.php, *.inc, *.phtml, *.js, *.sh) ; les fichiers sans extension ne sont pas scannés par défaut.
Le script est read-only — il ne supprime rien. Toutes les commandes proposées sont à copier-coller manuellement.
10 — Patterns recommandés (fichier patterns_strict.txt)
Copie ceci dans /root/patterns_strict.txt si tu veux un jeu de motifs strict :
# Trés suspects (eval/obfuscation)
Code :eval\(
base64_decode
gzinflate
preg_replace.*\/e
assert\(
create_function\(
Et patterns_loose.txt :
Code :# Exécution / commandes
system\(
exec\(
shell_exec\(
passthru\(
popen\(
proc_open\(
# Inclusion/réseau
file_get_contents\(.*http
curl_exec
fopen\(.*http
include\(.*http
11 — Checklist rapide à appliquer après audit
Sauvegarde / quarantaine des fichiers suspects
Restaurer depuis backup si possible (meilleure option)
Modifier chown/chmod pour code / configs / uploads
Bloquer exécution PHP dans uploads (nginx / .htaccess)
Changer tous les mots de passe liés (admin, DB, FTP/SFTP, API keys)
Scanner le serveur (clamav / rkhunter)
Monitorer / planifier audits réguliers
site_audit_portable.sh.zip (Taille : 6.24 Ko / Téléchargements : 1)
Ce script ne fait rien sur les fichiers il donne des conseils et annexes les fichiers qu'il estime suspicieux en éxécutant des paternes type
ce qui permet de voir des script php qui ont pu etre modifier et avec le code injecté en base 64
attention il lit tout ce qu'il imagine a risque mais cela peut représenter des faux positifs !

