Tutoriales

Comandos de Linux que todo hacker ético necesita (con ejemplos reales)

find, grep, awk, ss, sudo -l, nc, base64, tmux… Los comandos de Linux para hacking ético organizados por tarea, con ejemplos reales y qué buscar en la salida.

Publicado el 3 de noviembre de 202614 min de lectura0 views

Las herramientas de hacking cambian cada año; la terminal de Linux, no. Casi todo lo que harás en un laboratorio (encontrar una contraseña olvidada en un fichero de configuración, entender por qué un binario te da root, comprobar si un puerto está abierto o decodificar una cadena rara) se resuelve con un puñado de comandos de Linux bien combinados. Esta guía los organiza por tarea, con ejemplos realistas y, sobre todo, con qué tienes que buscar en la salida, que es lo que de verdad marca la diferencia.

Si todavía no tienes un entorno montado, empieza por Kali Linux para principiantes, donde ya repasamos lo más básico (ls, cd, cat…). Aquí vamos un paso más allá. Todos los ejemplos están pensados para ejecutarse en tu propia máquina virtual o en plataformas de práctica autorizadas.

1. Moverse por el sistema y encontrar cosas

find: la navaja suiza de la búsqueda

find recorre el árbol de directorios y filtra por casi cualquier atributo. La estructura es siempre find <dónde> <condiciones> <acción>. Añade 2>/dev/null para ocultar los miles de «Permiso denegado» cuando buscas desde /.

# Ficheros con el bit SUID activado (clásico en escalada de privilegios)
find / -perm -4000 -type f 2>/dev/null

# Ficheros que pertenecen a un usuario concreto
find / -user www-data -type f 2>/dev/null

# Ficheros de más de 50 MB en /home
find /home -type f -size +50M

# Ficheros modificados después que otro fichero de referencia
find /var/www -type f -newer /var/www/html/index.php

# Modificados en los últimos 30 minutos
find /etc -type f -mmin -30 2>/dev/null

# Directorios en los que tu usuario puede escribir
find / -type d -writable 2>/dev/null

Qué buscar: en la lista de SUID, la mayoría serán binarios esperados (/usr/bin/passwd, /usr/bin/sudo, /usr/bin/mount). Lo interesante es lo que no encaja: un binario en /opt, un script propio o una herramienta como find, vim o python3 con SUID. Con -newer y -mmin detectas qué ha cambiado recientemente, algo útil tanto para atacar un laboratorio como para investigar un incidente en tu propio servidor.

Ojo con la sintaxis de -perm: -perm -4000 significa «tiene al menos ese bit», mientras que -perm 4000 (sin guion) exige permisos exactamente iguales, y casi nunca devuelve nada.

locate: búsqueda instantánea por nombre

sudo updatedb
locate id_rsa
locate -i backup | grep -E '\.(zip|tar|gz|sql)$'

locate no recorre el disco: consulta una base de datos que genera updatedb. Por eso es rapidísimo, pero no verá ficheros creados después de la última actualización. En Kali viene como plocate. Úsalo para preguntas rápidas («¿hay alguna clave SSH en el sistema?») y find cuando necesites filtros o datos frescos.

which, type y command -v: ¿qué se ejecuta realmente?

which python3
type ll
command -v nc

which te dice qué ruta del PATH se ejecutará; type además te avisa si es un alias, una función o un comando interno de la shell. Es importante cuando ves un comportamiento extraño: si ls resulta ser un alias o un script en un directorio que va antes en el PATH, no estás ejecutando lo que crees. Ese mismo detalle es la base de una técnica de escalada conocida como PATH hijacking.

2. Leer y filtrar texto

En Linux casi todo es texto: configuraciones, logs, listados de usuarios, salidas de herramientas. Saber filtrarlo es la habilidad que más tiempo te ahorra.

grep: buscar dentro de ficheros

# Recursivo (-r), sin distinguir mayúsculas (-i), con número de línea (-n)
grep -rni "password" /var/www/ 2>/dev/null

