En primer lugar, vamos a comprobar si tenemos conexión con la máquina. Y si podemos averiguar el sistema operativo que utiliza mediante el ttl.
ping [Ip Víctima]
Podemos observar que tiene un ttl=63, por tanto, ya sabemos que estamos frente a una máquina Linux.
Ahora podemos escanear los puertos mediante nmap.
nmap -p- --open -T5 -n -v [Ip Víctima] -oG allPorts
Esto nos guardará los puertos abiertos en el archivo ‘allPorts’ por si posteriormente queremos revisarlos de manera rápida accediendo al archivo guardado en nuestro directorio mediante la herramienta ‘extractPorts’.
Puedes encontrar la descripción y la herramienta extractPorts creada por S4vitar en mi repositorio: ExtractPorts
Es este caso podemos observar los siguientes puertos abiertos por el protocolo TCP:
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
Ahora pasaremos a realizar un escaneo más exhaustivo:
nmap -sC -sV -v -p22,80 [Ip Víctima] -oN target
-sC : Lanza scrips básicos de reconocimiento.
-sV : Localiza la versión y servicio de los puertos definidos.
-p : Puertos a escanear. Ej: -p22,80
-oN : Reporta los resultados en formato nmap al archivo targed.
Este escaneo, al igual que el anterior, nos guardará los resultados en nuestro directorio en el archivo ‘target’.
Como podemos observar, obtenemos la siguiente información:
-Puerto 22 corre un servicio ssh con la versión OpenSSH 7.6p1.
-Puerto 80 corre un servicio http operativo con la versión Apache httpd 2.4.29.
Nos dirigimos al buscador y trataremos de introducir la Ip como host para ver si nos redirige hacia alguna página web.
Efectivamente, la dirección http://[Ip Víctima] nos muestra una página web sobre vehículos eléctricos.
Bueno, tras investigar un poco la página podemos ver como ningúna de las pestañas esta activa, tambien podemos ver en la parte inferior de la página, en un apartado llamado Services, nos indica que porfavor nos registremos para tener acceso al servicio.
Por lo que podemos suponer que tiene que existir alguna página de registro por la que poder acceder. Visto esto vamos a echar un vistazo al código fuente de la página para ver si encontramos alguna dirección de registro.
Para ver el código fuente de una página, clic derecho sobre la página y luego ‘Ver código fuente de la página’.
En la parte final del ćodigo podemos ver como muestra un directorio login. Vamos a tratar de acceder a él mediante el buscador para ver que nos reporta.
Ahora tenemos un sitio desde el que acceder. Ya que desconocemos el usuario y la contraseña (yo he probado los más comunes y no he tenido suerte) vamos a acceder como invitados. Para ello le daremos a la opción Login as Gues y tendremos acceso como invitados.
Podemos ver que tenemos diferentes pestañas, vamos a revisarlas una por una para ver la información que nos aportan:
Dentro de account tenemos información sobre el usuario guest, un Access Id, su nombre y un correo electrónico. Luego he revisado el código fuente, pero en este caso no me ha reportado mucha información.
También es interesante ver la url de la página, ya que nos asigna una id=2.
Tras inspeccionar las cookies es donde encontramos algo interesante.
Podemos ver como está página utiliza cookies de inicio de sesión, en caso de tener otro role y otro user, podríamos intentar cambiarlos y ganar acceso a otra cuenta.
Bien, ahora pasaremos a la siguiente pestaña a ver que más nos puede reportar.
Aquí podemos ver como se nos asigna una Brand Id = 2 y también podemos ver como las cookies de inicio de sesión se mantienen.
Vemos como se nos continua asignando una ID = 2 y nos muestra un nombre ‘client’.
Esta pestaña es muy interesante, ya que parece que sirve para subir archivos a la página. El único problema es que no tenemos permisos de ‘súper admin’.
En caso de tenerlos podríamos subir algún archivo para tratar de vulnerar la máquina o de escalar privilegios.
Tras investigar por todas las pestañas, lo más interesante que he encontrado es que todos los id del usuario actual son iguales a 2.
También me llama la atención como en la url de la pestaña nos especifica la id=2
Y otra cosa importante, son las cookies de inicio de sesión que hemos encontrado.
Ahora, tras conocer toda esta información, lo que podemos hacer es probar otras ‘id’ en la url de la pestaña ‘Account’. Simplemente, introducimos la misma url, pero probamos con otros valores (0,1,3,4,…).
El primer intento ha sido con 0 y vemos como no ha tenido resultado.
Al segundo intento, mediante el número id=1 vemos como nos reporta información de un usuario llamado ‘admin’. Pero nosotros buscamos al usuario ‘super admin’, ya que es el que tiene pleno acceso a la carga de archivos de la pestaña Upload, así que seguimos probando.
Vemos como tras muchos intentos vacíos, nos muestra algunos usuarios.
Finalmente, tras 30 intentos, lo conseguimos. El id=30 pertenece al usuario ‘super admin’.
Ya conoces el Acces ID (86575) y el Name (super admin), ahora tenemos que iniciar sesión como ese usuario. Tras probar a iniciar sesión desde la página anterior de registro a la que accedimos como ‘Gues’, veo que no me permite entrar, ya que aun desconocemos la contraseña.
Entonces utilizaremos las cookies de inicio de sesión para intentar acceder como super admin. Para ello, en la misma pestaña de Account, pulsamos clic derecho sobre la página y pulsamos ‘Inspeccionar’, dentro nos desplazaremos hasta la pestaña ‘Almacenamiento’.
Dentro de ‘Almacenamiento’ veremos una pestaña llamada ‘Cookies’ y el dominio de la página. Bueno, pues el truco consiste en cambiar los parametros ‘role’ y ‘user’ actuales por los del super admin.
Una vez introducimos los nuevos datos, recargamos la página y ya tendríamos acceso como super admin. Para comprobarlo, nos vamos a la pestaña Uploads y vemos como ya nos permite subir archivos.
Bueno, ahora que ya podemos subir archivos al sistema, vamos a probar a crear una reverse-shell.php, ya que la url utiliza archivos ‘.php’.
########################### php-reverse-shell.php ################################
En caso de utilizar Kali Linux o Parrot, lo más seguro es que ya tengáis una reverse-shell en vuestros repositorios. En mi caso que utilizo parrot, si realizamos una búsqueda del archivo ‘php-reverse-shell.php’ podemos ver como se aloja en los siguientes directorios:
En mi caso me aparece en dos repositorios y luego yo he realizado una copia en la carpeta Descargas para poder configurar con nuestros datos nuestra reverse-shell. Es importante copiar el archivo en la carpeta ‘Descargas’, ya que será difícil buscar nuestro archivo desde la página de Uploads a la hora de subirlo.
En caso de no tener el archivo php-reverse-shelll.php en vuestro sistema, lo podéis encontrar en mi repositorio de GitHub mediante el siguiente enlace: https://github.com/F1r0x/php-reverse-shell.php/blob/main/php-reverse-shell.php
Para tenerlo, simplemente lo copiáis, abrís una terminal y crearemos el archivo mediante nano:
nano php-reverse-shell.php
Pegamos todo el script, guardamos (Cntrl + o) y salimos (Cntrl + x).
Ya tendríamos la reverse-shell, ahora solo faltaría configurarla. Para ello, desde el directorio en el que esté el archivo php-reverse-shell.php (recomiendo que sea Descargas), mediante el comando nano cambiaremos la Ip por la nuestra y estableceremos un puerto, desde el cual, posteriormente con NetCat nos pondremos en escucha.
La configuración es muy simple, lo único que tenemos que hacer es cambiar la Ip por la de nuestro sistema y establecer el puerto por el que queremos ponernos en escucha.
Abrimos una terminar y modificamos el archivo php-reverse-shell.php
sudo nano php-reverse-shell.php
Establecemos nuestra Ip (tun0) y el puerto de escucha (en este ejemplo usaremos el 8080). Para saber cuál es nuestra Ip, podemos verlo mediante el comando ‘ipconfig’:
sudo ifconfig
Guardamos (Cntrl + o) y salimos (Cntrl + x).
Ya tendríamos nuestro archivo php-reverse-shell.php preparado. Ahora lo siguiente seria tratar de subirlo a la página desde la pestaña Uploads.
(NOTA: La Ip de la máquina que yo os muestro a lo largo del write-up va cambiando debido a que realizarlo ha llevado horas y he tenido que reiniciar varias veces la máquina)
Para ello simplemente vamos a la página, pulsamos examinar:
Seleccionamos nuestra reverse-shell:
Y finalmente pulsamos Upload:
Perfecto, ya tendríamos nuestro archivo subido.
Ahora faltaría preparar nuestro NetCat para que se ponga en modo escucha por el puerto 8080. Antes de probar el 8080 probé otros con el cual no conseguí establecer conexión para que lo tengáis en cuenta.
Para ponernos en escucha, abrimos una terminal y ejecutamos el siguiente comando:
nc -lnvp 8080
-l : Sirve para que Netcat abra un puerto y se mantenga ala escucha. Se aceptará una única conexión de un único cliente antes de cerrarse.
-n : Direcciones IP solo numéricas, sin DNS.
-v : Se usa para mostrar información acerca de la conexión.
-p : Esta opción permite especificar el puerto al que conectarse.
El siguiente paso sería ejecutar el archivo php-reverse-shell.php que hemos almacenado en la máquina víctima. El único problema es que no sabemos donde se ha almacenado nuestro archivo. Para encontrar nuestro archivo utilizaremos la herramienta ‘gobuester’.
Gobuster es una herramienta utilizada para la fuerza bruta de búsqueda de URL, incluidos directorios y archivos, así como subdominios DNS.
Para instalarlo simplemente ejecutamos:
sudo apt install gobuster
Y también tendremos que descargar los repositorios de direcciones, en esta ocasión utilizaremos un repositorio llamado ‘wordlists’ y en concreto la lista de directorios ‘directory-list-2.3-small.txt.
Podéis descargaros estas bibliotecas de directorios desde la misma página de github, existen un montón de variantes en función del sistema a explotar. De todas formas revisar primero si ya existe en vuestro sistema, ya que algunos SO traen repositorios instalados.
Para descargar o copiar:
https://gist.github.com/sl4v/c087e36164e74233514b
En ese enlace encontraréis la biblioteca que vamos a utilizar, yo recomiendo instalarlo en el siguiente directorio, si el directorio no existe crearlo.:
/usr/share/wordlists/dirbuster/directory-list-2.3-small.txt
Bien, ya tenemos nuestro Gobuster y nuestra biblioteca de directorios, ahora toca lanzar la herramienta a ver que nos reporta:
gobuster dir --url http://[Ip Víctima]/ --wordlist /usr/share/wordlists/dirbuster/directory-list-2.3-small.txt -x php
Ahora gobuster empezará a realizar pruebas y a mostrarnos resultados a medida que avanza. No tenemos que esperar a que finalice, simplemente fijaros en cuales son los directorios que reporta y ir probando a ver cuáles son funcionales.
Para el proceso: Cntrl + c
En este caso hemos tenido suerte, ya que al poco de buscar ha encontrado una ruta que nos dirige al directorio Uploads.
http://[Ip Víctima]/uploads/
Una vez hecho esto nos dirigiremos al navegador y trataremos de introducir la siguiente ruta:
http://[Ip Víctima]/uploads/php-reverse-shell.php
Una vez realizado esto, volvemos a la terminal donde se encontraba el ‘netcat’ y debería de haberse abierto nuestra shell.
Efectivamente, ya tenemos nuestra reverse-shell preparada y activa.
# Búsqueda de la primera Flag:
Una vez tengamos la shell activa, podemos ver los directorios mediante ls:
Vamos a ver que Usuarios tenemos registrados en el sistema, para ello nos dirigimos al directorio /home y vemos que existe el usuario ‘robert’.
Y bingo!! Dentro del directorio ‘robert’ podemos ver el archivo ‘user.txt’ que contiene la primera Flag.
Mediante el comando ‘cat’ podemos ver en la terminal el contenido del archivo:
cat user.txt
Ahora, para poder trabajar de manera más cómoda y tratar de escalarar privilegios, primero, abriremos una shell más funcional. Para ello volvemos al directorio principal mediante cd y ejecutamos el siguiente comando:
python3 -c 'import pty;pty.spawn("/bin/bash")'
Bien, ahora ya tenemos una shell más segura y funcional. Ya hemos visto que con el usuario actual no podemos hacer mucho más, ya que tenemos el acceso restringido al sistema.
Ya que el sitio web utiliza PHP y SQL, podemos tratar de comprobar el directorio web en busca de posibles divulgaciones o configuraciones incorrectas.
Para ello revisamos los directorios situados en ‘/var/www/html/’. Tras revisar los distintos directorios, podemos ver uno con el nombre ‘login’ (/var/www/html/cdn-cgi/login) que contiene distintos archivos.
Aparecen tres archivos ‘.php’ y uno ‘.js’, el siguiente paso sería buscar información en el codigo fuente de cada archivo. Para ello, buscaremos cadenas interesantes con el uso de la herramienta ‘grep’.
Grep es una herramienta que busca patrones en cada archivo e imprime las líneas que coinciden con los patrones. Junto a esta herramienta podemos utilizar el comanado ‘cat’ para leer todos los archivos filtrados por ‘grep’.
Con grep utilizaremos el patrón ‘passw’ para tratar de roportar todas los resultados con ese inicio de palabra (como passwd o password por ejemplo). También usaremos -i para ignorar las palabras sensibles a mayúsculas y minúsculas como por ejemplo las contraseñas en este caso.
cat * | grep -i passw*
Genial, podemos ver como nos reporta un username = “admin” y una password = “MEGACORP_4dm1n!!”.
Para poder verificar los usuarios disponibles en el sistema, podemos leer el archivo /etc/passwd y tratar de reutilizar la contrasña encontrada en alguna cuenta con altros privilegios.
cat /etc/passwd
Podemos ver como tenemos un usuario llamado ‘robert’. Vamos a tratar de entrar como este usuario mediante el comando ‘su’ y con la contraseña previamente encontrada.
su robert
Podemos ver que la contraseña no corresponde con este usuario. Como no nos sirve está contraseña, vamos a seguir revisando los archivos “.php” y “.js” de manera manual en busca de algo más.
Tras revisar los cuatro archivos, vemos que en el archivo ‘db.php’ encontramos la siguiente información:
cat db.php
Como podéis ver aparecen cuatro palabras que podemos probar como contraseñas, tras probarlas vemos como la contraseña del usuario ‘robert’ es “M3g4C0rpUs3r!”
su robert
Finalmente, estamos como el usuario ‘robert’, podemos comprobarlo utilizando el comando ‘whoami’:
Ahora podemos ir al directorio principal /home/robert y veremos como ahí está nuestro archivo user.txt con nuestra primera flag que ya habíamos visto anteriormente sin necesidad de ningún privilegio.
cd /home/robert
cat user.txt
Pero nosotros lo que buscamos es la flag del super usuario y para ello debemos de escalar privilegios.
En primer lugar, trataremos de iniciar sesión como super usuario mediante ‘sudo’:
sudo su robert
Tras probar las contraseñas previamente recopiladas vemos como ninguna parece funcionar. Vamos a seguir buscando información, está vez, vamos a revisar los grupos en los que forma parte el usuario ‘robert’, para ello utilizaremos el comando ‘id’:
Vemos como el usuario robert es parte del grupo ‘bugtracker’. Ahora, intentemos ver si hay algún binario dentro de ese grupo:
find / -group bugtracker 2>/dev/null
Nos ha reportado un archivo llamado ‘bugtracker’. Ahora comprobamos qué privilegio y qué tipo de archivo es:
ls -la /usr/bin/bugtracker && file /usr/bin/bugtracker
Podemos ver que existe un conjunto ‘SUID’ en ese binario, este es un buen camino de explotación para tratar de escalar privilegios.
Un archivo SUID siempre se ejecuta como el usuario propietario del archivo, independientemente de que usuario pase el comando.
En nuestro caso, el ‘butracker’ binario es propiedad de ‘root’ y por tanto, podemos ejecutalo como root ya que tiene configurado SUID.
Para ello ejecutamos ‘bugtacker’:
/usr/bin/bugtracker
En mi caso probé con ‘home’ para ver que me reportaba:
La herramienta acepta la entrada del usuario como nombre del archivo que se leerá con el comando ‘cat’. Sin embargo, no especifica la ruta completa al archivo ‘cat’ y podríamos aprovechar esto.
Para ello nos dirigiremos al directorio ‘/tmp’:
cd /tmp
Y crearemos un archivo ‘cat’ que contenga la siguiente ruta ‘/bin/sh’:
echo '/bin/sh' > cat
Ahora le tenemos que dar privilegios de ejecución:
chmod +x cat
Una vez preparado el archivo ‘cat’, debemos agregar el directorio /tmp a la variable ambiental PATH.
PATH es una variable de entorno en sistemas operativos similares a Unix, DOS, OS/2 y Microsoft Windows, que especifica un conjunto de directorios donde se encuentran los programas ejecutables.
Por tanto, debemos introducir el directorio ‘tmp’ en el archivo PATH para poder ejecutarlo correctamente. Para ello utilizamos el siguiente comando:
export PATH=/tmp:$PATH
Para confirmar que todo ha salido correctamente y verificar que el directorio ‘tmp’ está en PATH:
echo $PATH
Ahora, volvemos a ejecutar ‘bugtracker’ desde el directorio ‘/tmp’:
Genial, ya estamos registrados como ‘root’. Finalmente, nos dirigimos al directorio ‘/root’ donde encontramos el archivo ‘root.txt.’.
Para poder leer el archvio nos registramos como super usuarios:
sudo su
Y abrimos el archivo con ‘cat’ donde encontramos la última Flag:
cat root.txt