In this post, I would like to share a walkthrough of the Horizontall Machine from HackTheBox

This room has been considered difficulty rated as an Easy machine on HackThebox

What will you gain from Horizontall machine?

For the user flag, you will execute some strapi exploit such as password reset on api-prod.horizontall.htb and get a reverse shell by using plugin vulnerability

As for the root flag, you need to run some port forwarding and execute an exploit that related to laravel v8

Information Gathering

Once we have started the VPN connection which requires to download from Hackthebox, we can start the information gathering on the machine by executing the command nmap -sC -sV -p- <IP Address> -PN 

# Nmap 7.91 scan initiated Mon Aug 30 06:36:31 2021 as: nmap -sC -sV -oA intial -Pn 10.10.11.105
Nmap scan report for 10.10.11.105
Host is up (0.28s latency).
Not shown: 997 closed ports
PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 7.6p1 Ubuntu 4ubuntu0.5 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 ee:77:41:43:d4:82:bd:3e:6e:6e:50:cd:ff:6b:0d:d5 (RSA)
|   256 3a:d5:89:d5:da:95:59:d9:df:01:68:37:ca:d5:10:b0 (ECDSA)
|_  256 4a:00:04:b4:9d:29:e7:af:37:16:1b:4f:80:2d:98:94 (ED25519)
80/tcp   open  http    nginx 1.14.0 (Ubuntu)
|_http-server-header: nginx/1.14.0 (Ubuntu)
|_http-title: Did not follow redirect to http://horizontall.htb
5050/tcp open  http    (PHP 7.4.22)
| fingerprint-strings: 
|   FourOhFourRequest: 
|     HTTP/1.0 404 Not Found
|     Date: Mon, 30 Aug 2021 10:51:31 GMT
|     Connection: close
|     X-Powered-By: PHP/7.4.22
|     Cache-Control: no-cache, private
|     date: Mon, 30 Aug 2021 10:51:31 GMT
|     Content-type: text/html; charset=UTF-8
|     <!DOCTYPE html>
|     <html lang="en">
|     <head>
|     <meta charset="utf-8">
|     <meta name="viewport" content="width=device-width, initial-scale=1">
|     <title>Not Found</title>
|     <!-- Fonts -->
|     <link rel="preconnect" href="https://fonts.gstatic.com">
|     <link href="https://fonts.googleapis.com/css2?family=Nunito&display=swap" rel="stylesheet">
|     <style>
|     normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}a{background-color:transparent}code{font-family:monospace,monospace;font-size:1em}[hidden]{display:none}html{font-family:system-ui,-app
|   GetRequest: 
|     HTTP/1.0 200 OK
|     Date: Mon, 30 Aug 2021 10:51:19 GMT
|     Connection: close
|     X-Powered-By: PHP/7.4.22
|     Content-Type: text/html; charset=UTF-8
|     Cache-Control: private, must-revalidate
|     Date: Mon, 30 Aug 2021 10:51:19 GMT
|     pragma: no-cache
|     expires: -1
|     Set-Cookie: XSRF-TOKEN=eyJpdiI6IlduUXB4Uk5KOGhiRXZoQXBqM1djOWc9PSIsInZhbHVlIjoidkNKaVR1UjdLUUE0a3haelN2NkFmajBUcWZWb0kxcDc0WlJ4UU96WGdXZm1hc3RsY0ZFWmphcXZRRlJJTnJjMU9FblUzYTBOdUdNV1ZIZG8rNktYT3ZPM1pjLzEwbWZSNS9OdjJtdzYwWHduSUVEU2N3ektBM010WHRKR1FWZnEiLCJtYWMiOiIyYjg2ODVjMTBiOWI0OTZjZmFhNzI4NmFmM2M3ZTQ3MjU5ODQ1ZWZmYzFjOGRjODEyN2RmNzE3YmVlNDc4YTgwIn0%3D; expires=Mon, 30-Aug-2021 12:51:19 GMT; Max-Age=7200; path=/; samesite=lax
|     Set-Cookie: laravel_session=eyJpdiI6InYyYXBkRXB0VC8ybnFNUmZBcEpKK0E9PSIsInZhbHVlIjoid2x0b0RSN1lHZUhHWXFyanRGRzhTbXBqT2lsaFlPejJiU01LbmZQVjJwLzc3SDM1VzVHVjcvSzA1Y09Ta29VR2p5NUpLc1NlRURTZVNJZUZkSzdCVkRwdnVnZ0p5VGlNM2JYWjhBNk
|   HTTPOptions: 
|     HTTP/1.0 200 OK
|     Date: Mon, 30 Aug 2021 10:51:20 GMT
|     Connection: close
|     X-Powered-By: PHP/7.4.22
|     Allow: GET,HEAD
|     Cache-Control: private, must-revalidate
|     Date: Mon, 30 Aug 2021 10:51:20 GMT
|     Content-Type: text/html; charset=UTF-8
|     pragma: no-cache
|_    expires: -1
|_http-title: Laravel
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port5050-TCP:V=7.91%I=7%D=8/30%Time=612CB4ED%P=x86_64-pc-linux-gnu%r(Ge
SF:tRequest,348A,"HTTP/1\.0\x20200\x20OK\r\nDate:\x20Mon,\x2030\x20Aug\x20
SF:2021\x2010:51:19\x20GMT\r\nConnection:\x20close\r\nX-Powered-By:\x20PHP
SF:/7\.4\.22\r\nContent-Type:\x20text/html;\x20charset=UTF-8\r\nCache-Cont
SF:rol:\x20private,\x20must-revalidate\r\nDate:\x20Mon,\x2030\x20Aug\x2020
SF:21\x2010:51:19\x20GMT\r\npragma:\x20no-cache\r\nexpires:\x20-1\r\nSet-C
SF:ookie:\x20XSRF-TOKEN=eyJpdiI6IlduUXB4Uk5KOGhiRXZoQXBqM1djOWc9PSIsInZhbH
SF:VlIjoidkNKaVR1UjdLUUE0a3haelN2NkFmajBUcWZWb0kxcDc0WlJ4UU96WGdXZm1hc3RsY
SF:0ZFWmphcXZRRlJJTnJjMU9FblUzYTBOdUdNV1ZIZG8rNktYT3ZPM1pjLzEwbWZSNS9OdjJt
SF:dzYwWHduSUVEU2N3ektBM010WHRKR1FWZnEiLCJtYWMiOiIyYjg2ODVjMTBiOWI0OTZjZmF
SF:hNzI4NmFmM2M3ZTQ3MjU5ODQ1ZWZmYzFjOGRjODEyN2RmNzE3YmVlNDc4YTgwIn0%3D;\x2
SF:0expires=Mon,\x2030-Aug-2021\x2012:51:19\x20GMT;\x20Max-Age=7200;\x20pa
SF:th=/;\x20samesite=lax\r\nSet-Cookie:\x20laravel_session=eyJpdiI6InYyYXB
SF:kRXB0VC8ybnFNUmZBcEpKK0E9PSIsInZhbHVlIjoid2x0b0RSN1lHZUhHWXFyanRGRzhTbX
SF:BqT2lsaFlPejJiU01LbmZQVjJwLzc3SDM1VzVHVjcvSzA1Y09Ta29VR2p5NUpLc1NlRURTZ
SF:VNJZUZkSzdCVkRwdnVnZ0p5VGlNM2JYWjhBNk")%r(HTTPOptions,10B,"HTTP/1\.0\x2
SF:0200\x20OK\r\nDate:\x20Mon,\x2030\x20Aug\x202021\x2010:51:20\x20GMT\r\n
SF:Connection:\x20close\r\nX-Powered-By:\x20PHP/7\.4\.22\r\nAllow:\x20GET,
SF:HEAD\r\nCache-Control:\x20private,\x20must-revalidate\r\nDate:\x20Mon,\
SF:x2030\x20Aug\x202021\x2010:51:20\x20GMT\r\nContent-Type:\x20text/html;\
SF:x20charset=UTF-8\r\npragma:\x20no-cache\r\nexpires:\x20-1\r\n\r\n")%r(F
SF:ourOhFourRequest,1AAC,"HTTP/1\.0\x20404\x20Not\x20Found\r\nDate:\x20Mon
SF:,\x2030\x20Aug\x202021\x2010:51:31\x20GMT\r\nConnection:\x20close\r\nX-
SF:Powered-By:\x20PHP/7\.4\.22\r\nCache-Control:\x20no-cache,\x20private\r
SF:\ndate:\x20Mon,\x2030\x20Aug\x202021\x2010:51:31\x20GMT\r\nContent-type
SF::\x20text/html;\x20charset=UTF-8\r\n\r\n<!DOCTYPE\x20html>\n<html\x20la
SF:ng=\"en\">\n\x20\x20\x20\x20<head>\n\x20\x20\x20\x20\x20\x20\x20\x20<me
SF:ta\x20charset=\"utf-8\">\n\x20\x20\x20\x20\x20\x20\x20\x20<meta\x20name
SF:=\"viewport\"\x20content=\"width=device-width,\x20initial-scale=1\">\n\
SF:n\x20\x20\x20\x20\x20\x20\x20\x20<title>Not\x20Found</title>\n\n\x20\x2
SF:0\x20\x20\x20\x20\x20\x20<!--\x20Fonts\x20-->\n\x20\x20\x20\x20\x20\x20
SF:\x20\x20<link\x20rel=\"preconnect\"\x20href=\"https://fonts\.gstatic\.c
SF:om\">\n\x20\x20\x20\x20\x20\x20\x20\x20<link\x20href=\"https://fonts\.g
SF:oogleapis\.com/css2\?family=Nunito&display=swap\"\x20rel=\"stylesheet\"
SF:>\n\n\x20\x20\x20\x20\x20\x20\x20\x20<style>\n\x20\x20\x20\x20\x20\x20\
SF:x20\x20\x20\x20\x20\x20/\*!\x20normalize\.css\x20v8\.0\.1\x20\|\x20MIT\
SF:x20License\x20\|\x20github\.com/necolas/normalize\.css\x20\*/html{line-
SF:height:1\.15;-webkit-text-size-adjust:100%}body{margin:0}a{background-c
SF:olor:transparent}code{font-family:monospace,monospace;font-size:1em}\[h
SF:idden\]{display:none}html{font-family:system-ui,-app");
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 Mon Aug 30 06:37:59 2021 -- 1 IP address (1 host up) scanned in 89.05 seconds

Let’s open the browser and straight into the website interface.

Unfortunately, we cannot find anything on the web interface, but we have been redirected to http://horizontall.htb

We are required to add the domain name into /etc/hosts file to obtain access to the website interface

After we add the domain on the /etc/hosts file, let’s try to access the website interface again.

Finally, we successfully accessed the website, but we didn’t find anything useful on the webpage.

Let’s try running gobuster to enumerate any directory that we can access

Sadly, we cannot find any directory useful from the gobuster result. I have started wondering whether the domain has a subdomain at this moment.

Let’s try to enumerate any subdomain on the machine

Based on the gobuster result above which we have managed to get one subdomain which is api-prod.horizontall.htb

As a result, we were able to sight a “Welcome” text which didn’t help that much.

We must execute another gobuster activity on the new subdomain.

### We need to add the subdomain on our /etc/hosts file ###

We managed to find a directory that is labeled as /admin on the gobuster result.

We can verify the version of strapi by going to /admin/strapiversion/

Gaining Privileges Access on Horizontall machine

A strapi login page appeared when we try to access the api-prod.horizontall.htb

To be frankly honest, I’m not aware of any credentials that can use over here. Let’s do some research on any exploit to obtain strapi credentials or any default username and password

From the google search, I haven’t found anything that can exploit the application.

Let’s continue with our research especially on password reset

From the output, we managed to verify that strapi login page has a vulnerability in password reset.

We have found that the strapi vulnerability is labeled as CVE-2019-18818

Let’s execute some exploit code for the strapi application

Disclaimer: This code doesn’t write by me, but I found it on the internet. Source: Exploiting friends with CVE-2019-18818 – thatsn0tmysite (wordpress.com)

Let’s run the code by using the python3 command

We should be able to login the dashboard which used the same password that we reset earlier.

Voila! We managed to access the dashboard via the email “admin@horizontall.htb” and the password that we reset.

We can be roaming the dashboard while finding any available exploit on the internet

Maintaining Privileges Access

We managed to get an available exploit over here which we can use the code to obtain a reverse shell on the machine

We should be able to inspect the curl code via Burpsuite Community where we can modify any code missing from the curl code.

However, we should start our NC listener before we click the forward button on the Burpsuite Request

Boom! After that, the reverse shell has come back to us which we can use to get the user flag.

To get an upgraded version of the shell, we can type the command “bash -i

We can retrieve the user flag by executing the command “cat user.txt

Escalate to Root Privileges Access

On the other hand, we need to clarify which other ports are been open inside the machine. As a result, we managed to sight a bunch of ports open that have not been displayed on the Nmap output.

I have been wondering whether we can execute some port forwarding method on that port.

Let’s try using that port forwarding using port 8000

However, there are a lot of ways to use port forwarding, but I would prefer to use ssh port forwarding which i know will work well.

Sadly, we cannot create .ssh directory on the /home but. we might be able to create it somewhere else inside the machine

I did manage to find another strapi directory that resides inside /opt directory.

Success! We have been able to create a .ssh directory at /opt/strapi directory

On our attacker’s machine, we need to prepare our own version of id_rsa and id_rsa.pub

We should start our python HTTP server on our attacker’s machine

On the victim’s machine, we can retrieve those two files that we created by using wget function

Just a reminder to all including me that we need to move our id_rsa.pub into authorized_keys

Let’s try ssh port forwarding right now.

SSH Port Forwarding on Horizontall Machine

It works! we have finally successfully done the ssh port forwarding.

Let’s access the website using the http://localhost:8001

Oh wow! It’s a Laravel web interface and I notice the version has been shown there (Laravel v8 PHP V7.4.18)

Let’s do some research on Laravel v8 exploit where I did managed to find an exploit that we can use to obtain the root flag

I will read what should I do based on the ambionics/laravel-exploits

Firstly, I need to clone the GitHub page on my machine.

Next, we need. to access the directory of the GitHub page on our machine.

We are required to give permission to the exploit.py file

We need to start our nc listener on our terminal.

However, we need to run some PHP coding with additional phpggc

Next, we need to execute the command above to obtain a reverse shell.

We have successfully obtained a reverse shell, but it stuck there for a long time.

Therefore, we need to execute a basic command to test the python script if it’s working perfectly.

It works on the previous testing, and we can read the root flag by replacing the basic command with “cat /root/root.txt

-THE END-

Happy Learning Guys!

Extra Information

We can go to /etc/shadow to unlock the write-up

Categories:

One response

Leave a Reply

Your email address will not be published. Required fields are marked *