← Todas las guías
ExplotaciónChecklist de laboratorioIntermedio38 min

Enumeración local de Linux desde una cuenta limitada

Un procedimiento de solo lectura para interpretar identidad, sistema, cuentas, permisos, procesos, cron, servicios, entorno, historial y configuraciones desde una cuenta Linux sin privilegios.

1. Enumera por preguntas, no por cantidad de salida

La enumeración local convierte una shell limitada en un inventario explicable. Recorre cinco preguntas en orden: qué identidad aplica, qué sistema la contiene, qué puede leer o escribir, qué actividad está en marcha y qué configuración explica esa actividad. El objetivo es comparar con un baseline, no coleccionar todo lo visible.

Observación

Salida literal y fechada: UID, modo, PID, unidad, temporizador o nombre de variable.

Inferencia

Explicación provisional, como «parece una cuenta de servicio» o «la tarea podría ejecutar este script».

Validación pendiente

Dato adicional permitido que confirmaría la hipótesis. Si requiere privilegios, se entrega al responsable.

  • Activo, horario, cuenta y rutas autorizadas están documentados
  • La cuenta permanece sin privilegios y no se usará sudo, su ni exploits
  • La salida se limita por ruta, profundidad y número de filas
  • Historial, entorno y configuraciones se revisan en pantalla antes de exportar
  • Secretos, datos personales y contenido ajeno quedan fuera del informe

2. Identidad, kernel, distribución y cuentas

id informa de los identificadores reales y efectivos del proceso actual; esos valores son los que importan al evaluar acceso. uname describe el kernel y la arquitectura, mientras que/etc/os-release identifica la distribución. Registra ambos: una versión de distribución no basta para deducir el kernel en ejecución, y viceversa.

Linux · cuenta limitada · identidad y sistema
idwhoamigroupsumaskhostnameuname -acat /etc/os-releasedate --iso-8601=seconds

/etc/passwd contiene siete campos por cuenta: nombre, marcador de contraseña, UID, GID, comentario, directorio personal y shell. En instalaciones modernas, una x en el segundo campo indica que el material de autenticación está separado; esta guía no intenta leer /etc/shadow. Filtra solo los campos necesarios y distingue cuentas interactivas de identidades de servicio sin asumir que una shell válida demuestra que la cuenta esté en uso.

Linux · cuentas descritas por /etc/passwd
stat -c '%A %U:%G %s bytes %n' /etc/passwd /etc/groupawk -F: '{ printf "%-20s uid=%-6s gid=%-6s home=%-24s shell=%s\n", $1, $3, $4, $6, $7 }' /etc/passwdgetent passwd "$(id -un)"

Una entrada con UID 0 identifica privilegio de superusuario; no demuestra por sí sola una puerta trasera. Una shell como /usr/sbin/nologin suele señalar una cuenta no interactiva, pero el servicio todavía puede iniciar procesos con esa identidad. Correlaciona cuenta, proceso y unidad antes de concluir.

3. Rutas, propietarios y permisos desde tu propio límite

Los permisos se evalúan en cada componente de una ruta. namei -l muestra ese recorrido;stat traduce propietario, grupo y modo. Empieza por tu directorio personal y por una raíz de aplicación incluida en el alcance. No lances búsquedas desde / ni conviertas un archivo escribible en una prueba de modificación: la observación del modo basta para abrir una revisión.

Linux · permisos del usuario actual
pwdnamei -l -- "$HOME"stat -c 'modo=%A octal=%a dueño=%U grupo=%G ruta=%n' "$HOME"find "$HOME" -xdev -maxdepth 2 -type f -printf '%M %u:%g %s %TY-%Tm-%Td %TH:%TM %p\n' | head -n 100find "$HOME" -xdev -maxdepth 2 -type f -writable -printf '%M %u:%g %p\n' | head -n 100

Para una aplicación, sustituye la variable por una única ruta autorizada. El comando solo lista metadatos y limita la profundidad. Si la ruta no existe o no es legible, conserva el error; no amplíes el árbol ni ocultesstderr para hacer que el resultado parezca limpio.

Linux · raíz de aplicación autorizada
SCOPE=/var/www/aplicacion-autorizadanamei -l -- "$SCOPE"find "$SCOPE" -xdev -maxdepth 3 -type f -readable -printf '%M %u:%g %s %TY-%Tm-%Td %TH:%TM %p\n' | head -n 150find "$SCOPE" -xdev -maxdepth 3 -type f -writable -printf '%M %u:%g %p\n' | head -n 100

4. Procesos, servicios, temporizadores y cron

Un proceso es una instancia en ejecución; un servicio es una unidad gestionada; cron y los temporizadores de systemd programan actividad. Cruza estas vistas sin detener nada. ps ofrece una fotografía, por lo que la hora de captura importa. systemctl puede no funcionar dentro de un contenedor o en un sistema que use otro init: ese mensaje describe el entorno, no un fallo que deba corregirse durante la evaluación.

Linux · procesos y árbol de la shell
ps -p $$ -o user,pid,ppid,lstart,etime,comm,argsps -eo user,pid,ppid,lstart,etime,pcpu,pmem,comm --sort=-pcpu | head -n 40cat /proc/$$/status | sed -n '1,12p'
Linux con systemd · servicios y temporizadores de solo lectura
systemctl --type=service --state=running --no-pagersystemctl --user --type=service --state=running --no-pagersystemctl list-timers --all --no-pagersystemctl --user list-timers --all --no-pager

Cron puede existir junto a systemd. crontab -l consulta únicamente la tabla del usuario actual; los directorios de /etc muestran tareas administradas por el sistema que sean legibles. No ejecutes scripts encontrados ni edites tablas para «comprobar» su efecto.

Linux · cron visible desde la cuenta limitada
crontab -lls -ld /etc/cron.d /etc/cron.daily /etc/cron.hourly /etc/cron.weeklyfind /etc/cron.d /etc/cron.daily /etc/cron.hourly /etc/cron.weekly -maxdepth 1 -type f -readable -printf '%M %u:%g %TY-%Tm-%Td %TH:%TM %p\n'

5. Variables de entorno, historial y configuraciones sin filtrar secretos

