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

SOPlanning

SOPlanning 1.52.01 can expose a useful authenticated upload path once valid application credentials are recovered. In the observed path, exposed Git history leaked MySQL credentials, the soplanning database contained the admin user's cle and password hash, and the web login accepted the combined cle|password value before an authenticated .phtml upload produced command execution as www-data.

Discovery

Nmap showed SSH, HTTP, and MySQL:

80/tcp   open  http   Apache httpd

The HTTP scan also disclosed an exposed Git repository:

http-git:
  TARGET:80/.git/
    Git repository found!
    Last commit message: created .env to store the database configuration

If browsing by IP redirects to a hostname, add the main hostname and SOPlanning subdomain locally:

TARGET TARGET_HOST SOPLANNING_HOST

Useful web paths:

http://TARGET_HOST/
http://TARGET_HOST/login.php
http://SOPLANNING_HOST/
http://SOPLANNING_HOST/www/index.php

The SOPlanning subdomain showed:

Simple Online Planning v1.52.01

Exposed Git Credentials

Dump the exposed repository:

Interesting history:

Inspect the commit that added the database configuration:

Leaked database settings:

SOPlanning Database Access

Connect to the exposed MySQL service with server certificate verification disabled:

Available databases included the SOPlanning database:

Inspect SOPlanning tables:

Useful tables:

Useful planning_config values:

The admin row in planning_user contained both a password hash and cle value:

SOPlanning Login With cle|password

Capture a normal SOPlanning login request in Burp, send it to Repeater, and replace only the password value with the stored cle|password pair. The raw notes only showed the browser-field method, not the full HTTP request.

Working browser values:

The same value should be placed in the password parameter of the captured authentication request:

Authenticated Upload RCE

After authenticating, browse to the planning page and create a task with an attached file:

The upload request goes to:

Upload a PHP command shell with a PHP-executed extension:

The successful upload used p.phtml with Content-Type: image/png and returned:

The uploaded shell executed under /www/upload/files/<linkid>/:

Successful execution:

Reverse Shell

If direct callbacks fail, test outbound ports and host the payload on a port that can be reached. In the observed path, hosting files on 3306 and catching the reverse shell on 80 worked:

Fetch a PHP reverse shell into the upload directory through the web shell:

Trigger it:

Successful shell context:

Last updated