Week 6. Codify
TL;DR
This is an Ubuntu 22.04 machine running a web application created with vulnerable version of vm2 library (CVE-2023-32314). Exploiting the vulnerability, we get initial foothold, and pivot to SSH user is gained through password hunting in the file system. Escalation is achieved exploiting vulnerability in local backup shell script, for this purpose we generate our own custom exploit.
KEYWORDS
Node.js, vm2, CVE-2023-32314, exploit scripting.
REFERENCES
https://www.cvedetails.com/cve/CVE-2023-32314
https://gist.github.com/arkark/e9f5cf5782dec8321095be3e52acf5ac
https://www.baeldung.com/linux/bash-single-vs-double-brackets#4-pattern-matching
ENUMERATION
Port scan.
There are 2 web servers running. If you browse with Firefox, you see they are made with vm2 library.
For initial foothold, we'll focus on exploiting vm2 vulnerabilities.
USER
Searching for vm2 vulnerabilities, we came across this CVE-2023-32314 (https://www.cvedetails.com/cve/CVE-2023-32314). Also, a PoC is available in GitHub: https://gist.github.com/arkark/e9f5cf5782dec8321095be3e52acf5ac
Running it in the application we have immediate code execution.
Then run a reverse shell.
Once inside the machine, first step is to inspect the /etc/passwd
file, which reveals our first goal would be to pivot to user joshua
Searching for interesting files we came across this one /var/www/contact/tickets.db
, which turns out to contain Joshua's password hash.
This is a blowfish hash that can be cracked with Hashcat (module 3200).
SSH in as user joshua
using found credentials and collect the flag.
SYSTEM
Let's see if joshua
is a sudoer.
It seems he can sudo
run a backup script located at /opt/scripts/mysql-backup.sh
. Inspecting the code of the script we realize it is vulnerable to wildcard injection.
The use of double brackets in the if
comparison allows us to use wildcards to guess the password, using a process similar to blind SQL injections.
To find out more about the difference between single brackets and double brackets read this: https://www.baeldung.com/linux/bash-single-vs-double-brackets#4-pattern-matching
In summary, both conditions [[$DB_PASS == Password123!]]
and [[$DB_PASS == P* ]]
will be evaluated as true in the if
statement.
To brute force the password you can use 3 methods:
Manually. Letter by letter, not recommended.
Semi-manually. Create a file called
letter
containing all lower-case, upper-case and digits and bruteforce them using a loop. As soon as you find a new character, add it to the for loop (e.g....echo abcde*...
) and repeat until no more letters are discovered. Add letters sequentially as you discover in each iteration. The first loop iteration would look like this:
Using our own Python script. Elegant and fast. The machine also has Perl installed. A proposed Python script would be the following:
Running it, the root MySQL password is revealed in less than a minute, which turns out to be a reuse of the system's root password.
You are root.
Last updated