El entorno pasa pares nombre-valor a los procesos hijos y puede contener información sensible. Empieza por los nombres; muestra valores solo de variables operativas conocidas. No vuelques env,printenv completo ni /proc/*/environ en un informe. Una variable con nombre sugerente es una pista de configuración, no permiso para divulgar su valor.

Bash · inventario seguro del entorno
printenv | cut -d= -f1 | LC_ALL=C sortprintf 'USER=%s\nHOME=%s\nSHELL=%s\nPATH=%s\n' "$USER" "$HOME" "$SHELL" "$PATH"printf 'HISTFILE=%s\nHISTSIZE=%s\nHISTFILESIZE=%s\n' "${HISTFILE:-no definido}" "${HISTSIZE:-no definido}" "${HISTFILESIZE:-no definido}"

Bash guarda las órdenes antes de expandir parámetros, pero un usuario puede haber escrito secretos literalmente. Revisa únicamente tu historial y solo en pantalla. history es un builtin de Bash; puede estar vacío en shells no interactivas, desactivado o pendiente de escribirse en HISTFILE. No uses cat ~/.bash_history, no copies líneas sensibles y no reejecutes entradas con! ni fc.

Bash interactivo · historial propio, sin exportación
history 20test -n "${HISTFILE:-}" && stat -c '%A %U:%G %s %y %n' -- "$HISTFILE"

Para configuraciones, empieza por archivos de inicio y metadatos de ubicaciones conocidas. Después lee solo el archivo concreto necesario para explicar un servicio. Nunca hagas búsquedas masivas de palabras comopassword, token o secret; encontrar y exponer un secreto no es necesario para demostrar que una configuración está demasiado accesible.

Linux · configuraciones visibles y acotadas
find "$HOME" -maxdepth 1 -type f \( -name '.profile' -o -name '.bash_profile' -o -name '.bashrc' \) -printf '%M %u:%g %s %y %p\n'find "$HOME/.config" -xdev -maxdepth 2 -type f -readable -printf '%M %u:%g %s %TY-%Tm-%Td %p\n' | head -n 100find /etc/cron.d /etc/systemd/system -maxdepth 2 -type f -readable -printf '%M %u:%g %s %TY-%Tm-%Td %p\n' | head -n 100stat -c '%A %U:%G %s %y %n' /etc/os-release /etc/passwd /etc/group

6. Ejercicio: crea un informe local saneado

Ejecuta el ejercicio en una VM desechable con una cuenta sin sudo. El informe excluye valores de entorno, historial y contenido de configuraciones. Guarda solo identidad, plataforma, cuentas normalizadas, procesos, unidades, temporizadores y nombres de variables. umask 077 limita el acceso a los archivos nuevos del usuario actual.

Linux · artefacto final de enumeración
umask 077EVIDENCE="$HOME/cubix-enumeracion"mkdir -p "$EVIDENCE"{ date --iso-8601=seconds; id; hostname; uname -a; cat /etc/os-release; } > "$EVIDENCE/contexto.txt"awk -F: '{ print $1, "uid="$3, "gid="$4, "home="$6, "shell="$7 }' /etc/passwd > "$EVIDENCE/cuentas.txt"ps -eo user,pid,ppid,lstart,etime,comm --sort=user > "$EVIDENCE/procesos.txt"systemctl --type=service --state=running --no-pager > "$EVIDENCE/servicios.txt"systemctl list-timers --all --no-pager > "$EVIDENCE/temporizadores.txt"printenv | cut -d= -f1 | LC_ALL=C sort > "$EVIDENCE/variables-nombres.txt"sha256sum "$EVIDENCE"/*.txt | tee "$EVIDENCE/hashes.sha256"sha256sum --check "$EVIDENCE/hashes.sha256"

Si el host no usa systemd, conserva el error en tu bitácora y omite esos dos archivos; no instales nada. Revisa manualmente cada salida antes de compartirla. El cierre correcto muestra OK para cada archivo incluido y una nota separada con observaciones, inferencias y límites.

7. Cómo interpretar, reportar y defender

No confundir legibilidad con fallo

/etc/passwd debe ser legible para muchas utilidades. El riesgo depende de campos, permisos de escritura y contexto.

No confundir tarea con persistencia

Un cron o timer puede ser legítimo. Compara propietario, ruta, periodicidad y baseline antes de clasificarlo.

No confundir variable con secreto

El nombre describe configuración. Si el valor parece sensible, se redacta y se informa la exposición sin copiarlo.

No ocultar límites

Permission denied, ausencia de systemd o historial vacío ayudan a describir la sesión y su cobertura real.

La defensa convierte el mismo inventario en controles: cuentas de servicio sin login interactivo, permisos mínimos en rutas y unidades, temporizadores con propietario conocido, variables sensibles fuera del entorno, historiales configurados para reducir exposición y configuraciones comparadas con una baseline. La remediación debe preservar la función del servicio y validarse en una ventana de cambio.

  • La identidad observada sigue siendo la cuenta limitada autorizada
  • Kernel y distribución están registrados por separado
  • Las cuentas de /etc/passwd se interpretan por UID, home y shell, no por nombre
  • Las búsquedas de permisos se limitaron a HOME y a una raíz autorizada
  • Procesos, servicios, timers y cron se correlacionaron sin ejecutar ni modificar nada
  • El informe contiene nombres de variables, nunca valores sensibles
  • El historial solo se revisó en pantalla y no forma parte de la evidencia exportada
  • Los hashes verifican todos los archivos del artefacto final
  • Cada hallazgo separa observación, inferencia, riesgo contextual y validación pendiente

Glosario

Enumeración local

Recogida estructurada de información disponible desde el propio sistema y con los permisos de la sesión actual.

UID

Identificador numérico de usuario que Linux usa para aplicar propiedad y permisos.

GID

Identificador numérico de un grupo, usado para conceder acceso compartido a procesos y archivos.

Cuenta de servicio

Identidad destinada a ejecutar una aplicación o tarea, normalmente sin shell de inicio de sesión interactiva.

Modo de archivo

Conjunto de bits que expresa tipo y permisos de lectura, escritura y ejecución para propietario, grupo y otros.

Umask

Máscara que retira permisos al crear nuevos archivos y directorios.

Unidad systemd

Objeto gestionado por systemd, como un servicio, temporizador, socket o montaje.

Cron

Mecanismo tradicional que ejecuta órdenes programadas según una tabla temporal.

Variable de entorno

Par nombre-valor heredado por los procesos hijos y usado para configurar su ejecución.

HISTFILE

Variable de Bash que señala el archivo donde puede persistirse el historial de órdenes.

Baseline

Estado aprobado con el que se compara el inventario observado para identificar diferencias relevantes.

Ver más guías
Enumeración local de Linux desde una cuenta limitada | Cubix Academia