# Solo los nombres de fichero que contienen la cadena
grep -rli "DB_PASS" /var/www/

# Invertir la búsqueda: quitar comentarios y líneas vacías de un .conf
grep -vE '^\s*(#|$)' /etc/ssh/sshd_config

# Extraer solo las IPs de un log
grep -oE '([0-9]{1,3}\.){3}[0-9]{1,3}' access.log

Qué buscar: ficheros como wp-config.php, .env, config.php o settings.py con credenciales en claro. Y en un sshd_config limpio de comentarios, líneas como PermitRootLogin yes o PasswordAuthentication yes, que indican una configuración débil.

cut y awk: quedarte con las columnas que importan

# Usuario y shell de cada cuenta (campos 1 y 7, separados por ':')
cut -d: -f1,7 /etc/passwd

# Usuarios "humanos" (UID >= 1000) con su directorio personal
awk -F: '$3 >= 1000 {print $1, $6}' /etc/passwd

# Cuentas con una shell válida para iniciar sesión
grep -E 'sh$' /etc/passwd

cut es perfecto para separadores fijos; awk cuando necesitas condiciones o columnas separadas por espacios variables. Las cuentas con /usr/sbin/nologin o /bin/false son de servicio; las que terminan en bash o zsh son las que pueden iniciar sesión, y por tanto tus objetivos en un laboratorio.

sort | uniq -c: contar y encontrar patrones

# Las 10 IPs que más peticiones hacen a tu servidor web
awk '{print $1}' /var/log/apache2/access.log | sort | uniq -c | sort -nr | head

Esta cadena es un clásico: uniq solo agrupa líneas consecutivas, por eso hay que ordenar antes con sort. El segundo sort -nr ordena numéricamente de mayor a menor. Una sola IP con miles de peticiones suele ser un escáner o un ataque de fuerza bruta.

head, tail -f y wc

head -n 20 wordlist.txt         # primeras 20 líneas
tail -n 50 /var/log/auth.log    # últimas 50
tail -f /var/log/apache2/access.log   # seguir el fichero en tiempo real
wc -l /usr/share/wordlists/rockyou.txt   # número de líneas

tail -f es ideal para ver en directo qué ocurre en tu servidor de pruebas mientras lanzas una herramienta desde otra terminal. Si no encuentras /var/log/auth.log (en Kali y Debian recientes los logs del sistema suelen ir solo al journal de systemd), el equivalente es journalctl -f. Y wc -l te dice cuántas contraseñas tiene un diccionario antes de lanzar un ataque que podría tardar horas.

3. Permisos y usuarios

Leer permisos y cambiarlos con chmod y chown

ls -l script.sh
-rwxr-x--- 1 kali developers 812 nov  3 10:15 script.sh

Los nueve caracteres tras el tipo de fichero son tres bloques: propietario (rwx), grupo (r-x) y otros (---). En notación numérica, r=4, w=2, x=1, así que este fichero es 750.

chmod 600 ~/.ssh/id_rsa       # solo el propietario lee y escribe
chmod u+x exploit.sh          # añadir ejecución al propietario
chmod o-r informe.txt         # quitar lectura a "otros"
sudo chown kali:kali notas.txt   # cambiar propietario y grupo

SSH se niega a usar una clave privada con permisos demasiado abiertos, así que chmod 600 es algo que harás a menudo. Al revés, un fichero sensible legible por todos (-rw-r--r-- en un backup con contraseñas) es justo el tipo de fallo que buscas en una auditoría.

SUID explicado sin rodeos

Normalmente un programa se ejecuta con los permisos de quien lo lanza. Con el bit SUID activado, se ejecuta con los permisos del propietario del fichero. Lo verás como una s en lugar de la x del propietario:

ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 68248 mar 23  2025 /usr/bin/passwd

passwd necesita SUID para que un usuario normal pueda modificar su propia contraseña en /etc/shadow, que es de root. El problema aparece cuando un binario con SUID de root permite hacer más de lo previsto, por ejemplo lanzar una shell o leer ficheros arbitrarios. Para saber si un binario concreto es abusable, el proyecto GTFOBins documenta cientos de casos. Herramientas como PEASS-ng (LinPEAS) automatizan esta revisión, pero entender el concepto te permite interpretar sus resultados en lugar de copiarlos.

id y sudo -l: quién eres y qué puedes hacer

id
uid=1000(kali) gid=1000(kali) groups=1000(kali),27(sudo),998(docker)

sudo -l
User kali may run the following commands on lab:
    (root) NOPASSWD: /usr/bin/vim

Qué buscar: en id, grupos privilegiados como sudo, wheel, docker, lxd, adm (puede leer logs) o disk. Pertenecer a docker equivale en la práctica a ser root. En sudo -l, cualquier línea NOPASSWD y cualquier programa que permita escapar a una shell (editores, intérpretes, paginadores como less) merece una mirada atenta.

/etc/passwd frente a /etc/shadow

/etc/passwd/etc/shadow
Quién puede leerloTodos los usuariosSolo root (y el grupo shadow)
ContenidoUsuario, UID, GID, directorio personal, shellHash de la contraseña y caducidad
Ejemplokali:x:1000:1000:,,,:/home/kali:/usr/bin/zshkali:$y$j9T$...:20390:0:99999:7:::

La x del segundo campo de /etc/passwd indica que el hash está en /etc/shadow. El prefijo del hash dice el algoritmo: $6$ es SHA-512 y $y$ es yescrypt, el predeterminado en Debian y Kali actuales. Dos hallazgos graves en un laboratorio: que /etc/shadow sea legible por tu usuario, o que /etc/passwd sea escribible (podrías añadir un usuario con UID 0). Compruébalo con ls -l /etc/passwd /etc/shadow.

4. Procesos y servicios

ps aux: qué se está ejecutando

ps aux | grep -i mysql
ps aux --sort=-%mem | head    # los que más memoria consumen
ps -ef --forest               # árbol de procesos padre-hijo

Qué buscar: la primera columna indica el usuario. Un proceso de root que ejecuta un script en un directorio donde tú puedes escribir es una vía de escalada. También verás a veces credenciales pasadas como argumentos (mysql -u root -pSecreto), visibles para cualquier usuario que liste procesos.

ss -tulpn: qué está escuchando

sudo ss -tulpn
Netid State  Local Address:Port  Process
tcp   LISTEN 0.0.0.0:22          users:(("sshd",pid=812,fd=3))
tcp   LISTEN 127.0.0.1:3306      users:(("mariadbd",pid=950,fd=21))

Las opciones significan: tCP, uDP, solo puertos a la escucha (listening), proceso asociado y números en vez de nombres. La columna clave es la dirección local: 0.0.0.0 o [::] significa accesible desde la red; 127.0.0.1 significa solo local. Un servicio interno que un escaneo externo no veía (como esa base de datos) aparece aquí, y es habitual en máquinas de laboratorio. Sin sudo no verás el proceso de los servicios de otros usuarios.

systemctl y kill

sudo systemctl status ssh
sudo systemctl start apache2
sudo systemctl enable ssh          # arrancar al iniciar el sistema
systemctl list-units --type=service --state=running

kill 4321          # pide terminar (SIGTERM, señal 15)
kill -9 4321       # fuerza el cierre (SIGKILL), último recurso
pkill -f "python3 -m http.server"

En Kali los servicios de red vienen desactivados por defecto, así que systemctl start es lo que usarás para levantar un servidor web o SSH de pruebas. Usa siempre kill sin opciones primero: deja al proceso cerrar ficheros y limpiar; -9 no le da esa oportunidad.

5. Red

ip y ping: tu punto de partida

