XUT_ / COURSES / PENETRATION TESTER

Practical - Modifying a Signed Cookie

En esta tarea exploraremos un escenario del mundo real donde el ataque de length extension puede usarse para manipular una cookie firmada y escalar privilegios de un usuario normal a admin.


Exploitation

La aplicación hosteada en http://lea.thm/labs/lab2/ usa cookies para almacenar la información como el token de sesión y el hash de autentificación.

Practical - Modifying a Signed Cookie

Inicia sesión en la aplicación usando user:user.

Practical - Modifying a Signed Cookie

Para evitar la manipulación, firma la cookie llamada auth con un hash SHA-256 basado en una clave secreta. Sin embargo, como SHA-256 es vulnerable al ataque de length extension, podemos alterar el contenido de la cookie mientras conservamos una firma válida, permitiéndonos ganar acceso no autorizado.

Aquí está el código vulnerable que verifica la autenticidad de la cookie:

php
require_once("secrets.php");

// Default authorization status
$auth = false;

// Check if the 'auth' and 'hsh' cookies are set
if (isset($_COOKIE["auth"]) && isset($_COOKIE["hsh"])) {
    $auth = $_COOKIE["auth"]; // Get the original auth string
    $hsh = $_COOKIE["hsh"];

    // Verify the hash to ensure integrity
    if ($hsh === hash("sha256", $SECRET . $auth)) {
        // Instead of trying to parse, check if 'role=1' exists in the string
        if (strpos($auth, 'role=1') !== false) {
            echo "<html><head><title>Admin Panel</title></head><body>";
            echo "<h1>Welcome, Admin!</h1><br><br>";
        } elseif (strpos($auth, 'role=0') !== false) {
            echo "<html><head><title>User Panel</title></head><body>";
            echo "<h1>Welcome, User!</h1><br><br>";
        }
    }
}

En este setup:

  • La cookie auth contiene datos del usuario como "username=user;role=0 para indicar que es un usuario normal.
  • La cookie hsh es la firma SHA-256 generada usando la clave secreta combinada con la información de auth.
  • El servidor comprueba si role=1 existe en auth para otorgar acceso de administrador.

Como atacante, nuestro objetivo es escalar privilegios cambiando role=0 a role=1 en la cookie auth ganando así acceso de administrador sin saber la clave secreta. Para conseguir esto, usaremos de nuevo Hash Extender para realizar el ataque.


La herramienta hash_extender puede ser usada para generar un valor de cookie modificada válido que contenga role=1 y ofrece una nueva firma válida también.

shell-session
 ./hash_extender --data 'username=user;role=0' --append ';role=1' --signature bfe0fa5c36531773c73dcc8d2a931301f69cf9add05a1f35dcfa2d48b44c37f0 --format sha256 --secret 8 --out-data-format=html
  • --data: Es el valor de la cookie original.
  • --append: Especifica la información que queremos añadir.
  • --signature: Es la firma SHA-256 original para username=user;role=0.
  • --format: Especifica el algoritmo de hasheo.
  • --secret: Es la longitud adivinada de la clave secreta (en este caso 8).
  • --out-data-format=html: Saca la información en formato URL encodeado HTML para su fácil uso en una petición web.

El output de hash_extender nos da:

  • Una nueva firma para la cookie modificada.
  • Una string de auth nueva que incluye el valor añadido ;role=1.

Configurando estos valores en la web, podemos engañar al servidor para que piense que somos admins.

Practical - Modifying a Signed Cookie

Y así obtener la flag:

Practical - Modifying a Signed Cookie