BULLDOG 1
- Layout for this exercise:
1 - INTRODUCTION
- The goal of this exercise is to develop a hacking process for the vulnerable machine Bulldog1.
- Bulldog1 can be downloaded from here:
https://www.vulnhub.com/entry/bulldog-1,211/
- Once downloaded and extracted with VirtualBox:
2 - ENUMERATION
- Confirming Bulldog1's IP:
- Scanning with Nmap:
- Connecting to the web server:
- Reading the Public Notice, it smells to Dirty Cow exploit ... let's see ...::
- Dirbusting, it seems that there are basically two interesting folders: admin and /dev/shell:
- Same result with dirsearch.py:
- Nikto yields same result:
- gobuster also discovers robots.txt:
- Going to /dev:
- Viewing the source we find a bunch of users and password hashes:
- Clicking Web-Shell it seems that we need to authenticate before accessing the webshell:
3 - CRACKING HASHSES
- Storing these credentials in the text file team.txt:
- Identifying the type of hashes:
- Let's try to decrypt these hashes, at least some of them:
https://hashkiller.co.uk/sha1-decrypter.aspx
4 - EXPLOITATION
- Trying nick:bulldog and sarah:bulldoglover to get an SSH connection there is no success:
- However, nick:bulldog or sarah:bulldoglover are valid for authentication at the server:
- Once authenticated the Web-Shell is available:
- Because there is a limited set of 6 available commands, we would need to bypass that filter for instance using backticks, && or any other way.
4.1 - Getting a remote shell
- The first way of using Web-Shell is to upload a shellcode to Bulldog1 to eventually achieve a remote shell.
- For that purpose let's use repeatedly echo command (allowed by Web-Shell) with backtick command substitution:
https://www.gnu.org/software/bash/manual/html_node/Command-Substitution.html
- For instance:
- Other way would be using echo with normal quotes plus |sh:
- Let's create the exploit myshell with msfvenom:
- Giving execution permissions, though they are actually needed at the victim side :)
- Transferring myshell from Kali to Bulldog1:
- The transfer is successful:
- Giving execution permissions:
- Setting a listener with ncat:
- Running remotely myshell:
- The exploitation is successful:
- Improving the shell:
4.2 - Finding valid credentials with Web-Shell
- Another way of using Web-Shell is to perform an intensive listing of contents inside Bulldog1's filesystem until discovering any valid credentials.
- Trying some commands to learn how the Web-Shell works:
- Reading /etc/passwd we learn the existence of additional users like bulldogadmin and django:
- Actually we are at django's home folder:
- However, forbidden commands cannot be used directly:
- Listing the home folder:
- Unfortunately there is no result for sudo_as_admin_successful:
- One trick that can be used to bypass the 6 commands filter (aside for using backticks like in 4.1) is to link forbidden commands with the && operator.
- Going to .hiddenadmindirectory there are two files:
- Reading note:
- Also we learn that customPermissionApp is an executable file:
- Applying strings over customPermissionApp:
- Assembling the 4 highlighted strings it seems we could have a password, maybe one of these:
- Would it be valid for getting an SSH session? Let's try Hydra with users that we know:
- So yes, the password SUPERultimatePASSWORDyouCANTget is valid for user django.
- Let's open an SSH session with those credentials:
5 - PRIVILEGE ESCALATION
- Let's explore two ways of getting a root shell:
5.1 - Cron jobs
- There was an interesting notice at the /dev page of the web server about an AV system run every minute, what could be interpreted as a cron job:
- Let's check it out:
- Every 1 minute AVApplication.py is run with root privileges:
- Eventually we find a Python script that is blank at the moment:
- Using the Python reverse shell from here:
http://pentestmonkey.net/cheat-sheet/shells/reverse-shell-cheat-sheet
- Setting a Netcat listener at port 5555:
- Passing the Python reverse shell (adapted to our needs in terms of IP and port) to AVApplication.py:
- After less than 1 minute we've got a remote root shell:
5.2 - Sudoer privileges
- Checking django's sudoer privileges we learn that django is able to run all commands:
- Getting a root shell:
- Now it will be easy to capture the flag text file.
6 - CAPTURING THE FLAG
- Listing root directory:
- django can read congrats.txt:
- Also, congrats.txt can be read directly with a root shell: