Enumeramos Elasticsearch en donde encontramos credenciales para obtener acceso por SSH. Encontramos Kibana el cual obtuvimos localmente con SSH que ademas explotamos una vulnerabilidad la cual nos dio acceso al siguiente usuario. Un CronJob con Logstash nos dio una shell como usuario root.
Informacion de la Maquina
Nombre | Haystack |
---|---|
OS | Linux |
Puntos | 20 |
Dificultad | Facil |
IP | 10.10.10.115 |
Maker | |
|
MASSCAN & NMAP
Escaneo de puertos tcp/udp y su servicio.
|
|
HTTP
GOBUSTER
Realizamos una busqueda de directorios y archivos en el puerto 80 http con gobuster.
|
|
Hint - Imagen
Dentro de la imagen que se encuentra en el index del puerto 80 encontramos una cadena en base64 con lo que parece un hint.
Imagen:
Hint:
GOBUSTER - Puerto 9200
Realizamos una busqueda de directorios y archivos en el puerto 9200 con gobuster.
|
|
Encontramos algunos directorios no muy comunes, al visitar este puerto con firefox encontramos que esta corriendo un servidor de Elasticsearch en su version 6.4.2.
Al hacer una pequeña enumeracion encontramos 3 aliases, los cuales podemos utilizar para obtener informacion que esta almacenado en el servidor.
En el alias de .kibana
encontramos una vulnerabilidad de LFI pero esta no afecta a este alias del servidor.
Para obtener informacion de uno de los aliases (index) vamos a utilizar el siguiente query:
|
|
El resultado del query son 5 valores que se encuentran dentro de ‘bank’, podemos hacer lo mismo para los demas aliases que encontramos.
En este caso vamos a buscar dentro del alias ‘quotes’, como anteriormente obtuvimos un ‘hint’ en la imagen del index vamos a buscar en este caso la palabra “clave” dentro de este alias.
|
|
|
|
Obtenemos dos resultados, los cuales nso muestran dos mensajes con una cadena en base64, al decodificarlos obtenemos credenciales.
|
|
SSH - User flag
Ya que obtuvimos nuestras credenciales nos logeamos atravez del servicio ssh, obtenemos una shell y nuestra flag user.txt.
Kibana 6.4.2
Como vimos anteriormente encontramos un alias .kibana el cual no era afectado en el puerto 9200, al obtener una shell pudimos hacer una enumeracion y encontrar el archivo de configuracion en este caso kibana.yml el cual se encuentra en la carpeta /etc/kibana/
.
Vemos que la configuracion de este archivo tiene otro puerto en el cual esta corriendo el ‘backend’ de la aplicacion, pero este solo esta disponible en la maquina de manera local.
Para poder ver lo que hay en el puerto 5601 vamos a hacer port forwarding, para traerlo localmente a nuestra maquina. Para ello utilizamos el siguiente comando:
|
|
Verificamos con netstat que el puerto este activo en nuestra maquina:
Visitamos el puerto de manera local y nos muestra una plataforma, en este caso la de Kibana.
LFI - Kibana 6.4.2
Como lo dije anteriormente la version de Kibana 6.4.2 tiene una vulnerabilidad la cual permite ejecutar codigo mediante archivo javascript u obtener archivos mediante LFI, al explotar esta vulnerabilidad de LFI esta solo se ve reflejada dentro del archivo ’log’ de Kibana.
Una cosa importante que debemos saber es de que, los archivos que se reflejan dentro del log son archivos a los que Kibana tiene acceso. Para obtener una shell tenemos que escribir un archivo javascript dentro de la maquina en un lugar donde el usuario Kibana tenga acceso, el codigo de la Shell Inversa es:
|
|
Escribimos nuestra shell en /tmp/
y le dimos permisos para todos los usuarios:
Para poder ejecutar nuestra shell inversa podemos hacer una solicitud con curl o hacerlo con firefox:
|
|
Por otro lado obtuvimos nuestra shell inversa como usuario Kibana:
PRIVILEGE ESCALATION
Para obtener una shell como usuario root primero enumeramos los crons que se ejecutan con el usuario root esto lo hacemos con pspy. Al realizar esto encontramos un proceso que se ejecuta cada minuto aproximadamente. Este proceso esta relacionado con logstash la cual es una herramienta que administra los logs.
Al realizar una enumearcion de esta herramienta encontramos dentro de /etc/logstash
los archivos de configuracion de esta herramienta. Dentro de la carpeta /etc/logstash/conf.d
encontramos 3 archivos los cuales se utilizan para administrar logs.
El primer archivo (filter.conf) contiene una expresion regular la cual es utlizada para organizar los archivos log. En el segundo archivo (input.conf) encontramos que apunta a un archivo path => /opt/kibana/logstash_*
el cual va ser ejecutado por el programa con cierto intervalo de tiempo. En el tercer archivo (output.conf) este ultimo ejecuta el archivo o el codigo que se encuentra en el archivo (path) input.conf
.
filter.conf:
|
|
input.conf:
|
|
output.conf:
output {
if [type] == "execute" {
stdout { codec => json }
exec {
command => "%{comando} &"
}
}
}
Ya que este programa es ejecutado por el usuario root cada cierto tiempo, podemos escribir como usuario Kibana en el directorio /opt/kibana/ un archivo de shell inversa, pero este archivo debe de hacer match con la expresion regular que se encuentra en el archivo filter.conf: ('match => { "message" => "Ejecutar\s*comando\s*:\s+%{GREEDYDATA:comando}" }')
.
Para poder entender un poco mas las expresiones regulares de esta herramienta podemos verlo aqui:
El codigo que debemos de agregar al archivo es:
|
|
Para agregar el codigo a nuestro archivo utilizamos el siguiente comando:
|
|
El nombre de nuestro archivo debe de llevar en su nombre logstash_
(input.conf) para que pueda ser ejecutado en nuestro caso /opt/kibana/logstash_bash
. Un problema que tiene esta herramienta es la ejecucion, especificamente por el nombre ya que por alguna razon utilizar el mismo nombre de archivo genera algun problema y no se ejecuta, por lo que al agregar o cambiar el comando que se desea ejecutar se debe de crear un nuevo archivo con diferente nombre.
Por otro lado ponemos a la escucha netcat con el puerto que le pasamos a nuestra shell inversa, esperamos un poco a que se ejecute el cron de nuevo y obtenemos una shell como usuario root y nuestra flag root.txt.
Codigo de nuestra shelll inversa se ejecuta: