Grep - Búsqueda Avanzada de Texto
El comando grep es una herramienta fundamental para la búsqueda de patrones en texto. Esta guía cubre desde uso básico hasta técnicas avanzadas con expresiones regulares para pentesting y análisis forense.
Sintaxis Básica
Section titled “Sintaxis Básica”grep [OPCIONES] PATRÓN [ARCHIVO...]Opciones Fundamentales
Section titled “Opciones Fundamentales”Opciones de Búsqueda
Section titled “Opciones de Búsqueda”-i, --ignore-case # Ignorar mayúsculas y minúsculas-v, --invert-match # Mostrar líneas que NO coinciden-w, --word-regexp # Buscar palabras completas-x, --line-regexp # Buscar líneas completas-F, --fixed-strings # Interpretar patrón como cadena literal-E, --extended-regexp # Usar expresiones regulares extendidas-P, --perl-regexp # Usar expresiones regulares de PerlOpciones de Salida
Section titled “Opciones de Salida”-n, --line-number # Mostrar número de línea-H, --with-filename # Mostrar nombre del archivo-h, --no-filename # No mostrar nombre del archivo-c, --count # Contar coincidencias-l, --files-with-matches # Solo nombres de archivos con coincidencias-L, --files-without-match # Solo nombres de archivos sin coincidencias-o, --only-matching # Solo mostrar la parte que coincideOpciones de Contexto
Section titled “Opciones de Contexto”-A NUM, --after-context=NUM # Mostrar NUM líneas después-B NUM, --before-context=NUM # Mostrar NUM líneas antes-C NUM, --context=NUM # Mostrar NUM líneas antes y despuésOpciones de Archivo
Section titled “Opciones de Archivo”-r, --recursive # Buscar recursivamente en directorios-R, --dereference-recursive # Seguir enlaces simbólicos--include=PATRÓN # Solo buscar en archivos que coincidan--exclude=PATRÓN # Excluir archivos que coincidan--exclude-dir=PATRÓN # Excluir directorios que coincidanExpresiones Regulares Básicas
Section titled “Expresiones Regulares Básicas”Metacaracteres
Section titled “Metacaracteres”. # Cualquier carácter (excepto nueva línea)^ # Inicio de línea$ # Final de línea* # Cero o más repeticiones del carácter anterior+ # Una o más repeticiones (con -E)? # Cero o una repetición (con -E)[] # Clase de caracteres[^] # Clase de caracteres negada\ # Escape de metacaracteresClases de Caracteres Predefinidas
Section titled “Clases de Caracteres Predefinidas”[:alnum:] # Caracteres alfanuméricos[:alpha:] # Caracteres alfabéticos[:digit:] # Dígitos[:lower:] # Minúsculas[:upper:] # Mayúsculas[:space:] # Espacios en blanco[:punct:] # Signos de puntuaciónEjemplos Básicos
Section titled “Ejemplos Básicos”Búsqueda Simple
Section titled “Búsqueda Simple”# Buscar palabra en archivogrep "error" /var/log/syslog
# Búsqueda insensible a mayúsculasgrep -i "ERROR" /var/log/syslog
# Buscar palabra completagrep -w "root" /etc/passwd
# Buscar líneas que NO contengan el patróngrep -v "^#" /etc/ssh/sshd_configBúsqueda con Contexto
Section titled “Búsqueda con Contexto”# Mostrar 3 líneas antes y despuésgrep -C 3 "Failed password" /var/log/auth.log
# Mostrar 5 líneas despuésgrep -A 5 "kernel panic" /var/log/syslog
# Mostrar 2 líneas antesgrep -B 2 "segfault" /var/log/syslogExpresiones Regulares Avanzadas
Section titled “Expresiones Regulares Avanzadas”Patrones Comunes
Section titled “Patrones Comunes”# Direcciones IPgrep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" archivo.log
# Direcciones de emailgrep -E "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" archivo.txt
# URLs HTTP/HTTPSgrep -E "https?://[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}[/a-zA-Z0-9._-]*" archivo.txt
# Números de teléfono (formato US)grep -E "\([0-9]{3}\) [0-9]{3}-[0-9]{4}" archivo.txt
# Fechas (formato YYYY-MM-DD)grep -E "[0-9]{4}-[0-9]{2}-[0-9]{2}" archivo.log
# Hashes MD5grep -E "[a-f0-9]{32}" archivo.txt
# Hashes SHA1grep -E "[a-f0-9]{40}" archivo.txt
# Direcciones MACgrep -E "([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}" archivo.logBúsquedas Complejas
Section titled “Búsquedas Complejas”# Líneas que empiecen con mayúsculagrep "^[A-Z]" archivo.txt
# Líneas que terminen con puntogrep "\.$" archivo.txt
# Líneas vacíasgrep "^$" archivo.txt
# Líneas con al menos 3 dígitos consecutivosgrep "[0-9]{3,}" archivo.txt
# Palabras de 4 a 8 caracteresgrep -E "\b[a-zA-Z]{4,8}\b" archivo.txtUso en Pentesting y Forense
Section titled “Uso en Pentesting y Forense”Análisis de Logs de Seguridad
Section titled “Análisis de Logs de Seguridad”# Intentos de login fallidosgrep "Failed password" /var/log/auth.log
# Logins exitosos de rootgrep "Accepted.*root" /var/log/auth.log
# Conexiones SSH desde IPs específicasgrep "sshd.*192\.168\." /var/log/auth.log
# Intentos de escalada de privilegiosgrep -i "sudo.*COMMAND" /var/log/auth.log
# Actividad de usuarios específicosgrep "user.*john" /var/log/auth.logBúsqueda de Credenciales
Section titled “Búsqueda de Credenciales”# Buscar passwords en archivos de configuracióngrep -r -i "password" /etc/ 2>/dev/null
# Buscar claves APIgrep -r -E "api[_-]?key" /var/www/ 2>/dev/null
# Buscar tokens de autenticacióngrep -r -E "token|secret|key" /home/ 2>/dev/null
# Buscar hashes de contraseñasgrep -E "\$[0-9]\$" /etc/shadowAnálisis de Tráfico de Red
Section titled “Análisis de Tráfico de Red”# Buscar IPs sospechosas en logs de Apachegrep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" /var/log/apache2/access.log
# Buscar códigos de error HTTPgrep " 40[0-9] \| 50[0-9] " /var/log/apache2/access.log
# Buscar intentos de inyección SQLgrep -i "union.*select\|drop.*table" /var/log/apache2/access.log
# Buscar ataques XSSgrep -i "script.*alert\|javascript:" /var/log/apache2/access.logAnálisis de Procesos y Sistema
Section titled “Análisis de Procesos y Sistema”# Buscar procesos sospechososps aux | grep -E "(nc|netcat|ncat)"
# Buscar conexiones de red activasnetstat -tulpn | grep -E ":(22|80|443|3389)"
# Buscar archivos modificados recientementefind / -mtime -1 2>/dev/null | grep -v "/proc\|/sys"Combinaciones Avanzadas
Section titled “Combinaciones Avanzadas”Múltiples Patrones
Section titled “Múltiples Patrones”# Buscar múltiples patrones (OR)grep -E "error|warning|critical" /var/log/syslog
# Buscar múltiples patrones en archivos específicosgrep -E "admin|root" /etc/passwd /etc/group
# Usar archivo con patronesecho -e "error\nwarning\ncritical" > patterns.txtgrep -f patterns.txt /var/log/syslogFiltros Complejos
Section titled “Filtros Complejos”# Buscar IPs que NO sean de red localgrep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" access.log | \grep -v -E "^192\.168\.|^10\.|^172\.(1[6-9]|2[0-9]|3[01])\."
# Buscar errores excluyendo ciertos tiposgrep -i error /var/log/syslog | grep -v -E "timeout|connection"
# Buscar líneas con formato específicogrep -E "^[0-9]{4}-[0-9]{2}-[0-9]{2}.*ERROR" application.logOptimización y Rendimiento
Section titled “Optimización y Rendimiento”Opciones de Rendimiento
Section titled “Opciones de Rendimiento”# Usar grep binario para archivos grandesLC_ALL=C grep "pattern" largefile.log
# Limitar búsqueda a primeras coincidenciasgrep -m 10 "pattern" largefile.log
# Usar búsqueda de cadena fija para mejor rendimientogrep -F "literal_string" largefile.log
# Excluir archivos binariosgrep -I "pattern" *Búsquedas en Archivos Comprimidos
Section titled “Búsquedas en Archivos Comprimidos”# Buscar en archivos gzipzgrep "pattern" file.gz
# Buscar en archivos bzip2bzgrep "pattern" file.bz2
# Buscar en archivos xzxzgrep "pattern" file.xzScripts y Automatización
Section titled “Scripts y Automatización”Script de Análisis de Logs
Section titled “Script de Análisis de Logs”#!/bin/bashLOG_FILE="/var/log/auth.log"REPORT_FILE="security_report.txt"
echo "Reporte de Seguridad - $(date)" > $REPORT_FILEecho "=================================" >> $REPORT_FILE
echo "Intentos de login fallidos:" >> $REPORT_FILEgrep "Failed password" $LOG_FILE | wc -l >> $REPORT_FILE
echo "IPs con más intentos fallidos:" >> $REPORT_FILEgrep "Failed password" $LOG_FILE | \grep -oE "([0-9]{1,3}\.){3}[0-9]{1,3}" | \sort | uniq -c | sort -nr | head -10 >> $REPORT_FILEFunción de Búsqueda Inteligente
Section titled “Función de Búsqueda Inteligente”smart_grep() { local pattern="$1" local path="${2:-.}"
# Buscar en archivos de texto comunes find "$path" -type f \( -name "*.log" -o -name "*.txt" -o -name "*.conf" \) \ -exec grep -l "$pattern" {} \; 2>/dev/null
# Buscar en archivos comprimidos find "$path" -type f -name "*.gz" \ -exec zgrep -l "$pattern" {} \; 2>/dev/null}Casos de Uso Específicos
Section titled “Casos de Uso Específicos”Forense Digital
Section titled “Forense Digital”# Buscar evidencia de exfiltración de datosgrep -r -E "(wget|curl|scp|rsync).*\.(zip|tar|gz)" /var/log/
# Buscar comandos ejecutados por usuariosgrep -E "COMMAND.*(/bin/|/usr/bin/)" /var/log/auth.log
# Buscar modificaciones de archivos críticosgrep -E "(chmod|chown|mv|rm).*(/etc/|/bin/)" /var/log/syslogAnálisis de Malware
Section titled “Análisis de Malware”# Buscar strings sospechosos en binariosstrings suspicious_file | grep -E "(password|admin|backdoor)"
# Buscar patrones de shellcodegrep -aoE "\\x[0-9a-f]{2}" suspicious_file
# Buscar URLs embebidasstrings suspicious_file | grep -E "https?://"Nota de Rendimiento: Para archivos muy grandes, considera usar
ripgrep(rg) oag(the silver searcher) como alternativas más rápidas a grep tradicional.
Nota de Seguridad: Al buscar en logs del sistema, ten cuidado de no exponer información sensible en la salida de tus comandos.