#!/bin/bash
# Couleurs pour les messages en console
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
NC='\033[0m' # Pas de couleur
# Vérifie si l'outil nmap est installé
if ! command -v nmap &> /dev/null; then
echo -e "${RED}❌ nmap n'est pas installé. Installez-le d'abord.\n try: apt install nmap ${NC}"
exit 1
fi
# Vérifie si le dossier de sortie existe, sinon le crée
output_dir="/home/www-adm1n/rapports"
mkdir -p "$output_dir"
# Création d'un fichier HTML avec la date et l'heure courantes
current_datetime=$(date +"%Y-%m-%d %H:%M:%S")
output_file="$output_dir/scan_ports_$(date +"%Y-%m-%d_%H-%M-%S").html"
temp_file="/tmp/nmap_scan_result.txt"
# Récupère des informations système
hostname=$(hostname)
os_info=$(uname -srvmo)
# Début du script avec message et emoji
echo -e "${YELLOW}🔍 Démarrage du scan complet des ports...${NC}"
# Création du fichier HTML avec thème sombre, style moderne, tri, encodage UTF-8 et adaptation mobile
echo "
📊 Rapport de Scan Complet des Ports
📊 Rapport de Scan Complet des Ports 0
${current_datetime}
Port
Type
Service
Icone
Statut
" > "$output_file"
# Affiche une barre de progression simulée
function progress_bar {
for i in {1..10}; do
echo -ne "${YELLOW}⏳ Progression : $((i * 10))% \r${NC}"
sleep 0.3
done
echo -ne '\n'
}
progress_bar
# Exécution du scan de tous les ports TCP et UDP avec Nmap sans détection de version, enregistrement dans un fichier temporaire
nmap -sS -sU -p- localhost > "$temp_file"
# Vérification si le fichier temporaire a bien été créé et contient des données
if [[ ! -s "$temp_file" ]]; then
echo -e "${RED}❌ Erreur : Aucun résultat trouvé. Le scan nmap n'a pas produit de sortie.${NC}"
exit 1
fi
# Compteur de ports
port_count=0
# Fonction pour attribuer une icône selon le service et le port
function get_icon {
service="$1"
port_number="$2"
if [[ $service == "docker" ]]; then
echo ""
elif [[ $service == "http" || $service == "https" || $service == "apache" ]]; then
echo ""
elif [[ $service == "mysql" ]]; then
echo ""
elif [[ $service == "ssh" ]]; then
echo ""
elif [[ $service == "smtp" ]]; then
echo ""
elif [[ $port_number -eq 80 || $port_number -eq 81 || $port_number -eq 8080 || $port_number -eq 443 || ( $port_number -ge 8060 && $port_number -le 8090 ) ]]; then
echo ""
elif [[ $service == "mysql" || $port_number -eq 3306 ]]; then
echo "" # MySQL
elif [[ $service == "rpcbind" || $port_number -eq 111 ]]; then
echo "" # RPC services
elif [[ $service == "netbios-ssn" || $service == "netbios-ns" || $service == "netbios-dgm" ]]; then
echo "" # NetBIOS
elif [[ $service == "microsoft-ds" || $port_number -eq 445 ]]; then
echo "" # Microsoft Directory Services
elif [[ $service == "nessus" || $port_number -eq 3001 ]]; then
echo "" # Nessus
elif [[ $service == "redis" || $port_number -eq 6379 ]]; then
echo "" # Redis
elif [[ $service == "memcache" || $port_number -eq 11211 ]]; then
echo "" # Memcache
elif [[ $service == "unot" || $port_number -eq 5055 ]]; then
echo "" # Unot (générique pour services inconnus)
elif [[ $service == "pharos" || $port_number -eq 4443 ]]; then
echo "" # Pharos
elif [[ $service == "llmnr" || $port_number -eq 5355 ]]; then
echo "" # LLMNR (Link-Local Multicast)
elif [[ $service == "tor-orport" || $port_number -eq 9001 ]]; then
echo "" # Tor
elif [[ $service == "sdr" || $port_number -eq 9010 ]]; then
echo "" # SDR (Service Discovery Relay)
elif [[ $service == "dhcpc" || $port_number -eq 68 ]]; then
echo "" # DHCP client
elif [[ $service == "unknown" ]]; then
echo "" # Unknown service
elif [[ $port_number -eq 443 || $port_number -eq 8443 || $service == "https-alt" ]]; then
echo "" # HTTPS and secure ports
else
echo ""
fi
}
# Lecture et analyse du fichier temporaire ligne par ligne
while read -r line; do
echo -e "${YELLOW}🔹 Ligne lue : $line${NC}" # Message de débogage
# Filtre des lignes correspondant aux ports ouverts et extraction des informations
if [[ $line =~ ^[0-9]+/(tcp|udp) ]]; then
port=$(echo "$line" | awk '{print $1}')
protocol=$(echo "$port" | awk -F'/' '{print $2}')
port_number=$(echo "$port" | cut -d'/' -f1)
status=$(echo "$line" | awk '{print $2}')
service=$(echo "$line" | awk '{print $3}')
icon=$(get_icon "$service" "$port_number")
# Incrément du compteur de ports
((port_count++))
# Ajout des informations au fichier HTML
echo "
$port
$protocol
$service
$icon
$status
" >> "$output_file"
fi
done < "$temp_file"
# Ajout du compteur dans la balise de la pastille
echo "" >> "$output_file"
# Finalisation du fichier HTML avec informations supplémentaires et lien vers le fichier généré
echo "
" >> "$output_file"
# Suppression du fichier temporaire
rm "$temp_file"
# Confirmation de la création du fichier
if [[ -f "$output_file" ]]; then
echo -e "${GREEN}✅ Scan terminé. Rapport sauvegardé dans :${NC} $output_file"
else
echo -e "${RED}❌ Erreur : Impossible de créer le rapport.$NC"
fi