Cosa fa#
Cerca pattern (stringhe o espressioni regolari) all'interno di file o flussi di dati (Standard Input). È il pilastro fondamentale per l'analisi dei log e l'isolamento di eventi sospetti.
Sintassi#
grep [opzioni] "pattern" file
Comandi essenziali#
| Comando | Flag | Cosa fa | |
|---|---|---|---|
grep "Failed" auth.log | — | Cerca righe con la parola esatta "Failed". | |
grep -i "error" syslog | -i (ignore-case) | Cerca "error" ignorando maiuscole/minuscole. | |
grep -v "INFO" syslog | -v (invert-match) | Esclude le righe che contengono "INFO" (filtro negativo). | |
grep -r "password" /etc/ | -r (recursive) | Ricerca globale in directory e sottocartelle. | |
grep -c "Failed" auth.log | -c (count) | Conta le occorrenze totali del pattern. | |
grep -n "error" syslog | -n (line-number) | Mostra il numero di riga del match. | |
grep -A 5 "ssh" file | -A (after) | Mostra il match + le 5 righe successive (utile per contesto). | |
grep -E "regex" file | -E (extended) | Abilita le espressioni regolari estese (ERE). | |
grep -o 'pattern' file | -o | only-matching — solo il match | Stampa solo la parte della riga che corrisponde al pattern, non tutta la riga |
grep -C 5 "ssh" file | -C | Mostra il match + le 5 righe precedenti (utile per contesto). | |
🧩 Potenziamento con Regex (Bandit 09 Style)#
Quando usi grep -E, puoi usare simboli speciali per descrivere come deve essere fatta la riga, non solo cosa deve contenere.
I "Mattoncini" usati nel Livello 09:#
| Simbolo | Significato |
|---|---|
. | Jolly: Rappresenta un carattere qualsiasi. |
* | Quantificatore: Il carattere precedente può ripetersi 0 o infinite volte. |
^ | Ancora di Inizio: La riga deve iniziare esattamente da qui. |
$ | Ancora di Fine: La riga deve finire esattamente qui. |
\w | Word: Corrisponde a lettere, numeri e underscore. |
Pattern: ^.*==.*$
^ .* == .* $
| | | | |
Inizio -- Qualsiasi -- Due uguali -- Qualsiasi -- Fine riga
riga carattere fissi carattereLe tue varianti per Bandit 09:#
grep -E "\w*==\w*"- Logica: Cerca "parole" attaccate a due uguali.
- Rischio: Se la password ha uno spazio o un punto, la Regex si rompe.
grep -E ".*=.*=.*"- Logica: Almeno due simboli uguale in qualsiasi posizione.
- Rischio: Potrebbe catturare troppo rumore binario.
grep -E "^.*==.*$"- _Logica:_ La riga "universale" che contiene almeno `==`.
- Vantaggio: È la più robusta per catturare stringhe sporche.
🧠 Analisi da Senior Analyst#
Come vedi, la differenza fondamentale sta nel posizionamento del cuscinetto .*:
- Se metti
.*prima dell'ancora di inizio (^.*), stai dicendo agrep: "Non mi interessa quanta spazzatura c'è prima di trovare il mio obiettivo". - Se lo togli (
^==), stai dicendo: "Sii selettivo, l'obiettivo deve essere la primissima cosa che incontri".
LOGICA DELLE ANCORE E DEI CUSCINETTI (REGEX)#
1. CONTIENE "==" (In qualsiasi punto)
Pattern: ^ . * = = . * $
| |__| |__| |__| |
| | | | +-- Fine della riga
| | | +------- Cuscinetto Post: Qualsiasi carattere (0+)
| | +------------- CARATTERI FISSI: Cerca esattamente "=="
| +------------------- Cuscinetto Pre: Qualsiasi carattere (0+)
+----------------------- Inizio della riga
Match: [ abc==123 ] , [ 5==========PASS ] , [ ==password ]
--------------------------------------------------------------------------------
2. INIZIA CON "==" (Rigido all'inizio)
Pattern: ^ = = . * $
| |__| |__| |
| | | +-- Fine della riga
| | +------- Cuscinetto: Tutto ciò che segue i primi "=="
| +------------- CARATTERI FISSI: La riga DEVE aprirsi con "=="
+----------------- Inizio della riga
Match: [ ==abc123 ] , [ ==password ]
No Match: [ abc==123 ] (Inizia con 'a')
--------------------------------------------------------------------------------
3. FINISCE CON "==" (Rigido alla fine)
Pattern: ^ . * = = $
| |__| |__| |
| | | +-- Fine della riga: La riga DEVE chiudersi con "=="
| | +------- CARATTERI FISSI
| +------------- Cuscinetto: Tutto ciò che precede gli ultimi "=="
+----------------- Inizio della riga
Match: [ abc123== ] , [ password== ]
No Match: [ abc==123 ] (Finisce con '3')
================================================================================Esempi pratici di navigazione#
Uno dei tuoi trucchi più utili per studiare i manuali:
# Estrae la sezione esempi dal manuale di find (circa 20 righe)
man find | grep -A 20 -i "^examples" Combinazioni utili (SOC Analysis)#
# Analisi forense: Classifica gli IP che hanno fallito il login (dal più frequente)
cat /var/log/auth.log | grep "Failed" | awk '{print $11}' | sort | uniq -c | sort -rn
# Monitoraggio Real-time: Filtra log cercando errori o negazioni
journalctl -f | grep -i "error\|failed\|denied"
# Hardening: Identifica quali servizi sono abilitati all'avvio
sudo systemctl list-unit-files | grep "enabled"Estrae tutti i src di file JS da una pagina HTML#
grep -o 'src="[^"]*\.js"' index.html
# -o = stampa solo il match, non tutta la riga
# [^"]* = qualsiasi carattere tranne virgolette (zero o piu')
# \.js = letteralmente ".js" (il . e' escaped)
# Utile per: analisi di pagine web, trovare risorse caricateScenario Reale#
Durante l'analisi di un possibile attacco Brute Force, un analista utilizza la combinazione grep | uniq -c per identificare se un singolo indirizzo IP ha generato migliaia di tentativi di accesso in pochi minuti, permettendo di bloccare l'attaccante sul firewall.
Dove l'ho usato#
- bandit-07 — Per trovare la stringa "millionth" in un file di dati immenso.
- bandit-10 — Per estrarre dati leggibili da output complessi.
- progetto-lab-vm — Per navigare nel manuale di SSH e controllare lo stato dei demoni.
Note personali#
Analyst Tip: La combo
grep | sort | uniq -c | sort -rnè il pane quotidiano del SOC. Trasforma migliaia di righe di log disordinate in una classifica statistica chiara. Ricorda di usare sempre le virgolette" "per racchiudere il pattern.
Collegato a#
- log — categoria (Hub)
- system — categoria (Hub)
- regex — concetto (pattern complessi)
- awk — spesso usato in pipeline dopo grep per isolare colonne specifiche