ip a           # interfaces y direcciones
ip r           # tabla de rutas y puerta de enlace
ping -c 3 10.10.10.5

Cuando te conectas por VPN a una plataforma de práctica, aparece una interfaz tun0: esa IP es la que debes usar cuando una máquina tenga que conectarse de vuelta a ti. Que ping no responda no significa que el equipo esté apagado; muchos sistemas (Windows por defecto) bloquean ICMP.

curl y wget: hablar HTTP desde la terminal

curl -I http://10.10.10.5            # solo cabeceras
curl -s http://10.10.10.5/robots.txt
curl -v -X POST -d "user=admin&pass=test" http://10.10.10.5/login
wget -q http://10.10.14.2:8000/linpeas.sh -O /tmp/linpeas.sh

Qué buscar: en las cabeceras, Server y X-Powered-By revelan software y versiones; Set-Cookie sin HttpOnly o Secure es un fallo de configuración. Con -v ves la conversación completa, redirecciones incluidas. Para pasar ficheros entre tus máquinas de laboratorio, un python3 -m http.server 8000 en el origen y un wget o curl -O en el destino es lo más rápido.

dig: preguntar al DNS

dig example.com +short
dig example.com MX +short
dig -x 8.8.8.8 +short                  # resolución inversa
dig axfr @nsztm1.digi.ninja zonetransfer.me

El último ejemplo intenta una transferencia de zona contra zonetransfer.me, un dominio creado precisamente para practicarla legalmente. Si un servidor DNS mal configurado la permite, te entrega todos los subdominios de golpe.

nc: comprobar puertos a mano

nc -zv 10.10.10.5 22 80 443     # ¿están abiertos?
nc -zv -w 2 10.10.10.5 20-25    # rango, con 2 s de espera
nc -nv 10.10.10.5 21            # conectar y leer el banner

-z comprueba sin enviar datos, -v muestra el resultado y -n evita resolver DNS. Para un escaneo serio usarás Nmap, pero nc es perfecto para confirmar un puerto concreto o leer el banner de un servicio (FTP, SMTP y SSH suelen anunciar su versión al conectar).

6. Archivos comprimidos y codificaciones

tar -czvf web-backup.tar.gz /var/www/html   # crear .tar.gz
tar -tzf web-backup.tar.gz                  # listar sin extraer
tar -xzvf web-backup.tar.gz -C /tmp/revisar # extraer en otra carpeta

Recuerda las letras: crear, extraer, listar, z para gzip, v detallado, f fichero (siempre la última antes del nombre). Lista antes de extraer un archivo que no conoces.

echo -n 'admin:admin123' | base64      # YWRtaW46YWRtaW4xMjM=
echo 'YWRtaW46YWRtaW4xMjM=' | base64 -d
xxd misterio.bin | head
file misterio.bin
sha256sum kali-linux.iso
sha256sum -c SHA256SUMS

Usa echo -n al codificar: sin él se cuela un salto de línea y el resultado cambia. Una cadena con letras, números, +, / y uno o dos = al final suele ser Base64 (por ejemplo, en una cabecera Authorization: Basic). Recuerda que Base64 es una codificación, no un cifrado: cualquiera lo revierte. xxd muestra el volcado hexadecimal, donde los primeros bytes («números mágicos») delatan el tipo real del fichero: 89 50 4e 47 es PNG, 50 4b 03 04 es ZIP, aunque la extensión diga otra cosa; file hace esa comprobación por ti. Y los hashes sirven para verificar que una descarga no ha sido alterada.

7. Productividad en la shell

Tuberías y redirecciones

comando > salida.txt        # sobrescribe
comando >> salida.txt       # añade al final
comando 2> errores.txt      # solo errores (stderr)
comando > todo.txt 2>&1     # salida y errores al mismo fichero
comando 2>&1 | tee log.txt  # verlo en pantalla y guardarlo a la vez

