La idea tras esta habitación es realizar una introducción a diverss herramientas y conceptos que nos solemos encontrar en los tests de penetración.

Vamos con las preguntas.

Sección 1 - Utilidades de red - Nmap

Nmap es una de las herramientas más importantes en el arsenal de un pentester.

Permite ver qué puertos hay abiertos y obtener información sobre qué servicios corren en esos puertos.

Por eso, nos vamos a centrar en las opciones de nmap. Las primeras preguntas solo precisan el manual de Nmap y las siguientes desplegar la máquina que acompaña a esta habitación.

¿Qué significa Nmap?

Network Mapper

¿Cómo especificas qué puertos escanear?

-p

¿Cómo haces un escaneo de pings, solo para comprobar si la máquina objetivo está online? La pregunta no sé si es algo confusa. Se refiere más bien a no realizar un escaneo de puertos. Acepta la respuesta -sn (no port scan o saltarse el escaneo de puertos) mientras que un escaneo de pings es más bien -sP.

-sn

¿Cuál es la bandera para un escaneo UDP?

-sU

¿Cómo corres los scripts por defecto? (También es equivalente a –script=default

-sC

¿Cómo habilitas el modo «Agresivo» (permite detección de Sistema Operativo, de versión, escaneo de scripts y traceroute).

-A

¿Qué opción habilita la detección de sistema operativo?

-O

¿Cómo obtienes las versiones de los servicios que corren en la máquina objetivo?

-sV

A partir de aquí, desplegamos la máquina de la habitación y comenzamos a responder preguntas sobre ella.

¿Cuántos puertos hay abiertos en la máquina?

1

¿Qué servicio hay corriendo en la máquina?

Apache

¿Cuál es la versión del servicio?

2.4.18

¿Cuál es el resultado del script http-title, incluido en los scripts por defecto?

Apache2 Ubuntu Default Page: It works

Netcat

Netcat o nc es una herramienta extremadamente versátil. Permite a los usuarios conectar a puertos específicos para enviar y recibir datos. También permite a las máquinas recibir datos y conexiones en puertos específicos, lo que la hace muy popular para ganar shells inversas.

Después de que conectes a un puerto con nc serás capaz de enviar datos, esto también tiene la consecuencia de que un usuario sea capaz de usar tuberías (pipes) para enviar datos a través de nc.

Por ejemplo, uno puede ejecutar:

echo hello | nc <ip> 1234

Para enviar la cadena hello al servicio corriendo en el puerto 1234.

Hay múltiples versiones de nc, de manera que si somos incapaces de encontrar una respuesta en un manual específico, debemos mirar en el manual de otras versiones.

¿Cómo permaneces a la escucha de conexiones?

-l

¿Cómo habilitas el modo verbose que permite conocer quién se ha conectado a ti?

-v

¿Cómo especificas el puerto en el que escuchar?

-p

¿Cómo especificas qué programa ejecutar después de conectar a una máquina? (Una de las prestaciones más famosas y a la vez infames).

-e

¿Cómo conectas a puertos UDP?

-u

Sección 2 - Enumeración Web - Gobuster

Uno de los principales problemas de los test de penetración web es no saber dónde están las cosas. El reconocimiento básico te puede decir dónde están algunos archivos y directorios, sin embargo, lo más poderoso suele estra escondido de los ojos de los usuarios.

Aquí es donde entra Gobuster. La idea tras la aplicación es que intenta encontrar directorios válidos partiendo de una lista de palabras de posibles directorios.

Gobuster también puede encontrar subdominios válidos usando el mismo método.

¿Cómo especificas el modo de fuerza bruta para directorios/archivos?

dir

¿Cómo especificas el modo de fuerza bruta DNS?

dns

¿Qué opción se usa para establecer extensiones? (Por ejemplo, si la extensión php se define, y la palabra es «admin», Gobuster probará admin.php

-x

¿Qué bandera especifica la lista de palabras a ser usada?

-w

¿Cómo especificas el nombre de usuario para autenticación básica? (Si es que el directorio requiere un nombre de usuario / contraseña).

-U

¿Y la contraseña? (¿Password?)

-P

¿Cómo defines qué código de estado (status code, como 200, 404, etc) va a interpretar Gobuster como válido?

-s

¿Cómo saltas la verificación del certificado SSL?

-k

¿Cómo especificas un User-Agent?

-a

¿Cómo especificas un encabezado HTTP?

-H

¿Qué opción especifica la URL a la que hacer fuerza bruta?

-u

Desplegamos la máquina:

¿Cuál es el nombre del directorio oculto?

gobuster dir -u IP_Objetivo -w /usr/share/wordlists/dirb/common.txt -x xxa # En preparación para la siguiente pregunta

secret

¿Cuál es el nombre del archivo oculto con extensión xxa?

password

Nikto

Nikto es una popular herramienta de escaneo web que permite a los usuarios encontrar vulnerabilidades web comunes. Se usa habitualmente para chequear CVE’s habituales como shellshock, y para obtener información general sobre el servidor web que estás enumerando.

¿Cómo especificas qué host específico usar?

-h

¿Qué opción deshabilita ssl?

-nossl

¿Cómo fuerzas SSL?

-ssl

¿Cómo especificas autenticación (nombre de usuario y contraseña)? (es -id username:password, así que)

-id

¿Cómo seleccionas qué plugin usar?

-plugins

¿Qué plugin chequea si puedes enumerar a los usuarios de Apache?

apacheusers

¿Cómo actualizas la lista de plugins?

-update

¿Cómo listas todos los plugins que es posible usar?

-list-plugins

Sección 3 Metasploit - Introducción

Metasploit es una de las frameworks más populares en pruebas de penetración. Contiene una gran base de datos de casi cualquier CVE, que puedes usar fácilmente contra una máquina.

El objetivo de esta sección es ver algunas de sus características principales y al final habrá una máquina que explotaremos con la herramienta.

Metasploit - Configuración

¿Qué comando permite buscar módulos?

search

¿Cómo seleccionas un módulo?

use

¿Cómo muestras información sobre un módulo específico?

info

¿Cómo ves una lista de las opciones que puedes configurar?

options

¿Qué comando te deja ver opciones avanzadas de un módulo específico?

advanced

¿Cómo muestras opciones en una categoría específica?

show

Metasploit - Seleccionando un módulo

Una vez has encontrado un módulo para la máquina específica que quieres explotar, necesitas seleccionarla y usar las opciones adecuadas.

En esta sección vamos a seleccionar y establecer opciones para uno de los módulos de Metasploit más famosos: eternalblue.

Todos los comandos básicos que pueden correrse antes de seleccionar un módulo también pueden ser ejecutados mientras ese módulo está seleccionado.

¿Cómo seleccionas el módulo eternalblue?

sudo msfconsole # Ejecutamos Metasploit
search eternalblue # Buscamos el módulo que queremos
# Vemos la ruta exacta de ese módulo

use exploit/Windows/smb/ms17_010_eternalblue

¿Qué opción te permite seleccionar el host objetivo?

RHOSTS

¿Cómo estableces el puerto objetivo?

RPORT

¿Qué comando te permite establecer opciones?

set

¿Cómo configuras SMBPass a «username»?

set SMBPass username

¿Cómo configuras SMBUser a «password»?

set SMBUser password

¿Qué opción configura la arquitectura a ser explotada?

arch

¿Qué opción establece el payload que será enviado a la máquina objetivo?

payload

Una vez has terminado de configurar todas las opciones requeridas, ¿Cómo ejecutas el exploit? (También se puede usar run)

exploit

¿Qué opción usas si quieres que el exploit corra en segundo plano?

-j

¿Cómo sacas una lista de todas las sesiones en marcha?

sessions -l

¿Qué opción permite el modo interactivo con una sesión (desciendes a una consola meterpreter o habitual).

-i

Metasploit - Meterpreter

Una vez hemos ejecutado un exploit, este nos proporcionará dos cosas si la situación es ideal.

  • Una shell normal.
  • Una shell de Meterpreter.

Meterpreter es el «centro de mando» de Metasploit, donde puedes hacer varias cosas para interactuar con la máquina.

Puedes ver una lista de comandos Meterpreter habituales

Normalmente, las shells normales pueden ser mejoradas a shells de Meterpreter usando el módulo post/multi/manage/shell_to_meterpreter.

Cómo mejorar una shell normal y convertirla en shell de meterpreter

Tras ejecutar el exploit habremos conseguido esa shell normal.

Lo primero que tenemos que hacer es ponerla en segundo plano con Ctrl+z.

Ahora, buscamos el módulo que hemos comentado más arriba y lo usamos (o lo usamos directamente si recordamos la ruta completa):

search shell_to_meterpreter # Buscamos
use post/multi/manage/shell_to_metepreter # Usamos

Ahora tenemos que configurar las opciones, las necesarias serán el número de sesión que tiene la shell normal que hemos conseguido y un puerto local.

show option # o info para ver esas opciones
sessions -l # para ver el número de sesión de la shell, imaginemos que es 1
set SESSION 1 # para que meterpreter use esa shell normal y la mejore
set LPORT 9999 # o uno libre
exploit # iniciamos el conversor de shell

Una vez ejecutado, tendremos una sesión de meterpreter, vemos su número con sessions -l (imaginemos que nos aparece que es el 3). Ahora, cuando queramos usarla, pasamos a interactuar (-i) con esa sesión, ejecutando el comando que nos pone en modo interactivo con ella.

sessions -i 3

Y ya tenemos shell de Meterpreter, que es mejor que una normal, básicamente, porque nos ofrece más control, poder y prestaciones de serie.

Hecho este paréntesis, sigamos y respondamos preguntas.

¿Qué comando nos permite descargar archivos de la máquina?

download

¿Qué comando nos permite subir archivos a la máquina?

upload

¿Cómo listas todos los procesos que se están ejecutando?

ps

¿Cómo cambias procesos en la máquina víctima (idealmente, eso permitirá cambiar usuarios y ganar los permisos asociados con ese usuario? (hay que usar ese comando y después poner el PID del proceso)

migrate

¿Qué comando saca una lista de los archivos en el directorio actual de la máquina remota?

ls

¿Cómo ejecutas un comando en la máquina remota?

execute

¿Qué comando inicia una shell interactiva en la máquina remota?

shell

¿Cómo encuentras archivos en el objetivo de manera similar a usar el comando find de Linux?

search

¿Cómo obtienes el output de un archivo en la máquina remota?

cat

¿Cómo pones la shell de Meterpreter en «modo segundo plano»? Esto nos permite correr otros módulos de Metasploit mientras mantenemos la shell de Meterpreter como una sesión?

background

Metasploit, tutorial final

Desplegamos la máquina vulnerable. Concretamente lo es al módulo exploit/multi/http/nostromo_code_exec en el puerto 80.

Esta tarea nos llevará a través del proceso de explotar y ganar una shell en esa máquina.

Empezamos seleccionando el módulo con el que vamos a explotar el objetivo.

use exploit/multi/http/nostromo_code_exec

¿Qué variable necesitamos configurar para establecer la máquina remota?

RHOSTS

¿Cómo la configuras para el puerto 80?

set RPORT 80

¿Cómo configuras la dirección de escucha en tu máquina de ataque?

LHOST

Ejecutamos el exploit (con exploit o run).

¿Cuál es el nombre del directorio secreto que hay en /var/nostromo/htdocs? (mejoro a shell de Meterpreter siguiendo el procedimiento que he detallado más arriba). A partir de ahí, me muevo al directorio que me dicen para ver la carpeta secreta.

s3cretd1r

¿Cuál es el contenido del archivo que hay dentro del directorio?

Woohoo!

Sección 4. Rompiendo hashes, introducción

A menudo, durante pruebas de penetración, ganaremos acceso a una base de datos. Cuando la investiguemos, seguramente encontraremos una tabla de usuario que contendrá nombres de usuario y contraseñas hasheadas.

Por eso, a menudo habrá que saber cómo romper esos hashes y conseguir autenticarnos en la web o, con suerte, alguna de esas claves puede funcionar para el acceso por ssh.

Rompiendo hashes, formatos y sales

Independientemente de la herramienta que usemos, casi todas ellas tienen el mismo formato exacto. Un archivo con los hashes y cada hash separado por una nueva línea.

Las sales (salt), normalmente, se añaden al hash con dos puntos (:) y la sal. Los archivos con hashes salados siguen la primera conveción, con cada hash separado por una nueva línea:

hash1:sal hash2:sal

Los distintos algoritmos tratan las sales de manera diferente. Algunos las ponen de prefijo y otros las añaden al final. Hay que investigar bien qué estamos tratando de romper y hacer la distinción.

Rompiendo hashes, Hashcat

Hashcat es una popular herramienta de ruptura de contraseñas, versátil y rápida.

No tiene autodetección de tipos de hash, en su lugar tiene modos. Por ejemplo, si estás tratando de romper un hash md5 el modo debería ser 0, mientras que si estás intentando romper un hash sha1, el modo sería 100.

Se puede consultar la lista de todos los modos de Hashcat

¿Qué opción determina el modo?

-m

¿Qué opción configura el «modo de ataque»?

-a

¿Cuál es el número del modo de ataque fuerza bruta?

3

¿Cuál es número de modo para SHA3-512?

17600

Rompamos este hash: 56ab24c15b72a457069c5ea42fcfc640

Tipo: MD5. Usaremos el ataque de diccionario, que es el 0 y la lista rockyou.txt

hashcat -m 0 -a 0 hash.txt /usr/share/wordlists/rockyou.txt

happy

Rompamos este hash: 4bc9ae2b9236c2ad02d81491dcb51d5f

Tipo MD4 y usamos de nuevo rockyou.txt

hashcat -m 900 -a 0 hash.txt /usr/share/wordlists/rockyou.txt

nootnoot

Rompiendo hashes, John the Ripper

John the Ripper es una de las mejores herramientas disponibles para romper hashes. Muy fácil de usar, soporta muchos formatos de hash y es muy personalizable.

Hay muchas versiones de John, para esta tarea, usamos la que viene instalada por defecto en Kali, así como la lista de palabras rockyou.txt

¿Qué opción nos deja especificar la lista de palabras a usar?

–wordlist=

¿Qué opción nos deja especifica el formato de hash a usar?

–format=

¿Cómo especificas qué regla usar?

–rules

Rompamos este hash 5d41402abc4b2a76b9719d911017c592 de tipo MD5.

john --list=formats # Para ver cómo especifica exactamente el formato
john --format=Raw-MD5 --wordlist=/usr/share/wordlists/rockyou.txt hash.txt

hello

Rompamos este hash 5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8 de tipo SHA1.

password

Sección 5. Inyección SQl - Introducción

La inyección SQl es el arte de modificar una petición SQL de manera que puedas acceder a la base de datos del objetivo.

Esta técnica se usa a menudo para obtener datos del usuario, como contraseñas, emails, etc.

La inyección SQL es una de las vulnerabilidades web más comunes y, por eso, siempre es interesante chequear si se produce.

Inyección SQL - SQLMap

SQLMap es la herramienta más popular para automatizar la inyección AQL. Chequea varios tipos de inyecciones y tiene multitud de opciones de personalización.

¿Cómo especificas qué URL comprobar?

-u

¿Cómo especificas que Google Dork usar?

-g

¿Cómo seleccionas qué parámetro usar? Por ejemplo: en http://ex.com?test=1 el parámetro sería test

-p

¿Qué opción determina la base de datos en el backend de la máquina objetivo? Por ejemplo: si esa opción está puesta a mysql, entonces SQLMap solo probará inyecciones MySQL.

–dbms

¿Cómo seleccionas el nivel de profundidad que debería usar SQLMap? A mayor nivel, más tests y más precisión en general.

–level

¿Cómo vuelcas las entradas de la tabla de la base de datos?

–dump

¿Qué opción establece qué base de datos enumerar? (Ojo a las mayúsculas)

-D

¿Qué opción establece qué tabla enumerar? (De nuevo, la mayúscula es importante)

-T

¿Qué opción establece la columna a enumerar? (Pues eso, la mayúscula)

-C

¿Cómo le pides a SQLMap que trate de obtener una consola de sistema interactiva?

–os-shell

¿Qué opción vuelca todos los datos de cada tabla?

–dump-all

Inyección SQL - Una nota sobre inyección SQL manual

En ocasiones, no podrás usar SQLMap. Puede ser que el objetivo tenga configurado un Firewall o un límite a las peticiones. En este caso es rentable conocer cómo realizar inyección SQL básica manualmente, aunque solo sea para confirmar que existe esa inyección SQL.

Para eso, es útil esta lista de maneras de realizar inyección SQL.

Inyección SQL - Aplicación web vulnerable

Para demostrar el uso de SQLMap, trabajamos con una aplicación web vulnerable. También podemos hacerlo manual (va a ser que no) y la aplicación saca la petición SQL completa de cada intento, con lo que podemos saber qué está tratando de hacer.

En dicha máquina hay un formulario y un parámetro llamado msg.

Ponemos la URL de la IP de la máquina y corremos la aplicación de la siguiente manera:

sqlmap -u IP_Objetivo --forms

¿A cuántos tipos de inyección SQL es vulnerable la aplicación? (Dentro de las pruebas que hace, nos vamos fijando en las que están en verde más claro y leemos bien los tipos de vulnerabilidades).

3

Volquemos la base de datos.

sqlmap -u IP_Objetivo --forms --dump

¿Cuál es el nombre de la base de datos?

tests

¿Cuántas tablas hay en la base de datos?

2

¿Cuál es el valor de la bandera? (Está en la tabla lol, pero hay un problema, los valores están en blanco, algún gracioso los ha borrado o bien no funciona la máquina adecuadamente, así que busco el valor en algún escrito de la habitación que se ha hecho).

found_me

Sección 6. Samba - Introducción

Muchas de las técnicas y herramientas de text de penetración que hemos visto hasta ahora se pueden usar tanto en Windows como en Linux.

Sin embargo, una de las cosas que te vas a encontrar más a menudo cuando hagas pruebas en máquinas Windows es samba, así que es interesante hacer una sección dedicada a enumerarlo.

Samba también está en todas las plataformas, pero nos vamos a centrar en la enumeración de Windows. Algunas de las técnicas que veremos también se aplican a Linux.

Samba - SMBMap

SMBMap es una de las mejores herramientas para enumerar Samba y permite a los pentesters ejecutar comandos (con los permisos adecuados), descargar y subir archivos…

¿Cómo determinamos el nombre de usuario con el que autenticarnos?

-u

¿Y la contraseña?

-p

¿Cómo determinas el host?

-h

¿Qué opción ejecuta un comando en el servidor? (Suponiendo que tengamos los permisos adecuados).

-x

¿Cómo especificas el compartido (share) a enumerar?

-s

¿Cómo estableces el dominio a enumerar?

-d

¿Qué opción descarga un archivo?

–download

¿Y subirlo?

–upload

Dado el nombre de usuario admin y la contraseña password, así como la IP 10.10.10.10, ¿cómo ejecutarías ipconfig en la máquina objetivo?

smbmap -u “admin” -p “password” -H 10.10.10.10 -x “ipconfig”

Samba - SMBClient

SMBClient nos permite hacer muchas de las cosas que podemos hacer con SMBMap y también nos ofrece una línea de comandos interactiva.

¿Cómo especificas qué dominio (grupo de trabajo - workgroup) usar cuando te conectas a la máquina host?

-W

¿Cómo especificas la dirección IP del host?

-I

¿Cómo ejecutas el comando “ipconfig” en la máquina objetivo?

-c “ipconfig”

¿Cómo especificas el nombre de usuario con el que autenticarse?

-U

¿Cómo especificas la contraseña?

-P

¿Qué opción le dice a smbclient que no use una contraseña?

-N

Cuando estás en la consola interactiva, ¿cóm descargarías el archivo test, asumiendo que está en el mismo directorio en el que te encuentras?

get test

En la consola interactiva, ¿cómo subirías tu archivo /etc/hosts?

put /etc/hosts

Una nota sobre impacket

impacket es una colección de scripts de Windows muy útiles. Es importante mencionarlo, porque tiene muchos scripts disponibles que usan samba para enumerar, e incluso ganar una consola interactiva a máquinas Windows.

Todos los scripts se pueden encontrar aquí.

También hay scripts para otros protocolos y servicios que no son Samba.

Una nota sobre escalada de privilegios

Este es un tema tan amplio que es imposible hacer justicia aquí. Sin embargo, es imoprtante tener al menos recursos a los que acudir.

General:

https://github.com/swisskyrepo/PayloadsAllTheThings (Herramientas y payloads para cada fase del test de penetración)

Linux:

https://blog.g0tmi1k.com/2011/08/basic-linux-privilege-escalation/ (Antiguo, pero merece la pena echar un vistazo)

https://github.com/rebootuser/LinEnum (Uno de los scripts más usados para enumerar vectores de escalada de privilegios, LinPEAS es otra alternativa que, en mi experiencia, es bastante mejor).

https://github.com/diego-treitos/linux-smart-enumeration/blob/master/lse.sh (otro script popular).

https://github.com/mzet-/linux-exploit-suggester (Un script dedicado a buscar exploits del kernel).

https://gtfobins.github.io (El sitio más útil del mundo para escalar privilegios a partir de binarios que tienen permisos especiales).

Windows:

https://www.fuzzysecurity.com/tutorials/16.html (Comandos útiles y métodos de enumerar el hosts y conseguir información interesante).

https://github.com/PowerShellEmpire/PowerTools/tree/master/PowerUp (algo antiguo, pero muy útil).

https://github.com/411Hall/JAWS (Un script de enumeración general).

Examen final

Ahora vamos a usar lo visto para atacar una máquina y conseguir las banderas de usuario y administrador.

Comencemos por explorar la máquina con Nmap.

nmap -A IP_Objetivo

Están abiertos los puertos 22 (ssh) y 80 (HTTP).

En el puerto 80, la página por defecto de Apache para Ubuntu, así que buscamos directorios ocultos e interesantes.

gobuster dir -u IP_Objetivo -w /usr/share/wordlists/dirb/common.txt -x php,txt,html

Vemos que hay un directorio /secret que examinamos. La página index.html aparece en blanco, así que escaneamos también ese directorio.

gobuster dir -u http://IP_Objetivo/secret.txt -w /usr/share/wordlists/dirb/common.txt -x php,txt,html

Ahí encontramos un archivo secret.txt que contiene unas credenciales:

nyan:046385855FC9580393853D8E81F240B66FE9A7B8

Tal cual, la contraseña no nos sirve para conectar por ssh, está codificada o encriptada. Con un identificador online de hashes vemos que es del tipo SHA1.

Vamos a pegarlo en un archivo hash.txt y romperlo. Usaré hashcat, así que vamos a ver qué modo es SHA1 y vemos que es el 100. También empleamos un ataque de diccionario con la lista rockyou.txt.

hashcat -m 100 -a 0 hash.txt /usr/share/wordlists/rockyou.txt 

Conseguimos romperlo y la contraseña para ssh es también nyan, así que entramos por ssh.

En el directorio en el que aterrizamos está la bandera de usuario, así que la leo.

cat user.txt

supernootnoot

Toca escalar privilegios para leer la bandera de root. Cuando ejecuto sudo -l veo que puede usar su como root sin contraseña. Eso significa que puedo pasar a superusuario con:

sudo su

Con eso me voy a la carpeta /root y leo root.txt

congratulations!!!!

Extremadamente sencillo, pero un buen recopilatorio en general, muy apto para principiantes.