Post

HackTheBox: Bitlab

Image


I would like to preface this post by saying that the privilege escalation is through an unintended method.

Host Enumeration

As usual, we begin with a full port scan in order to discover open ports. In this case, we see that there are 2 ports open:

  • 22: OpenSSH 7.6p1 Ubuntu
  • 80: nginx
1
nmap -p- -sV 10.10.10.114

Image

Enumeration - HTTP

The default page when navigating to http://10.10.10.114/ is a redirect to /users/sign_in. We see that Bitlab is hosting GitLab community edition. My GoBuster scan was failing to run, so I performed some manual enumeration. Firstly, I view the /robots.txt page, there is usually some interesting information in these files when they are present.

Image

Image

/profile - On this page we see a profile Clave; a web developer engaged in the development of WWW applications.

Image

/help - Navigating to this page reveals a folder including a backed up bookmarks file named bookmarks.html.

Image

Opening the bookmarks.html, we see an interesting bookmark Gitlab Login, which appears to be a JavaScript function. This can be seen when hovering the mouse over the hyperlink. We obtain the JavaScript function by viewing the page source code. We see that there is hexadecimal encoded text. I’ll use the ascii2hex website to decode the hexadecimal. I inserted \x0a (linebreak) to make the decoding process for every variable easier to read; seen in the image below. We see some potential user credentials; clave:11********. We are denied SSH login using these credentials, however we are able to login to the Gitlab application.

Image

Image

Image

Enumeration - Gitlab

Immediately when logging in, we see two repositories; Profile and Deployer. When viewing the Profile repository, it appears that it is code being hosted on the /profile endpoint which we viewed in the HTTP enumeration stage earlier. Interesting ;). In addition, we see that Clave is labelled as a developer for this repository.

My idea to get the initial shell through authenticated code execution. The aim is to upload a php reverse shell file into the profile repository, with the aim that it will be executed when viewing it. Let us try it!

Image

Getting the initial shell

I use the generic pentestmonkey php reverse shell file, and setup my netcat listener. Upload the php file to the repository, and create a merge request. Remember, as we have developer permissions for this repository, we are allowed to approve our own merge request.

Image

Image

Image

Privilege Escalation

This is where the unintended route begins. I questioned for a while whether I would publish this post, however I believe that there is still value in writing this. It is not a simple kernel exploit or misconfigured permission of user.txt, but rather a method which bypasses the requirement to pivot to the Clave user on the host.

When performing sudo -l in the www-data shell, we can see that we are able to run git pull as root user without a password requirement.

Image

We will exploit the sudo command misconfiguration, and using it to our advantage by the use of Git Hooks. Git hooks are used to perform automated tasks after something has occurred. For example, a notification to select persons when a merge request has been approved, or something along those lines. We will generate a reverse shell by using the post-merge hook, which will be triggered after thegit pull command. The one pre-requisite for this exploit to be successful is that there must be some change in the repository through the web application before we pull the repository. This will ensure that the post-merge hook will be invoked.

The challenge that we face is the “official” profile repository is owned by the root user, and therefore the www-data user will not be able to edit the git hook. To overcome this, we can copy the profile folder to the /tmp directory.

Image

Image

Image

This post is licensed under CC BY 4.0 by the author.