El orden importa: en > todo.txt 2>&1 primero rediriges la salida al fichero y después «los errores van donde vaya la salida». Al revés no funciona igual. tee es tu mejor amigo para documentar: todo lo que guardes ahora te servirá para el informe o el writeup.

Historial

history | grep nmap   # ¿cómo lancé aquel escaneo?
!!                    # repetir el último comando
sudo !!               # repetirlo con sudo
Ctrl+R                # búsqueda inversa interactiva

En un laboratorio, el historial de otros usuarios (~/.bash_history, ~/.zsh_history) a veces contiene contraseñas tecleadas por error. Revisa también el tuyo antes de compartir capturas.

tmux: varias terminales en una

tmux new -s lab        # nueva sesión llamada "lab"
Ctrl+b %               # paneles lado a lado
Ctrl+b "               # paneles arriba y abajo
Ctrl+b flechas         # moverse entre paneles
Ctrl+b c / Ctrl+b n    # nueva ventana / siguiente
Ctrl+b d               # desconectarse (la sesión sigue viva)
tmux attach -t lab     # volver a ella

Lo típico: un panel con la VPN, otro con un escaneo largo y otro para trabajar. Y si se cae tu conexión SSH a una máquina remota, la sesión de tmux sigue ejecutándose.

Alias

alias ll='ls -lah'
alias myip="ip -4 addr show tun0 | grep -oP '(?<=inet )[0-9.]+'"
echo "alias ll='ls -lah'" >> ~/.zshrc   # hacerlo permanente

Kali usa Zsh, así que los alias permanentes van en ~/.zshrc (en Bash, ~/.bashrc). Recarga con source ~/.zshrc.

Chuleta: comandos de Linux para hacking ético

TareaComandoQué buscar
Binarios SUIDfind / -perm -4000 -type f 2>/dev/nullBinarios fuera de lo normal
Cambios recientesfind /etc -mmin -30Configuraciones tocadas hace poco
Buscar credencialesgrep -rni "password" /var/wwwContraseñas en claro
Usuarios con shellgrep -E 'sh$' /etc/passwdCuentas que pueden iniciar sesión
Contar ocurrenciassort | uniq -c | sort -nrValores que se repiten mucho
IdentidadidGrupos sudo, docker, lxd, adm
Privilegios sudosudo -lNOPASSWD y programas con escape a shell
Procesosps auxProcesos de root y argumentos con credenciales
Puertos localessudo ss -tulpnServicios solo en 127.0.0.1
Cabeceras webcurl -I URLServer, X-Powered-By, cookies
DNSdig dominio +shortIPs, MX, transferencias de zona
Puerto concretonc -zv IP PUERTO«succeeded» / «open» y banners
Decodificarbase64 -dTexto legible oculto
Tipo real de ficherofile / xxd | headNúmeros mágicos
Guardar evidenciascmd 2>&1 | tee log.txtTodo, para el informe

Cómo practicar estos comandos

Leer una lista de comandos no basta; hay que usarlos con un objetivo. La mejor forma de empezar es OverTheWire: su wargame Bandit obliga a usar find, grep, sort | uniq, base64, xxd, tar y nc exactamente como en esta guía. Si te atascas, tienes nuestras soluciones de Bandit explicadas nivel a nivel (intenta cada nivel antes de mirarlas). Después, monta una máquina vulnerable en tu red local y repite la sección de permisos y procesos desde dentro: es exactamente la revisión que hace LinPEAS, pero entendiendo cada paso.

Practica siempre en tu propia máquina, en laboratorios locales o en plataformas que lo autoricen expresamente. Ejecutar estas búsquedas en sistemas ajenos sin permiso puede ser delito.

Si prefieres una ruta guiada en español, con ejercicios prácticos que construyen sobre estos comandos, echa un vistazo a la Academia de Hackers en Acción.

Guía gratisAprende hacking ético desde cero

Tags

linuxcommandsbeginnerscheatsheet
CompartirTwitterLinkedIn

// POSTS_RELACIONADOS