For the complete documentation index, see llms.txt. This page is also available as Markdown.

Camaleon CMS

Ruby-based CMS. Version often in footer: e.g. "Camaleon CMS ... Version 2.9.0".

Paths: /admin/login, /admin/register (registration may be open).


Discovery

  • Footer: "Copyright © ... Camaleon CMS. See intro. Version X.X.X"

  • Admin: http://TARGET/admin/login, http://TARGET/admin/register

  • Nuclei / feroxbuster with CMS wordlists can find themes and assets (/assets/themes/camaleon_first/, /assets/camaleon_cms/).


CVE-2025-2304 – Mass assignment (user → admin)

Versions prior to 2.8.1 allow mass assignment in the profile update: injecting password[role]=admin (and password fields) into the password update scope promotes the user to admin. In practice the PoC has been confirmed on 2.9.0 — try it even if the footer shows a newer version. Some public PoCs also set the password to a fixed value (e.g. admin); after exploitation log in with the new password (e.g. jack / admin).

# PoC (creates admin from low-priv user; may change password to "admin")
python3 main.py --url http://TARGET --user jack --password jack123
# Then log in with jack / admin (or whatever the PoC sets)

PoC: https://github.com/7acini/CVE-2025-2304-CamaleonCMS-PoC


CVE-2024-46987 – LFI (authenticated)

Authenticated LFI: arbitrary file read as the app user. Useful for /etc/passwd, /etc/shadow, SSH keys, nginx/config, and /proc/self/fd/N (open file descriptors — often the app’s SQLite DB).

Binary files (DB): The default PoC prints r.text; for SQLite you must save bytes (r.content). Modify the script to write r.content to a file (e.g. /tmp/file.bytes), then open with sqlite3 /tmp/file.bytes. Try /proc/self/fd/7, /proc/self/fd/9, etc. Tables like cama_users contain password_digest (bcrypt); crack with hashcat -a0 -m 3200 hash.txt /usr/share/wordlists/rockyou.txt. SSH private keys read via LFI can be cracked with ssh2john keyfile > key.hash then john --wordlist=rockyou.txt key.hash.

Mass LFI: Point the PoC at a wordlist (e.g. /usr/share/seclists/Discovery/Web-Content/default-web-root-directory-linux.txt or LFI-WordList-Linux) to enumerate readable paths.

Example — leaked key: Reading /home/trivia/.ssh/id_ed25519 returns the private key; if it is passphrase-protected, use ssh2john id_ed25519 > key.hash then john --wordlist=/usr/share/wordlists/rockyou.txt key.hash.

PoC: https://github.com/Goultarde/CVE-2024-46987


  • CVE-2024-46986 – Arbitrary file write (prior to 2.8.2).

  • CVE-2023-30145 – SSTI via formats parameter (below 2.7.0; fixed in 2.7.4).

Check version in footer and run the appropriate exploit.

Last updated