Téléverser les fichiers vers "/"

This commit is contained in:
2026-04-20 13:26:13 +02:00
commit e456c6d94e
3 changed files with 999 additions and 0 deletions

315
audit-suid.sh Normal file
View File

@@ -0,0 +1,315 @@
#!/bin/bash
# Script d'audit des fichiers SUID et GUID
# Auteur: Zen6
# Date: $(date +%Y-%m-%d)
# Version: 1.0
# Configuration
LOG_DIR="/var/log/audit"
LOG_FILE="$LOG_DIR/suid_guid_audit_$(date +%Y%m%d_%H%M%S).log"
REPORT_FILE="$LOG_DIR/suid_guid_report_$(date +%Y%m%d_%H%M%S).txt"
ALERT_FILE="$LOG_DIR/suid_guid_alerts_$(date +%Y%m%d_%H%M%S).txt"
WHITELIST_FILE="/etc/audit/suid_whitelist.conf"
# Couleurs pour l'affichage
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Fonction de logging
log() {
echo -e "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
}
# Fonction d'affichage
print_header() {
echo -e "${BLUE}========================================${NC}"
echo -e "${BLUE}$1${NC}"
echo -e "${BLUE}========================================${NC}"
}
# Vérification des privilèges root
check_root() {
if [[ $EUID -ne 0 ]]; then
echo -e "${RED}Ce script doit être exécuté en tant que root${NC}"
echo "Utilisez: sudo $0"
exit 1
fi
}
# Création des répertoires nécessaires
setup_directories() {
if [[ ! -d "$LOG_DIR" ]]; then
mkdir -p "$LOG_DIR"
chmod 750 "$LOG_DIR"
fi
}
# Création du fichier de whitelist par défaut
create_default_whitelist() {
if [[ ! -f "$WHITELIST_FILE" ]]; then
mkdir -p "$(dirname $WHITELIST_FILE)"
cat > "$WHITELIST_FILE" << EOF
# Liste blanche des binaires SUID/SGID légitimes
# Format: chemin/du/binaire [SUID|SGID|BOTH]
/bin/su SUID
/bin/ping SUID
/bin/mount SUID
/bin/umount SUID
/usr/bin/passwd SUID
/usr/bin/sudo SUID
/usr/bin/chsh SUID
/usr/bin/chfn SUID
/usr/bin/gpasswd SUID
/usr/bin/crontab SUID
/usr/bin/at SUID
/usr/bin/newgrp SUID
/usr/sbin/unix_chkpwd SUID
/usr/bin/wall SGID
/usr/bin/write SGID
/usr/bin/ssh-agent SGID
/usr/bin/locate SGID
/usr/bin/mlocate SGID
EOF
log "Fichier de whitelist créé: $WHITELIST_FILE"
fi
}
# Fonction pour charger la whitelist
load_whitelist() {
declare -gA WHITELIST_SUID
declare -gA WHITELIST_SGID
if [[ -f "$WHITELIST_FILE" ]]; then
while IFS= read -r line || [[ -n "$line" ]]; do
# Ignorer les commentaires et lignes vides
[[ "$line" =~ ^#.*$ ]] && continue
[[ -z "$line" ]] && continue
read -r path type <<< "$line"
if [[ -n "$path" ]]; then
case "$type" in
SUID) WHITELIST_SUID["$path"]=1 ;;
SGID) WHITELIST_SGID["$path"]=1 ;;
BOTH) WHITELIST_SUID["$path"]=1; WHITELIST_SGID["$path"]=1 ;;
esac
fi
done < "$WHITELIST_FILE"
fi
}
# Fonction principale d'audit
audit_files() {
local tmp_file="/tmp/suid_audit_$$.tmp"
print_header "AUDIT DES FICHIERS SUID ET GUID"
log "Début de l'audit des fichiers SUID/SGID"
# Recherche des fichiers SUID
log "Recherche des fichiers SUID..."
find / -type f -perm -4000 2>/dev/null | while read -r file; do
if [[ -f "$file" ]]; then
local perms=$(ls -l "$file" | awk '{print $1}')
local owner=$(ls -l "$file" | awk '{print $3}')
local size=$(ls -lh "$file" | awk '{print $5}')
local mtime=$(stat -c %y "$file" 2>/dev/null | cut -d. -f1)
# Vérification dans la whitelist
if [[ -z "${WHITELIST_SUID[$file]}" ]]; then
echo "$file|SUID|$owner|$perms|$size|$mtime" >> "$tmp_file"
echo -e "${RED}[ALERTE SUID]${NC} $file (propriétaire: $owner, permissions: $perms)"
log "ALERTE SUID: $file (propriétaire: $owner)"
else
echo -e "${GREEN}[OK SUID]${NC} $file (whitelisté)"
log "OK SUID: $file (whitelisté)"
fi
fi
done
# Recherche des fichiers SGID
log "Recherche des fichiers SGID..."
find / -type f -perm -2000 2>/dev/null | while read -r file; do
if [[ -f "$file" ]]; then
local perms=$(ls -l "$file" | awk '{print $1}')
local group=$(ls -l "$file" | awk '{print $4}')
local size=$(ls -lh "$file" | awk '{print $5}')
local mtime=$(stat -c %y "$file" 2>/dev/null | cut -d. -f1)
# Vérification dans la whitelist
if [[ -z "${WHITELIST_SGID[$file]}" ]]; then
echo "$file|SGID|$group|$perms|$size|$mtime" >> "$tmp_file"
echo -e "${RED}[ALERTE SGID]${NC} $file (groupe: $group, permissions: $perms)"
log "ALERTE SGID: $file (groupe: $group)"
else
echo -e "${GREEN}[OK SGID]${NC} $file (whitelisté)"
log "OK SGID: $file (whitelisté)"
fi
fi
done
# Génération du rapport
if [[ -f "$tmp_file" ]]; then
generate_report "$tmp_file"
rm -f "$tmp_file"
else
log "Aucune anomalie SUID/SGID détectée"
echo -e "${GREEN}Aucune anomalie SUID/SGID détectée${NC}"
fi
}
# Génération du rapport détaillé
generate_report() {
local tmp_file="$1"
{
echo "=========================================="
echo "RAPPORT D'AUDIT SUID/SGID"
echo "Date: $(date '+%Y-%m-%d %H:%M:%S')"
echo "Serveur: $(hostname)"
echo "=========================================="
echo ""
echo "ANOMALIES DÉTECTÉES:"
echo "--------------------"
local suid_count=0
local sgid_count=0
while IFS='|' read -r file type owner perms size mtime; do
if [[ "$type" == "SUID" ]]; then
((suid_count++))
echo ""
echo "[$suid_count] FICHIER SUID SUSPECT: $file"
echo " Propriétaire: $owner"
echo " Permissions: $perms"
echo " Taille: $size"
echo " Dernière modification: $mtime"
echo " Recommandation: Vérifier la légitimité de ce binaire"
elif [[ "$type" == "SGID" ]]; then
((sgid_count++))
echo ""
echo "[$sgid_count] FICHIER SGID SUSPECT: $file"
echo " Groupe: $owner"
echo " Permissions: $perms"
echo " Taille: $size"
echo " Dernière modification: $mtime"
echo " Recommandation: Vérifier la légitimité de ce binaire"
fi
done < "$tmp_file"
echo ""
echo "STATISTIQUES:"
echo "-------------"
echo "Total SUID suspects: $suid_count"
echo "Total SGID suspects: $sgid_count"
echo ""
echo "RECOMMANDATIONS:"
echo "----------------"
echo "1. Examinez chaque binaire suspect manuellement"
echo "2. Supprimez les bits SUID/SGID si non nécessaires: chmod u-s <fichier>"
echo "3. Ajoutez les binaires légitimes à la whitelist: $WHITELIST_FILE"
echo "4. Vérifiez l'intégrité des binaires système"
echo "5. Surveillez les changements régulièrement"
} > "$REPORT_FILE"
# Création du fichier d'alertes (uniquement les anomalies)
grep -E "^\[ALERTE" "$LOG_FILE" > "$ALERT_FILE" 2>/dev/null || true
log "Rapport généré: $REPORT_FILE"
log "Alertes sauvegardées: $ALERT_FILE"
}
# Fonction de vérification supplémentaire (fichiers dans /tmp, /var/tmp)
check_temp_directories() {
print_header "VÉRIFICATION DES RÉPERTOIRES TEMPORAIRES"
log "Vérification des répertoires /tmp et /var/tmp..."
for dir in /tmp /var/tmp /dev/shm; do
if [[ -d "$dir" ]]; then
echo -e "${YELLOW}Vérification de $dir:${NC}"
find "$dir" -type f \( -perm -4000 -o -perm -2000 \) 2>/dev/null | while read -r file; do
echo -e "${RED}[URGENT] Fichier suspect dans $dir: $file${NC}"
log "URGENT: Fichier SUID/SGID dans $dir: $file"
done
fi
done
}
# Fonction de vérification des fichiers sans propriétaire
check_orphan_files() {
print_header "FICHIERS SUID/SGID SANS PROPRIÉTAIRE"
log "Recherche des fichiers SUID/SGID sans propriétaire valide..."
find / -type f \( -perm -4000 -o -perm -2000 \) -nouser -o -nogroup 2>/dev/null | while read -r file; do
echo -e "${RED}[ORPHELIN] $file${NC}"
log "ORPHELIN: $file"
echo "$file" >> "$ALERT_FILE"
done
}
# Fonction de vérification des hash MD5 pour les binaires système
check_system_binaries() {
print_header "VÉRIFICATION DES BINAIRES SYSTÈME"
log "Vérification des binaires système critiques..."
local system_bins=("/bin/su" "/bin/ping" "/usr/bin/sudo" "/usr/bin/passwd")
for bin in "${system_bins[@]}"; do
if [[ -f "$bin" ]]; then
local md5=$(md5sum "$bin" 2>/dev/null | awk '{print $1}')
log "Hash MD5 de $bin: $md5"
echo "$bin: $md5" >> "$LOG_DIR/system_hashes_$(date +%Y%m%d).txt"
fi
done
}
# Fonction principale
main() {
echo -e "${BLUE}"
cat << "EOF"
╔═══════════════════════════════════════╗
║ SUID/SGID Security Audit Tool ║
║ Linux Privilege Scanner ║
╚═══════════════════════════════════════╝
EOF
echo -e "${NC}"
check_root
setup_directories
create_default_whitelist
load_whitelist
echo ""
audit_files
echo ""
check_temp_directories
echo ""
check_orphan_files
echo ""
check_system_binaries
print_header "RÉSUMÉ DE L'AUDIT"
echo -e "Log complet: ${GREEN}$LOG_FILE${NC}"
echo -e "Rapport détaillé: ${GREEN}$REPORT_FILE${NC}"
echo -e "Alertes: ${RED}$ALERT_FILE${NC}"
echo -e "Whitelist: ${YELLOW}$WHITELIST_FILE${NC}"
if [[ -s "$ALERT_FILE" ]]; then
echo -e "\n${RED}⚠️ ATTENTION: Des anomalies ont été détectées !${NC}"
echo "Consultez $ALERT_FILE pour plus de détails"
exit 1
else
echo -e "\n${GREEN}✓ Aucune anomalie détectée${NC}"
exit 0
fi
}
# Gestion des signaux
trap 'echo -e "\n${RED}Script interrompu par utilisateur${NC}"; exit 1' INT TERM
# Exécution
main "$@"