Netgate Discussion Forum
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Search
    • Register
    • Login

    Cambio password portal cautivo

    Español
    2
    3
    1.3k
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • J
      jairo_pm
      last edited by

      Hola!

      Antes de nada, me presento. Soy Jairo, trabajo como técnico informático en el ayuntamiento de mi pueblo.

      Hace poco se nos ocurrió montar puntos de acceso gratuitos en algunos equipamientos municipales, y para tener un poco controlado el tema montamos un pfsense con un proxy y un portal cautivo que valida contra un freeradius, donde la gente tendrá que validarse con unas credenciales proporcionadas previamente en los puntos de información de estos equipamientos.

      Todo funciona correctamente. Los passwords de freeradius se guardan en una BBDD MySQL y son creados a través de la utilidad DaloRadius usando el tipo de contraseña "Encrypted-password", que lo que hace es pasar la cadena de texto por la función ENCRYPT() de mysql.

      El problema es que nos planteamos cómo un usuarios podía cambiar su password para ponerse uno personal, ya que los que damos son cadenas de caracteres aleatorias. Buscando por Internet encontré que lo mejor era hacer un mini-sitio web con php que atacase a la BBDD MySQL para modificar el password.
      Bien, ya lo he construido. El problema es que para que funcione bien debo pedir el usuario y contraseña actuales, comprobarlos en la BBDD y seguidamente pedir el nuevo password. Como el password está cifrado en la BBDD pensé que pasando el password que me llegue por el formulario por la misma función ENCRYPT() saldría la misma cadena y podria comprovar si hacen match, pero he descubierto que aunque sea la misma palabra, la función ENCRYPT() siempre da una cadena diferente (a no ser que apliques siempre un mismo SALT).

      Todo este rollo lo explico para preguntar lo siguiente:
      ¿Sabéis qué consulta mysql o qué mecanismo utiliza el portal cautivo de pfSense para conseguir validar usuarios que tienen su password cifrado en la BBDD? Si el password es "abc", la función ENCRYPT me da cada vez una cosa distinta por lo tanto no concuerda con lo que hay en la BBDD, pero en cambio en el login del portal cautivo de pfSense siempre que le pones "abc" en el password comprueba en la BBDD la cadena cifrada y hace match.

      Qué opináis sobre el tema?
      Espero haberme explicado bien.

      Muchas gracias de antemano!
      Saludos!

      1 Reply Last reply Reply Quote 0
      • belleraB
        bellera
        last edited by

        Creo que tienes cómo lo hace pfSense contra un Radius en https://github.com/pfsense/pfsense/blob/master/usr/local/captiveportal/radius_authentication.inc

        1 Reply Last reply Reply Quote 0
        • J
          jairo_pm
          last edited by

          Hola!

          He encontrado una solución, pero de todos modos, gracias por tu ayuda Bellera. Me miraré ese código para entender mejor cómo maneja el portal cautivo.

          La cosa es que descubrí que si a la función ENCRYPT le pasas la cadena a encriptar y como valor SALT le pasas el valor cifrado que hay actualmente en la base de datos ligado a ese username, si la función acaba devolviendo exactamente la misma cadena que el valor SALT que le has pasado quiere decir que la contraseña es correcta.
          Además, como siempre le especificas un SALT, por mucho que aplicases repetidamente esa función a una misma cadena  siempre devuelve el mismo valor cifrado, cosa que soluciona el problema que tenía al principio.

          Dejo la query mysql hecha con PHP y la clase PDO por si a alguien le sirve:

          $sql = $conn->prepare('UPDATE radcheck SET value = ENCRYPT(:newPassword) WHERE username = :user AND value = ENCRYPT(:password, value)');

          $sql->bindParam(":newPassword", $newPassword, PDO::PARAM_STR);
          $sql->bindParam(":user", $user, PDO::PARAM_STR);
          $sql->bindParam(":password", $password, PDO::PARAM_STR);

          Gracias.
          Saludos!

          1 Reply Last reply Reply Quote 0
          • First post
            Last post
          Copyright 2025 Rubicon Communications LLC (Netgate). All rights reserved.